























@@ -24,6 +24,31 @@ function recoveryKey(params: StuckSessionRecoveryParams): string | undefined {
2424return params.sessionKey?.trim() || params.sessionId?.trim() || undefined;
2525}
262627+function formatRecoveryContext(
28+params: StuckSessionRecoveryParams,
29+extra?: { activeSessionId?: string; lane?: string; activeCount?: number; queuedCount?: number },
30+): string {
31+const fields = [
32+`sessionId=${params.sessionId ?? extra?.activeSessionId ?? "unknown"}`,
33+`sessionKey=${params.sessionKey ?? "unknown"}`,
34+`age=${Math.round(params.ageMs / 1000)}s`,
35+`queueDepth=${params.queueDepth ?? 0}`,
36+];
37+if (extra?.activeSessionId) {
38+fields.push(`activeSessionId=${extra.activeSessionId}`);
39+}
40+if (extra?.lane) {
41+fields.push(`lane=${extra.lane}`);
42+}
43+if (extra?.activeCount !== undefined) {
44+fields.push(`laneActive=${extra.activeCount}`);
45+}
46+if (extra?.queuedCount !== undefined) {
47+fields.push(`laneQueued=${extra.queuedCount}`);
48+}
49+return fields.join(" ");
50+}
51+2752export async function recoverStuckDiagnosticSession(
2853params: StuckSessionRecoveryParams,
2954): Promise<void> {
@@ -51,12 +76,11 @@ export async function recoverStuckDiagnosticSession(
51765277if (activeSessionId) {
5378if (params.allowActiveAbort !== true) {
54-diag.debug(
55-`stuck session recovery skipped active abort: sessionId=${
56- params.sessionId ?? activeSessionId
57- } sessionKey=${params.sessionKey ?? "unknown"} age=${Math.round(
58- params.ageMs / 1000,
59- )}s queueDepth=${params.queueDepth ?? 0}`,
79+diag.warn(
80+`stuck session recovery skipped: reason=active_embedded_run action=observe_only ${formatRecoveryContext(
81+ params,
82+ { activeSessionId },
83+ )}`,
6084);
6185return;
6286}
@@ -72,21 +96,27 @@ export async function recoverStuckDiagnosticSession(
7296}
73977498if (!activeSessionId && activeWorkSessionId && isEmbeddedPiRunActive(activeWorkSessionId)) {
75-diag.debug(
76-`stuck session recovery skipped lane reset: active reply work sessionId=${activeWorkSessionId} sessionKey=${
77- params.sessionKey ?? "unknown"
78- } age=${Math.round(params.ageMs / 1000)}s queueDepth=${params.queueDepth ?? 0}`,
99+diag.warn(
100+`stuck session recovery skipped: reason=active_reply_work action=keep_lane ${formatRecoveryContext(
101+ params,
102+ { activeSessionId: activeWorkSessionId },
103+ )}`,
79104);
80105return;
81106}
8210783108if (!activeSessionId && sessionLane) {
84109const laneSnapshot = getCommandLaneSnapshot(sessionLane);
85110if (laneSnapshot.activeCount > 0) {
86-diag.debug(
87-`stuck session recovery skipped lane reset: active lane task lane=${sessionLane} active=${laneSnapshot.activeCount} queued=${laneSnapshot.queuedCount} sessionId=${
88- params.sessionId ?? "unknown"
89- } sessionKey=${params.sessionKey ?? "unknown"} age=${Math.round(params.ageMs / 1000)}s`,
111+diag.warn(
112+`stuck session recovery skipped: reason=active_lane_task action=keep_lane ${formatRecoveryContext(
113+ params,
114+ {
115+ lane: sessionLane,
116+ activeCount: laneSnapshot.activeCount,
117+ queuedCount: laneSnapshot.queuedCount,
118+ },
119+ )}`,
90120);
91121return;
92122}
@@ -101,6 +131,15 @@ export async function recoverStuckDiagnosticSession(
101131 params.sessionKey ?? "unknown"
102132 } age=${Math.round(params.ageMs / 1000)}s aborted=${aborted} drained=${drained} released=${released}`,
103133);
134+} else {
135+diag.warn(
136+`stuck session recovery no-op: reason=no_active_work action=none ${formatRecoveryContext(
137+ params,
138+ {
139+ lane: sessionLane ?? undefined,
140+ },
141+ )}`,
142+);
104143}
105144} catch (err) {
106145diag.warn(
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。