


































@@ -11,6 +11,7 @@ import {
1111import {
1212getDiagnosticSessionState,
1313isDiagnosticSessionStateCurrent,
14+peekDiagnosticSessionState,
1415} from "./diagnostic-session-state.js";
15161617export type RecoverStuckSession = (
@@ -27,7 +28,7 @@ function emitSessionRecoveryRequested(params: {
2728type: "session.recovery.requested",
2829sessionId: params.request.sessionId,
2930sessionKey: params.request.sessionKey,
30-state: "processing",
31+state: params.request.expectedState ?? "processing",
3132stateGeneration: params.request.stateGeneration,
3233ageMs: params.request.ageMs,
3334queueDepth: params.request.queueDepth,
@@ -46,7 +47,7 @@ function emitSessionRecoveryCompleted(params: {
4647type: "session.recovery.completed",
4748sessionId: params.request.sessionId,
4849sessionKey: params.request.sessionKey,
49-state: "processing",
50+state: params.request.expectedState ?? "processing",
5051stateGeneration: params.request.stateGeneration,
5152ageMs: params.request.ageMs,
5253queueDepth: params.request.queueDepth,
@@ -75,6 +76,10 @@ function isRecoveryPromiseLike(
7576);
7677}
777879+function recoveryOutcomeHasQueuedLaneWork(outcome: StuckSessionRecoveryOutcome): boolean {
80+return outcome.status === "aborted" && (outcome.queuedCount ?? 0) > 0;
81+}
82+7883function applyRecoveryOutcomeToDiagnosticState(params: {
7984request: StuckSessionRecoveryRequest;
8085outcome: StuckSessionRecoveryOutcome | undefined;
@@ -86,14 +91,23 @@ function applyRecoveryOutcomeToDiagnosticState(params: {
8691emitSessionRecoveryCompleted({ request: params.request, outcome: params.outcome });
8792return;
8893}
89-if (
90-!isDiagnosticSessionStateCurrent({
91-sessionId: params.request.sessionId,
92-sessionKey: params.request.sessionKey,
93-generation: params.request.stateGeneration,
94-state: "processing",
95-})
96-) {
94+const expectedState = params.request.expectedState ?? "processing";
95+const currentState = peekDiagnosticSessionState(params.request);
96+const currentGeneration = currentState?.generation ?? 0;
97+const requestGeneration = params.request.stateGeneration ?? 0;
98+const stateIsCurrent =
99+expectedState === "idle" &&
100+params.request.stateGeneration !== undefined &&
101+params.outcome.action === "abort_embedded_run"
102+ ? currentState?.state === "idle" &&
103+(currentGeneration === requestGeneration || currentGeneration === requestGeneration + 1)
104+ : isDiagnosticSessionStateCurrent({
105+sessionId: params.request.sessionId,
106+sessionKey: params.request.sessionKey,
107+generation: params.request.stateGeneration,
108+state: expectedState,
109+});
110+if (!stateIsCurrent) {
97111emitSessionRecoveryCompleted({
98112request: params.request,
99113outcome: params.outcome,
@@ -108,9 +122,13 @@ function applyRecoveryOutcomeToDiagnosticState(params: {
108122state.generation = (state.generation ?? 0) + 1;
109123state.lastStuckWarnAgeMs = undefined;
110124state.lastLongRunningWarnAgeMs = undefined;
125+const preserveQueuedIdleWork =
126+params.request.expectedState === "idle" && recoveryOutcomeHasQueuedLaneWork(params.outcome);
111127state.queueDepth = recoveryOutcomeClearsQueuedSessionState(params.outcome)
112128 ? 0
113- : Math.max(0, state.queueDepth - 1);
129+ : preserveQueuedIdleWork
130+ ? Math.max(state.queueDepth, params.request.queueDepth ?? 0)
131+ : Math.max(0, state.queueDepth - 1);
114132emitDiagnosticEvent({
115133type: "session.state",
116134sessionId: state.sessionId,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。