instar 1.2.82 → 1.2.83
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/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +99 -1
- package/dist/commands/server.js.map +1 -1
- package/dist/config/ConfigDefaults.d.ts.map +1 -1
- package/dist/config/ConfigDefaults.js +23 -0
- package/dist/config/ConfigDefaults.js.map +1 -1
- package/dist/core/SessionManager.d.ts +43 -0
- package/dist/core/SessionManager.d.ts.map +1 -1
- package/dist/core/SessionManager.js +123 -24
- package/dist/core/SessionManager.js.map +1 -1
- package/dist/core/types.d.ts +26 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/monitoring/SessionReaper.d.ts +153 -0
- package/dist/monitoring/SessionReaper.d.ts.map +1 -0
- package/dist/monitoring/SessionReaper.js +376 -0
- package/dist/monitoring/SessionReaper.js.map +1 -0
- package/dist/monitoring/TokenLedger.d.ts +12 -0
- package/dist/monitoring/TokenLedger.d.ts.map +1 -1
- package/dist/monitoring/TokenLedger.js +22 -0
- package/dist/monitoring/TokenLedger.js.map +1 -1
- package/dist/monitoring/transcriptProber.d.ts +44 -0
- package/dist/monitoring/transcriptProber.d.ts.map +1 -0
- package/dist/monitoring/transcriptProber.js +57 -0
- package/dist/monitoring/transcriptProber.js.map +1 -0
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +6 -0
- package/dist/scaffold/templates.js.map +1 -1
- package/dist/server/AgentServer.d.ts +3 -0
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +1 -0
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/routes.d.ts +3 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +10 -0
- package/dist/server/routes.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +48 -48
- package/src/scaffold/templates.ts +6 -0
- package/upgrades/1.2.83.md +26 -0
- package/upgrades/side-effects/session-reaper.md +42 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigDefaults.d.ts","sourceRoot":"","sources":["../../src/config/ConfigDefaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"ConfigDefaults.d.ts","sourceRoot":"","sources":["../../src/config/ConfigDefaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA0OH,MAAM,MAAM,SAAS,GAAG,iBAAiB,GAAG,YAAY,CAAC;AAEzD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAO7E;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIlF;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAuC5D"}
|
|
@@ -39,6 +39,29 @@ const SHARED_DEFAULTS = {
|
|
|
39
39
|
activeWorkSilenceSentinel: {
|
|
40
40
|
enabled: true,
|
|
41
41
|
},
|
|
42
|
+
// SessionReaper — pressure-aware reaper of idle-but-alive sessions.
|
|
43
|
+
// UNLIKE the sentinels above, default OFF + dry-run: it is the only monitor
|
|
44
|
+
// that *kills* sessions on a heuristic, so it ships dark and must be flipped
|
|
45
|
+
// on by an operator after validating the dry-run log over a real pressure
|
|
46
|
+
// event. enabled:false → never runs; dryRun:true → logs would-reap, kills
|
|
47
|
+
// nothing. See docs/specs/SESSION-REAPER-SPEC.md.
|
|
48
|
+
sessionReaper: {
|
|
49
|
+
enabled: false,
|
|
50
|
+
dryRun: true,
|
|
51
|
+
tickIntervalSec: 120,
|
|
52
|
+
minAgeMinutes: 30,
|
|
53
|
+
confirmObservations: 3,
|
|
54
|
+
confirmWindowMinutes: 10,
|
|
55
|
+
paneCaptureLines: 200,
|
|
56
|
+
recentUserWindowMinutes: 30,
|
|
57
|
+
idleThresholdModerateMinutes: 45,
|
|
58
|
+
idleThresholdCriticalMinutes: 15,
|
|
59
|
+
normalTierReaps: false,
|
|
60
|
+
maxReapsPerTick: 3,
|
|
61
|
+
maxReapsPerHour: 12,
|
|
62
|
+
finalGraceSec: 60,
|
|
63
|
+
protectOpenCommitments: true,
|
|
64
|
+
},
|
|
42
65
|
// Master gate for Telegram delivery of silently-stopped-sentinel
|
|
43
66
|
// escalations. Default false → sentinel notices are housekeeping and stay
|
|
44
67
|
// in the logs (server.log + sentinel-events.jsonl). Set true to receive
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigDefaults.js","sourceRoot":"","sources":["../../src/config/ConfigDefaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,2EAA2E;AAC3E,MAAM,eAAe,GAA4B;IAC/C,UAAU,EAAE;QACV,gBAAgB,EAAE,IAAI;QACtB,qBAAqB,EAAE,KAAK;QAC5B,mEAAmE;QACnE,qDAAqD;QACrD,QAAQ,EAAE;YACR,OAAO,EAAE,IAAI;SACd;QACD,sEAAsE;QACtE,sEAAsE;QACtE,wEAAwE;QACxE,iBAAiB,EAAE;YACjB,OAAO,EAAE,IAAI;SACd;QACD,uEAAuE;QACvE,yEAAyE;QACzE,mEAAmE;QACnE,iEAAiE;QACjE,wBAAwB,EAAE;YACxB,OAAO,EAAE,IAAI;SACd;QACD,yBAAyB,EAAE;YACzB,OAAO,EAAE,IAAI;SACd;QACD,iEAAiE;QACjE,0EAA0E;QAC1E,wEAAwE;QACxE,wEAAwE;QACxE,mEAAmE;QACnE,wEAAwE;QACxE,0BAA0B,EAAE,KAAK;QACjC,UAAU,EAAE;YACV,OAAO,EAAE,IAAI;YACb,WAAW,EAAE;gBACX,OAAO,EAAE,IAAI;gBACb,YAAY,EAAE,IAAI;gBAClB,SAAS,EAAE,IAAI;gBACf,YAAY,EAAE,KAAK;aACpB;YACD,MAAM,EAAE,KAAK;SACd;KACF;IACD,UAAU,EAAE;QACV,YAAY,EAAE,KAAK;QACnB,UAAU,EAAE,QAAQ;QACpB,YAAY,EAAE,CAAC,MAAM,CAAC;KACvB;IACD,2EAA2E;IAC3E,6EAA6E;IAC7E,6EAA6E;IAC7E,6EAA6E;IAC7E,4EAA4E;IAC5E,2EAA2E;IAC3E,gEAAgE;IAChE,+CAA+C;IAC/C,WAAW,EAAE;QACX,OAAO,EAAE;YACP,OAAO,EAAE,IAAI;SACd;KACF;IACD,+EAA+E;IAC/E,0EAA0E;IAC1E,8EAA8E;IAC9E,4EAA4E;IAC5E,UAAU,EAAE;QACV,WAAW,EAAE;YACX,OAAO,EAAE,IAAI;SACd;KACF;IACD,gFAAgF;IAChF,iFAAiF;IACjF,mFAAmF;IACnF,KAAK,EAAE;QACL,OAAO,EAAE,IAAI;KACd;IACD,sEAAsE;IACtE,wEAAwE;IACxE,2EAA2E;IAC3E,oEAAoE;IACpE,qEAAqE;IACrE,kEAAkE;IAClE,SAAS,EAAE;QACT,OAAO,EAAE,IAAI;KACd;IACD,uEAAuE;IACvE,uEAAuE;IACvE,sEAAsE;IACtE,yCAAyC;IACzC,MAAM,EAAE;QACN,YAAY,EAAE,EAAc;KAC7B;IACD,kEAAkE;IAClE,iEAAiE;IACjE,MAAM,EAAE;QACN,KAAK,EAAE,KAAc;KACtB;IACD,0EAA0E;IAC1E,4EAA4E;IAC5E,wEAAwE;IACxE,2EAA2E;IAC3E,sDAAsD;IACtD,OAAO,EAAE;QACP,8BAA8B,EAAE,EAAE,GAAG,MAAM;KAC5C;IACD,qEAAqE;IACrE,2EAA2E;IAC3E,mFAAmF;IACnF,QAAQ,EAAE;QACR,aAAa,EAAE;YACb,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,EAAE;YACb,cAAc,EAAE,MAAM;YACtB,UAAU,EAAE,EAAE,GAAG,MAAM;SACxB;KACF;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,cAAc,GAA4C;IAC9D,iBAAiB,EAAE;QACjB,UAAU,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE;QACpC,kBAAkB,EAAE;YAClB,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;YAC3B,QAAQ,EAAE,EAAE;YACZ,gBAAgB,EAAE,EAAE;YACpB,KAAK,EAAE;gBACL,KAAK,EAAE,eAAe;gBACtB,kBAAkB,EAAE,IAAI;gBACxB,kBAAkB,EAAE,CAAC;aACtB;SACF;QACD,MAAM,EAAE;YACN,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,OAAO;YACb,yEAAyE;YACzE,qEAAqE;YACrE,8BAA8B;YAC9B,cAAc,EAAE,CAAC,aAAa,CAAC;YAC/B,aAAa,EAAE,IAAI;YACnB,YAAY,EAAE,KAAK;YACnB,gBAAgB,EAAE,MAAM;YACxB,WAAW,EAAE,WAAW;SACzB;KACF;IACD,UAAU,EAAE;QACV,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE;QACnC,kBAAkB,EAAE;YAClB,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;YAC3B,QAAQ,EAAE,EAAE;YACZ,gBAAgB,EAAE,EAAE;YACpB,KAAK,EAAE;gBACL,KAAK,EAAE,eAAe;gBACtB,kBAAkB,EAAE,IAAI;gBACxB,kBAAkB,EAAE,CAAC;aACtB;SACF;KACF;CACF,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,mBAAmB,GAA4B;IACnD,kBAAkB,EAAE;QAClB,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QAC3B,QAAQ,EAAE,EAAE;QACZ,gBAAgB,EAAE,EAAE;QACpB,KAAK,EAAE;YACL,KAAK,EAAE,YAAY,EAAS,gDAAgD;YAC5E,kBAAkB,EAAE,KAAK,EAAI,qCAAqC;YAClE,kBAAkB,EAAE,EAAE,EAAO,mBAAmB;SACjD;KACF;CACF,CAAC;AAEF,2BAA2B;AAE3B;;;GAGG;AACH,SAAS,SAAS,CAAC,MAA+B,EAAE,MAA+B;IACjF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,IACE,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACtF,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EACtF,CAAC;YACD,SAAS,CAAC,MAAM,CAAC,GAAG,CAA4B,EAAE,MAAM,CAAC,GAAG,CAA4B,CAAC,CAAC;QAC5F,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;AACH,CAAC;AAMD;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,SAAoB;IAClD,MAAM,IAAI,GAAG,eAAe,CAAC,eAAe,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAC5C,IAAI,SAAS,EAAE,CAAC;QACd,SAAS,CAAC,IAAI,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAoB;IACvD,MAAM,IAAI,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IACxC,SAAS,CAAC,IAAI,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC,CAAC;IACtD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAC3B,MAA+B,EAC/B,QAAiC;IAEjC,MAAM,SAAS,GAAG,IAAI,GAAG,CACvB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC;QACrC,CAAC,CAAC,MAAM,CAAC,iBAA6B;QACtC,CAAC,CAAC,EAAE,CACP,CAAC;IAEF,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,SAAS,KAAK,CAAC,MAA+B,EAAE,MAA+B,EAAE,IAAY;QAC3F,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YAE/C,+CAA+C;YAC/C,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClD,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,oCAAoC,CAAC,CAAC;gBAC9D,SAAS;YACX,CAAC;YAED,IAAI,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,CAAC;gBACrB,0BAA0B;gBAC1B,MAAM,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC3C,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,UAAU,CAAC,CAAC;YACtC,CAAC;iBAAM,IACL,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACtF,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EACtF,CAAC;gBACD,6BAA6B;gBAC7B,KAAK,CAAC,MAAM,CAAC,GAAG,CAA4B,EAAE,MAAM,CAAC,GAAG,CAA4B,EAAE,QAAQ,CAAC,CAAC;YAClG,CAAC;iBAAM,CAAC;gBACN,4EAA4E;gBAC5E,wEAAwE;YAC1E,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC5B,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC3D,CAAC"}
|
|
1
|
+
{"version":3,"file":"ConfigDefaults.js","sourceRoot":"","sources":["../../src/config/ConfigDefaults.ts"],"names":[],"mappings":"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"}
|
|
@@ -68,6 +68,13 @@ export declare class SessionManager extends EventEmitter {
|
|
|
68
68
|
private promptDetector?;
|
|
69
69
|
/** Sessions with active relay leases (prompt relayed, waiting for response) — extends idle timeout */
|
|
70
70
|
private relayLeases;
|
|
71
|
+
/** Sessions the SessionReaper has leased for a two-phase reap (the transient
|
|
72
|
+
* 'reaping' state of SESSION-REAPER-SPEC §3.6). While a session id is here,
|
|
73
|
+
* the idle-kill path skips it so only the reaper acts on it. */
|
|
74
|
+
private reapingSessions;
|
|
75
|
+
/** Sessions whose termination is currently in flight — guards terminateSession()
|
|
76
|
+
* against re-entrant double-kill / double-event emission within a tick. */
|
|
77
|
+
private terminating;
|
|
71
78
|
/** Track pending Telegram injections awaiting agent response.
|
|
72
79
|
* Key = tmuxSession name. Cleared when agent replies via /telegram/reply/:topicId. */
|
|
73
80
|
private pendingInjections;
|
|
@@ -165,6 +172,42 @@ export declare class SessionManager extends EventEmitter {
|
|
|
165
172
|
* Clear a relay lease (prompt was answered or timed out).
|
|
166
173
|
*/
|
|
167
174
|
clearRelayLease(sessionId: string): void;
|
|
175
|
+
/**
|
|
176
|
+
* True if the session has an unexpired relay lease (a prompt was relayed and
|
|
177
|
+
* we are waiting on the user). Gate H of the SessionReaper — keyed on the
|
|
178
|
+
* instar session id, not the tmux name. (SESSION-REAPER-SPEC §3.1(4)H.)
|
|
179
|
+
*/
|
|
180
|
+
isRelayLeaseActive(sessionId: string): boolean;
|
|
181
|
+
/** The resolved protected-session list (incl. the `<project>-server` default).
|
|
182
|
+
* Exposed so the SessionReaper's gate A uses the SAME list the idle-kill /
|
|
183
|
+
* terminateSession guards enforce, rather than re-reading raw file config. */
|
|
184
|
+
getProtectedSessions(): string[];
|
|
185
|
+
/** Mark a session as being reaped (two-phase reap window). The idle-kill path
|
|
186
|
+
* skips reaping sessions so the reaper is the single actor on them. */
|
|
187
|
+
markReaping(sessionId: string): void;
|
|
188
|
+
/** Clear the reaping lease (reap completed or aborted). */
|
|
189
|
+
clearReaping(sessionId: string): void;
|
|
190
|
+
/** True if a reap is in flight for this session. */
|
|
191
|
+
isReaping(sessionId: string): boolean;
|
|
192
|
+
/**
|
|
193
|
+
* Single-writer session termination (SESSION-REAPER-SPEC §3.6). Both the
|
|
194
|
+
* idle-kill path and the SessionReaper funnel through this so a session is
|
|
195
|
+
* killed at most once with exactly-once `beforeSessionKill`/`sessionComplete`
|
|
196
|
+
* emission and a correct `endedReason`.
|
|
197
|
+
*
|
|
198
|
+
* Compare-and-set semantics: a session that is not in a live state
|
|
199
|
+
* ('starting'/'running'), or whose termination is already in flight, is a
|
|
200
|
+
* no-op — this is what prevents the idle-kill ↔ reaper double-kill race.
|
|
201
|
+
*
|
|
202
|
+
* @returns `{ terminated: true }` on a kill performed by THIS call, or
|
|
203
|
+
* `{ terminated: false, skipped }` describing why it was a no-op.
|
|
204
|
+
*/
|
|
205
|
+
terminateSession(sessionId: string, reason: string, opts?: {
|
|
206
|
+
finalStatus?: 'completed' | 'killed';
|
|
207
|
+
}): Promise<{
|
|
208
|
+
terminated: boolean;
|
|
209
|
+
skipped?: string;
|
|
210
|
+
}>;
|
|
168
211
|
/**
|
|
169
212
|
* Associate a Claude Code session UUID with an instar session.
|
|
170
213
|
* Called when the first hook event arrives from a Claude Code session,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../../src/core/SessionManager.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../../src/core/SessionManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -103,6 +103,13 @@ export class SessionManager extends EventEmitter {
|
|
|
103
103
|
promptDetector;
|
|
104
104
|
/** Sessions with active relay leases (prompt relayed, waiting for response) — extends idle timeout */
|
|
105
105
|
relayLeases = new Map(); // session ID → lease expiry timestamp
|
|
106
|
+
/** Sessions the SessionReaper has leased for a two-phase reap (the transient
|
|
107
|
+
* 'reaping' state of SESSION-REAPER-SPEC §3.6). While a session id is here,
|
|
108
|
+
* the idle-kill path skips it so only the reaper acts on it. */
|
|
109
|
+
reapingSessions = new Set();
|
|
110
|
+
/** Sessions whose termination is currently in flight — guards terminateSession()
|
|
111
|
+
* against re-entrant double-kill / double-event emission within a tick. */
|
|
112
|
+
terminating = new Set();
|
|
106
113
|
/** Track pending Telegram injections awaiting agent response.
|
|
107
114
|
* Key = tmuxSession name. Cleared when agent replies via /telegram/reply/:topicId. */
|
|
108
115
|
pendingInjections = new Map();
|
|
@@ -271,6 +278,84 @@ rm() { "${shimRunner}" rm "$@"; }
|
|
|
271
278
|
clearRelayLease(sessionId) {
|
|
272
279
|
this.relayLeases.delete(sessionId);
|
|
273
280
|
}
|
|
281
|
+
/**
|
|
282
|
+
* True if the session has an unexpired relay lease (a prompt was relayed and
|
|
283
|
+
* we are waiting on the user). Gate H of the SessionReaper — keyed on the
|
|
284
|
+
* instar session id, not the tmux name. (SESSION-REAPER-SPEC §3.1(4)H.)
|
|
285
|
+
*/
|
|
286
|
+
isRelayLeaseActive(sessionId) {
|
|
287
|
+
const expiry = this.relayLeases.get(sessionId);
|
|
288
|
+
return expiry != null && expiry > Date.now();
|
|
289
|
+
}
|
|
290
|
+
/** The resolved protected-session list (incl. the `<project>-server` default).
|
|
291
|
+
* Exposed so the SessionReaper's gate A uses the SAME list the idle-kill /
|
|
292
|
+
* terminateSession guards enforce, rather than re-reading raw file config. */
|
|
293
|
+
getProtectedSessions() {
|
|
294
|
+
return this.config.protectedSessions;
|
|
295
|
+
}
|
|
296
|
+
/** Mark a session as being reaped (two-phase reap window). The idle-kill path
|
|
297
|
+
* skips reaping sessions so the reaper is the single actor on them. */
|
|
298
|
+
markReaping(sessionId) {
|
|
299
|
+
this.reapingSessions.add(sessionId);
|
|
300
|
+
}
|
|
301
|
+
/** Clear the reaping lease (reap completed or aborted). */
|
|
302
|
+
clearReaping(sessionId) {
|
|
303
|
+
this.reapingSessions.delete(sessionId);
|
|
304
|
+
}
|
|
305
|
+
/** True if a reap is in flight for this session. */
|
|
306
|
+
isReaping(sessionId) {
|
|
307
|
+
return this.reapingSessions.has(sessionId);
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Single-writer session termination (SESSION-REAPER-SPEC §3.6). Both the
|
|
311
|
+
* idle-kill path and the SessionReaper funnel through this so a session is
|
|
312
|
+
* killed at most once with exactly-once `beforeSessionKill`/`sessionComplete`
|
|
313
|
+
* emission and a correct `endedReason`.
|
|
314
|
+
*
|
|
315
|
+
* Compare-and-set semantics: a session that is not in a live state
|
|
316
|
+
* ('starting'/'running'), or whose termination is already in flight, is a
|
|
317
|
+
* no-op — this is what prevents the idle-kill ↔ reaper double-kill race.
|
|
318
|
+
*
|
|
319
|
+
* @returns `{ terminated: true }` on a kill performed by THIS call, or
|
|
320
|
+
* `{ terminated: false, skipped }` describing why it was a no-op.
|
|
321
|
+
*/
|
|
322
|
+
async terminateSession(sessionId, reason, opts) {
|
|
323
|
+
const session = this.state.getSession(sessionId);
|
|
324
|
+
if (!session)
|
|
325
|
+
return { terminated: false, skipped: 'not-found' };
|
|
326
|
+
// CAS: only live sessions are terminable. Idempotent for already-terminal ones.
|
|
327
|
+
if (session.status !== 'running' && session.status !== 'starting') {
|
|
328
|
+
return { terminated: false, skipped: `already-${session.status}` };
|
|
329
|
+
}
|
|
330
|
+
if (this.config.protectedSessions.includes(session.tmuxSession)) {
|
|
331
|
+
return { terminated: false, skipped: 'protected' };
|
|
332
|
+
}
|
|
333
|
+
// In-flight guard: a concurrent terminate already owns this session.
|
|
334
|
+
if (this.terminating.has(sessionId)) {
|
|
335
|
+
return { terminated: false, skipped: 'in-flight' };
|
|
336
|
+
}
|
|
337
|
+
this.terminating.add(sessionId);
|
|
338
|
+
try {
|
|
339
|
+
// Emit BEFORE destroying tmux so listeners (TopicResumeMap, SlackAdapter)
|
|
340
|
+
// can capture resume UUIDs while the session is still alive.
|
|
341
|
+
this.emit('beforeSessionKill', session);
|
|
342
|
+
try {
|
|
343
|
+
await execFileAsync(this.config.tmuxPath, ['kill-session', '-t', `=${session.tmuxSession}`]);
|
|
344
|
+
}
|
|
345
|
+
catch { /* session may already be dead */ }
|
|
346
|
+
session.status = opts?.finalStatus ?? 'completed';
|
|
347
|
+
session.endedAt = new Date().toISOString();
|
|
348
|
+
session.endedReason = reason;
|
|
349
|
+
this.state.saveSession(session);
|
|
350
|
+
this.emit('sessionComplete', session);
|
|
351
|
+
this.idlePromptSince.delete(session.id);
|
|
352
|
+
this.reapingSessions.delete(session.id);
|
|
353
|
+
return { terminated: true };
|
|
354
|
+
}
|
|
355
|
+
finally {
|
|
356
|
+
this.terminating.delete(sessionId);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
274
359
|
/**
|
|
275
360
|
* Associate a Claude Code session UUID with an instar session.
|
|
276
361
|
* Called when the first hook event arrives from a Claude Code session,
|
|
@@ -465,7 +550,9 @@ rm() { "${shimRunner}" rm "$@"; }
|
|
|
465
550
|
// AND (2) no non-baseline child processes are running. This is the ground
|
|
466
551
|
// truth — no exemptions needed for subagents, topic bindings, or relay leases.
|
|
467
552
|
// If the process tree shows work, the session is active. Period.
|
|
468
|
-
|
|
553
|
+
// Skip sessions the SessionReaper has leased for a two-phase reap — it
|
|
554
|
+
// is the single actor on them while reaping (§3.6).
|
|
555
|
+
if (!this.config.protectedSessions.includes(session.tmuxSession) && !this.isReaping(session.id)) {
|
|
469
556
|
const output = this.captureOutput(session.tmuxSession, 5);
|
|
470
557
|
const isIdleAtPrompt = output && IDLE_PROMPT_PATTERNS.some(p => output.includes(p));
|
|
471
558
|
// ── Prompt Gate: feed captured output to InputDetector ──
|
|
@@ -558,16 +645,9 @@ rm() { "${shimRunner}" rm "$@"; }
|
|
|
558
645
|
}
|
|
559
646
|
const bindingNote = binding != null ? ` (topic-bound, threshold ${killThresholdMinutes}m)` : ` (threshold ${killThresholdMinutes}m)`;
|
|
560
647
|
console.warn(`[SessionManager] Session "${session.name}" idle at prompt for ${Math.round(idleMs / 60_000)}m with no active processes${bindingNote}. Killing zombie.`);
|
|
561
|
-
this
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
}
|
|
565
|
-
catch { /* ignore */ }
|
|
566
|
-
session.status = 'completed';
|
|
567
|
-
session.endedAt = new Date().toISOString();
|
|
568
|
-
this.state.saveSession(session);
|
|
569
|
-
this.emit('sessionComplete', session);
|
|
570
|
-
this.idlePromptSince.delete(session.id);
|
|
648
|
+
// Funnel through the single-writer path so the reaper and this
|
|
649
|
+
// idle-kill can never double-kill or double-emit (§3.6).
|
|
650
|
+
await this.terminateSession(session.id, 'idle-zombie');
|
|
571
651
|
continue;
|
|
572
652
|
}
|
|
573
653
|
}
|
|
@@ -881,22 +961,41 @@ rm() { "${shimRunner}" rm "$@"; }
|
|
|
881
961
|
if (this.config.protectedSessions.includes(session.tmuxSession)) {
|
|
882
962
|
throw new Error(`Cannot kill protected session: ${session.tmuxSession}`);
|
|
883
963
|
}
|
|
884
|
-
//
|
|
885
|
-
//
|
|
886
|
-
//
|
|
887
|
-
|
|
964
|
+
// Share the in-flight guard so an explicit kill can't double with an
|
|
965
|
+
// in-flight terminateSession() from the idle-kill / reaper path (§3.6).
|
|
966
|
+
// NB: unlike terminateSession we do NOT early-return on terminal status —
|
|
967
|
+
// killSession's contract is to destroy the pane unconditionally (a caller
|
|
968
|
+
// may kill a session whose status already drifted while its pane lives).
|
|
969
|
+
if (this.terminating.has(sessionId))
|
|
970
|
+
return false;
|
|
971
|
+
this.terminating.add(sessionId);
|
|
888
972
|
try {
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
973
|
+
// Emit beforeSessionKill BEFORE destroying the tmux session so
|
|
974
|
+
// listeners (e.g. TopicResumeMap) can discover the Claude UUID
|
|
975
|
+
// while the session is still alive.
|
|
976
|
+
this.emit('beforeSessionKill', session);
|
|
977
|
+
try {
|
|
978
|
+
execFileSync(this.config.tmuxPath, ['kill-session', '-t', `=${session.tmuxSession}`], {
|
|
979
|
+
encoding: 'utf-8',
|
|
980
|
+
});
|
|
981
|
+
}
|
|
982
|
+
catch {
|
|
983
|
+
// Session might already be dead
|
|
984
|
+
}
|
|
985
|
+
session.status = 'killed';
|
|
986
|
+
session.endedAt = new Date().toISOString();
|
|
987
|
+
session.endedReason = 'manual-kill';
|
|
988
|
+
this.state.saveSession(session);
|
|
989
|
+
// NB: killSession historically does NOT emit 'sessionComplete' (only
|
|
990
|
+
// beforeSessionKill). Preserved to avoid changing listener semantics —
|
|
991
|
+
// the CAS guard + endedReason are the only additions here.
|
|
992
|
+
this.idlePromptSince.delete(session.id);
|
|
993
|
+
this.reapingSessions.delete(session.id);
|
|
994
|
+
return true;
|
|
892
995
|
}
|
|
893
|
-
|
|
894
|
-
|
|
996
|
+
finally {
|
|
997
|
+
this.terminating.delete(sessionId);
|
|
895
998
|
}
|
|
896
|
-
session.status = 'killed';
|
|
897
|
-
session.endedAt = new Date().toISOString();
|
|
898
|
-
this.state.saveSession(session);
|
|
899
|
-
return true;
|
|
900
999
|
}
|
|
901
1000
|
/**
|
|
902
1001
|
* Check if a tmux session has active (non-baseline) child processes.
|