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.
- package/dist/package.json +1 -1
- package/dist/src/connectors/slack/__tests__/triage-prompt.test.js +43 -1
- package/dist/src/connectors/slack/__tests__/triage-prompt.test.js.map +1 -1
- package/dist/src/connectors/slack/index.d.ts.map +1 -1
- package/dist/src/connectors/slack/index.js +33 -11
- package/dist/src/connectors/slack/index.js.map +1 -1
- package/dist/src/connectors/slack/triage-prompt.d.ts +16 -0
- package/dist/src/connectors/slack/triage-prompt.d.ts.map +1 -1
- package/dist/src/connectors/slack/triage-prompt.js +42 -4
- package/dist/src/connectors/slack/triage-prompt.js.map +1 -1
- package/dist/src/engines/__tests__/claude-interactive-transcript-recovery.test.d.ts +2 -0
- package/dist/src/engines/__tests__/claude-interactive-transcript-recovery.test.d.ts.map +1 -0
- package/dist/src/engines/__tests__/claude-interactive-transcript-recovery.test.js +84 -0
- package/dist/src/engines/__tests__/claude-interactive-transcript-recovery.test.js.map +1 -0
- package/dist/src/engines/__tests__/claude-interactive.test.js +107 -1
- package/dist/src/engines/__tests__/claude-interactive.test.js.map +1 -1
- package/dist/src/engines/__tests__/pty-lifecycle.test.js +33 -0
- package/dist/src/engines/__tests__/pty-lifecycle.test.js.map +1 -1
- package/dist/src/engines/__tests__/sse-pty-proxy-busy.test.d.ts +2 -0
- package/dist/src/engines/__tests__/sse-pty-proxy-busy.test.d.ts.map +1 -0
- package/dist/src/engines/__tests__/sse-pty-proxy-busy.test.js +67 -0
- package/dist/src/engines/__tests__/sse-pty-proxy-busy.test.js.map +1 -0
- package/dist/src/engines/claude-interactive.d.ts +59 -0
- package/dist/src/engines/claude-interactive.d.ts.map +1 -1
- package/dist/src/engines/claude-interactive.js +335 -17
- package/dist/src/engines/claude-interactive.js.map +1 -1
- package/dist/src/engines/pty-lifecycle.d.ts +9 -0
- package/dist/src/engines/pty-lifecycle.d.ts.map +1 -1
- package/dist/src/engines/pty-lifecycle.js +13 -0
- package/dist/src/engines/pty-lifecycle.js.map +1 -1
- package/dist/src/engines/sse-pty-proxy.d.ts +15 -0
- package/dist/src/engines/sse-pty-proxy.d.ts.map +1 -1
- package/dist/src/engines/sse-pty-proxy.js +34 -0
- package/dist/src/engines/sse-pty-proxy.js.map +1 -1
- package/dist/src/gateway/__tests__/hook-registry.test.js +50 -0
- package/dist/src/gateway/__tests__/hook-registry.test.js.map +1 -1
- package/dist/src/gateway/__tests__/status-reconciler.test.d.ts +2 -0
- package/dist/src/gateway/__tests__/status-reconciler.test.d.ts.map +1 -0
- package/dist/src/gateway/__tests__/status-reconciler.test.js +100 -0
- package/dist/src/gateway/__tests__/status-reconciler.test.js.map +1 -0
- package/dist/src/gateway/hook-registry.d.ts +12 -0
- package/dist/src/gateway/hook-registry.d.ts.map +1 -1
- package/dist/src/gateway/hook-registry.js +26 -0
- package/dist/src/gateway/hook-registry.js.map +1 -1
- package/dist/src/gateway/server.d.ts.map +1 -1
- package/dist/src/gateway/server.js +20 -0
- package/dist/src/gateway/server.js.map +1 -1
- package/dist/src/gateway/status-reconciler.d.ts +32 -0
- package/dist/src/gateway/status-reconciler.d.ts.map +1 -0
- package/dist/src/gateway/status-reconciler.js +74 -0
- package/dist/src/gateway/status-reconciler.js.map +1 -0
- package/dist/src/sessions/manager.d.ts +15 -0
- package/dist/src/sessions/manager.d.ts.map +1 -1
- package/dist/src/sessions/manager.js +120 -2
- package/dist/src/sessions/manager.js.map +1 -1
- package/dist/src/shared/__tests__/rateLimit.test.js +21 -1
- package/dist/src/shared/__tests__/rateLimit.test.js.map +1 -1
- package/dist/src/shared/rateLimit.d.ts +1 -0
- package/dist/src/shared/rateLimit.d.ts.map +1 -1
- package/dist/src/shared/rateLimit.js +17 -0
- package/dist/src/shared/rateLimit.js.map +1 -1
- package/dist/src/shared/types.d.ts +9 -0
- package/dist/src/shared/types.d.ts.map +1 -1
- 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;
|
|
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":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;
|
|
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;
|
|
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":"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"}
|
|
@@ -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 @@
|
|
|
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;
|
|
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":"AAgBA,MAAM,OAAO,YAAY;
|
|
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;
|
|
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
|
}
|