






















@@ -89,7 +89,7 @@ export async function recoverStuckDiagnosticSession(
8989params.sessionId && isEmbeddedPiRunHandleActive(params.sessionId)
9090 ? params.sessionId
9191 : undefined;
92-const activeSessionId = params.sessionKey
92+let activeSessionId = params.sessionKey
9393 ? (resolveActiveEmbeddedRunHandleSessionId(params.sessionKey) ?? fallbackActiveSessionId)
9494 : fallbackActiveSessionId;
9595const activeWorkSessionId = params.sessionKey
@@ -131,17 +131,31 @@ export async function recoverStuckDiagnosticSession(
131131}
132132133133if (!activeSessionId && activeWorkSessionId && isEmbeddedPiRunActive(activeWorkSessionId)) {
134-const outcome: StuckSessionRecoveryOutcome = {
135-status: "skipped",
136-action: "keep_lane",
137-reason: "active_reply_work",
138-sessionId: params.sessionId,
139-sessionKey: params.sessionKey,
140-activeSessionId: activeWorkSessionId,
141-activeWorkKind: "embedded_run",
142-};
143-diag.warn(`stuck session recovery outcome: ${formatRecoveryOutcome(outcome)}`);
144-return outcome;
134+if (params.allowActiveAbort === true) {
135+const result = await abortAndDrainEmbeddedPiRun({
136+sessionId: activeWorkSessionId,
137+sessionKey: params.sessionKey,
138+settleMs: STUCK_SESSION_ABORT_SETTLE_MS,
139+forceClear: true,
140+reason: "stuck_recovery",
141+});
142+aborted = result.aborted;
143+drained = result.drained;
144+forceCleared = result.forceCleared;
145+activeSessionId = activeWorkSessionId;
146+} else {
147+const outcome: StuckSessionRecoveryOutcome = {
148+status: "skipped",
149+action: "keep_lane",
150+reason: "active_reply_work",
151+sessionId: params.sessionId,
152+sessionKey: params.sessionKey,
153+activeSessionId: activeWorkSessionId,
154+activeWorkKind: "embedded_run",
155+};
156+diag.warn(`stuck session recovery outcome: ${formatRecoveryOutcome(outcome)}`);
157+return outcome;
158+}
145159}
146160147161if (!activeSessionId && sessionLane) {
@@ -167,8 +181,8 @@ export async function recoverStuckDiagnosticSession(
167181168182const clearStaleQueuedSession = !aborted && released === 0 && (params.queueDepth ?? 0) > 0;
169183170-if (aborted || released > 0 || clearStaleQueuedSession) {
171-const action = aborted ? "abort_embedded_run" : "release_lane";
184+if (aborted || forceCleared || released > 0 || clearStaleQueuedSession) {
185+const action = aborted || forceCleared ? "abort_embedded_run" : "release_lane";
172186const stoppedFields = formatStoppedCronSessionDiagnosticFields(
173187resolveCronSessionDiagnosticContext({ sessionKey: params.sessionKey, activeSessionId }),
174188);
@@ -179,28 +193,29 @@ export async function recoverStuckDiagnosticSession(
179193 stoppedFields ? ` ${stoppedFields}` : ""
180194 }`,
181195);
182-const outcome: StuckSessionRecoveryOutcome = aborted
183- ? {
184-status: "aborted",
185-action: "abort_embedded_run",
186-sessionId: params.sessionId,
187-sessionKey: params.sessionKey,
188- activeSessionId,
189-activeWorkKind: "embedded_run",
190- aborted,
191- drained,
192- forceCleared,
193- released,
194-lane: sessionLane ?? undefined,
195-}
196- : {
197-status: "released",
198-action: "release_lane",
199-sessionId: params.sessionId,
200-sessionKey: params.sessionKey,
201- released,
202-lane: sessionLane ?? undefined,
203-};
196+const outcome: StuckSessionRecoveryOutcome =
197+aborted || forceCleared
198+ ? {
199+status: "aborted",
200+action: "abort_embedded_run",
201+sessionId: params.sessionId,
202+sessionKey: params.sessionKey,
203+ activeSessionId,
204+activeWorkKind: "embedded_run",
205+ aborted,
206+ drained,
207+ forceCleared,
208+ released,
209+lane: sessionLane ?? undefined,
210+}
211+ : {
212+status: "released",
213+action: "release_lane",
214+sessionId: params.sessionId,
215+sessionKey: params.sessionKey,
216+ released,
217+lane: sessionLane ?? undefined,
218+};
204219diag.warn(`stuck session recovery outcome: ${formatRecoveryOutcome(outcome)}`);
205220return outcome;
206221}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。