

























@@ -12,7 +12,6 @@ import {
1212resolveDefaultAgentId,
1313} from "../agents/agent-scope.js";
1414import { appendCronStyleCurrentTimeLine } from "../agents/current-time.js";
15-import { resolveEffectiveMessagesConfig } from "../agents/identity.js";
1615import { isNestedAgentLane } from "../agents/lanes.js";
1716import { resolveEmbeddedSessionLane } from "../agents/pi-embedded-runner/lanes.js";
1817import { DEFAULT_HEARTBEAT_FILENAME } from "../agents/workspace.js";
@@ -26,6 +25,7 @@ import {
2625stripHeartbeatToken,
2726type HeartbeatTask,
2827} from "../auto-reply/heartbeat.js";
28+import { resolveResponsePrefixTemplate } from "../auto-reply/reply/response-prefix-template.js";
2929import { HEARTBEAT_TOKEN } from "../auto-reply/tokens.js";
3030import type { ReplyPayload } from "../auto-reply/types.js";
3131import { getChannelPlugin } from "../channels/plugins/index.js";
@@ -34,6 +34,7 @@ import type {
3434ChannelId,
3535ChannelPlugin,
3636} from "../channels/plugins/types.public.js";
37+import { createReplyPrefixContext } from "../channels/reply-prefix.js";
3738import {
3839listDueCommitmentsForSession,
3940listDueCommitmentSessionKeys,
@@ -1056,10 +1057,12 @@ export async function runHeartbeatOnce(opts: {
10561057})
10571058 : { showOk: false, showAlerts: true, useIndicator: true };
10581059const { sender } = resolveHeartbeatSenderContext({ cfg, entry, delivery });
1059-const responsePrefix = resolveEffectiveMessagesConfig(cfg, agentId, {
1060+const replyPrefix = createReplyPrefixContext({
1061+ cfg,
1062+ agentId,
10601063channel: delivery.channel !== "none" ? delivery.channel : undefined,
10611064accountId: delivery.accountId,
1062-}).responsePrefix;
1065+});
1063106610641067const canRelayToUser = Boolean(
10651068delivery.channel !== "none" && delivery.to && visibility.showAlerts,
@@ -1231,7 +1234,15 @@ export async function runHeartbeatOnce(opts: {
12311234nowMs: startedAt,
12321235});
123312361234-const heartbeatOkText = responsePrefix ? `${responsePrefix} ${HEARTBEAT_TOKEN}` : HEARTBEAT_TOKEN;
1237+const resolveHeartbeatResponsePrefix = () =>
1238+resolveResponsePrefixTemplate(
1239+replyPrefix.responsePrefix,
1240+replyPrefix.responsePrefixContextProvider(),
1241+);
1242+const resolveHeartbeatOkText = () => {
1243+const responsePrefix = resolveHeartbeatResponsePrefix();
1244+return responsePrefix ? `${responsePrefix} ${HEARTBEAT_TOKEN}` : HEARTBEAT_TOKEN;
1245+};
12351246const outboundSession = buildOutboundSessionContext({
12361247 cfg,
12371248 agentId,
@@ -1289,7 +1300,7 @@ export async function runHeartbeatOnce(opts: {
12891300to: delivery.to,
12901301accountId: delivery.accountId,
12911302threadId: delivery.threadId,
1292-payloads: [{ text: heartbeatOkText }],
1303+payloads: [{ text: resolveHeartbeatOkText() }],
12931304session: outboundSession,
12941305deps: opts.deps,
12951306});
@@ -1311,6 +1322,7 @@ export async function runHeartbeatOnce(opts: {
13111322// Heartbeat timeout is a per-run override so user turns keep the global default.
13121323 timeoutOverrideSeconds,
13131324 bootstrapContextMode,
1325+onModelSelected: replyPrefix.onModelSelected,
13141326};
13151327const getReplyFromConfig =
13161328opts.deps?.getReplyFromConfig ?? (await loadHeartbeatRunnerRuntime()).getReplyFromConfig;
@@ -1350,6 +1362,7 @@ export async function runHeartbeatOnce(opts: {
13501362}
1351136313521364const ackMaxChars = resolveHeartbeatAckMaxChars(cfg, heartbeat);
1365+const responsePrefix = resolveHeartbeatResponsePrefix();
13531366const normalized = normalizeHeartbeatReply(replyPayload, responsePrefix, ackMaxChars);
13541367// For exec completion events, don't skip even if the response looks like HEARTBEAT_OK.
13551368// The model should be responding with exec results, not ack tokens.
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。