@rubytech/create-maxy-code 0.1.39 → 0.1.41

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 (132) hide show
  1. package/dist/index.js +35 -101
  2. package/dist/uninstall.js +11 -102
  3. package/package.json +1 -1
  4. package/payload/platform/lib/mcp-stderr-tee/package.json +7 -0
  5. package/payload/platform/plugins/admin/hooks/turn-completed-graph-write.sh +142 -52
  6. package/payload/platform/plugins/docs/references/deployment.md +7 -3
  7. package/payload/platform/plugins/docs/references/platform.md +18 -4
  8. package/payload/platform/plugins/docs/references/plugins-guide.md +2 -0
  9. package/payload/platform/services/claude-session-manager/dist/config.d.ts +17 -0
  10. package/payload/platform/services/claude-session-manager/dist/config.d.ts.map +1 -1
  11. package/payload/platform/services/claude-session-manager/dist/config.js +37 -1
  12. package/payload/platform/services/claude-session-manager/dist/config.js.map +1 -1
  13. package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts +54 -0
  14. package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts.map +1 -0
  15. package/payload/platform/services/claude-session-manager/dist/fs-watcher.js +516 -0
  16. package/payload/platform/services/claude-session-manager/dist/fs-watcher.js.map +1 -0
  17. package/payload/platform/services/claude-session-manager/dist/hooks-discovery.d.ts +7 -0
  18. package/payload/platform/services/claude-session-manager/dist/hooks-discovery.d.ts.map +1 -0
  19. package/payload/platform/services/claude-session-manager/dist/hooks-discovery.js +90 -0
  20. package/payload/platform/services/claude-session-manager/dist/hooks-discovery.js.map +1 -0
  21. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +3 -1
  22. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  23. package/payload/platform/services/claude-session-manager/dist/http-server.js +426 -204
  24. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  25. package/payload/platform/services/claude-session-manager/dist/index.js +60 -13
  26. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  27. package/payload/platform/services/claude-session-manager/dist/jsonl-path.d.ts +2 -0
  28. package/payload/platform/services/claude-session-manager/dist/jsonl-path.d.ts.map +1 -1
  29. package/payload/platform/services/claude-session-manager/dist/jsonl-path.js +11 -6
  30. package/payload/platform/services/claude-session-manager/dist/jsonl-path.js.map +1 -1
  31. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +40 -45
  32. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  33. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +146 -162
  34. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  35. package/payload/platform/services/claude-session-manager/dist/reaper.d.ts +24 -0
  36. package/payload/platform/services/claude-session-manager/dist/reaper.d.ts.map +1 -0
  37. package/payload/platform/services/claude-session-manager/dist/reaper.js +114 -0
  38. package/payload/platform/services/claude-session-manager/dist/reaper.js.map +1 -0
  39. package/payload/platform/services/claude-session-manager/dist/session-store.d.ts +16 -41
  40. package/payload/platform/services/claude-session-manager/dist/session-store.d.ts.map +1 -1
  41. package/payload/platform/services/claude-session-manager/dist/session-store.js +29 -68
  42. package/payload/platform/services/claude-session-manager/dist/session-store.js.map +1 -1
  43. package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts +54 -0
  44. package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts.map +1 -1
  45. package/payload/platform/services/claude-session-manager/dist/system-prompt.js +111 -0
  46. package/payload/platform/services/claude-session-manager/dist/system-prompt.js.map +1 -1
  47. package/payload/platform/templates/agents/admin/IDENTITY.md +4 -2
  48. package/payload/platform/templates/agents/admin/SOUL.md +8 -14
  49. package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/dist/index.d.ts +51 -0
  50. package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/dist/index.d.ts.map +1 -0
  51. package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/dist/index.js +196 -0
  52. package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/dist/index.js.map +1 -0
  53. package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/package.json +7 -0
  54. package/payload/server/{chunk-NNHHGQJL.js → chunk-4P2MPERV.js} +6 -163
  55. package/payload/server/{chunk-3G6JMV7N.js → chunk-MEGIQYUD.js} +1 -1
  56. package/payload/server/{chunk-QC5LHYPH.js → chunk-XJVJ2B2Q.js} +1 -1
  57. package/payload/server/{cloudflare-task-tracker-NEB3X6O2.js → cloudflare-task-tracker-R6MMORFU.js} +2 -2
  58. package/payload/server/maxy-edge.js +2 -2
  59. package/payload/server/public/assets/{Checkbox-CmCjmfJy.js → Checkbox-blxv2XPY.js} +1 -1
  60. package/payload/server/public/assets/{admin-CtodW6As.js → admin-C3EvHpLN.js} +1 -1
  61. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-CfOjbx0H.js → architectureDiagram-Q4EWVU46-bETsVzGS.js} +1 -1
  62. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-D0kA2C9i.js → blockDiagram-DXYQGD6D-5y0GBnfQ.js} +1 -1
  63. package/payload/server/public/assets/{brand-6hKfBgOI.css → brand-DQlLKLDH.css} +1 -1
  64. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-CDgXiXgj.js → c4Diagram-AHTNJAMY-C1znpVGu.js} +1 -1
  65. package/payload/server/public/assets/channel-BWqTaXzb.js +1 -0
  66. package/payload/server/public/assets/{chunk-336JU56O-BfBTcT5X.js → chunk-336JU56O-DlCVUGzQ.js} +2 -2
  67. package/payload/server/public/assets/{chunk-426QAEUC-BdSSZ1Kw.js → chunk-426QAEUC-bGYkmA4z.js} +1 -1
  68. package/payload/server/public/assets/{chunk-4TB4RGXK-UvE1im9g.js → chunk-4TB4RGXK-6Sb0Undm.js} +1 -1
  69. package/payload/server/public/assets/{chunk-5FUZZQ4R-Dx4DslXz.js → chunk-5FUZZQ4R-CAT_Pq2T.js} +1 -1
  70. package/payload/server/public/assets/{chunk-5PVQY5BW-CNHawhLJ.js → chunk-5PVQY5BW-j231ESse.js} +1 -1
  71. package/payload/server/public/assets/{chunk-EDXVE4YY-Rmjv-1et.js → chunk-EDXVE4YY-BAlS4QL7.js} +1 -1
  72. package/payload/server/public/assets/{chunk-ENJZ2VHE-CL-LeH3r.js → chunk-ENJZ2VHE-D3Ku_BMP.js} +1 -1
  73. package/payload/server/public/assets/{chunk-ICPOFSXX-B2MFOJDt.js → chunk-ICPOFSXX-AR86A5WB.js} +1 -1
  74. package/payload/server/public/assets/{chunk-OYMX7WX6-BxcIcCt5.js → chunk-OYMX7WX6-DxGhapkW.js} +1 -1
  75. package/payload/server/public/assets/{chunk-U2HBQHQK-COzwOBrY.js → chunk-U2HBQHQK-DAlqsDo_.js} +1 -1
  76. package/payload/server/public/assets/{chunk-X2U36JSP-B0rjT5hL.js → chunk-X2U36JSP-lZdkkdyB.js} +1 -1
  77. package/payload/server/public/assets/{chunk-YZCP3GAM-pwrIw0XH.js → chunk-YZCP3GAM-CCjtXOFD.js} +1 -1
  78. package/payload/server/public/assets/{chunk-ZZ45TVLE-BXpeAm0k.js → chunk-ZZ45TVLE-ComtdKny.js} +1 -1
  79. package/payload/server/public/assets/classDiagram-6PBFFD2Q-B9hC6fOR.js +1 -0
  80. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-afl_ydIG.js +1 -0
  81. package/payload/server/public/assets/clone-Lj83OaZ3.js +1 -0
  82. package/payload/server/public/assets/{dagre-DjOJn05k.js → dagre-DX8QJeVt.js} +1 -1
  83. package/payload/server/public/assets/{dagre-KV5264BT-PczvQiEh.js → dagre-KV5264BT-BcRbiZ1q.js} +1 -1
  84. package/payload/server/public/assets/data-CS_R5VWQ.js +1 -0
  85. package/payload/server/public/assets/{device-url-actions-C55ZS_Zg.js → device-url-actions-Cag9IJ7n.js} +1 -1
  86. package/payload/server/public/assets/{diagram-5BDNPKRD-D477xo5F.js → diagram-5BDNPKRD-Bw47VwHO.js} +1 -1
  87. package/payload/server/public/assets/{diagram-G4DWMVQ6-C-HAtbtT.js → diagram-G4DWMVQ6-B-aVfhiD.js} +1 -1
  88. package/payload/server/public/assets/{diagram-MMDJMWI5-B9wus4H0.js → diagram-MMDJMWI5-DERz2dKo.js} +1 -1
  89. package/payload/server/public/assets/{diagram-TYMM5635-UMZLloFr.js → diagram-TYMM5635-B7eEX9Ta.js} +1 -1
  90. package/payload/server/public/assets/{erDiagram-SMLLAGMA-B8E52Mp4.js → erDiagram-SMLLAGMA-G_JJq3zB.js} +1 -1
  91. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-CUel34tq.js → flowDiagram-DWJPFMVM-BeY9QaO0.js} +1 -1
  92. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-BfwE-Xav.js → ganttDiagram-T4ZO3ILL-IXviGYnx.js} +1 -1
  93. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-2d6tXRIM.js → gitGraphDiagram-UUTBAWPF-GlY6pZQ1.js} +1 -1
  94. package/payload/server/public/assets/graph-DtGkQBFr.js +1 -0
  95. package/payload/server/public/assets/graph-labels-Dwu1ON5v.js +1 -0
  96. package/payload/server/public/assets/{graphlib-CCo9-wNJ.js → graphlib-BWgAjZSb.js} +1 -1
  97. package/payload/server/public/assets/{infoDiagram-42DDH7IO-DB1SVWL6.js → infoDiagram-42DDH7IO-D4YZM0gD.js} +1 -1
  98. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-CdeMUTYS.js → ishikawaDiagram-UXIWVN3A-fR71GDOp.js} +1 -1
  99. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-D8x8TUoc.js → journeyDiagram-VCZTEJTY-C1TcY_6m.js} +1 -1
  100. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-Cmkhd1mO.js → kanban-definition-6JOO6SKY-IPZKpnnG.js} +1 -1
  101. package/payload/server/public/assets/{line-CoHkpBv3.js → line-B2JtEL1B.js} +1 -1
  102. package/payload/server/public/assets/{mermaid-parser.core-C7R2PfZC.js → mermaid-parser.core-BKCLXqUh.js} +1 -1
  103. package/payload/server/public/assets/{mermaid.core-lQaq-kll.js → mermaid.core-CmNpCLB-.js} +3 -3
  104. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-CsPq3pX1.js → mindmap-definition-QFDTVHPH-BS0E2FPD.js} +1 -1
  105. package/payload/server/public/assets/{page-DwEaAdVp.js → page-BdI3GCun.js} +1 -1
  106. package/payload/server/public/assets/{page-CBKzjUHO.js → page-zIjAkU2y.js} +1 -1
  107. package/payload/server/public/assets/{pieDiagram-DEJITSTG-FZH9sTnP.js → pieDiagram-DEJITSTG-J61JDyk8.js} +1 -1
  108. package/payload/server/public/assets/{public-hGLzxhE_.js → public-C5vaQnC_.js} +4 -4
  109. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-9poxfoqh.js → quadrantDiagram-34T5L4WZ-CLI03OtR.js} +1 -1
  110. package/payload/server/public/assets/{requirementDiagram-MS252O5E-Ce7iOdT_.js → requirementDiagram-MS252O5E-C8MCt5NO.js} +1 -1
  111. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-DINuXatI.js → sankeyDiagram-XADWPNL6-DQuugruj.js} +1 -1
  112. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-CSMec3EK.js → sequenceDiagram-FGHM5R23-CoYitwhO.js} +1 -1
  113. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-15DKzypj.js → stateDiagram-FHFEXIEX-G68cHHoI.js} +1 -1
  114. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-Dtgpgr_D.js +1 -0
  115. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-BxIRc9Pu.js → timeline-definition-GMOUNBTQ-CelLeJVS.js} +1 -1
  116. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-DdgRyU55.js → vennDiagram-DHZGUBPP-BVgFPkJq.js} +1 -1
  117. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-CKvhU1Uj.js → wardleyDiagram-NUSXRM2D-CzD_8hl2.js} +1 -1
  118. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-d0V1V4PD.js → xychartDiagram-5P7HB3ND-BuTxWdX5.js} +1 -1
  119. package/payload/server/public/data.html +5 -5
  120. package/payload/server/public/graph.html +6 -6
  121. package/payload/server/public/index.html +8 -8
  122. package/payload/server/public/public.html +5 -5
  123. package/payload/server/server.js +1058 -846
  124. package/payload/server/public/assets/channel-DA7MGMzQ.js +0 -1
  125. package/payload/server/public/assets/classDiagram-6PBFFD2Q-DqfmcWSr.js +0 -1
  126. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BVOMSbZ_.js +0 -1
  127. package/payload/server/public/assets/clone-Byp7hagU.js +0 -1
  128. package/payload/server/public/assets/data-A7azIkZU.js +0 -1
  129. package/payload/server/public/assets/graph-Dx83EhtP.js +0 -1
  130. package/payload/server/public/assets/graph-labels-Bg2Bzelb.js +0 -1
  131. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-AcaK_QfD.js +0 -1
  132. /package/payload/server/public/assets/{brand-DXOx08r0.js → brand-D6mXeyxV.js} +0 -0
@@ -1,37 +1,25 @@
1
- // Spawn a `claude --verbose` PTY child, capture the /remote-control URL,
2
- // register the session keyed on the URL's bridge suffix, and return 200
3
- // immediately. The PTY stream flows; Claude Code writes its intrinsic JSONL
4
- // to ~/.<brand>/.claude/projects/<slug>/<intrinsic>.jsonl on the first
5
- // operator turnwhich may be seconds, minutes, or never. The jsonl-observer
6
- // fires when that file appears and promotes the row to the intrinsic
7
- // claudeSessionId without changing its surface identity.
1
+ // Spawn a `claude --verbose` PTY child and resolve once the fs-watcher
2
+ // reports the PID file Claude Code writes at process init
3
+ // (`${CLAUDE_CONFIG_DIR}/sessions/<pid>.json` for entrypoint=cli). That
4
+ // file carries the intrinsic sessionId, bridgeSessionId, agent, status
5
+ // and cwd directly earlier and more authoritatively than the
6
+ // `/remote-control` URL banner. URL capture still runs in parallel so
7
+ // the operator-facing iframe URL is populated, but it no longer gates
8
+ // /spawn's response.
8
9
  //
9
- // The manager mints zero session ids of its own. The bridge suffix is the
10
- // row's identifier from URL capture; the intrinsic id takes over for
11
- // JSONL-bound routes once observation fires. /spawn no longer blocks on
12
- // observation, so the `observe-timeout` failure mode (Task 065's loud-fail
13
- // timer) is gone — an operator who clicks `+ New session` and then walks
14
- // away does not get a killed PTY.
10
+ // The manager mints zero session ids. Both the intrinsic id and the
11
+ // bridgeSessionId come from Claude Code's own state files.
15
12
  //
16
- // Remaining spawn failure surfaces (all return 500 with `stderrTail`):
17
- // which-claude-not-found, pty-spawn-failed, url-capture-timeout,
18
- // bridge-suffix-unparseable, host-context-unresolved, identity-unresolved.
13
+ // Spawn failure surfaces (return 500 with `stderrTail`):
14
+ // which-claude-not-found, pty-spawn-failed, pid-file-timeout,
15
+ // host-context-unresolved, identity-unresolved, mcp-config-write-failed.
19
16
  import { mkdirSync, writeFileSync, existsSync } from 'node:fs';
20
17
  import { tmpdir } from 'node:os';
21
18
  import { dirname, join } from 'node:path';
22
19
  import { startUrlCapture } from './url-capture.js';
23
- import { bridgeSuffixFromUrl } from './jsonl-path.js';
24
20
  // CSI (Cursor / Style) escape sequence: ESC `[` <args> <final-letter>.
25
- // Stripped from the PTY tail so failure logs are readable instead of an
26
- // alphabet soup of `\x1b[1C`, `\x1b[38;5;246m`, etc.
27
21
  const PTY_TAIL_CSI = /\x1b\[[0-9;?]*[A-Za-z]/g;
28
- // 4 KiB rolling buffer is enough to show the welcome banner, the
29
- // `/remote-control is active …` line, and any prompt or error message
30
- // claude prints in the seconds between spawn and JSONL observation.
31
22
  const PTY_TAIL_BYTES = 4 * 1024;
32
- // Capped slice emitted into log lines (server.log) so a single failure
33
- // line never balloons past ~2 KiB. The full tail still goes onto the wire
34
- // (SpawnResult.stderrTail) so the UI can surface it.
35
23
  const PTY_TAIL_LOG_BYTES = 1024;
36
24
  function attachPtyTail(pty) {
37
25
  let buf = '';
@@ -55,39 +43,22 @@ function formatTailForLog(tail) {
55
43
  return JSON.stringify(trimmed);
56
44
  }
57
45
  import { composeAppendSystemPrompt, } from './system-prompt.js';
46
+ import { discoverHooks } from './hooks-discovery.js';
58
47
  export const PERMISSION_MODES = ['default', 'acceptEdits', 'plan', 'auto'];
59
- /** Expand `${VAR}` placeholders that appear in PLUGIN.md mcp args/env. Only
60
- * PLATFORM_ROOT, PREMIUM_PLUGINS_ROOT, ACCOUNT_ID, SESSION_ID, LOG_DIR are
61
- * substituted — everything else is passed through literally so Claude Code's
62
- * own var-expansion (if any) still applies.
63
- *
64
- * PREMIUM_PLUGINS_ROOT is derived as the sibling `premium-plugins/` directory
65
- * of PLATFORM_ROOT — mirrors the boot-time resolution at
66
- * index.ts:loadToolSurface so premium-plugin mcp: blocks can declare their
67
- * dist path symmetrically to platform plugins. */
68
48
  function expandPlaceholders(raw, vars) {
69
49
  return raw.replace(/\$\{([A-Z_][A-Z0-9_]*)\}/g, (m, name) => {
70
50
  return Object.prototype.hasOwnProperty.call(vars, name) ? vars[name] : m;
71
51
  });
72
52
  }
73
53
  function writePerSpawnMcpConfig(p) {
74
- // Public spawns currently expose zero MCP tools (no plugin sets
75
- // publicAllowlist: true). Write a config with an empty `mcpServers` map so
76
- // the --mcp-config flag still appears in argv — keeps the argv shape
77
- // identical across roles and makes the observability emit unambiguous.
78
54
  const serversForRole = [];
79
55
  if (p.role === 'admin') {
80
- // Admin sees every plugin's MCP server.
81
56
  for (const [name, desc] of p.toolSurface.mcpServers)
82
57
  serversForRole.push([name, desc]);
83
58
  }
84
59
  else {
85
- // Public sees only plugins that contribute at least one public tool.
86
60
  const publicPluginNames = new Set();
87
61
  for (const t of p.toolSurface.public) {
88
- // Qualified tools look like `mcp__<plugin>__<tool>`. Plugin and tool
89
- // names use single hyphens/underscores; the delimiter is the literal
90
- // `__` pair, so a non-greedy match terminates at the first one.
91
62
  const m = t.match(/^mcp__(.+?)__/);
92
63
  if (m)
93
64
  publicPluginNames.add(m[1]);
@@ -132,13 +103,61 @@ function writePerSpawnMcpConfig(p) {
132
103
  }
133
104
  return { ok: true, path: target, bytes: Buffer.byteLength(payload, 'utf8'), serverCount: serversForRole.length };
134
105
  }
106
+ /** Pre-spawn slot accounting. Returns either a rejection (caller should
107
+ * surface as 503) or undefined when the spawn may proceed. Eviction of an
108
+ * idle specialist row, when needed, happens here too. Operator
109
+ * (non-specialist) spawns are exempt from both guards. */
110
+ function checkSlotsAndMaybeEvict(deps, args) {
111
+ const isSpecialistSpawn = typeof args.specialist === 'string' && args.specialist.length > 0;
112
+ if (!isSpecialistSpawn)
113
+ return undefined;
114
+ const liveRows = deps.watcher.all().filter((r) => r.state === 'live');
115
+ const specialistRows = liveRows.filter((r) => r.agent !== null);
116
+ if (specialistRows.length >= deps.specialistCap) {
117
+ const idleOldest = specialistRows
118
+ .filter((r) => r.status === 'idle' && r.jsonlPath === null)
119
+ .sort((a, b) => a.updatedAt - b.updatedAt)[0];
120
+ if (!idleOldest) {
121
+ deps.logger(`[pty-cap] specialist-cap-reached account=${deps.accountId} current=${specialistRows.length} cap=${deps.specialistCap} evicted=none`);
122
+ return { kind: 'specialist-cap-reached', currentCount: specialistRows.length, cap: deps.specialistCap };
123
+ }
124
+ const victim = deps.store.get(idleOldest.sessionId);
125
+ if (victim && !victim.exited) {
126
+ try {
127
+ victim.pty.kill('SIGTERM');
128
+ }
129
+ catch { /* fire-and-forget */ }
130
+ }
131
+ deps.store.remove(idleOldest.sessionId);
132
+ deps.logger(`[pty-cap] specialist-cap-reached account=${deps.accountId} current=${specialistRows.length} cap=${deps.specialistCap} evicted=${idleOldest.sessionId}`);
133
+ }
134
+ if (liveRows.length >= deps.totalPtyCap - deps.operatorReserve) {
135
+ deps.logger(`[pty-cap] operator-slots-reserved total=${liveRows.length} reserve=${deps.operatorReserve} totalCap=${deps.totalPtyCap} rejected-specialist=${args.senderId}`);
136
+ return {
137
+ kind: 'operator-slots-reserved',
138
+ total: liveRows.length,
139
+ reserve: deps.operatorReserve,
140
+ totalCap: deps.totalPtyCap,
141
+ };
142
+ }
143
+ return undefined;
144
+ }
135
145
  export async function spawnClaudeSession(deps, args) {
146
+ const rejection = checkSlotsAndMaybeEvict(deps, args);
147
+ if (rejection) {
148
+ return { ok: false, rejected: rejection };
149
+ }
136
150
  const startedAt = new Date().toISOString();
137
151
  const start = Date.now();
138
152
  const composedHost = deps.tunnelUrlOverride !== undefined
139
153
  ? { ...deps.host, tunnelUrl: deps.tunnelUrlOverride }
140
154
  : deps.host;
141
- const composed = composeAppendSystemPrompt(composedHost, { accountDir: deps.accountDir, role: args.role }, { aboutOwner: args.aboutOwner, dormantPlugins: args.dormantPlugins });
155
+ const composed = composeAppendSystemPrompt(composedHost, { accountDir: deps.accountDir, role: args.role }, {
156
+ aboutOwner: args.aboutOwner,
157
+ dormantPlugins: args.dormantPlugins,
158
+ activePlugins: args.activePlugins,
159
+ specialistDomains: args.specialistDomains,
160
+ });
142
161
  if (!composed.ok) {
143
162
  if (composed.reason === 'host-unresolved') {
144
163
  const stderrTail = deps.host.lanIPv4Diagnostic ?? 'append-system-prompt unresolved';
@@ -152,7 +171,7 @@ export async function spawnClaudeSession(deps, args) {
152
171
  return { ok: false, reason: 'identity-unresolved', stderrTail: composed.detail };
153
172
  }
154
173
  const appendSystemPrompt = composed.block;
155
- deps.logger(`compose-system-prompt-ok role=${args.role} accountDir=${deps.accountDir} appendSystemPromptBytes=${Buffer.byteLength(appendSystemPrompt, 'utf8')} identityBytes=${composed.identityBytes} soulBytes=${composed.soulBytes} aboutOwnerBytes=${composed.aboutOwnerBytes} dormantPluginsBytes=${composed.dormantPluginsBytes}`);
174
+ deps.logger(`compose-system-prompt-ok role=${args.role} accountDir=${deps.accountDir} appendSystemPromptBytes=${Buffer.byteLength(appendSystemPrompt, 'utf8')} identityBytes=${composed.identityBytes} soulBytes=${composed.soulBytes} aboutOwnerBytes=${composed.aboutOwnerBytes} dormantPluginsBytes=${composed.dormantPluginsBytes} pluginManifestBytes=${composed.pluginManifestBytes} specialistDomainsBytes=${composed.specialistDomainsBytes}`);
156
175
  const argv = [
157
176
  '--verbose',
158
177
  '--remote-control',
@@ -182,10 +201,6 @@ export async function spawnClaudeSession(deps, args) {
182
201
  if (args.permissionMode && args.permissionMode !== 'default') {
183
202
  argv.push('--permission-mode', args.permissionMode);
184
203
  }
185
- // Per-spawn mcp-config.json: role-gated descriptor union resolved from the
186
- // tool-surface. Plugins that contribute zero public tools (every plugin
187
- // today) are admin-only — public spawns get no MCP servers, which matches
188
- // their empty allow-list.
189
204
  const mcpConfigResult = writePerSpawnMcpConfig({
190
205
  role: args.role,
191
206
  toolSurface: deps.toolSurface,
@@ -200,10 +215,6 @@ export async function spawnClaudeSession(deps, args) {
200
215
  return { ok: false, reason: 'mcp-config-write-failed', stderrTail: mcpConfigResult.detail };
201
216
  }
202
217
  argv.push('--mcp-config', mcpConfigResult.path);
203
- // Bundled plugin agents (`platform/plugins/*/agents/`,
204
- // `premium-plugins/*/agents/`) — both roles. Per-account specialists
205
- // (`<accountDir>/specialists/agents/`) — admin only. `--add-dir` lets
206
- // Claude Code's `subagent_type` dispatch reach the file on disk.
207
218
  const dirsToAdd = [...deps.agentsDirs[args.role]];
208
219
  if (args.role === 'admin' && existsSync(deps.perAccountSpecialistsDir)) {
209
220
  dirsToAdd.push(deps.perAccountSpecialistsDir);
@@ -218,16 +229,14 @@ export async function spawnClaudeSession(deps, args) {
218
229
  argv.push('--add-dir', args.attachmentDir);
219
230
  argv.push('--allowed-tools', `Read(${args.attachmentDir}/**)`);
220
231
  }
221
- deps.logger(`pty-spawn-start claudeBin=${deps.claudeBin} argv-count=${argv.length} append-system-prompt-bytes=${Buffer.byteLength(appendSystemPrompt, 'utf8')} permission-mode=${args.permissionMode ?? 'default'} resume=${args.resumeClaudeSessionId ? 'yes' : 'no'}`);
232
+ const hooksResolved = discoverHooks(deps.spawnCwd, process.env.CLAUDE_CONFIG_DIR);
233
+ deps.logger(`pty-spawn-start claudeBin=${deps.claudeBin} argv-count=${argv.length} append-system-prompt-bytes=${Buffer.byteLength(appendSystemPrompt, 'utf8')} permission-mode=${args.permissionMode ?? 'default'} resume=${args.resumeClaudeSessionId ? 'yes' : 'no'} hooksResolved=${hooksResolved.join(',') || 'none'}`);
222
234
  const ptySpawnStart = Date.now();
223
235
  let pty;
224
236
  try {
225
237
  pty = deps.spawnPty(deps.claudeBin, argv, {
226
238
  ...process.env,
227
239
  TERM: 'xterm-256color',
228
- // Stop-hook gate reads these — admin foreground sessions fire the
229
- // per-turn graph-write hook; everything else (public role, hidden
230
- // background recorder PTYs) exits the hook 0 early.
231
240
  MAXY_SESSION_ROLE: args.role,
232
241
  MAXY_HIDDEN_SPAWN: args.hidden ? '1' : '0',
233
242
  });
@@ -241,115 +250,90 @@ export async function spawnClaudeSession(deps, args) {
241
250
  }
242
251
  deps.logger(`pty-spawned pid=${pty.pid} ms=${Date.now() - ptySpawnStart}`);
243
252
  const tail = attachPtyTail(pty);
244
- return await new Promise((resolve) => {
245
- let settled = false;
246
- const settle = (outcome) => {
247
- if (settled)
248
- return;
249
- settled = true;
250
- resolve(outcome);
251
- };
252
- startUrlCapture({
253
- pty,
254
- timeoutMs: deps.urlCaptureTimeoutMs,
255
- logger: deps.logger,
256
- onUrl: (url) => {
257
- const bridgeSuffix = bridgeSuffixFromUrl(url);
258
- deps.logger(`bridge-suffix-extracted suffix=${bridgeSuffix ?? 'null'} url=${url}`);
259
- if (!bridgeSuffix) {
260
- pty.kill('SIGKILL');
261
- const stderrTail = tail.getTail();
262
- deps.logger(`spawn-failed reason=bridge-suffix-unparseable url=${url} stderr-tail=${formatTailForLog(stderrTail)}`);
263
- settle({ ok: false, reason: 'bridge-suffix-unparseable', stderrTail });
264
- return;
265
- }
266
- const session = {
267
- bridgeSuffix,
268
- claudeSessionId: null,
269
- pid: pty.pid,
270
- url,
271
- startedAt,
272
- senderId: args.senderId,
273
- role: args.role,
274
- channel: args.channel,
275
- jsonlPath: null,
276
- pty,
277
- exited: false,
278
- hidden: args.hidden === true,
279
- specialist: args.specialist ?? null,
280
- };
281
- deps.store.addPending(session);
282
- if (args.hidden === true) {
283
- deps.logger(`hidden-spawn specialist=${args.specialist ?? 'none'} bridgeSuffix=${bridgeSuffix} pid=${pty.pid}`);
284
- }
285
- if (args.stdinPayload !== undefined) {
286
- try {
287
- pty.write(args.stdinPayload + '\r');
288
- }
289
- catch (err) {
290
- const msg = err instanceof Error ? err.message : String(err);
291
- deps.logger(`hidden-stdin-write-failed bridgeSuffix=${bridgeSuffix} message=${msg}`);
292
- }
293
- }
294
- // Spawn-response side: respond on URL capture, no observer wait.
295
- // The observation runs in the background and promotes the row when
296
- // the first operator turn lands. `wait-ms` on `jsonl-observed` is
297
- // unbounded by design — high values are the normal idle-then-typed
298
- // case, not a fault.
299
- const observation = deps.observer.observe({ bridgeSuffix });
300
- observation.promise.then((observed) => {
301
- if (!observed) {
302
- // Observer cancelled (e.g. operator deleted the row before
303
- // typing). Nothing to do pending row is already gone.
304
- return;
305
- }
306
- const promoted = deps.store.promote(bridgeSuffix, observed.claudeSessionId, observed.jsonlPath);
307
- if (!promoted) {
308
- // Row was removed before promotion landed; drop the observation.
309
- return;
310
- }
311
- const waitMs = Date.now() - start;
312
- deps.logger(`jsonl-observed pid=${pty.pid} sessionId=${observed.claudeSessionId} bridgeSuffix=${bridgeSuffix} path=${observed.jsonlPath} wait-ms=${waitMs}`);
313
- deps.logger(`session-id-promoted bridgeSuffix=${bridgeSuffix} intrinsic=${observed.claudeSessionId} pid=${pty.pid}`);
314
- deps.logger(`[pty-spawn] sessionId=${observed.claudeSessionId} appendSystemPromptBytes=${Buffer.byteLength(appendSystemPrompt, 'utf8')} identityBytes=${composed.identityBytes} soulBytes=${composed.soulBytes} aboutOwnerBytes=${composed.aboutOwnerBytes} dormantPluginsBytes=${composed.dormantPluginsBytes} accountDir=${deps.accountDir} role=${args.role} hostname=${deps.host.hostname} lanIPv4=${deps.host.lanIPv4} adminUrl=${deps.host.adminUrl} tunnelUrl=${composedHost.tunnelUrl ?? 'none'}`);
315
- deps.onJsonlObserved?.(promoted);
316
- });
317
- // PTY exit: flip the exited flag and cancel the observation. No
318
- // hard error here — by design the PTY may outlive any number of
319
- // operator-idle periods; only after promotion is the JSONL useful.
320
- pty.onExit((e) => {
321
- session.exited = true;
322
- const stderrTail = tail.getTail();
323
- tail.dispose();
324
- observation.cancel();
325
- if (session.claudeSessionId === null) {
326
- // never typed → drop the pending row silently
327
- deps.store.remove(bridgeSuffix);
328
- deps.logger(`session-closed-idle bridgeSuffix=${bridgeSuffix} pid=${pty.pid}`);
329
- }
330
- deps.logger(`kill pid=${pty.pid} reason=process-exited exit-code=${e.exitCode} signal=${e.signal ?? 'none'} stderr-tail=${formatTailForLog(stderrTail)}`);
331
- });
332
- const responseMs = Date.now() - start;
333
- deps.logger(`spawn-response-returned bridgeSuffix=${bridgeSuffix} pid=${pty.pid} ms=${responseMs}`);
334
- deps.logger(`spawn pid=${pty.pid} sessionUrl=${url} senderId=${args.senderId} role=${args.role} channel=${args.channel} permissionMode=${args.permissionMode ?? 'default'} latency-ms=${responseMs}`);
335
- settle({ ok: true, session });
336
- },
337
- onTimeout: () => {
338
- pty.kill('SIGKILL');
339
- const stderrTail = tail.getTail();
340
- deps.logger(`spawn-failed reason=url-capture-timeout stderr-tail=${formatTailForLog(stderrTail)}`);
341
- settle({ ok: false, reason: 'url-capture-timeout', stderrTail });
342
- },
343
- });
253
+ // URL capture runs in parallel; its result is patched onto the
254
+ // session row when (if) it fires. The spawn promise does not block on
255
+ // it. A timeout here is logged but not a failure — the operator's
256
+ // iframe URL falls back to UI-side construction from bridgeSessionId.
257
+ let capturedUrl = null;
258
+ startUrlCapture({
259
+ pty,
260
+ timeoutMs: deps.urlCaptureTimeoutMs,
261
+ logger: deps.logger,
262
+ onUrl: (url) => {
263
+ capturedUrl = url;
264
+ deps.logger(`url-captured pid=${pty.pid} url=${url}`);
265
+ const live = deps.store.get(sessionIdRef.current ?? '');
266
+ if (live)
267
+ live.url = url;
268
+ },
269
+ onTimeout: () => {
270
+ deps.logger(`url-capture-timeout pid=${pty.pid} ms=${Date.now() - start}`);
271
+ },
272
+ });
273
+ // Mutable holder so the URL callback can find the row once sessionId
274
+ // is known. The PID-file event below sets sessionIdRef.current.
275
+ const sessionIdRef = { current: null };
276
+ // Wait for the watcher's PID-file event. The watcher resolves
277
+ // synchronously if the file already exists (race-safe boot scan).
278
+ let row;
279
+ try {
280
+ row = await deps.watcher.waitForPid(pty.pid, deps.pidFileTimeoutMs);
281
+ }
282
+ catch (err) {
283
+ pty.kill('SIGKILL');
284
+ const stderrTail = tail.getTail();
285
+ tail.dispose();
286
+ const detail = err instanceof Error ? err.message : String(err);
287
+ deps.logger(`spawn-failed reason=pid-file-timeout pid=${pty.pid} detail=${JSON.stringify(detail)} stderr-tail=${formatTailForLog(stderrTail)}`);
288
+ return { ok: false, reason: 'pid-file-timeout', stderrTail };
289
+ }
290
+ sessionIdRef.current = row.sessionId;
291
+ const session = {
292
+ sessionId: row.sessionId,
293
+ bridgeSessionId: row.bridgeSessionId ?? `session_${row.sessionId}`,
294
+ bridgeSuffix: row.bridgeSuffix ?? row.sessionId,
295
+ pid: pty.pid,
296
+ url: capturedUrl,
297
+ startedAt,
298
+ senderId: args.senderId,
299
+ role: args.role,
300
+ channel: args.channel,
301
+ jsonlPath: row.jsonlPath,
302
+ pty,
303
+ exited: false,
304
+ hidden: args.hidden === true,
305
+ specialist: args.specialist ?? row.agent ?? null,
306
+ };
307
+ deps.store.add(session);
308
+ if (args.hidden === true) {
309
+ deps.logger(`hidden-spawn specialist=${session.specialist ?? 'none'} sessionId=${session.sessionId} pid=${pty.pid}`);
310
+ }
311
+ // PTY exit: mark exited; the watcher will fire a delete event when
312
+ // claude removes its PID file, which the http-server subscriber
313
+ // translates into an archived row (JSONL still on disk if any turn ran).
314
+ pty.onExit((e) => {
315
+ session.exited = true;
316
+ const stderrTail = tail.getTail();
317
+ tail.dispose();
318
+ deps.logger(`kill pid=${pty.pid} reason=process-exited exit-code=${e.exitCode} signal=${e.signal ?? 'none'} stderr-tail=${formatTailForLog(stderrTail)}`);
344
319
  });
320
+ const responseMs = Date.now() - start;
321
+ deps.logger(`spawn-response-returned sessionId=${session.sessionId} bridgeSessionId=${session.bridgeSessionId} pid=${pty.pid} ms=${responseMs}`);
322
+ deps.logger(`spawn pid=${pty.pid} sessionId=${session.sessionId} bridgeSessionId=${session.bridgeSessionId} senderId=${args.senderId} role=${args.role} channel=${args.channel} permissionMode=${args.permissionMode ?? 'default'} latency-ms=${responseMs}`);
323
+ deps.logger(`[pty-spawn] sessionId=${session.sessionId} appendSystemPromptBytes=${Buffer.byteLength(appendSystemPrompt, 'utf8')} identityBytes=${composed.identityBytes} soulBytes=${composed.soulBytes} aboutOwnerBytes=${composed.aboutOwnerBytes} dormantPluginsBytes=${composed.dormantPluginsBytes} accountDir=${deps.accountDir} role=${args.role} hostname=${deps.host.hostname} lanIPv4=${deps.host.lanIPv4} adminUrl=${deps.host.adminUrl} tunnelUrl=${composedHost.tunnelUrl ?? 'none'}`);
324
+ deps.onSessionReady?.(session);
325
+ return { ok: true, session };
345
326
  }
346
- export async function deleteSession(deps, sessionId) {
327
+ /** SIGTERM-only stop. Idempotent already-exited rows resolve immediately.
328
+ * Does not touch the JSONL transcript. Returns whether a PTY existed. */
329
+ export async function stopSession(deps, sessionId) {
347
330
  const s = deps.store.get(sessionId);
348
331
  if (!s)
349
- return { ok: true, existed: false };
332
+ return { existed: false };
350
333
  if (s.exited) {
351
334
  deps.store.remove(sessionId);
352
- return { ok: true, existed: true };
335
+ deps.logger(`kill sessionId=${sessionId} pid=${s.pid} reason=operator-request status=already-exited`);
336
+ return { existed: true };
353
337
  }
354
338
  s.pty.kill('SIGTERM');
355
339
  await new Promise((resolve) => {
@@ -364,7 +348,7 @@ export async function deleteSession(deps, sessionId) {
364
348
  });
365
349
  });
366
350
  deps.store.remove(sessionId);
367
- deps.logger(`kill pid=${s.pid} reason=operator-request exit-code=0`);
368
- return { ok: true, existed: true };
351
+ deps.logger(`kill sessionId=${sessionId} pid=${s.pid} reason=operator-request exit-code=0`);
352
+ return { existed: true };
369
353
  }
370
354
  //# sourceMappingURL=pty-spawner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pty-spawner.js","sourceRoot":"","sources":["../src/pty-spawner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pty-spawner.js","sourceRoot":"","sources":["../src/pty-spawner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Logger } from './types.js';
2
+ import type { FsWatcher } from './fs-watcher.js';
3
+ import type { SessionStore } from './session-store.js';
4
+ export interface ReaperDeps {
5
+ watcher: FsWatcher;
6
+ store: SessionStore;
7
+ recorderIdleTtlMs: number;
8
+ killGraceMs: number;
9
+ intervalMs: number;
10
+ logger: Logger;
11
+ /** Injectable clock for tests. Defaults to Date.now. */
12
+ now?: () => number;
13
+ }
14
+ export interface Reaper {
15
+ start(): void;
16
+ stop(): void;
17
+ /** Run one reap pass synchronously. Exposed for tests. */
18
+ tickOnce(): {
19
+ scanned: number;
20
+ reaped: number;
21
+ };
22
+ }
23
+ export declare function createReaper(deps: ReaperDeps): Reaper;
24
+ //# sourceMappingURL=reaper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reaper.d.ts","sourceRoot":"","sources":["../src/reaper.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,iBAAiB,CAAA;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEtD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,SAAS,CAAA;IAClB,KAAK,EAAE,YAAY,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,wDAAwD;IACxD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,IAAI,IAAI,CAAA;IACb,IAAI,IAAI,IAAI,CAAA;IACZ,0DAA0D;IAC1D,QAAQ,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAChD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAoFrD"}
@@ -0,0 +1,114 @@
1
+ // Idle-recorder reaper. Walks the fs-watcher row index every `intervalMs`
2
+ // (and again on each watcher event) and SIGTERMs any specialist row that has
3
+ // been status:idle with no JSONL for longer than `recorderIdleTtlMs`. The
4
+ // Stop hook in the admin agent fires one recorder per turn; any recorder that
5
+ // errors-without-exit leaks a PTY. Without this loop, leaks compound until
6
+ // `/proc/sys/kernel/pty/max` or `nofile` is exhausted and the manager cannot
7
+ // spawn its own cleanup turn.
8
+ //
9
+ // Reap condition (all four must hold):
10
+ // row.agent !== null // it's a specialist
11
+ // row.status === 'idle' // not actively producing output
12
+ // row.jsonlPath === null // no transcript was ever written
13
+ // row.updatedAt older than TTL // not a fresh spawn
14
+ //
15
+ // The reaper holds no PTY itself — it sends SIGTERM via the StoredSession's
16
+ // pty handle from the SessionStore. The PID file removal happens naturally
17
+ // when claude exits; the fs-watcher observes that and drops the row.
18
+ export function createReaper(deps) {
19
+ const now = deps.now ?? (() => Date.now());
20
+ let timer = null;
21
+ let unsubscribe = null;
22
+ let started = false;
23
+ function shouldReap(row) {
24
+ if (row.agent === null)
25
+ return false;
26
+ if (row.status !== 'idle')
27
+ return false;
28
+ if (row.jsonlPath !== null)
29
+ return false;
30
+ if (row.state !== 'live')
31
+ return false;
32
+ const idleMs = now() - row.updatedAt;
33
+ return idleMs > deps.recorderIdleTtlMs;
34
+ }
35
+ function reapRow(row) {
36
+ const idleMs = now() - row.updatedAt;
37
+ const live = deps.store.get(row.sessionId);
38
+ if (live && !live.exited) {
39
+ try {
40
+ live.pty.kill('SIGTERM');
41
+ }
42
+ catch {
43
+ // Already gone — fall through to log + SIGKILL escalation.
44
+ }
45
+ const grace = setTimeout(() => {
46
+ if (!live.exited) {
47
+ try {
48
+ live.pty.kill('SIGKILL');
49
+ }
50
+ catch { /* gone */ }
51
+ }
52
+ }, deps.killGraceMs);
53
+ live.pty.onExit(() => clearTimeout(grace));
54
+ }
55
+ deps.logger(`[reaper] reaped sessionId=${row.sessionId} agent=${row.agent} idle-ms=${idleMs} reason=stale-recorder`);
56
+ }
57
+ function tickOnce() {
58
+ let scanned = 0;
59
+ let reaped = 0;
60
+ try {
61
+ const rows = deps.watcher.all();
62
+ scanned = rows.length;
63
+ for (const row of rows) {
64
+ if (shouldReap(row)) {
65
+ reapRow(row);
66
+ reaped += 1;
67
+ }
68
+ }
69
+ deps.logger(`[reaper] tick rows-scanned=${scanned} reaped=${reaped}`);
70
+ }
71
+ catch (err) {
72
+ const message = err instanceof Error ? err.message : String(err);
73
+ deps.logger(`[reaper] tick-failed message=${JSON.stringify(message)}`);
74
+ }
75
+ return { scanned, reaped };
76
+ }
77
+ function start() {
78
+ if (started)
79
+ return;
80
+ started = true;
81
+ timer = setInterval(tickOnce, deps.intervalMs);
82
+ // Don't keep the event loop alive for the reaper alone — the HTTP
83
+ // server's listener handles that. Without unref(), shutdown via
84
+ // process.exit is fine, but tests that close the watcher and expect
85
+ // the process to drain would hang.
86
+ if (typeof timer.unref === 'function')
87
+ timer.unref();
88
+ unsubscribe = deps.watcher.subscribe((event) => {
89
+ // Only pid-source events change the lifecycle of a specialist row
90
+ // in a way that could make it eligible. jsonl events disqualify
91
+ // (jsonlPath !== null), so we skip them.
92
+ if (event.source !== 'pid')
93
+ return;
94
+ tickOnce();
95
+ });
96
+ deps.logger(`[reaper] started intervalMs=${deps.intervalMs} recorderIdleTtlMs=${deps.recorderIdleTtlMs} killGraceMs=${deps.killGraceMs}`);
97
+ }
98
+ function stop() {
99
+ if (!started)
100
+ return;
101
+ if (timer) {
102
+ clearInterval(timer);
103
+ timer = null;
104
+ }
105
+ if (unsubscribe) {
106
+ unsubscribe();
107
+ unsubscribe = null;
108
+ }
109
+ started = false;
110
+ deps.logger(`[reaper] stopped`);
111
+ }
112
+ return { start, stop, tickOnce };
113
+ }
114
+ //# sourceMappingURL=reaper.js.map