@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.
Files changed (108) hide show
  1. package/dist/__tests__/claude-ptys-slice.test.js +25 -0
  2. package/dist/index.js +10 -1
  3. package/dist/port-resolution.js +29 -0
  4. package/package.json +1 -1
  5. package/payload/platform/plugins/docs/references/platform.md +4 -2
  6. package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts +61 -2
  7. package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts.map +1 -1
  8. package/payload/platform/services/claude-session-manager/dist/fs-watcher.js +337 -32
  9. package/payload/platform/services/claude-session-manager/dist/fs-watcher.js.map +1 -1
  10. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +1 -3
  11. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  12. package/payload/platform/services/claude-session-manager/dist/http-server.js +307 -209
  13. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  14. package/payload/platform/services/claude-session-manager/dist/index.js +62 -13
  15. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  16. package/payload/platform/services/claude-session-manager/dist/jsonl-path.d.ts +9 -0
  17. package/payload/platform/services/claude-session-manager/dist/jsonl-path.d.ts.map +1 -1
  18. package/payload/platform/services/claude-session-manager/dist/jsonl-path.js +14 -0
  19. package/payload/platform/services/claude-session-manager/dist/jsonl-path.js.map +1 -1
  20. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +165 -33
  21. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  22. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +283 -92
  23. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  24. package/payload/platform/services/claude-session-manager/dist/reaper.d.ts +4 -2
  25. package/payload/platform/services/claude-session-manager/dist/reaper.d.ts.map +1 -1
  26. package/payload/platform/services/claude-session-manager/dist/reaper.js +23 -22
  27. package/payload/platform/services/claude-session-manager/dist/reaper.js.map +1 -1
  28. package/payload/platform/services/claude-session-manager/dist/session-sidecar.d.ts +55 -0
  29. package/payload/platform/services/claude-session-manager/dist/session-sidecar.d.ts.map +1 -0
  30. package/payload/platform/services/claude-session-manager/dist/session-sidecar.js +170 -0
  31. package/payload/platform/services/claude-session-manager/dist/session-sidecar.js.map +1 -0
  32. package/payload/platform/services/claude-session-manager/dist/systemd-scope.d.ts +114 -0
  33. package/payload/platform/services/claude-session-manager/dist/systemd-scope.d.ts.map +1 -0
  34. package/payload/platform/services/claude-session-manager/dist/systemd-scope.js +209 -0
  35. package/payload/platform/services/claude-session-manager/dist/systemd-scope.js.map +1 -0
  36. package/payload/server/public/assets/{ChatInput-dLWJ0Q8I.css → ChatInput-CzQhPt90.css} +1 -1
  37. package/payload/server/public/assets/{Checkbox-Bx8mRHQ3.js → Checkbox-ynZtDWi3.js} +1 -1
  38. package/payload/server/public/assets/{admin-BhEvxMrC.js → admin-ux6TKHS1.js} +1 -1
  39. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-BEW_bD50.js → architectureDiagram-Q4EWVU46-Ko_izKmY.js} +1 -1
  40. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-DFLT98C3.js → blockDiagram-DXYQGD6D-D58VDC0w.js} +1 -1
  41. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-BemKtROA.js → c4Diagram-AHTNJAMY-C-eRXyKi.js} +1 -1
  42. package/payload/server/public/assets/channel-CejaITMF.js +1 -0
  43. package/payload/server/public/assets/{chunk-336JU56O-BL8fGJ7_.js → chunk-336JU56O-DZLEfLAb.js} +2 -2
  44. package/payload/server/public/assets/{chunk-426QAEUC-BD6by0MP.js → chunk-426QAEUC-BriTU3L8.js} +1 -1
  45. package/payload/server/public/assets/{chunk-4TB4RGXK-DX-cb6Nd.js → chunk-4TB4RGXK-BdxRL-AY.js} +1 -1
  46. package/payload/server/public/assets/{chunk-5FUZZQ4R-B2QqtIZS.js → chunk-5FUZZQ4R-BgEmy7Y3.js} +1 -1
  47. package/payload/server/public/assets/{chunk-5PVQY5BW-CzJWmsmd.js → chunk-5PVQY5BW-emnbDRLA.js} +1 -1
  48. package/payload/server/public/assets/{chunk-EDXVE4YY-DP9vcvEU.js → chunk-EDXVE4YY-BvCf2Xf2.js} +1 -1
  49. package/payload/server/public/assets/{chunk-ENJZ2VHE-D5xWEjF0.js → chunk-ENJZ2VHE-DTpEYJRb.js} +1 -1
  50. package/payload/server/public/assets/{chunk-ICPOFSXX-AKduf9o4.js → chunk-ICPOFSXX-Ced2j48Y.js} +1 -1
  51. package/payload/server/public/assets/{chunk-OYMX7WX6-D6jsVNyQ.js → chunk-OYMX7WX6-B21_a3Dv.js} +1 -1
  52. package/payload/server/public/assets/{chunk-U2HBQHQK-BNAnTYh8.js → chunk-U2HBQHQK-CPS3yyXK.js} +1 -1
  53. package/payload/server/public/assets/{chunk-X2U36JSP-UdQhYDnh.js → chunk-X2U36JSP-BJ_B5NW7.js} +1 -1
  54. package/payload/server/public/assets/{chunk-YZCP3GAM-DSSmSGmS.js → chunk-YZCP3GAM-CMLy-WXm.js} +1 -1
  55. package/payload/server/public/assets/{chunk-ZZ45TVLE-Czm7IDMC.js → chunk-ZZ45TVLE-BkLnzCHe.js} +1 -1
  56. package/payload/server/public/assets/classDiagram-6PBFFD2Q-BmoqALf4.js +1 -0
  57. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-vMajwCNi.js +1 -0
  58. package/payload/server/public/assets/clone-mvVfHkyg.js +1 -0
  59. package/payload/server/public/assets/{dagre-hSIMHJcO.js → dagre-Dd_gq4yj.js} +1 -1
  60. package/payload/server/public/assets/{dagre-KV5264BT-CBuRCJE7.js → dagre-KV5264BT-RY0E5UAn.js} +1 -1
  61. package/payload/server/public/assets/data-BK4r8Dqy.js +1 -0
  62. package/payload/server/public/assets/{diagram-5BDNPKRD-dbMrH0le.js → diagram-5BDNPKRD-DR7XiPLh.js} +1 -1
  63. package/payload/server/public/assets/{diagram-G4DWMVQ6-DBc6hs9a.js → diagram-G4DWMVQ6-2EbOfKFs.js} +1 -1
  64. package/payload/server/public/assets/{diagram-MMDJMWI5-ubSGybUk.js → diagram-MMDJMWI5-CGcY0Ze7.js} +1 -1
  65. package/payload/server/public/assets/{diagram-TYMM5635-WxL3cv-9.js → diagram-TYMM5635-Dk6MmAso.js} +1 -1
  66. package/payload/server/public/assets/{erDiagram-SMLLAGMA-CrBBOAN8.js → erDiagram-SMLLAGMA-CKvdlUqk.js} +1 -1
  67. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-CXUq5Hzt.js → flowDiagram-DWJPFMVM-BqKhvCDz.js} +1 -1
  68. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-vTCBnYVS.js → ganttDiagram-T4ZO3ILL-CeiE-IRb.js} +1 -1
  69. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-BHrj_bRa.js → gitGraphDiagram-UUTBAWPF-BbPKn7v2.js} +1 -1
  70. package/payload/server/public/assets/graph-Cb6A8Hhs.js +1 -0
  71. package/payload/server/public/assets/graph-labels-DCsUNtnE.js +1 -0
  72. package/payload/server/public/assets/{graphlib-CDO75l2X.js → graphlib-tG6kR59B.js} +1 -1
  73. package/payload/server/public/assets/{infoDiagram-42DDH7IO-CcQdaOhi.js → infoDiagram-42DDH7IO-6MiRGCI1.js} +1 -1
  74. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-3KvltFgV.js → ishikawaDiagram-UXIWVN3A-BwY4p5mg.js} +1 -1
  75. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-DZCXaGFE.js → journeyDiagram-VCZTEJTY-BXAQ_fUi.js} +1 -1
  76. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-DAIAKy1-.js → kanban-definition-6JOO6SKY-ChiiO7Yt.js} +1 -1
  77. package/payload/server/public/assets/{lib-CCLURO3E.js → lib-DbPz9cfu.js} +1 -1
  78. package/payload/server/public/assets/{line-C8iCE2Wx.js → line-B5g5OrOD.js} +1 -1
  79. package/payload/server/public/assets/{mermaid-parser.core-ElvUhnV9.js → mermaid-parser.core-BMGzMKJx.js} +1 -1
  80. package/payload/server/public/assets/{mermaid.core-7dSH31Ao.js → mermaid.core-DLMgkjXn.js} +3 -3
  81. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-FZ0rcfac.js → mindmap-definition-QFDTVHPH-BvyzRLAi.js} +1 -1
  82. package/payload/server/public/assets/{page-C1hj89Gf.js → page-BeYR_GI2.js} +1 -1
  83. package/payload/server/public/assets/{page-Bu8kO4jO.js → page-DVNp-Dfy.js} +1 -1
  84. package/payload/server/public/assets/{pieDiagram-DEJITSTG-CDuvMZbO.js → pieDiagram-DEJITSTG--EV9pVfs.js} +1 -1
  85. package/payload/server/public/assets/{public-g_2skbnY.js → public-sYW0Dwku.js} +3 -3
  86. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-xDjhkqNc.js → quadrantDiagram-34T5L4WZ-DJcL08ft.js} +1 -1
  87. package/payload/server/public/assets/{requirementDiagram-MS252O5E-BPKpyT0n.js → requirementDiagram-MS252O5E-D4VdmmSu.js} +1 -1
  88. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-BvFIrihC.js → sankeyDiagram-XADWPNL6-Dsw3nHRS.js} +1 -1
  89. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-C6G1oAE0.js → sequenceDiagram-FGHM5R23-CAgemUx5.js} +1 -1
  90. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-DbOJT_Xh.js → stateDiagram-FHFEXIEX-B7dyL9_X.js} +1 -1
  91. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-CImN6Wk6.js +1 -0
  92. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-D1DSxHh6.js → timeline-definition-GMOUNBTQ-B7iKswhp.js} +1 -1
  93. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-BYoSeMdo.js → vennDiagram-DHZGUBPP-uFS0i1qX.js} +1 -1
  94. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-DH3kZdea.js → wardleyDiagram-NUSXRM2D-lDUh4LAD.js} +1 -1
  95. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-C6MROMLG.js → xychartDiagram-5P7HB3ND-0v7MEVwW.js} +1 -1
  96. package/payload/server/public/data.html +5 -5
  97. package/payload/server/public/graph.html +6 -6
  98. package/payload/server/public/index.html +8 -8
  99. package/payload/server/public/public.html +5 -5
  100. package/payload/server/public/assets/channel-CfpByn-m.js +0 -1
  101. package/payload/server/public/assets/classDiagram-6PBFFD2Q-DNc9R1IX.js +0 -1
  102. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DM1DQh8N.js +0 -1
  103. package/payload/server/public/assets/clone-BSrNdvLW.js +0 -1
  104. package/payload/server/public/assets/data-Cbo0tTS3.js +0 -1
  105. package/payload/server/public/assets/graph-Beucu3_J.js +0 -1
  106. package/payload/server/public/assets/graph-labels-D15-eFQK.js +0 -1
  107. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-Ce4GFk-H.js +0 -1
  108. /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 { SessionStore, type StoredSession } from './session-store.js';
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 type SpawnFailureReason = 'which-claude-not-found' | 'pty-spawn-failed' | 'pid-file-timeout' | 'host-context-unresolved' | 'identity-unresolved' | 'mcp-config-write-failed';
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: StoredSession;
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
- spawnPty: (cmd: string, args: string[], env: NodeJS.ProcessEnv) => PtyHandle;
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. http-server uses this to attach the public-tool audit
64
- * watcher. */
65
- onSessionReady?: (session: StoredSession) => void;
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 StoredSession's `url` field has been mutated.
68
- * http-server uses this to push a `row-updated` SSE so the client's
69
- * hidden Open-in-new-tab arrow appears in step with the URL landing.
70
- * Headless spawns never invoke this (the capture handler is not
71
- * attached); url-capture-timeout never invokes this (no URL to push). */
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 `stopSession`'s post-Task-170 fd-release + store-remove
268
- * contract on the second exit branch the original task explicitly
269
- * out-of-scoped. Without this, the master fd lingers in node-pty's
270
- * internal socket until V8 GC finalises the IPty object and the
271
- * SessionStore row survives until manager shutdown — so the shutdown
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 `stopSession` sees the already-exited branch; release the
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 row third (Map.delete on a missing
278
- * key is a no-op, so the operator-request follow-up that races us is
279
- * harmless). The log line carries the same `master-fd=...` suffix the
280
- * operator-request path emits — every `kill … pid=<n>` line in
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
- }, session: StoredSession, exit: {
396
+ }, tracker: PtyTracker, exit: {
290
397
  exitCode: number;
291
398
  signal?: number;
292
399
  }, stderrTail: string): void;
293
- /** SIGTERM-only stop. Idempotentalready-exited rows resolve immediately.
294
- * Does not touch the JSONL transcript. Returns whether a PTY existed. */
295
- export declare function stopSession(deps: StopDeps, sessionId: string): Promise<{
296
- existed: boolean;
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":"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"}
1
+ {"version":3,"file":"pty-spawner.d.ts","sourceRoot":"","sources":["../src/pty-spawner.ts"],"names":[],"mappings":"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"}