


























@@ -11,6 +11,7 @@ import {
1111resolveAgentIdFromSessionKey,
1212resolveStorePath,
1313} from "./subagent-announce.runtime.js";
14+import { assistantCallsSessionsYield, isSessionsYieldToolResult } from "./subagent-yield-output.js";
1415import { readLatestAssistantReply } from "./tools/agent-step.js";
1516import { extractAssistantText, sanitizeTextContent } from "./tools/session-message-text.js";
1617import { isAnnounceSkip } from "./tools/sessions-send-tokens.js";
@@ -46,13 +47,17 @@ type SubagentOutputSnapshot = {
4647latestRawText?: string;
4748assistantFragments: string[];
4849toolCallCount: number;
50+waitingForContinuation?: boolean;
4951};
50525153export type AgentWaitResult = {
5254status?: string;
5355startedAt?: number;
5456endedAt?: number;
5557error?: string;
58+stopReason?: string;
59+livenessState?: string;
60+yielded?: boolean;
5661};
57625863export type SubagentRunOutcome = {
@@ -199,32 +204,58 @@ function summarizeSubagentOutputHistory(messages: Array<unknown>): SubagentOutpu
199204assistantFragments: [],
200205toolCallCount: 0,
201206};
207+let previousAssistantCalledYield = false;
202208for (const message of messages) {
203209if (!message || typeof message !== "object") {
204210continue;
205211}
206212const role = (message as { role?: unknown }).role;
207213if (role === "assistant") {
208214snapshot.toolCallCount += countAssistantToolCalls((message as { content?: unknown }).content);
215+if (assistantCallsSessionsYield(message)) {
216+snapshot.latestAssistantText = undefined;
217+snapshot.latestRawText = undefined;
218+snapshot.latestSilentText = undefined;
219+snapshot.assistantFragments = [];
220+snapshot.waitingForContinuation = true;
221+previousAssistantCalledYield = true;
222+continue;
223+}
209224const text = extractSubagentOutputText(message).trim();
210225if (!text) {
226+previousAssistantCalledYield = false;
211227continue;
212228}
213229if (isAnnounceSkip(text) || isSilentReplyText(text, SILENT_REPLY_TOKEN)) {
214230snapshot.latestSilentText = text;
215231snapshot.latestAssistantText = undefined;
216232snapshot.assistantFragments = [];
233+snapshot.waitingForContinuation = false;
234+previousAssistantCalledYield = false;
217235continue;
218236}
219237snapshot.latestSilentText = undefined;
220238snapshot.latestAssistantText = text;
221239snapshot.assistantFragments.push(text);
240+snapshot.waitingForContinuation = false;
241+previousAssistantCalledYield = false;
242+continue;
243+}
244+if (isSessionsYieldToolResult(message, previousAssistantCalledYield)) {
245+snapshot.latestAssistantText = undefined;
246+snapshot.latestRawText = undefined;
247+snapshot.latestSilentText = undefined;
248+snapshot.assistantFragments = [];
249+snapshot.waitingForContinuation = true;
250+previousAssistantCalledYield = false;
222251continue;
223252}
224253const text = extractSubagentOutputText(message).trim();
225254if (text) {
226255snapshot.latestRawText = text;
256+snapshot.waitingForContinuation = false;
227257}
258+previousAssistantCalledYield = false;
228259}
229260return snapshot;
230261}
@@ -256,6 +287,9 @@ function selectSubagentOutputText(
256287snapshot: SubagentOutputSnapshot,
257288outcome?: SubagentRunOutcome,
258289): string | undefined {
290+if (snapshot.waitingForContinuation) {
291+return undefined;
292+}
259293if (snapshot.latestSilentText) {
260294return snapshot.latestSilentText;
261295}
@@ -278,10 +312,14 @@ export async function readSubagentOutput(
278312params: { sessionKey, limit: 100 },
279313});
280314const messages = Array.isArray(history?.messages) ? history.messages : [];
281-const selected = selectSubagentOutputText(summarizeSubagentOutputHistory(messages), outcome);
315+const snapshot = summarizeSubagentOutputHistory(messages);
316+const selected = selectSubagentOutputText(snapshot, outcome);
282317if (selected?.trim()) {
283318return selected;
284319}
320+if (snapshot.waitingForContinuation) {
321+return undefined;
322+}
285323const latestAssistant = await subagentAnnounceOutputDeps.readLatestAssistantReply({
286324 sessionKey,
287325limit: 100,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。