openryoko 2026.7.1 → 2026.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/dist/package.json +1 -1
  2. package/dist/src/connectors/slack/__tests__/triage-prompt.test.js +43 -1
  3. package/dist/src/connectors/slack/__tests__/triage-prompt.test.js.map +1 -1
  4. package/dist/src/connectors/slack/index.d.ts.map +1 -1
  5. package/dist/src/connectors/slack/index.js +33 -11
  6. package/dist/src/connectors/slack/index.js.map +1 -1
  7. package/dist/src/connectors/slack/triage-prompt.d.ts +16 -0
  8. package/dist/src/connectors/slack/triage-prompt.d.ts.map +1 -1
  9. package/dist/src/connectors/slack/triage-prompt.js +42 -4
  10. package/dist/src/connectors/slack/triage-prompt.js.map +1 -1
  11. package/dist/src/engines/__tests__/claude-interactive-transcript-recovery.test.d.ts +2 -0
  12. package/dist/src/engines/__tests__/claude-interactive-transcript-recovery.test.d.ts.map +1 -0
  13. package/dist/src/engines/__tests__/claude-interactive-transcript-recovery.test.js +84 -0
  14. package/dist/src/engines/__tests__/claude-interactive-transcript-recovery.test.js.map +1 -0
  15. package/dist/src/engines/__tests__/claude-interactive.test.js +107 -1
  16. package/dist/src/engines/__tests__/claude-interactive.test.js.map +1 -1
  17. package/dist/src/engines/__tests__/pty-lifecycle.test.js +33 -0
  18. package/dist/src/engines/__tests__/pty-lifecycle.test.js.map +1 -1
  19. package/dist/src/engines/__tests__/sse-pty-proxy-busy.test.d.ts +2 -0
  20. package/dist/src/engines/__tests__/sse-pty-proxy-busy.test.d.ts.map +1 -0
  21. package/dist/src/engines/__tests__/sse-pty-proxy-busy.test.js +67 -0
  22. package/dist/src/engines/__tests__/sse-pty-proxy-busy.test.js.map +1 -0
  23. package/dist/src/engines/claude-interactive.d.ts +59 -0
  24. package/dist/src/engines/claude-interactive.d.ts.map +1 -1
  25. package/dist/src/engines/claude-interactive.js +335 -17
  26. package/dist/src/engines/claude-interactive.js.map +1 -1
  27. package/dist/src/engines/pty-lifecycle.d.ts +9 -0
  28. package/dist/src/engines/pty-lifecycle.d.ts.map +1 -1
  29. package/dist/src/engines/pty-lifecycle.js +13 -0
  30. package/dist/src/engines/pty-lifecycle.js.map +1 -1
  31. package/dist/src/engines/sse-pty-proxy.d.ts +15 -0
  32. package/dist/src/engines/sse-pty-proxy.d.ts.map +1 -1
  33. package/dist/src/engines/sse-pty-proxy.js +34 -0
  34. package/dist/src/engines/sse-pty-proxy.js.map +1 -1
  35. package/dist/src/gateway/__tests__/hook-registry.test.js +50 -0
  36. package/dist/src/gateway/__tests__/hook-registry.test.js.map +1 -1
  37. package/dist/src/gateway/__tests__/status-reconciler.test.d.ts +2 -0
  38. package/dist/src/gateway/__tests__/status-reconciler.test.d.ts.map +1 -0
  39. package/dist/src/gateway/__tests__/status-reconciler.test.js +100 -0
  40. package/dist/src/gateway/__tests__/status-reconciler.test.js.map +1 -0
  41. package/dist/src/gateway/hook-registry.d.ts +12 -0
  42. package/dist/src/gateway/hook-registry.d.ts.map +1 -1
  43. package/dist/src/gateway/hook-registry.js +26 -0
  44. package/dist/src/gateway/hook-registry.js.map +1 -1
  45. package/dist/src/gateway/server.d.ts.map +1 -1
  46. package/dist/src/gateway/server.js +20 -0
  47. package/dist/src/gateway/server.js.map +1 -1
  48. package/dist/src/gateway/status-reconciler.d.ts +32 -0
  49. package/dist/src/gateway/status-reconciler.d.ts.map +1 -0
  50. package/dist/src/gateway/status-reconciler.js +74 -0
  51. package/dist/src/gateway/status-reconciler.js.map +1 -0
  52. package/dist/src/sessions/manager.d.ts +15 -0
  53. package/dist/src/sessions/manager.d.ts.map +1 -1
  54. package/dist/src/sessions/manager.js +120 -2
  55. package/dist/src/sessions/manager.js.map +1 -1
  56. package/dist/src/shared/__tests__/rateLimit.test.js +21 -1
  57. package/dist/src/shared/__tests__/rateLimit.test.js.map +1 -1
  58. package/dist/src/shared/rateLimit.d.ts +1 -0
  59. package/dist/src/shared/rateLimit.d.ts.map +1 -1
  60. package/dist/src/shared/rateLimit.js +17 -0
  61. package/dist/src/shared/rateLimit.js.map +1 -1
  62. package/dist/src/shared/types.d.ts +9 -0
  63. package/dist/src/shared/types.d.ts.map +1 -1
  64. package/package.json +1 -1
@@ -21,6 +21,11 @@ export interface PtyLifecycleOpts {
21
21
  onAdopt?: (sessionId: string) => void;
22
22
  /** Called after a PTY is killed/removed — used to clean the --settings file, hook registry, gateway.json pids. */
23
23
  onCleanup?: (sessionId: string) => void;
24
+ /** Extra liveness probe consulted by the sweep/eviction: return true while the
25
+ * PTY's engine is still doing work the lifecycle can't see as a "turn" (e.g.
26
+ * an autonomous background continuation streaming API requests). A busy PTY
27
+ * is never reaped or LRU-evicted — killing it would abort in-flight work. */
28
+ isBusy?: (sessionId: string) => boolean;
24
29
  }
25
30
  export declare class PtyLifecycleManager {
26
31
  private opts;
@@ -35,6 +40,10 @@ export declare class PtyLifecycleManager {
35
40
  viewerLeave(sessionId: string): void;
36
41
  turnStarted(sessionId: string): void;
37
42
  turnEnded(sessionId: string): void;
43
+ /** Signal out-of-turn engine activity (e.g. an orphan hook from a background
44
+ * continuation). Restarts the keep-warm grace window so an actively-working
45
+ * PTY isn't reaped between activity signals. No-op while a turn is running. */
46
+ touch(sessionId: string): void;
38
47
  releaseSession(sessionId: string): void;
39
48
  killAll(): void;
40
49
  private reevaluate;
@@ -1 +1 @@
1
- {"version":3,"file":"pty-lifecycle.d.ts","sourceRoot":"","sources":["../../../src/engines/pty-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,4BAA4B,QAAiB,CAAC;AAE3D,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,kHAAkH;IAClH,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAkBD,qBAAa,mBAAmB;IAIlB,OAAO,CAAC,IAAI;IAHxB,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,UAAU,CAA6B;gBAE3B,IAAI,EAAE,gBAAgB;IAK1C,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI;IAYjD,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIjD,YAAY,IAAI,OAAO;IAIvB,QAAQ,IAAI,MAAM,EAAE;IAIpB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAOpC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAUpC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAKpC,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQlC,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQvC,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,KAAK;IAIb;6FACyF;IACzF,OAAO,CAAC,QAAQ;IAchB,OAAO,IAAI,IAAI;CAIhB"}
1
+ {"version":3,"file":"pty-lifecycle.d.ts","sourceRoot":"","sources":["../../../src/engines/pty-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,4BAA4B,QAAiB,CAAC;AAE3D,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,kHAAkH;IAClH,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC;;;kFAG8E;IAC9E,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;CACzC;AAkBD,qBAAa,mBAAmB;IAIlB,OAAO,CAAC,IAAI;IAHxB,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,UAAU,CAA6B;gBAE3B,IAAI,EAAE,gBAAgB;IAK1C,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI;IAYjD,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIjD,YAAY,IAAI,OAAO;IAIvB,QAAQ,IAAI,MAAM,EAAE;IAIpB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAOpC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAUpC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAKpC,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQlC;;oFAEgF;IAChF,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAM9B,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQvC,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,KAAK;IAIb;6FACyF;IACzF,OAAO,CAAC,QAAQ;IAehB,OAAO,IAAI,IAAI;CAIhB"}
@@ -80,6 +80,15 @@ export class PtyLifecycleManager {
80
80
  e.lastTurnEndedAt = Date.now();
81
81
  this.reevaluate(sessionId);
82
82
  }
83
+ /** Signal out-of-turn engine activity (e.g. an orphan hook from a background
84
+ * continuation). Restarts the keep-warm grace window so an actively-working
85
+ * PTY isn't reaped between activity signals. No-op while a turn is running. */
86
+ touch(sessionId) {
87
+ const e = this.entries.get(sessionId);
88
+ if (!e || e.turnRunning)
89
+ return;
90
+ e.lastTurnEndedAt = Date.now();
91
+ }
83
92
  releaseSession(sessionId) {
84
93
  const e = this.entries.get(sessionId);
85
94
  if (!e)
@@ -97,6 +106,8 @@ export class PtyLifecycleManager {
97
106
  const e = this.entries.get(sessionId);
98
107
  if (!e)
99
108
  return;
109
+ if (this.opts.isBusy?.(sessionId))
110
+ return;
100
111
  if (!shouldStayAlive(e, Date.now()))
101
112
  this.releaseSession(sessionId);
102
113
  }
@@ -112,6 +123,8 @@ export class PtyLifecycleManager {
112
123
  for (const [id, e] of this.entries.entries()) {
113
124
  if (e.turnRunning || e.viewerCount > 0)
114
125
  continue;
126
+ if (this.opts.isBusy?.(id))
127
+ continue;
115
128
  const since = Math.max(e.viewingEndedAt, e.lastTurnEndedAt);
116
129
  if (since < oldest) {
117
130
  oldest = since;
@@ -1 +1 @@
1
- {"version":3,"file":"pty-lifecycle.js","sourceRoot":"","sources":["../../../src/engines/pty-lifecycle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pty-lifecycle.js","sourceRoot":"","sources":["../../../src/engines/pty-lifecycle.ts"],"names":[],"mappings":"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"}
@@ -64,6 +64,12 @@ export declare class SsePtyProxy {
64
64
  /** Fingerprint of the top-level (main) agent's system prompt, captured from the
65
65
  * first classifiable request. Streams whose system prompt differs are sub-agents. */
66
66
  private mainSystemFp;
67
+ /** Upstream requests currently streaming through this proxy. Non-zero means the
68
+ * claude behind this PTY is mid-API-call (main agent OR a sub-agent). */
69
+ private inflightCount;
70
+ /** Epoch ms of the most recent upstream activity (request start, response
71
+ * bytes, or completion). 0 until the first request. */
72
+ private lastUpstreamActivityAt;
67
73
  private readonly requestFn;
68
74
  private readonly upstreamHost;
69
75
  private readonly upstreamPort;
@@ -73,6 +79,15 @@ export declare class SsePtyProxy {
73
79
  start(): Promise<number>;
74
80
  /** Tear down the proxy. Safe to call multiple times. */
75
81
  stop(): void;
82
+ /** True while the claude behind this PTY is demonstrably working: an upstream
83
+ * request is in flight, or one finished within `recentMs`. Used by the PTY
84
+ * lifecycle so the keep-warm reaper never kills a PTY mid-background-work
85
+ * (tool executions between API calls produce short gaps — `recentMs` bridges
86
+ * them). */
87
+ isBusy(recentMs: number): boolean;
88
+ /** Strictly in-flight (no recency window): an upstream request is streaming
89
+ * through this proxy right now. */
90
+ hasInflight(): boolean;
76
91
  private handle;
77
92
  /** Forward one buffered request upstream and stream the response back. On a
78
93
  * "stale pooled socket" error before any response bytes, retry ONCE on a
@@ -1 +1 @@
1
- {"version":3,"file":"sse-pty-proxy.d.ts","sourceRoot":"","sources":["../../../src/engines/sse-pty-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,KAAK,MAAM,YAAY,CAAC;AAe/B,iFAAiF;AACjF,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED;;0BAE0B;AAC1B,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AA4CD;+EAC+E;AAC/E,KAAK,iBAAiB,GAAG,CACvB,OAAO,EAAE,KAAK,CAAC,cAAc,EAC7B,EAAE,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,KAAK,IAAI,KACpC,IAAI,CAAC,aAAa,CAAC;AAExB;uEACuE;AACvE,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,QAAQ,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,wEAAwE;IACxE,YAAY,CAAC,EAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;CACjD;AAcD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,WAAW;IAcpB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAd1B,OAAO,CAAC,MAAM,CAAc;IAC5B,2DAA2D;IAC3D,IAAI,SAAK;IACT;0FACsF;IACtF,OAAO,CAAC,YAAY,CAAuB;IAE3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoB;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmC;gBAG7C,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,SAAS,KAAK,IAAI,EACnE,IAAI,GAAE,eAAoB;IAe5B,0EAA0E;IAC1E,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAaxB,wDAAwD;IACxD,IAAI,IAAI,IAAI;IAIZ,OAAO,CAAC,MAAM;IAgCd;;;;;yCAKqC;IACrC,OAAO,CAAC,YAAY;IAsDpB;;;kFAG8E;IAC9E,OAAO,CAAC,eAAe;IAuBvB;;uFAEmF;IACnF,OAAO,CAAC,QAAQ;CAmBjB"}
1
+ {"version":3,"file":"sse-pty-proxy.d.ts","sourceRoot":"","sources":["../../../src/engines/sse-pty-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,KAAK,MAAM,YAAY,CAAC;AAe/B,iFAAiF;AACjF,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED;;0BAE0B;AAC1B,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AA4CD;+EAC+E;AAC/E,KAAK,iBAAiB,GAAG,CACvB,OAAO,EAAE,KAAK,CAAC,cAAc,EAC7B,EAAE,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,KAAK,IAAI,KACpC,IAAI,CAAC,aAAa,CAAC;AAExB;uEACuE;AACvE,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,QAAQ,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,wEAAwE;IACxE,YAAY,CAAC,EAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;CACjD;AAcD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,WAAW;IAoBpB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IApB1B,OAAO,CAAC,MAAM,CAAc;IAC5B,2DAA2D;IAC3D,IAAI,SAAK;IACT;0FACsF;IACtF,OAAO,CAAC,YAAY,CAAuB;IAC3C;8EAC0E;IAC1E,OAAO,CAAC,aAAa,CAAK;IAC1B;4DACwD;IACxD,OAAO,CAAC,sBAAsB,CAAK;IAEnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoB;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmC;gBAG7C,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,SAAS,KAAK,IAAI,EACnE,IAAI,GAAE,eAAoB;IAe5B,0EAA0E;IAC1E,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAaxB,wDAAwD;IACxD,IAAI,IAAI,IAAI;IAIZ;;;;iBAIa;IACb,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAKjC;wCACoC;IACpC,WAAW,IAAI,OAAO;IAItB,OAAO,CAAC,MAAM;IA4Cd;;;;;yCAKqC;IACrC,OAAO,CAAC,YAAY;IAuDpB;;;kFAG8E;IAC9E,OAAO,CAAC,eAAe;IAuBvB;;uFAEmF;IACnF,OAAO,CAAC,QAAQ;CAmBjB"}
@@ -99,6 +99,12 @@ export class SsePtyProxy {
99
99
  /** Fingerprint of the top-level (main) agent's system prompt, captured from the
100
100
  * first classifiable request. Streams whose system prompt differs are sub-agents. */
101
101
  mainSystemFp = null;
102
+ /** Upstream requests currently streaming through this proxy. Non-zero means the
103
+ * claude behind this PTY is mid-API-call (main agent OR a sub-agent). */
104
+ inflightCount = 0;
105
+ /** Epoch ms of the most recent upstream activity (request start, response
106
+ * bytes, or completion). 0 until the first request. */
107
+ lastUpstreamActivityAt = 0;
102
108
  requestFn;
103
109
  upstreamHost;
104
110
  upstreamPort;
@@ -141,11 +147,28 @@ export class SsePtyProxy {
141
147
  }
142
148
  catch { /* already closed */ }
143
149
  }
150
+ /** True while the claude behind this PTY is demonstrably working: an upstream
151
+ * request is in flight, or one finished within `recentMs`. Used by the PTY
152
+ * lifecycle so the keep-warm reaper never kills a PTY mid-background-work
153
+ * (tool executions between API calls produce short gaps — `recentMs` bridges
154
+ * them). */
155
+ isBusy(recentMs) {
156
+ if (this.inflightCount > 0)
157
+ return true;
158
+ return this.lastUpstreamActivityAt > 0 && Date.now() - this.lastUpstreamActivityAt < recentMs;
159
+ }
160
+ /** Strictly in-flight (no recency window): an upstream request is streaming
161
+ * through this proxy right now. */
162
+ hasInflight() {
163
+ return this.inflightCount > 0;
164
+ }
144
165
  handle(req, res) {
145
166
  const chunks = [];
146
167
  // Holder (not a plain `let`) so the req-close handler always destroys the
147
168
  // CURRENT in-flight upstream even after a retry swapped it out.
148
169
  const inflight = {};
170
+ // True from req 'end' (in-flight count incremented) until res 'close'.
171
+ let counted = false;
149
172
  req.on("data", (c) => chunks.push(c));
150
173
  req.on("error", () => { try {
151
174
  res.destroy();
@@ -165,8 +188,18 @@ export class SsePtyProxy {
165
188
  }
166
189
  catch { /* ignore */ }
167
190
  }
191
+ // 'close' fires exactly once per response (finished or aborted) — the
192
+ // symmetric end of the in-flight window opened at req 'end'.
193
+ if (counted) {
194
+ counted = false;
195
+ this.inflightCount = Math.max(0, this.inflightCount - 1);
196
+ this.lastUpstreamActivityAt = Date.now();
197
+ }
168
198
  });
169
199
  req.on("end", () => {
200
+ counted = true;
201
+ this.inflightCount += 1;
202
+ this.lastUpstreamActivityAt = Date.now();
170
203
  const body = Buffer.concat(chunks);
171
204
  // Classify once per request: main agent (untagged) vs Task sub-agent (tagged
172
205
  // with a stable id so the chat pane routes it into a card). Decided from the
@@ -201,6 +234,7 @@ export class SsePtyProxy {
201
234
  const isSSE = String(uRes.headers["content-type"] || "").includes("text/event-stream");
202
235
  let sseBuf = "";
203
236
  uRes.on("data", (chunk) => {
237
+ this.lastUpstreamActivityAt = Date.now();
204
238
  // Forward UNCHANGED to the client first (never let parsing affect the stream).
205
239
  try {
206
240
  res.write(chunk);
@@ -1 +1 @@
1
- {"version":3,"file":"sse-pty-proxy.js","sourceRoot":"","sources":["../../../src/engines/sse-pty-proxy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sse-pty-proxy.js","sourceRoot":"","sources":["../../../src/engines/sse-pty-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C;;;0CAG0C;AAC1C,MAAM,aAAa,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;AAE3E;;uCAEuC;AACvC,MAAM,wBAAwB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAe/C;;;;;;iCAMiC;AACjC,SAAS,qBAAqB,CAAC,MAAe;IAC5C,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CACvB,CAAC,CAAC,EAAyC,EAAE,CAC3C,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAK,CAAuB,CAAC,IAAI,KAAK,MAAM,IAAI,OAAQ,CAAuB,CAAC,IAAI,KAAK,QAAQ,CAChI,CAAC;QACF,IAAI,KAAK,EAAE,IAAI;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IACrC,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED;;wEAEwE;AACxE,SAAS,aAAa,CAAC,QAAiB;IACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,SAAS;QAC1C,MAAM,GAAG,GAAG,CAAyC,CAAC;QACtD,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;YAAE,SAAS;QAClC,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC,OAAO,CAAC;QACxD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO;iBACpB,MAAM,CAAC,CAAC,CAAC,EAAyC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC;iBAClF,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;iBAC9D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAc,CAAC;iBAC5B,IAAI,CAAC,GAAG,CAAC,CAAC;YACb,OAAO,GAAG,CAAC;QACb,CAAC;QACD,OAAO,EAAE,CAAC,CAAC,uEAAuE;IACpF,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAkBD;;;uEAGuE;AACvE,SAAS,wBAAwB,CAAC,GAA0B;IAC1D,OAAO,CACL,GAAG,CAAC,IAAI,KAAK,YAAY;QACzB,GAAG,CAAC,IAAI,KAAK,OAAO;QACpB,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CACpC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,OAAO,WAAW;IAoBH;IACA;IApBX,MAAM,CAAc;IAC5B,2DAA2D;IAC3D,IAAI,GAAG,CAAC,CAAC;IACT;0FACsF;IAC9E,YAAY,GAAkB,IAAI,CAAC;IAC3C;8EAC0E;IAClE,aAAa,GAAG,CAAC,CAAC;IAC1B;4DACwD;IAChD,sBAAsB,GAAG,CAAC,CAAC;IAElB,SAAS,CAAoB;IAC7B,YAAY,CAAS;IACrB,YAAY,CAAS;IACrB,YAAY,CAAmC;IAEhE,YACmB,KAAa,EACb,OAAkD,EACnE,OAAwB,EAAE;QAFT,UAAK,GAAL,KAAK,CAAQ;QACb,YAAO,GAAP,OAAO,CAA2C;QAGnE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC;QACjD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,IAAI,mBAAmB,CAAC;QACnE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,GAAG,CAAC;QAC/C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,aAAa,CAAC;QACvD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACrE,yEAAyE;QACzE,4CAA4C;QAC5C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;YAC5C,MAAM,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,KAAK,kBAAkB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACtE,IAAI,CAAC;gBAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,0EAA0E;IAC1E,KAAK;QACH,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC7C,MAAM,KAAK,GAAG,CAAC,GAAU,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;gBACtC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBAChC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnC,IAAI,CAAC,IAAI,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7D,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,wDAAwD;IACxD,IAAI;QACF,IAAI,CAAC;YAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAC7D,CAAC;IAED;;;;iBAIa;IACb,MAAM,CAAC,QAAgB;QACrB,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACxC,OAAO,IAAI,CAAC,sBAAsB,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,sBAAsB,GAAG,QAAQ,CAAC;IAChG,CAAC;IAED;wCACoC;IACpC,WAAW;QACT,OAAO,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;IAChC,CAAC;IAEO,MAAM,CAAC,GAAyB,EAAE,GAAwB;QAChE,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,0EAA0E;QAC1E,gEAAgE;QAChE,MAAM,QAAQ,GAAqC,EAAE,CAAC;QACtD,uEAAuE;QACvE,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;YAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,6EAA6E;QAC7E,0EAA0E;QAC1E,6EAA6E;QAC7E,2EAA2E;QAC3E,8EAA8E;QAC9E,sEAAsE;QACtE,gDAAgD;QAChD,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACnB,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;gBAAC,IAAI,CAAC;oBAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YAAC,CAAC;YAC1F,sEAAsE;YACtE,6DAA6D;YAC7D,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,GAAG,KAAK,CAAC;gBAChB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;gBACzD,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC3C,CAAC;QACH,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YACjB,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC;YACxB,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACnC,6EAA6E;YAC7E,6EAA6E;YAC7E,wDAAwD;YACxD,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,OAAO,GAA4B,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;YACrF,uEAAuE;YACvE,0EAA0E;YAC1E,OAAO,OAAO,CAAC,iBAAiB,CAAC,CAAC;YAElC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;yCAKqC;IAC7B,YAAY,CAClB,GAAyB,EACzB,GAAwB,EACxB,IAAY,EACZ,GAAc,EACd,OAAgC,EAChC,QAA0C,EAC1C,OAAe;QAEf,0EAA0E;QAC1E,wDAAwD;QACxD,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAC7B;YACE,QAAQ,EAAE,IAAI,CAAC,YAAY;YAC3B,IAAI,EAAE,IAAI,CAAC,YAAY;YACvB,IAAI,EAAE,GAAG,CAAC,GAAG;YACb,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,OAAO,EAAE,OAAmC;YAC5C,KAAK;SACN,EACD,CAAC,IAAI,EAAE,EAAE;YACP,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,IAAI,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACpD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;YACvF,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBAChC,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACzC,+EAA+E;gBAC/E,IAAI,CAAC;oBAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;gBACrD,IAAI,KAAK;oBAAE,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;YAC3E,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;gBAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3E,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;gBAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,CAAC,CACF,CAAC;QACF,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC;QAC5B,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;YAClD,0EAA0E;YAC1E,kEAAkE;YAClE,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvE,MAAM,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,KAAK,cAAc,GAAG,CAAC,OAAO,6BAA6B,CAAC,CAAC;gBAC7F,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;gBACvE,OAAO;YACT,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,KAAK,qBAAqB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACzE,IAAI,CAAC;gBAAC,IAAI,CAAC,GAAG,CAAC,WAAW;oBAAE,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACrF,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,UAAU,CAAC,wBAAwB,EAAE,GAAG,EAAE;YACjD,MAAM,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,KAAK,sCAAsC,CAAC,CAAC;YAC7E,IAAI,CAAC;gBAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,MAAM;YAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,QAAQ,CAAC,GAAG,EAAE,CAAC;IACjB,CAAC;IAED;;;kFAG8E;IACtE,eAAe,CAAC,IAAY;QAClC,IAAI,IAAI,GAAqE,IAAI,CAAC;QAClF,IAAI,CAAC;YAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAA8D,CAAC;QAAC,CAAC;QAC/G,MAAM,CAAC;YAAC,OAAO,EAAE,CAAC;QAAC,CAAC;QACpB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI;YAAE,OAAO,EAAE,CAAC,CAAiB,wBAAwB;QACrF,4EAA4E;QAC5E,6EAA6E;QAC7E,4EAA4E;QAC5E,wEAAwE;QACxE,2EAA2E;QAC3E,sDAAsD;QACtD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACrE,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvF,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC;YAAC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;YAAC,OAAO,EAAE,CAAC;QAAC,CAAC,CAAC,eAAe;QACrF,IAAI,EAAE,KAAK,IAAI,CAAC,YAAY;YAAE,OAAO,EAAE,CAAC,CAAqB,aAAa;QAC1E,mFAAmF;QACnF,oFAAoF;QACpF,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACjF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;QACpD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;IACrC,CAAC;IAED;;uFAEmF;IAC3E,QAAQ,CAAC,GAAW,EAAE,GAAc;QAC1C,IAAI,GAAW,CAAC;QAChB,uEAAuE;QACvE,OAAO,CAAC,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC3C,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC9B,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;YAC/C,IAAI,OAAO,GAAG,EAAE,CAAC;YACjB,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;oBAAE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;YACrE,CAAC;YACD,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,QAAQ;gBAAE,SAAS;YAC/C,IAAI,MAAoB,CAAC;YACzB,IAAI,CAAC;gBAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAiB,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,SAAS;YAAC,CAAC;YACzE,IAAI,CAAC;gBAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAAC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBAC9C,MAAM,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,KAAK,oBAAoB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/G,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AAED,+EAA+E;AAC/E,SAAS,eAAe,CAAC,GAAW;IAClC,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9B,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAClC,IAAI,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACvB,IAAI,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACvB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,aAAa,CAAC,GAAW,EAAE,GAAW;IAC7C,OAAO,GAAG,CAAC,UAAU,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC"}
@@ -48,6 +48,56 @@ describe("HookRegistry", () => {
48
48
  reg.register("s4", (h) => seen.push(h.hook_event_name));
49
49
  expect(seen).toEqual([]);
50
50
  });
51
+ it("routes a Stop with no listener to the orphan handler and does NOT buffer it", () => {
52
+ const reg = make();
53
+ const orphans = [];
54
+ reg.setOrphanHandler((sid, h) => orphans.push(`${sid}:${h.hook_event_name}`));
55
+ reg.deliver("s6", { hook_event_name: "Stop", last_assistant_message: "done" });
56
+ expect(orphans).toEqual(["s6:Stop"]);
57
+ // A later register must NOT drain the consumed Stop into the new resolver —
58
+ // that would settle the next turn instantly with the previous turn's text.
59
+ const seen = [];
60
+ reg.register("s6", (h) => seen.push(h.hook_event_name));
61
+ expect(seen).toEqual([]);
62
+ });
63
+ it("routes a StopFailure orphan to the handler and does not buffer it", () => {
64
+ const reg = make();
65
+ const orphans = [];
66
+ reg.setOrphanHandler((sid, h) => orphans.push(h.hook_event_name));
67
+ reg.deliver("s7", { hook_event_name: "StopFailure", error: "server_error" });
68
+ expect(orphans).toEqual(["StopFailure"]);
69
+ const seen = [];
70
+ reg.register("s7", (h) => seen.push(h.hook_event_name));
71
+ expect(seen).toEqual([]);
72
+ });
73
+ it("still buffers non-terminal orphans (and surfaces them as activity)", () => {
74
+ const reg = make();
75
+ const orphans = [];
76
+ reg.setOrphanHandler((_sid, h) => orphans.push(h.hook_event_name));
77
+ reg.deliver("s8", { hook_event_name: "PostToolUse" });
78
+ expect(orphans).toEqual(["PostToolUse"]); // activity signal fired
79
+ const seen = [];
80
+ reg.register("s8", (h) => seen.push(h.hook_event_name));
81
+ expect(seen).toEqual(["PostToolUse"]); // and it still drains on register
82
+ });
83
+ it("does not invoke the orphan handler when a listener is registered", () => {
84
+ const reg = make();
85
+ const orphans = [];
86
+ reg.setOrphanHandler((_sid, h) => orphans.push(h.hook_event_name));
87
+ const seen = [];
88
+ reg.register("s9", (h) => seen.push(h.hook_event_name));
89
+ reg.deliver("s9", { hook_event_name: "Stop" });
90
+ expect(seen).toEqual(["Stop"]);
91
+ expect(orphans).toEqual([]);
92
+ });
93
+ it("swallows orphan-handler exceptions (terminal orphans stay consumed)", () => {
94
+ const reg = make();
95
+ reg.setOrphanHandler(() => { throw new Error("boom"); });
96
+ expect(() => reg.deliver("s10", { hook_event_name: "Stop" })).not.toThrow();
97
+ const seen = [];
98
+ reg.register("s10", (h) => seen.push(h.hook_event_name));
99
+ expect(seen).toEqual([]);
100
+ });
51
101
  it("periodic sweep evicts stale entries but keeps fresh ones", async () => {
52
102
  const reg = make(50, 10); // 50ms TTL, 10ms sweep
53
103
  // t=0: deliver a stale entry that should age past TTL by t=80ms.
@@ -1 +1 @@
1
- {"version":3,"file":"hook-registry.test.js","sourceRoot":"","sources":["../../../../src/gateway/__tests__/hook-registry.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hook-registry.test.js","sourceRoot":"","sources":["../../../../src/gateway/__tests__/hook-registry.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=status-reconciler.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-reconciler.test.d.ts","sourceRoot":"","sources":["../../../../src/gateway/__tests__/status-reconciler.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,100 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+ const listSessions = vi.fn();
3
+ const updateSession = vi.fn();
4
+ vi.mock("../../sessions/registry.js", () => ({
5
+ listSessions: (...a) => listSessions(...a),
6
+ updateSession: (...a) => updateSession(...a),
7
+ }));
8
+ import { sweepOnce } from "../status-reconciler.js";
9
+ const NOW = Date.parse("2026-07-02T12:00:00Z");
10
+ const iso = (msAgo) => new Date(NOW - msAgo).toISOString();
11
+ function makeSession(overrides = {}) {
12
+ return {
13
+ id: "s1",
14
+ engine: "claude",
15
+ status: "running",
16
+ lastActivity: iso(120_000), // stale by default
17
+ employee: null,
18
+ title: "t",
19
+ ...overrides,
20
+ };
21
+ }
22
+ function makeDeps(overrides = {}) {
23
+ const emitted = [];
24
+ return {
25
+ engines: new Map(),
26
+ emit: (event, payload) => emitted.push({ event, payload }),
27
+ now: () => NOW,
28
+ pendingStuck: new Set(),
29
+ emitted,
30
+ ...overrides,
31
+ };
32
+ }
33
+ beforeEach(() => {
34
+ listSessions.mockReset();
35
+ updateSession.mockReset();
36
+ });
37
+ describe("status-reconciler sweepOnce", () => {
38
+ it("skips sessions with a fresh heartbeat", () => {
39
+ listSessions.mockReturnValue([makeSession({ lastActivity: iso(10_000) })]);
40
+ const deps = makeDeps();
41
+ expect(sweepOnce(deps)).toBe(0);
42
+ expect(updateSession).not.toHaveBeenCalled();
43
+ });
44
+ it("skips stale sessions whose engine reports a live turn", () => {
45
+ listSessions.mockReturnValue([makeSession()]);
46
+ const engines = new Map([
47
+ ["claude", { isTurnRunning: (id) => id === "s1" }],
48
+ ]);
49
+ const deps = makeDeps({ engines: engines });
50
+ expect(sweepOnce(deps)).toBe(0);
51
+ expect(updateSession).not.toHaveBeenCalled();
52
+ });
53
+ it("resets a stuck session only on the SECOND consecutive sweep", () => {
54
+ listSessions.mockReturnValue([makeSession()]);
55
+ const engines = new Map([
56
+ ["claude", { isTurnRunning: () => false }],
57
+ ]);
58
+ const deps = makeDeps({ engines: engines });
59
+ expect(sweepOnce(deps)).toBe(0); // first observation — marked, not reset
60
+ expect(updateSession).not.toHaveBeenCalled();
61
+ expect(deps.pendingStuck.has("s1")).toBe(true);
62
+ expect(sweepOnce(deps)).toBe(1); // second consecutive — reset
63
+ expect(updateSession).toHaveBeenCalledWith("s1", expect.objectContaining({ status: "idle", lastError: null }));
64
+ expect(deps.emitted).toEqual([
65
+ expect.objectContaining({ event: "session:completed" }),
66
+ ]);
67
+ expect(deps.pendingStuck.has("s1")).toBe(false);
68
+ });
69
+ it("a live turn between sweeps clears the stuck mark (turn-boundary race)", () => {
70
+ listSessions.mockReturnValue([makeSession()]);
71
+ let running = false;
72
+ const engines = new Map([
73
+ ["claude", { isTurnRunning: () => running }],
74
+ ]);
75
+ const deps = makeDeps({ engines: engines });
76
+ expect(sweepOnce(deps)).toBe(0); // marked
77
+ running = true;
78
+ expect(sweepOnce(deps)).toBe(0); // live turn — mark cleared
79
+ expect(deps.pendingStuck.has("s1")).toBe(false);
80
+ running = false;
81
+ expect(sweepOnce(deps)).toBe(0); // needs two consecutive observations again
82
+ expect(updateSession).not.toHaveBeenCalled();
83
+ });
84
+ it("falls back to isAlive for headless engines and treats unknown engines as no-turn", () => {
85
+ listSessions.mockReturnValue([
86
+ makeSession({ id: "codex-1", engine: "codex" }),
87
+ makeSession({ id: "ghost-1", engine: "ghost" }),
88
+ ]);
89
+ const engines = new Map([
90
+ ["codex", { isAlive: () => true }], // live headless process — skip
91
+ ]);
92
+ const deps = makeDeps({ engines: engines });
93
+ expect(sweepOnce(deps)).toBe(0); // codex skipped; ghost marked (first sweep)
94
+ expect(deps.pendingStuck.has("ghost-1")).toBe(true);
95
+ expect(sweepOnce(deps)).toBe(1); // ghost reset on second sweep
96
+ expect(updateSession).toHaveBeenCalledTimes(1);
97
+ expect(updateSession).toHaveBeenCalledWith("ghost-1", expect.anything());
98
+ });
99
+ });
100
+ //# sourceMappingURL=status-reconciler.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-reconciler.test.js","sourceRoot":"","sources":["../../../../src/gateway/__tests__/status-reconciler.test.ts"],"names":[],"mappings":"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"}
@@ -16,9 +16,21 @@ export declare class HookRegistry {
16
16
  private listeners;
17
17
  private buffer;
18
18
  private sweepTimer;
19
+ /** Invoked for hooks that arrive with NO registered listener (no turn in
20
+ * flight). Stop/StopFailure orphans are the final output of autonomous
21
+ * post-turn work (background sub-agents / tasks finishing after the turn
22
+ * settled) — they are handed here for delivery instead of being buffered
23
+ * (a buffered stale Stop could otherwise drain into the NEXT turn's resolver
24
+ * and settle it with the previous turn's message). Other events are still
25
+ * buffered as before, but also surfaced here as a liveness signal. */
26
+ private orphanHandler;
19
27
  constructor(ttlMs?: number, sweepIntervalMs?: number);
20
28
  register(jinnSessionId: string, listener: HookListener): void;
21
29
  unregister(jinnSessionId: string): void;
30
+ /** Register the orphan-hook handler (see `orphanHandler`). Errors thrown by
31
+ * the handler are swallowed — a delivery failure must never break the hook
32
+ * endpoint. */
33
+ setOrphanHandler(fn: (jinnSessionId: string, payload: HookPayload) => void): void;
22
34
  deliver(jinnSessionId: string, payload: HookPayload): void;
23
35
  /** Drop buffered entries whose `at` is older than ttlMs. */
24
36
  private sweep;
@@ -1 +1 @@
1
- {"version":3,"file":"hook-registry.d.ts","sourceRoot":"","sources":["../../../src/gateway/hook-registry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,eAAe,EAAE,cAAc,GAAG,MAAM,GAAG,aAAa,GAAG,YAAY,GAAG,aAAa,GAAG,MAAM,CAAC;IACjG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uJAAuJ;IACvJ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED,KAAK,YAAY,GAAG,CAAC,CAAC,EAAE,WAAW,KAAK,IAAI,CAAC;AAG7C,qBAAa,YAAY;IAIX,OAAO,CAAC,KAAK;IAHzB,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,UAAU,CAA+C;gBAC7C,KAAK,SAAS,EAAE,eAAe,SAAQ;IAM3D,QAAQ,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI;IAoB7D,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI;IAKvC,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAQ1D,4DAA4D;IAC5D,OAAO,CAAC,KAAK;IASb,2EAA2E;IAC3E,OAAO,IAAI,IAAI;CAMhB"}
1
+ {"version":3,"file":"hook-registry.d.ts","sourceRoot":"","sources":["../../../src/gateway/hook-registry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,eAAe,EAAE,cAAc,GAAG,MAAM,GAAG,aAAa,GAAG,YAAY,GAAG,aAAa,GAAG,MAAM,CAAC;IACjG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uJAAuJ;IACvJ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED,KAAK,YAAY,GAAG,CAAC,CAAC,EAAE,WAAW,KAAK,IAAI,CAAC;AAG7C,qBAAa,YAAY;IAYX,OAAO,CAAC,KAAK;IAXzB,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,UAAU,CAA+C;IACjE;;;;;;2EAMuE;IACvE,OAAO,CAAC,aAAa,CAAwE;gBACzE,KAAK,SAAS,EAAE,eAAe,SAAQ;IAM3D,QAAQ,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI;IAoB7D,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI;IAKvC;;oBAEgB;IAChB,gBAAgB,CAAC,EAAE,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI;IAIjF,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAgB1D,4DAA4D;IAC5D,OAAO,CAAC,KAAK;IASb,2EAA2E;IAC3E,OAAO,IAAI,IAAI;CAMhB"}
@@ -3,6 +3,14 @@ export class HookRegistry {
3
3
  listeners = new Map();
4
4
  buffer = new Map();
5
5
  sweepTimer = null;
6
+ /** Invoked for hooks that arrive with NO registered listener (no turn in
7
+ * flight). Stop/StopFailure orphans are the final output of autonomous
8
+ * post-turn work (background sub-agents / tasks finishing after the turn
9
+ * settled) — they are handed here for delivery instead of being buffered
10
+ * (a buffered stale Stop could otherwise drain into the NEXT turn's resolver
11
+ * and settle it with the previous turn's message). Other events are still
12
+ * buffered as before, but also surfaced here as a liveness signal. */
13
+ orphanHandler = null;
6
14
  constructor(ttlMs = 30_000, sweepIntervalMs = 5_000) {
7
15
  this.ttlMs = ttlMs;
8
16
  this.sweepTimer = setInterval(() => this.sweep(), sweepIntervalMs);
@@ -31,12 +39,30 @@ export class HookRegistry {
31
39
  this.listeners.delete(jinnSessionId);
32
40
  this.buffer.delete(jinnSessionId);
33
41
  }
42
+ /** Register the orphan-hook handler (see `orphanHandler`). Errors thrown by
43
+ * the handler are swallowed — a delivery failure must never break the hook
44
+ * endpoint. */
45
+ setOrphanHandler(fn) {
46
+ this.orphanHandler = fn;
47
+ }
34
48
  deliver(jinnSessionId, payload) {
35
49
  const listener = this.listeners.get(jinnSessionId);
36
50
  if (listener) {
37
51
  listener(payload);
38
52
  return;
39
53
  }
54
+ const isTerminal = payload.hook_event_name === "Stop" || payload.hook_event_name === "StopFailure";
55
+ if (this.orphanHandler) {
56
+ try {
57
+ this.orphanHandler(jinnSessionId, payload);
58
+ }
59
+ catch { /* never break the endpoint */ }
60
+ // Terminal orphans are CONSUMED by the handler: buffering them would let a
61
+ // stale Stop drain into the next turn's resolver and settle it instantly
62
+ // with the previous turn's text.
63
+ if (isTerminal)
64
+ return;
65
+ }
40
66
  const arr = this.buffer.get(jinnSessionId) ?? [];
41
67
  arr.push({ payload, at: Date.now() });
42
68
  this.buffer.set(jinnSessionId, arr);
@@ -1 +1 @@
1
- {"version":3,"file":"hook-registry.js","sourceRoot":"","sources":["../../../src/gateway/hook-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hook-registry.js","sourceRoot":"","sources":["../../../src/gateway/hook-registry.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/gateway/server.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAuB,MAAM,oBAAoB,CAAC;AAqH1E,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAEjD,wBAAsB,YAAY,CAChC,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,cAAc,CAAC,CA6mCzB"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/gateway/server.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAuB,MAAM,oBAAoB,CAAC;AAsH1E,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAEjD,wBAAsB,YAAY,CAChC,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,cAAc,CAAC,CA+nCzB"}
@@ -18,6 +18,7 @@ import { InteractiveClaudeEngine } from "../engines/claude-interactive.js";
18
18
  import { PtyLifecycleManager } from "../engines/pty-lifecycle.js";
19
19
  import { attachPtyWebSocket } from "./pty-ws.js";
20
20
  import { HookRegistry } from "./hook-registry.js";
21
+ import { startStatusReconciler } from "./status-reconciler.js";
21
22
  import { writeGatewayInfo } from "./gateway-info.js";
22
23
  import { cleanupSessionSettings, seedTrust } from "../shared/claude-settings.js";
23
24
  import { GATEWAY_INFO_FILE, HOOK_RELAY_SCRIPT, CLAUDE_SETTINGS_DIR, JINN_HOME } from "../shared/paths.js";
@@ -161,6 +162,10 @@ export async function startGateway(config) {
161
162
  hookRegistry?.unregister(id);
162
163
  cleanupSessionSettings(CLAUDE_SETTINGS_DIR, id);
163
164
  },
165
+ // Never reap/evict a PTY whose claude is mid-API-call (background
166
+ // sub-agents keep streaming after the managed turn settles). Lazily bound:
167
+ // the engine is constructed a few lines below.
168
+ isBusy: (id) => interactiveClaudeEngine?.isEngineBusy(id) ?? false,
164
169
  });
165
170
  // Pass the headless engine as a remote fallback so sshHost employees still run
166
171
  // over SSH (the local PTY can't), while local turns get the Max-subsidized PTY.
@@ -203,6 +208,14 @@ export async function startGateway(config) {
203
208
  }
204
209
  // Session manager
205
210
  const sessionManager = new SessionManager(config, engines, connectorNames);
211
+ // Orphan hooks = engine activity AFTER a turn settled (background sub-agents /
212
+ // tasks still running in the PTY). Any orphan event keeps the PTY alive; a
213
+ // terminal Stop orphan is the final output of that background work and gets
214
+ // delivered to the session's conversation instead of being dropped.
215
+ hookRegistry?.setOrphanHandler((sid, hook) => {
216
+ interactiveClaudeEngine?.noteBackgroundActivity(sid);
217
+ void sessionManager.handleOrphanHook(sid, hook);
218
+ });
206
219
  // Build employee registry
207
220
  let employeeRegistry = scanOrg();
208
221
  logger.info(`Loaded ${employeeRegistry.size} employee(s) from org directory`);
@@ -798,6 +811,9 @@ export async function startGateway(config) {
798
811
  }
799
812
  }
800
813
  };
814
+ // Backstop for lost completion events: unstick sessions stuck at
815
+ // status:"running" with no live turn (see status-reconciler.ts).
816
+ const stopStatusReconciler = startStatusReconciler({ engines, emit });
801
817
  // API context
802
818
  const apiContext = {
803
819
  config: currentConfig,
@@ -1170,6 +1186,10 @@ export async function startGateway(config) {
1170
1186
  if (interactiveClaudeEngine) {
1171
1187
  interactiveClaudeEngine.killAll();
1172
1188
  claudeLifecycle?.dispose();
1189
+ try {
1190
+ stopStatusReconciler();
1191
+ }
1192
+ catch { /* best effort */ }
1173
1193
  try {
1174
1194
  hookRegistry?.dispose();
1175
1195
  }