























@@ -178,6 +178,12 @@ import {
178178isSubagentEnvelopeSession,
179179resolveSubagentCapabilityStore,
180180} from "../../subagent-capabilities.js";
181+import {
182+ackPendingSubagentCompletionHandoffs,
183+leasePendingSubagentCompletionHandoffs,
184+prependSubagentHandoffPrompt,
185+releasePendingSubagentCompletionHandoffs,
186+} from "../../subagent-registry.js";
181187import { ensureSystemPromptCacheBoundary } from "../../system-prompt-cache-boundary.js";
182188import { buildSystemPromptParams } from "../../system-prompt-params.js";
183189import { buildSystemPromptReport } from "../../system-prompt-report.js";
@@ -3323,6 +3329,23 @@ export async function runEmbeddedAttempt(
33233329}
33243330};
33253331let skipPromptSubmission = false;
3332+let leasedSubagentHandoff:
3333+| {
3334+leaseId: string;
3335+runIds: readonly string[];
3336+}
3337+| undefined;
3338+const releaseLeasedSubagentHandoff = (error?: unknown) => {
3339+if (!leasedSubagentHandoff) {
3340+return;
3341+}
3342+releasePendingSubagentCompletionHandoffs({
3343+runIds: leasedSubagentHandoff.runIds,
3344+leaseId: leasedSubagentHandoff.leaseId,
3345+error: error ? formatErrorMessage(error) : undefined,
3346+});
3347+leasedSubagentHandoff = undefined;
3348+};
33263349try {
33273350const promptStartedAt = Date.now();
33283351if (emptyExplicitToolAllowlistError) {
@@ -3521,6 +3544,37 @@ export async function runEmbeddedAttempt(
35213544log.debug(orphanRepairMessage);
35223545}
35233546}
3547+if (params.sessionKey && !isRawModelRun) {
3548+const leaseId = `${params.runId}:subagent-next-turn-handoff`;
3549+const leased = leasePendingSubagentCompletionHandoffs({
3550+requesterSessionKey: params.sessionKey,
3551+ leaseId,
3552+});
3553+if (leased) {
3554+leasedSubagentHandoff = {
3555+ leaseId,
3556+runIds: leased.runIds,
3557+};
3558+effectivePrompt = prependSubagentHandoffPrompt({
3559+handoffPrompt: leased.prompt,
3560+prompt: effectivePrompt,
3561+});
3562+promptForRuntimeContextSplit = prependSubagentHandoffPrompt({
3563+handoffPrompt: leased.prompt,
3564+prompt: promptForRuntimeContextSplit,
3565+});
3566+if (transcriptPromptForRuntimeSplit !== undefined) {
3567+transcriptPromptForRuntimeSplit = prependSubagentHandoffPrompt({
3568+handoffPrompt: leased.prompt,
3569+prompt: transcriptPromptForRuntimeSplit,
3570+});
3571+}
3572+log.debug(
3573+`subagent handoff: injected ${leased.runIds.length} completion(s) into parent turn ` +
3574+`runId=${params.runId} sessionKey=${params.sessionKey}`,
3575+);
3576+}
3577+}
35243578const promptForModelBeforeRuntimeContextSplit = effectivePrompt;
35253579if (!isRawModelRun) {
35263580promptForRuntimeContextSplit = annotateInterSessionPromptText(
@@ -4110,12 +4164,22 @@ export async function runEmbeddedAttempt(
41104164cleanupRuntimeContextMessage();
41114165}
41124166}
4167+if (leasedSubagentHandoff) {
4168+ackPendingSubagentCompletionHandoffs({
4169+runIds: leasedSubagentHandoff.runIds,
4170+leaseId: leasedSubagentHandoff.leaseId,
4171+});
4172+leasedSubagentHandoff = undefined;
4173+}
41134174} finally {
41144175cleanupProviderPromptHistoryTransform();
41154176cleanupModelPromptTransform();
41164177}
4178+} else {
4179+releaseLeasedSubagentHandoff(promptError ?? "prompt submission skipped");
41174180}
41184181} catch (err) {
4182+releaseLeasedSubagentHandoff(err);
41194183yieldAborted =
41204184yieldDetected &&
41214185isRunnerAbortError(err) &&
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。