@rubytech/create-maxy-code 0.1.92 → 0.1.93
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/__tests__/claude-ptys-slice.test.js +25 -0
- package/dist/index.js +10 -1
- package/dist/port-resolution.js +29 -0
- package/package.json +1 -1
- package/payload/platform/plugins/docs/references/platform.md +4 -2
- package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts +61 -2
- package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/fs-watcher.js +337 -32
- package/payload/platform/services/claude-session-manager/dist/fs-watcher.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +1 -3
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.js +307 -209
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/index.js +62 -13
- package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.d.ts +9 -0
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.js +14 -0
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +165 -33
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +283 -92
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/reaper.d.ts +4 -2
- package/payload/platform/services/claude-session-manager/dist/reaper.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/reaper.js +23 -22
- package/payload/platform/services/claude-session-manager/dist/reaper.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/session-sidecar.d.ts +55 -0
- package/payload/platform/services/claude-session-manager/dist/session-sidecar.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/session-sidecar.js +170 -0
- package/payload/platform/services/claude-session-manager/dist/session-sidecar.js.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/systemd-scope.d.ts +114 -0
- package/payload/platform/services/claude-session-manager/dist/systemd-scope.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/systemd-scope.js +209 -0
- package/payload/platform/services/claude-session-manager/dist/systemd-scope.js.map +1 -0
- package/payload/server/public/assets/{ChatInput-dLWJ0Q8I.css → ChatInput-CzQhPt90.css} +1 -1
- package/payload/server/public/assets/{Checkbox-Bx8mRHQ3.js → Checkbox-ynZtDWi3.js} +1 -1
- package/payload/server/public/assets/{admin-BhEvxMrC.js → admin-ux6TKHS1.js} +1 -1
- package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-BEW_bD50.js → architectureDiagram-Q4EWVU46-Ko_izKmY.js} +1 -1
- package/payload/server/public/assets/{blockDiagram-DXYQGD6D-DFLT98C3.js → blockDiagram-DXYQGD6D-D58VDC0w.js} +1 -1
- package/payload/server/public/assets/{c4Diagram-AHTNJAMY-BemKtROA.js → c4Diagram-AHTNJAMY-C-eRXyKi.js} +1 -1
- package/payload/server/public/assets/channel-CejaITMF.js +1 -0
- package/payload/server/public/assets/{chunk-336JU56O-BL8fGJ7_.js → chunk-336JU56O-DZLEfLAb.js} +2 -2
- package/payload/server/public/assets/{chunk-426QAEUC-BD6by0MP.js → chunk-426QAEUC-BriTU3L8.js} +1 -1
- package/payload/server/public/assets/{chunk-4TB4RGXK-DX-cb6Nd.js → chunk-4TB4RGXK-BdxRL-AY.js} +1 -1
- package/payload/server/public/assets/{chunk-5FUZZQ4R-B2QqtIZS.js → chunk-5FUZZQ4R-BgEmy7Y3.js} +1 -1
- package/payload/server/public/assets/{chunk-5PVQY5BW-CzJWmsmd.js → chunk-5PVQY5BW-emnbDRLA.js} +1 -1
- package/payload/server/public/assets/{chunk-EDXVE4YY-DP9vcvEU.js → chunk-EDXVE4YY-BvCf2Xf2.js} +1 -1
- package/payload/server/public/assets/{chunk-ENJZ2VHE-D5xWEjF0.js → chunk-ENJZ2VHE-DTpEYJRb.js} +1 -1
- package/payload/server/public/assets/{chunk-ICPOFSXX-AKduf9o4.js → chunk-ICPOFSXX-Ced2j48Y.js} +1 -1
- package/payload/server/public/assets/{chunk-OYMX7WX6-D6jsVNyQ.js → chunk-OYMX7WX6-B21_a3Dv.js} +1 -1
- package/payload/server/public/assets/{chunk-U2HBQHQK-BNAnTYh8.js → chunk-U2HBQHQK-CPS3yyXK.js} +1 -1
- package/payload/server/public/assets/{chunk-X2U36JSP-UdQhYDnh.js → chunk-X2U36JSP-BJ_B5NW7.js} +1 -1
- package/payload/server/public/assets/{chunk-YZCP3GAM-DSSmSGmS.js → chunk-YZCP3GAM-CMLy-WXm.js} +1 -1
- package/payload/server/public/assets/{chunk-ZZ45TVLE-Czm7IDMC.js → chunk-ZZ45TVLE-BkLnzCHe.js} +1 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-BmoqALf4.js +1 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-vMajwCNi.js +1 -0
- package/payload/server/public/assets/clone-mvVfHkyg.js +1 -0
- package/payload/server/public/assets/{dagre-hSIMHJcO.js → dagre-Dd_gq4yj.js} +1 -1
- package/payload/server/public/assets/{dagre-KV5264BT-CBuRCJE7.js → dagre-KV5264BT-RY0E5UAn.js} +1 -1
- package/payload/server/public/assets/data-BK4r8Dqy.js +1 -0
- package/payload/server/public/assets/{diagram-5BDNPKRD-dbMrH0le.js → diagram-5BDNPKRD-DR7XiPLh.js} +1 -1
- package/payload/server/public/assets/{diagram-G4DWMVQ6-DBc6hs9a.js → diagram-G4DWMVQ6-2EbOfKFs.js} +1 -1
- package/payload/server/public/assets/{diagram-MMDJMWI5-ubSGybUk.js → diagram-MMDJMWI5-CGcY0Ze7.js} +1 -1
- package/payload/server/public/assets/{diagram-TYMM5635-WxL3cv-9.js → diagram-TYMM5635-Dk6MmAso.js} +1 -1
- package/payload/server/public/assets/{erDiagram-SMLLAGMA-CrBBOAN8.js → erDiagram-SMLLAGMA-CKvdlUqk.js} +1 -1
- package/payload/server/public/assets/{flowDiagram-DWJPFMVM-CXUq5Hzt.js → flowDiagram-DWJPFMVM-BqKhvCDz.js} +1 -1
- package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-vTCBnYVS.js → ganttDiagram-T4ZO3ILL-CeiE-IRb.js} +1 -1
- package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-BHrj_bRa.js → gitGraphDiagram-UUTBAWPF-BbPKn7v2.js} +1 -1
- package/payload/server/public/assets/graph-Cb6A8Hhs.js +1 -0
- package/payload/server/public/assets/graph-labels-DCsUNtnE.js +1 -0
- package/payload/server/public/assets/{graphlib-CDO75l2X.js → graphlib-tG6kR59B.js} +1 -1
- package/payload/server/public/assets/{infoDiagram-42DDH7IO-CcQdaOhi.js → infoDiagram-42DDH7IO-6MiRGCI1.js} +1 -1
- package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-3KvltFgV.js → ishikawaDiagram-UXIWVN3A-BwY4p5mg.js} +1 -1
- package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-DZCXaGFE.js → journeyDiagram-VCZTEJTY-BXAQ_fUi.js} +1 -1
- package/payload/server/public/assets/{kanban-definition-6JOO6SKY-DAIAKy1-.js → kanban-definition-6JOO6SKY-ChiiO7Yt.js} +1 -1
- package/payload/server/public/assets/{lib-CCLURO3E.js → lib-DbPz9cfu.js} +1 -1
- package/payload/server/public/assets/{line-C8iCE2Wx.js → line-B5g5OrOD.js} +1 -1
- package/payload/server/public/assets/{mermaid-parser.core-ElvUhnV9.js → mermaid-parser.core-BMGzMKJx.js} +1 -1
- package/payload/server/public/assets/{mermaid.core-7dSH31Ao.js → mermaid.core-DLMgkjXn.js} +3 -3
- package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-FZ0rcfac.js → mindmap-definition-QFDTVHPH-BvyzRLAi.js} +1 -1
- package/payload/server/public/assets/{page-C1hj89Gf.js → page-BeYR_GI2.js} +1 -1
- package/payload/server/public/assets/{page-Bu8kO4jO.js → page-DVNp-Dfy.js} +1 -1
- package/payload/server/public/assets/{pieDiagram-DEJITSTG-CDuvMZbO.js → pieDiagram-DEJITSTG--EV9pVfs.js} +1 -1
- package/payload/server/public/assets/{public-g_2skbnY.js → public-sYW0Dwku.js} +3 -3
- package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-xDjhkqNc.js → quadrantDiagram-34T5L4WZ-DJcL08ft.js} +1 -1
- package/payload/server/public/assets/{requirementDiagram-MS252O5E-BPKpyT0n.js → requirementDiagram-MS252O5E-D4VdmmSu.js} +1 -1
- package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-BvFIrihC.js → sankeyDiagram-XADWPNL6-Dsw3nHRS.js} +1 -1
- package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-C6G1oAE0.js → sequenceDiagram-FGHM5R23-CAgemUx5.js} +1 -1
- package/payload/server/public/assets/{stateDiagram-FHFEXIEX-DbOJT_Xh.js → stateDiagram-FHFEXIEX-B7dyL9_X.js} +1 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-CImN6Wk6.js +1 -0
- package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-D1DSxHh6.js → timeline-definition-GMOUNBTQ-B7iKswhp.js} +1 -1
- package/payload/server/public/assets/{vennDiagram-DHZGUBPP-BYoSeMdo.js → vennDiagram-DHZGUBPP-uFS0i1qX.js} +1 -1
- package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-DH3kZdea.js → wardleyDiagram-NUSXRM2D-lDUh4LAD.js} +1 -1
- package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-C6MROMLG.js → xychartDiagram-5P7HB3ND-0v7MEVwW.js} +1 -1
- package/payload/server/public/data.html +5 -5
- package/payload/server/public/graph.html +6 -6
- package/payload/server/public/index.html +8 -8
- package/payload/server/public/public.html +5 -5
- package/payload/server/public/assets/channel-CfpByn-m.js +0 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-DNc9R1IX.js +0 -1
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DM1DQh8N.js +0 -1
- package/payload/server/public/assets/clone-BSrNdvLW.js +0 -1
- package/payload/server/public/assets/data-Cbo0tTS3.js +0 -1
- package/payload/server/public/assets/graph-Beucu3_J.js +0 -1
- package/payload/server/public/assets/graph-labels-D15-eFQK.js +0 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-Ce4GFk-H.js +0 -1
- /package/payload/server/public/assets/{ChatInput-DoS80kaC.js → ChatInput-Cj9JQtYt.js} +0 -0
|
@@ -1,12 +1,77 @@
|
|
|
1
1
|
import type { Logger, PtyHandle, Role, Channel } from './types.js';
|
|
2
|
-
import {
|
|
2
|
+
import { type SystemctlRunner } from './systemd-scope.js';
|
|
3
3
|
import type { FsWatcher } from './fs-watcher.js';
|
|
4
4
|
import { type McpProbeResult, type McpProbeServerDescriptor } from './mcp-tools-probe.js';
|
|
5
5
|
import { type OwnerProfileBlock, type DormantPlugin, type ActivePlugin, type SpecialistDomain } from './system-prompt.js';
|
|
6
6
|
import type { HostResolution } from './config.js';
|
|
7
7
|
import type { ToolSurface } from './tool-surface.js';
|
|
8
8
|
import type { JsonlTail } from './jsonl-tail.js';
|
|
9
|
-
export
|
|
9
|
+
export interface PtyTracker {
|
|
10
|
+
/** Intrinsic Claude session id. Map key, duplicated here so
|
|
11
|
+
* `forEachLive` callbacks don't need a closure over the key. */
|
|
12
|
+
sessionId: string;
|
|
13
|
+
/** "session_<suffix>" form from the PID file. Stable after the
|
|
14
|
+
* watcher's PID-file event resolves. */
|
|
15
|
+
bridgeSessionId: string;
|
|
16
|
+
/** Suffix-only convenience field (no "session_" prefix). */
|
|
17
|
+
bridgeSuffix: string;
|
|
18
|
+
pid: number;
|
|
19
|
+
/** Live PtyHandle — the only place this reference lives. */
|
|
20
|
+
pty: PtyHandle;
|
|
21
|
+
/** Flipped true on PTY exit (natural or operator-requested). Read by
|
|
22
|
+
* /input (refuse 410) and the operator-request kill path (skip
|
|
23
|
+
* redundant destroy that would throw on a closed socket). */
|
|
24
|
+
exited: boolean;
|
|
25
|
+
/** Task 176 — true once `releasePtyMasterFd` has returned
|
|
26
|
+
* `master-fd=closed`. Defense in depth across the two exit branches
|
|
27
|
+
* (natural exit and operator request) — whichever loses the race
|
|
28
|
+
* skips the second destroy that would throw on real node-pty. */
|
|
29
|
+
fdReleased: boolean;
|
|
30
|
+
/** Hidden-spawn flag from /spawn body. Used by the LRU eviction
|
|
31
|
+
* hot path that does not want to round-trip through the sidecar. */
|
|
32
|
+
hidden: boolean;
|
|
33
|
+
/** Specialist agent name (or null for operator spawns). Same
|
|
34
|
+
* rationale as `hidden`. */
|
|
35
|
+
specialist: string | null;
|
|
36
|
+
/** Task 250 — systemd scope unit token for this spawn. The unit name
|
|
37
|
+
* is `claude-session-<scopeUnitToken>.scope`; `stopSession` and the
|
|
38
|
+
* reaper issue `systemctl --user stop` against that unit instead of
|
|
39
|
+
* `pty.kill`. Equals the intrinsic sessionId on `/resume` spawns
|
|
40
|
+
* (sessionId known pre-spawn) and a manager-minted UUID on fresh
|
|
41
|
+
* spawns. */
|
|
42
|
+
scopeUnitToken: string;
|
|
43
|
+
}
|
|
44
|
+
/** Returns true when the manager has a live PtyHandle for `sessionId`.
|
|
45
|
+
* False for exited rows (the tracker is removed) and for sessions the
|
|
46
|
+
* manager never spawned (e.g. a JSONL-only archived row). */
|
|
47
|
+
export declare function isLive(sessionId: string): boolean;
|
|
48
|
+
/** Test seam — read-only access to the tracker for a given session.
|
|
49
|
+
* Production routes never call this; they use the dedicated mutation
|
|
50
|
+
* exports (`writeInputToPty`, `killSession`, `onPtyExit`, etc.) so
|
|
51
|
+
* the PtyHandle stays encapsulated inside the module. */
|
|
52
|
+
export declare function getPtyTrackerForTests(sessionId: string): PtyTracker | undefined;
|
|
53
|
+
/** Register a callback to fire when the PTY for `sessionId` exits.
|
|
54
|
+
* Returns true when the tracker exists (callback was wired); false
|
|
55
|
+
* when no live PTY is tracked for that id (the caller's contract
|
|
56
|
+
* fires regardless — e.g. `attachPublicAudit` skips on no-tracker).
|
|
57
|
+
* Routes call this instead of reaching into the tracker for `.pty`. */
|
|
58
|
+
export declare function onPtyExit(sessionId: string, cb: () => void): boolean;
|
|
59
|
+
/** Iterate every live tracker. Used by index.ts's shutdown loop to
|
|
60
|
+
* SIGTERM each PTY synchronously, and by checkSlotsAndMaybeEvict's
|
|
61
|
+
* LRU search to walk specialists when the cap is hit. */
|
|
62
|
+
export declare function forEachLivePty(cb: (tracker: PtyTracker) => void): void;
|
|
63
|
+
/** Count of live trackers. Surfaced by /healthz so the operator can
|
|
64
|
+
* see process-side liveness without scanning the watcher's row index. */
|
|
65
|
+
export declare function livePtyCount(): number;
|
|
66
|
+
/** Test-only — clear the tracker map between vitest cases. Production
|
|
67
|
+
* never invokes this; the only legitimate eviction is PTY exit. */
|
|
68
|
+
export declare function __resetPtyTrackerForTests(): void;
|
|
69
|
+
/** Test-only — directly register a tracker without going through
|
|
70
|
+
* `spawnClaudeSession`. Used by FD-release / natural-exit tests that
|
|
71
|
+
* need to construct a known PtyHandle + tracker pair and exercise
|
|
72
|
+
* `killSession` / `handlePtyNaturalExit` against it. */
|
|
73
|
+
export declare function __registerPtyTrackerForTests(tracker: PtyTracker): void;
|
|
74
|
+
export type SpawnFailureReason = 'which-claude-not-found' | 'pty-spawn-failed' | 'pid-file-timeout' | 'host-context-unresolved' | 'identity-unresolved' | 'mcp-config-write-failed' | 'sidecar-write-failed';
|
|
10
75
|
export type SpawnRejectionReason = 'specialist-cap-reached' | 'operator-slots-reserved';
|
|
11
76
|
export interface SpecialistCapRejection {
|
|
12
77
|
kind: 'specialist-cap-reached';
|
|
@@ -19,9 +84,31 @@ export interface OperatorReserveRejection {
|
|
|
19
84
|
reserve: number;
|
|
20
85
|
totalCap: number;
|
|
21
86
|
}
|
|
87
|
+
/** Task 260 — what /spawn and /resume return to the caller. The
|
|
88
|
+
* metadata-rich `StoredSession` shape is gone; everything the wire
|
|
89
|
+
* payload needs (senderId, role, channel, url, startedAt, etc.) is
|
|
90
|
+
* read by the route from the sidecar (which `spawnClaudeSession`
|
|
91
|
+
* wrote before launching the PTY) and the watcher row. The success
|
|
92
|
+
* payload carries the in-process facts: the canonical sessionId
|
|
93
|
+
* (which may equal `args.resumeClaudeSessionId` on /resume), the
|
|
94
|
+
* pid, and the tracker reference for callers that need to attach
|
|
95
|
+
* exit-time handlers (`attachPublicAudit`,
|
|
96
|
+
* `attachSpecialistEndTurnAutoArchive`). */
|
|
97
|
+
export interface SpawnedSession {
|
|
98
|
+
sessionId: string;
|
|
99
|
+
pid: number;
|
|
100
|
+
startedAt: string;
|
|
101
|
+
/** URL captured by the time /spawn returns, or null when the
|
|
102
|
+
* `/remote-control` banner has not landed yet (the common case for
|
|
103
|
+
* fast spawns) or when the spawn is headless. The sidecar's `url`
|
|
104
|
+
* field is mutated when the banner does land; the route's SSE push
|
|
105
|
+
* re-emits the row from sidecar then. */
|
|
106
|
+
url: string | null;
|
|
107
|
+
tracker: PtyTracker;
|
|
108
|
+
}
|
|
22
109
|
export type SpawnResult = {
|
|
23
110
|
ok: true;
|
|
24
|
-
session:
|
|
111
|
+
session: SpawnedSession;
|
|
25
112
|
} | {
|
|
26
113
|
ok: false;
|
|
27
114
|
reason: SpawnFailureReason;
|
|
@@ -31,7 +118,12 @@ export type SpawnResult = {
|
|
|
31
118
|
rejected: SpecialistCapRejection | OperatorReserveRejection;
|
|
32
119
|
};
|
|
33
120
|
export interface SpawnDeps {
|
|
34
|
-
|
|
121
|
+
/** Task 250 — spawn adapter takes a stable per-spawn unit token so the
|
|
122
|
+
* systemd-run --user --scope --unit=claude-session-<token>.scope can be
|
|
123
|
+
* composed at the adapter boundary. The adapter wraps node-pty around
|
|
124
|
+
* systemd-run; from the caller's perspective the contract is unchanged
|
|
125
|
+
* apart from the extra `unitToken` argument. */
|
|
126
|
+
spawnPty: (cmd: string, args: string[], env: NodeJS.ProcessEnv, unitToken: string) => PtyHandle;
|
|
35
127
|
spawnCwd: string;
|
|
36
128
|
claudeBin: string;
|
|
37
129
|
/** Max wait for the PID file to land after PTY spawn. Replaces the
|
|
@@ -41,7 +133,6 @@ export interface SpawnDeps {
|
|
|
41
133
|
* used purely for the parallel capture loop's bound. */
|
|
42
134
|
urlCaptureTimeoutMs: number;
|
|
43
135
|
logger: Logger;
|
|
44
|
-
store: SessionStore;
|
|
45
136
|
watcher: FsWatcher;
|
|
46
137
|
host: HostResolution;
|
|
47
138
|
accountDir: string;
|
|
@@ -60,15 +151,19 @@ export interface SpawnDeps {
|
|
|
60
151
|
mcpConfigDir?: string;
|
|
61
152
|
toolSurface: ToolSurface;
|
|
62
153
|
/** Fires once after the watcher reports the PID-file CREATE event for
|
|
63
|
-
* the spawn
|
|
64
|
-
* watcher
|
|
65
|
-
|
|
154
|
+
* the spawn AND the sidecar has been written to disk. http-server
|
|
155
|
+
* uses this to attach the public-tool audit watcher and the
|
|
156
|
+
* end-turn auto-archive subscriber. The callback receives the
|
|
157
|
+
* PtyTracker so callers can register `pty.onExit` handlers; route
|
|
158
|
+
* code reads spawn metadata from the sidecar (or via the watcher
|
|
159
|
+
* row that the sidecar populated). */
|
|
160
|
+
onSessionReady?: (tracker: PtyTracker) => void;
|
|
66
161
|
/** Task 189 — fires after the `/remote-control is active · <url>` banner
|
|
67
|
-
* is matched and the
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
162
|
+
* is matched and the sidecar's `url` field has been written. http-server
|
|
163
|
+
* uses this to push a `row-updated` SSE so the client's hidden
|
|
164
|
+
* Open-in-new-tab arrow appears in step with the URL landing. Headless
|
|
165
|
+
* spawns never invoke this (the capture handler is not attached);
|
|
166
|
+
* url-capture-timeout never invokes this (no URL to push). */
|
|
72
167
|
onUrlCaptured?: (sessionId: string) => void;
|
|
73
168
|
tunnelUrlOverride?: string | null;
|
|
74
169
|
/** Concurrent-specialist cap (per-account). See ManagerConfig. */
|
|
@@ -118,6 +213,10 @@ export interface SpawnDeps {
|
|
|
118
213
|
* 5_000 ms. On timeout the server's tool list is empty in the
|
|
119
214
|
* aggregated [pty-spawn-tool-inventory] line. */
|
|
120
215
|
toolInventoryProbeTimeoutMs?: number;
|
|
216
|
+
/** Task 250 — systemctl runner for scope-stop/list. Default uses
|
|
217
|
+
* spawnSync; tests inject a recording stub. Optional for older test
|
|
218
|
+
* fixtures that never reach the stop path. */
|
|
219
|
+
runSystemctl?: SystemctlRunner;
|
|
121
220
|
/** Task 183 — JSONL tail for the database-operator recorder spawn.
|
|
122
221
|
* pty-spawner calls `register(sessionId, { specialist, argvTools })`
|
|
123
222
|
* immediately after argv composition, BEFORE the PTY actually spawns,
|
|
@@ -257,43 +356,76 @@ export declare function __resetFirstTurnTimeoutMsForTests(): void;
|
|
|
257
356
|
export declare function __clearFinalSnapshotStateForTests(): void;
|
|
258
357
|
export declare function spawnClaudeSession(deps: SpawnDeps, args: SpawnArgs): Promise<SpawnResult>;
|
|
259
358
|
export interface StopDeps {
|
|
260
|
-
store: SessionStore;
|
|
261
359
|
killGraceMs: number;
|
|
262
360
|
logger: Logger;
|
|
361
|
+
/** Task 250 — systemctl runner for issuing the scope-unit stop. Default
|
|
362
|
+
* implementation invokes spawnSync; tests inject a recording stub. */
|
|
363
|
+
runSystemctl?: SystemctlRunner;
|
|
364
|
+
}
|
|
365
|
+
/** Task 250 — outcome of a stopSession call. The HTTP /stop route uses
|
|
366
|
+
* `outcome` to decide whether to surface a 500 to the operator. */
|
|
367
|
+
export interface StopSessionOutcome {
|
|
368
|
+
existed: boolean;
|
|
369
|
+
scopeOutcome: 'ok' | 'already-gone' | 'error' | 'no-store-entry';
|
|
370
|
+
exitCode: number | null;
|
|
263
371
|
}
|
|
264
372
|
/** Task 176 — natural-exit handler. Fires when the claude child exits on
|
|
265
373
|
* its own (operator `/quit`, SIGINT in the PTY, crash, network drop on
|
|
266
374
|
* `--remote-control`), with no operator `/stop` and no auto-archive in
|
|
267
|
-
* flight. Mirrors `
|
|
268
|
-
* contract on the second exit branch the original task
|
|
269
|
-
* out-of-scoped. Without this, the master fd lingers in
|
|
270
|
-
* internal socket until V8 GC finalises the IPty object
|
|
271
|
-
*
|
|
272
|
-
* loop SIGTERMs PIDs that already logged `process-exited`.
|
|
375
|
+
* flight. Mirrors `killSession`'s post-Task-170 fd-release + tracker
|
|
376
|
+
* removal contract on the second exit branch the original task
|
|
377
|
+
* explicitly out-of-scoped. Without this, the master fd lingers in
|
|
378
|
+
* node-pty's internal socket until V8 GC finalises the IPty object,
|
|
379
|
+
* and the tracker entry survives until manager shutdown — so the
|
|
380
|
+
* shutdown loop SIGTERMs PIDs that already logged `process-exited`.
|
|
273
381
|
*
|
|
274
382
|
* Side-effect order is load-bearing: set `exited` first so any
|
|
275
|
-
* concurrent `
|
|
383
|
+
* concurrent `killSession` sees the already-exited branch; release the
|
|
276
384
|
* fd second (idempotent on a destroyed socket via the try/catch in
|
|
277
|
-
* `releasePtyMasterFd`); drop the
|
|
278
|
-
* key is a no-op, so the operator-request follow-up that
|
|
279
|
-
* harmless). The log line carries the same `master-fd=...`
|
|
280
|
-
* operator-request path emits — every `kill … pid=<n>`
|
|
281
|
-
* `server.log` now ends in `master-fd=...`, no exceptions.
|
|
385
|
+
* `releasePtyMasterFd`); drop the tracker third (Map.delete on a
|
|
386
|
+
* missing key is a no-op, so the operator-request follow-up that
|
|
387
|
+
* races us is harmless). The log line carries the same `master-fd=...`
|
|
388
|
+
* suffix the operator-request path emits — every `kill … pid=<n>`
|
|
389
|
+
* line in `server.log` now ends in `master-fd=...`, no exceptions.
|
|
282
390
|
*
|
|
283
391
|
* Exported so `__tests__/stop-session-fd-release.test.ts` can verify
|
|
284
392
|
* the contract end-to-end without re-implementing the handler in test
|
|
285
393
|
* code. */
|
|
286
394
|
export declare function handlePtyNaturalExit(deps: {
|
|
287
|
-
store: SessionStore;
|
|
288
395
|
logger: Logger;
|
|
289
|
-
},
|
|
396
|
+
}, tracker: PtyTracker, exit: {
|
|
290
397
|
exitCode: number;
|
|
291
398
|
signal?: number;
|
|
292
399
|
}, stderrTail: string): void;
|
|
293
|
-
/**
|
|
294
|
-
*
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
400
|
+
/** Task 250 + 260 — operator-request stop. Issues `systemctl --user
|
|
401
|
+
* stop --no-block <scope>` against the PTY's scope unit (Task 250)
|
|
402
|
+
* instead of `pty.kill('SIGTERM')`; the scope's TimeoutStopSec=5 handles
|
|
403
|
+
* SIGTERM→SIGKILL escalation inside its own cgroup. Idempotent: a
|
|
404
|
+
* no-such-unit response (exit code 5) is treated as success because
|
|
405
|
+
* claude exited naturally and systemd retired the scope. The master fd
|
|
406
|
+
* is still released locally — fd ownership stays with the manager
|
|
407
|
+
* process and must be cleaned up there, irrespective of which process
|
|
408
|
+
* killed claude.
|
|
409
|
+
*
|
|
410
|
+
* Task 260 — looks up the tracker in the module-scoped `livePtys` map
|
|
411
|
+
* (the metadata-rich SessionStore is gone). Deletes by identity (only
|
|
412
|
+
* if `livePtys.get(sessionId) === t`) so an LRU recycle or a
|
|
413
|
+
* cross-fixture sessionId collision in tests never clobbers a live
|
|
414
|
+
* PTY whose tracker was registered after the current call resolved. */
|
|
415
|
+
export declare function stopSession(deps: StopDeps, sessionId: string): Promise<StopSessionOutcome>;
|
|
416
|
+
/** Task 260 — alias preserved during the http-server callsite rename
|
|
417
|
+
* in this branch. The canonical export name is `stopSession` (Task 250). */
|
|
418
|
+
export declare const killSession: typeof stopSession;
|
|
419
|
+
/** Task 260 — operator `/input` route entry. Writes to the tracker's
|
|
420
|
+
* PtyHandle via Claude TUI bracketed-paste semantics (Task 122). Returns
|
|
421
|
+
* a structured outcome so the route can choose the right HTTP status
|
|
422
|
+
* without reaching into the tracker. */
|
|
423
|
+
export interface WriteInputResult {
|
|
424
|
+
ok: boolean;
|
|
425
|
+
bytes?: number;
|
|
426
|
+
error?: 'not-found' | 'exited' | 'write-failed';
|
|
427
|
+
detail?: string;
|
|
428
|
+
}
|
|
429
|
+
export declare function writeInputToPty(sessionId: string, text: string, logger: Logger, channel: Channel | null): WriteInputResult;
|
|
298
430
|
export {};
|
|
299
431
|
//# sourceMappingURL=pty-spawner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pty-spawner.d.ts","sourceRoot":"","sources":["../src/pty-spawner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pty-spawner.d.ts","sourceRoot":"","sources":["../src/pty-spawner.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAClE,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,oBAAoB,CAAA;AAI3B,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,iBAAiB,CAAA;AAC5D,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,wBAAwB,EAC9B,MAAM,sBAAsB,CAAA;AA+B7B,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACtB,MAAM,oBAAoB,CAAA;AAE3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AA2BhD,MAAM,WAAW,UAAU;IACzB;qEACiE;IACjE,SAAS,EAAE,MAAM,CAAA;IACjB;6CACyC;IACzC,eAAe,EAAE,MAAM,CAAA;IACvB,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAA;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,4DAA4D;IAC5D,GAAG,EAAE,SAAS,CAAA;IACd;;kEAE8D;IAC9D,MAAM,EAAE,OAAO,CAAA;IACf;;;sEAGkE;IAClE,UAAU,EAAE,OAAO,CAAA;IACnB;yEACqE;IACrE,MAAM,EAAE,OAAO,CAAA;IACf;iCAC6B;IAC7B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB;;;;;kBAKc;IACd,cAAc,EAAE,MAAM,CAAA;CACvB;AAID;;8DAE8D;AAC9D,wBAAgB,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAGjD;AAED;;;0DAG0D;AAC1D,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAE/E;AAED;;;;wEAIwE;AACxE,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI,GAAG,OAAO,CAKpE;AAED;;0DAE0D;AAC1D,wBAAgB,cAAc,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI,CAEtE;AAED;0EAC0E;AAC1E,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;oEACoE;AACpE,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAGD;;;yDAGyD;AACzD,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAEtE;AAED,MAAM,MAAM,kBAAkB,GAC1B,wBAAwB,GACxB,kBAAkB,GAClB,kBAAkB,GAClB,yBAAyB,GACzB,qBAAqB,GACrB,yBAAyB,GACzB,sBAAsB,CAAA;AAE1B,MAAM,MAAM,oBAAoB,GAC5B,wBAAwB,GACxB,yBAAyB,CAAA;AAE7B,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,wBAAwB,CAAA;IAC9B,YAAY,EAAE,MAAM,CAAA;IACpB,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,yBAAyB,CAAA;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;;;;;;;;6CAS6C;AAC7C,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB;;;;8CAI0C;IAC1C,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,OAAO,EAAE,UAAU,CAAA;CACpB;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,GACrC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,sBAAsB,GAAG,wBAAwB,CAAA;CAAE,CAAA;AAE9E,MAAM,WAAW,SAAS;IACxB;;;;qDAIiD;IACjD,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,KAAK,SAAS,CAAA;IAC/F,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB;qDACiD;IACjD,gBAAgB,EAAE,MAAM,CAAA;IACxB;6DACyD;IACzD,mBAAmB,EAAE,MAAM,CAAA;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,SAAS,CAAA;IAClB,IAAI,EAAE,cAAc,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAA;IACrD,wBAAwB,EAAE,MAAM,CAAA;IAChC;;;;;sBAKkB;IAClB,eAAe,EAAE,MAAM,CAAA;IACvB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,WAAW,CAAA;IACxB;;;;;;2CAMuC;IACvC,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAA;IAC9C;;;;;mEAK+D;IAC/D,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3C,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,kEAAkE;IAClE,aAAa,EAAE,MAAM,CAAA;IACrB,oDAAoD;IACpD,eAAe,EAAE,MAAM,CAAA;IACvB,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAA;IACnB;;;;;;iEAM6D;IAC7D,uBAAuB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAA;IAClE;;;;;;;;;;2BAUuB;IACvB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;;;;;4CAMwC;IACxC,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B;;;;+DAI2D;IAC3D,oBAAoB,CAAC,EAAE,CAAC,GAAG,EAAE;QAC3B,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAA;QACtD,SAAS,EAAE,MAAM,CAAA;KAClB,KAAK,OAAO,CAAC,cAAc,CAAC,CAAA;IAC7B;;sDAEkD;IAClD,2BAA2B,CAAC,EAAE,MAAM,CAAA;IACpC;;mDAE+C;IAC/C,YAAY,CAAC,EAAE,eAAe,CAAA;IAC9B;;;;;;qEAMiE;IACjE,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,CAK7C,CAAA;AAEF,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB;;;;;yEAKqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,IAAI,CAAA;IACV,OAAO,EAAE,OAAO,CAAA;IAChB,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,iBAAiB,CAAA;IAC9B,cAAc,CAAC,EAAE,SAAS,aAAa,EAAE,CAAA;IACzC,aAAa,CAAC,EAAE,SAAS,YAAY,EAAE,CAAA;IACvC,iBAAiB,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAA;IAC/C,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;kEAG8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;;;0BAKsB;IACtB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,mBAAmB,CAAA;AAC9F,eAAO,MAAM,gBAAgB,EAAE,SAAS,cAAc,EAAoE,CAAA;AAE1H,UAAU,oBAAoB;IAC5B,IAAI,EAAE,IAAI,CAAA;IACV,WAAW,EAAE,WAAW,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB;;;kBAGc;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,gBAAgB,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd;;;;mBAIe;IACf,eAAe,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;CAC1C;AAiBD;;;;;;sBAMsB;AACtB,wBAAgB,mBAAmB,CAAC,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAmCzF;AAWD;;;;;;;;;;;;;;;;;;;;;;;sBAuBsB;AACtB,wBAAgB,kCAAkC,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAanF;AAED;;;;;;;;sBAQsB;AACtB,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,kBAAkB,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/C;IACD,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IACnC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAA;CAClC,CAqBA;AAED;;8DAE8D;AAC9D,wBAAgB,oBAAoB,CAClC,CAAC,EAAE,IAAI,CAAC,oBAAoB,EAAE,cAAc,GAAG,WAAW,GAAG,QAAQ,GAAG,kBAAkB,GAAG,QAAQ,CAAC,EACtG,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAsBxB;AAsQD;8CAC8C;AAC9C,wBAAgB,+BAA+B,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAEhE;AACD,wBAAgB,iCAAiC,IAAI,IAAI,CAExD;AAgDD;;mEAEmE;AACnE,wBAAgB,iCAAiC,IAAI,IAAI,CAKxD;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAgpB/F;AAED,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd;2EACuE;IACvE,YAAY,CAAC,EAAE,eAAe,CAAA;CAC/B;AAED;oEACoE;AACpE,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAA;IAChB,YAAY,EAAE,IAAI,GAAG,cAAc,GAAG,OAAO,GAAG,gBAAgB,CAAA;IAChE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;YAqBY;AACZ,wBAAgB,oBAAoB,CAClC,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,EACxB,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EAC3C,UAAU,EAAE,MAAM,GACjB,IAAI,CAiBN;AAmBD;;;;;;;;;;;;;;wEAcwE;AACxE,wBAAsB,WAAW,CAC/B,IAAI,EAAE,QAAQ,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,CAAC,CA8C7B;AAED;6EAC6E;AAC7E,eAAO,MAAM,WAAW,oBAAc,CAAA;AAEtC;;;yCAGyC;AACzC,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,WAAW,GAAG,QAAQ,GAAG,cAAc,CAAA;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,GAAG,IAAI,GACtB,gBAAgB,CA8BlB"}
|