


























@@ -75,6 +75,63 @@ async function loadCleanupBrowserSessionsForLifecycleEnd(): Promise<
7575return (await browserCleanupLoader.load()).cleanupBrowserSessionsForLifecycleEnd;
7676}
777778+function resolveSubagentRunDeadlineMs(
79+entry: SubagentRunRecord,
80+observedStartedAt?: number,
81+): number | undefined {
82+const timeoutSeconds = entry.runTimeoutSeconds;
83+if (
84+typeof timeoutSeconds !== "number" ||
85+!Number.isFinite(timeoutSeconds) ||
86+timeoutSeconds <= 0
87+) {
88+return undefined;
89+}
90+const startedAt =
91+typeof observedStartedAt === "number" && Number.isFinite(observedStartedAt)
92+ ? observedStartedAt
93+ : typeof entry.startedAt === "number" && Number.isFinite(entry.startedAt)
94+ ? entry.startedAt
95+ : entry.createdAt;
96+return Number.isFinite(startedAt) ? startedAt + Math.floor(timeoutSeconds * 1000) : undefined;
97+}
98+99+function shouldPreservePublishedExplicitRunTimeout(params: { entry: SubagentRunRecord }): boolean {
100+if (
101+typeof params.entry.runTimeoutSeconds !== "number" ||
102+!Number.isFinite(params.entry.runTimeoutSeconds) ||
103+params.entry.runTimeoutSeconds <= 0 ||
104+params.entry.outcome?.status !== "timeout" ||
105+typeof params.entry.endedAt !== "number"
106+) {
107+return false;
108+}
109+const deadlineMs = resolveSubagentRunDeadlineMs(params.entry);
110+if (deadlineMs === undefined || params.entry.endedAt < deadlineMs) {
111+return false;
112+}
113+if (
114+params.entry.cleanupHandled ||
115+typeof params.entry.cleanupCompletedAt === "number" ||
116+typeof params.entry.endedHookEmittedAt === "number" ||
117+params.entry.delivery?.status === "delivered" ||
118+typeof params.entry.delivery?.announcedAt === "number"
119+) {
120+return true;
121+}
122+return false;
123+}
124+125+function resolveExpiredExplicitRunDeadlineMs(params: {
126+entry: SubagentRunRecord;
127+nextOutcome: SubagentRunOutcome;
128+nextEndedAt: number;
129+observedStartedAt?: number;
130+}): number | undefined {
131+const deadlineMs = resolveSubagentRunDeadlineMs(params.entry, params.observedStartedAt);
132+return deadlineMs !== undefined && params.nextEndedAt > deadlineMs ? deadlineMs : undefined;
133+}
134+78135export function createSubagentRegistryLifecycleController(params: {
79136runs: Map<string, SubagentRunRecord>;
80137resumedRuns: Set<string>;
@@ -515,6 +572,26 @@ export function createSubagentRegistryLifecycleController(params: {
515572delivery.payload = payload;
516573};
517574575+const refreshPendingFinalDeliveryPayload = (entry: SubagentRunRecord): boolean => {
576+const delivery = entry.delivery;
577+if (
578+!delivery?.payload ||
579+delivery.status === "delivered" ||
580+typeof delivery.announcedAt === "number"
581+) {
582+return false;
583+}
584+delivery.payload = {
585+ ...delivery.payload,
586+startedAt: entry.startedAt,
587+endedAt: entry.endedAt,
588+outcome: entry.outcome,
589+frozenResultText: entry.completion?.resultText,
590+fallbackFrozenResultText: entry.completion?.fallbackResultText,
591+};
592+return true;
593+};
594+518595const suspendPendingFinalDelivery = (args: {
519596runId: string;
520597entry: SubagentRunRecord;
@@ -1016,6 +1093,7 @@ export function createSubagentRegistryLifecycleController(params: {
10161093sendFarewell?: boolean;
10171094accountId?: string;
10181095triggerCleanup: boolean;
1096+startedAt?: number;
10191097}) => {
10201098params.clearPendingLifecycleError(completeParams.runId);
10211099const entry = params.runs.get(completeParams.runId);
@@ -1036,8 +1114,40 @@ export function createSubagentRegistryLifecycleController(params: {
10361114mutated = true;
10371115}
103811161039-const endedAt =
1040-typeof completeParams.endedAt === "number" ? completeParams.endedAt : Date.now();
1117+let endedAt = typeof completeParams.endedAt === "number" ? completeParams.endedAt : Date.now();
1118+let completionOutcome = completeParams.outcome;
1119+let completionReason = completeParams.reason;
1120+if (
1121+shouldPreservePublishedExplicitRunTimeout({
1122+ entry,
1123+})
1124+) {
1125+return;
1126+}
1127+1128+const observedStartedAt =
1129+typeof completeParams.startedAt === "number" && Number.isFinite(completeParams.startedAt)
1130+ ? completeParams.startedAt
1131+ : undefined;
1132+if (observedStartedAt !== undefined && entry.startedAt !== observedStartedAt) {
1133+entry.startedAt = observedStartedAt;
1134+if (typeof entry.sessionStartedAt !== "number") {
1135+entry.sessionStartedAt = observedStartedAt;
1136+}
1137+mutated = true;
1138+}
1139+1140+const expiredDeadlineMs = resolveExpiredExplicitRunDeadlineMs({
1141+ entry,
1142+nextOutcome: completionOutcome,
1143+nextEndedAt: endedAt,
1144+ observedStartedAt,
1145+});
1146+if (expiredDeadlineMs !== undefined) {
1147+endedAt = expiredDeadlineMs;
1148+completionOutcome = { status: "timeout" };
1149+completionReason = SUBAGENT_ENDED_REASON_COMPLETE;
1150+}
10411151if (entry.endedAt !== endedAt) {
10421152entry.endedAt = endedAt;
10431153entry.execution = {
@@ -1048,7 +1158,7 @@ export function createSubagentRegistryLifecycleController(params: {
10481158};
10491159mutated = true;
10501160}
1051-const outcome = withSubagentOutcomeTiming(completeParams.outcome, {
1161+const outcome = withSubagentOutcomeTiming(completionOutcome, {
10521162startedAt: entry.startedAt,
10531163 endedAt,
10541164});
@@ -1070,8 +1180,8 @@ export function createSubagentRegistryLifecycleController(params: {
10701180};
10711181mutated = true;
10721182}
1073-if (entry.endedReason !== completeParams.reason) {
1074-entry.endedReason = completeParams.reason;
1183+if (entry.endedReason !== completionReason) {
1184+entry.endedReason = completionReason;
10751185mutated = true;
10761186}
10771187if (entry.pauseReason !== undefined) {
@@ -1082,6 +1192,9 @@ export function createSubagentRegistryLifecycleController(params: {
10821192if (await freezeRunResultAtCompletion(entry, outcome)) {
10831193mutated = true;
10841194}
1195+if (refreshPendingFinalDeliveryPayload(entry)) {
1196+mutated = true;
1197+}
1085119810861199if (mutated) {
10871200params.persist();
@@ -1114,7 +1227,7 @@ export function createSubagentRegistryLifecycleController(params: {
11141227!suppressedForSteerRestart &&
11151228params.shouldEmitEndedHookForRun({
11161229 entry,
1117-reason: completeParams.reason,
1230+reason: completionReason,
11181231});
11191232const shouldDeferEndedHook =
11201233shouldEmitEndedHook &&
@@ -1124,7 +1237,7 @@ export function createSubagentRegistryLifecycleController(params: {
11241237if (!shouldDeferEndedHook && shouldEmitEndedHook) {
11251238await params.emitSubagentEndedHookForRun({
11261239 entry,
1127-reason: completeParams.reason,
1240+reason: completionReason,
11281241sendFarewell: completeParams.sendFarewell,
11291242accountId: completeParams.accountId,
11301243});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。