@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.
- package/dist/index.js +35 -101
- package/dist/uninstall.js +11 -102
- package/package.json +1 -1
- package/payload/platform/lib/mcp-stderr-tee/package.json +7 -0
- package/payload/platform/plugins/admin/hooks/turn-completed-graph-write.sh +142 -52
- package/payload/platform/plugins/docs/references/deployment.md +7 -3
- package/payload/platform/plugins/docs/references/platform.md +18 -4
- package/payload/platform/plugins/docs/references/plugins-guide.md +2 -0
- package/payload/platform/services/claude-session-manager/dist/config.d.ts +17 -0
- package/payload/platform/services/claude-session-manager/dist/config.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/config.js +37 -1
- package/payload/platform/services/claude-session-manager/dist/config.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts +54 -0
- package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/fs-watcher.js +516 -0
- package/payload/platform/services/claude-session-manager/dist/fs-watcher.js.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/hooks-discovery.d.ts +7 -0
- package/payload/platform/services/claude-session-manager/dist/hooks-discovery.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/hooks-discovery.js +90 -0
- package/payload/platform/services/claude-session-manager/dist/hooks-discovery.js.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +3 -1
- 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 +426 -204
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/index.js +60 -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 +2 -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 +11 -6
- 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 +40 -45
- 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 +146 -162
- 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 +24 -0
- package/payload/platform/services/claude-session-manager/dist/reaper.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/reaper.js +114 -0
- package/payload/platform/services/claude-session-manager/dist/reaper.js.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/session-store.d.ts +16 -41
- package/payload/platform/services/claude-session-manager/dist/session-store.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/session-store.js +29 -68
- package/payload/platform/services/claude-session-manager/dist/session-store.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts +54 -0
- package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/system-prompt.js +111 -0
- package/payload/platform/services/claude-session-manager/dist/system-prompt.js.map +1 -1
- package/payload/platform/templates/agents/admin/IDENTITY.md +4 -2
- package/payload/platform/templates/agents/admin/SOUL.md +8 -14
- package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/dist/index.d.ts +51 -0
- package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/dist/index.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/dist/index.js +196 -0
- package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/dist/index.js.map +1 -0
- package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/package.json +7 -0
- package/payload/server/{chunk-NNHHGQJL.js → chunk-4P2MPERV.js} +6 -163
- package/payload/server/{chunk-3G6JMV7N.js → chunk-MEGIQYUD.js} +1 -1
- package/payload/server/{chunk-QC5LHYPH.js → chunk-XJVJ2B2Q.js} +1 -1
- package/payload/server/{cloudflare-task-tracker-NEB3X6O2.js → cloudflare-task-tracker-R6MMORFU.js} +2 -2
- package/payload/server/maxy-edge.js +2 -2
- package/payload/server/public/assets/{Checkbox-CmCjmfJy.js → Checkbox-blxv2XPY.js} +1 -1
- package/payload/server/public/assets/{admin-CtodW6As.js → admin-C3EvHpLN.js} +1 -1
- package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-CfOjbx0H.js → architectureDiagram-Q4EWVU46-bETsVzGS.js} +1 -1
- package/payload/server/public/assets/{blockDiagram-DXYQGD6D-D0kA2C9i.js → blockDiagram-DXYQGD6D-5y0GBnfQ.js} +1 -1
- package/payload/server/public/assets/{brand-6hKfBgOI.css → brand-DQlLKLDH.css} +1 -1
- package/payload/server/public/assets/{c4Diagram-AHTNJAMY-CDgXiXgj.js → c4Diagram-AHTNJAMY-C1znpVGu.js} +1 -1
- package/payload/server/public/assets/channel-BWqTaXzb.js +1 -0
- package/payload/server/public/assets/{chunk-336JU56O-BfBTcT5X.js → chunk-336JU56O-DlCVUGzQ.js} +2 -2
- package/payload/server/public/assets/{chunk-426QAEUC-BdSSZ1Kw.js → chunk-426QAEUC-bGYkmA4z.js} +1 -1
- package/payload/server/public/assets/{chunk-4TB4RGXK-UvE1im9g.js → chunk-4TB4RGXK-6Sb0Undm.js} +1 -1
- package/payload/server/public/assets/{chunk-5FUZZQ4R-Dx4DslXz.js → chunk-5FUZZQ4R-CAT_Pq2T.js} +1 -1
- package/payload/server/public/assets/{chunk-5PVQY5BW-CNHawhLJ.js → chunk-5PVQY5BW-j231ESse.js} +1 -1
- package/payload/server/public/assets/{chunk-EDXVE4YY-Rmjv-1et.js → chunk-EDXVE4YY-BAlS4QL7.js} +1 -1
- package/payload/server/public/assets/{chunk-ENJZ2VHE-CL-LeH3r.js → chunk-ENJZ2VHE-D3Ku_BMP.js} +1 -1
- package/payload/server/public/assets/{chunk-ICPOFSXX-B2MFOJDt.js → chunk-ICPOFSXX-AR86A5WB.js} +1 -1
- package/payload/server/public/assets/{chunk-OYMX7WX6-BxcIcCt5.js → chunk-OYMX7WX6-DxGhapkW.js} +1 -1
- package/payload/server/public/assets/{chunk-U2HBQHQK-COzwOBrY.js → chunk-U2HBQHQK-DAlqsDo_.js} +1 -1
- package/payload/server/public/assets/{chunk-X2U36JSP-B0rjT5hL.js → chunk-X2U36JSP-lZdkkdyB.js} +1 -1
- package/payload/server/public/assets/{chunk-YZCP3GAM-pwrIw0XH.js → chunk-YZCP3GAM-CCjtXOFD.js} +1 -1
- package/payload/server/public/assets/{chunk-ZZ45TVLE-BXpeAm0k.js → chunk-ZZ45TVLE-ComtdKny.js} +1 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-B9hC6fOR.js +1 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-afl_ydIG.js +1 -0
- package/payload/server/public/assets/clone-Lj83OaZ3.js +1 -0
- package/payload/server/public/assets/{dagre-DjOJn05k.js → dagre-DX8QJeVt.js} +1 -1
- package/payload/server/public/assets/{dagre-KV5264BT-PczvQiEh.js → dagre-KV5264BT-BcRbiZ1q.js} +1 -1
- package/payload/server/public/assets/data-CS_R5VWQ.js +1 -0
- package/payload/server/public/assets/{device-url-actions-C55ZS_Zg.js → device-url-actions-Cag9IJ7n.js} +1 -1
- package/payload/server/public/assets/{diagram-5BDNPKRD-D477xo5F.js → diagram-5BDNPKRD-Bw47VwHO.js} +1 -1
- package/payload/server/public/assets/{diagram-G4DWMVQ6-C-HAtbtT.js → diagram-G4DWMVQ6-B-aVfhiD.js} +1 -1
- package/payload/server/public/assets/{diagram-MMDJMWI5-B9wus4H0.js → diagram-MMDJMWI5-DERz2dKo.js} +1 -1
- package/payload/server/public/assets/{diagram-TYMM5635-UMZLloFr.js → diagram-TYMM5635-B7eEX9Ta.js} +1 -1
- package/payload/server/public/assets/{erDiagram-SMLLAGMA-B8E52Mp4.js → erDiagram-SMLLAGMA-G_JJq3zB.js} +1 -1
- package/payload/server/public/assets/{flowDiagram-DWJPFMVM-CUel34tq.js → flowDiagram-DWJPFMVM-BeY9QaO0.js} +1 -1
- package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-BfwE-Xav.js → ganttDiagram-T4ZO3ILL-IXviGYnx.js} +1 -1
- package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-2d6tXRIM.js → gitGraphDiagram-UUTBAWPF-GlY6pZQ1.js} +1 -1
- package/payload/server/public/assets/graph-DtGkQBFr.js +1 -0
- package/payload/server/public/assets/graph-labels-Dwu1ON5v.js +1 -0
- package/payload/server/public/assets/{graphlib-CCo9-wNJ.js → graphlib-BWgAjZSb.js} +1 -1
- package/payload/server/public/assets/{infoDiagram-42DDH7IO-DB1SVWL6.js → infoDiagram-42DDH7IO-D4YZM0gD.js} +1 -1
- package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-CdeMUTYS.js → ishikawaDiagram-UXIWVN3A-fR71GDOp.js} +1 -1
- package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-D8x8TUoc.js → journeyDiagram-VCZTEJTY-C1TcY_6m.js} +1 -1
- package/payload/server/public/assets/{kanban-definition-6JOO6SKY-Cmkhd1mO.js → kanban-definition-6JOO6SKY-IPZKpnnG.js} +1 -1
- package/payload/server/public/assets/{line-CoHkpBv3.js → line-B2JtEL1B.js} +1 -1
- package/payload/server/public/assets/{mermaid-parser.core-C7R2PfZC.js → mermaid-parser.core-BKCLXqUh.js} +1 -1
- package/payload/server/public/assets/{mermaid.core-lQaq-kll.js → mermaid.core-CmNpCLB-.js} +3 -3
- package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-CsPq3pX1.js → mindmap-definition-QFDTVHPH-BS0E2FPD.js} +1 -1
- package/payload/server/public/assets/{page-DwEaAdVp.js → page-BdI3GCun.js} +1 -1
- package/payload/server/public/assets/{page-CBKzjUHO.js → page-zIjAkU2y.js} +1 -1
- package/payload/server/public/assets/{pieDiagram-DEJITSTG-FZH9sTnP.js → pieDiagram-DEJITSTG-J61JDyk8.js} +1 -1
- package/payload/server/public/assets/{public-hGLzxhE_.js → public-C5vaQnC_.js} +4 -4
- package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-9poxfoqh.js → quadrantDiagram-34T5L4WZ-CLI03OtR.js} +1 -1
- package/payload/server/public/assets/{requirementDiagram-MS252O5E-Ce7iOdT_.js → requirementDiagram-MS252O5E-C8MCt5NO.js} +1 -1
- package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-DINuXatI.js → sankeyDiagram-XADWPNL6-DQuugruj.js} +1 -1
- package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-CSMec3EK.js → sequenceDiagram-FGHM5R23-CoYitwhO.js} +1 -1
- package/payload/server/public/assets/{stateDiagram-FHFEXIEX-15DKzypj.js → stateDiagram-FHFEXIEX-G68cHHoI.js} +1 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-Dtgpgr_D.js +1 -0
- package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-BxIRc9Pu.js → timeline-definition-GMOUNBTQ-CelLeJVS.js} +1 -1
- package/payload/server/public/assets/{vennDiagram-DHZGUBPP-DdgRyU55.js → vennDiagram-DHZGUBPP-BVgFPkJq.js} +1 -1
- package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-CKvhU1Uj.js → wardleyDiagram-NUSXRM2D-CzD_8hl2.js} +1 -1
- package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-d0V1V4PD.js → xychartDiagram-5P7HB3ND-BuTxWdX5.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/server.js +1058 -846
- package/payload/server/public/assets/channel-DA7MGMzQ.js +0 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-DqfmcWSr.js +0 -1
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BVOMSbZ_.js +0 -1
- package/payload/server/public/assets/clone-Byp7hagU.js +0 -1
- package/payload/server/public/assets/data-A7azIkZU.js +0 -1
- package/payload/server/public/assets/graph-Dx83EhtP.js +0 -1
- package/payload/server/public/assets/graph-labels-Bg2Bzelb.js +0 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-AcaK_QfD.js +0 -1
- /package/payload/server/public/assets/{brand-DXOx08r0.js → brand-D6mXeyxV.js} +0 -0
|
@@ -1,37 +1,25 @@
|
|
|
1
|
-
// Spawn a `claude --verbose` PTY child
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
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
|
|
10
|
-
//
|
|
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
|
-
//
|
|
17
|
-
// which-claude-not-found, pty-spawn-failed,
|
|
18
|
-
//
|
|
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 }, {
|
|
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
|
-
|
|
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
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
logger
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
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
|
-
|
|
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 {
|
|
332
|
+
return { existed: false };
|
|
350
333
|
if (s.exited) {
|
|
351
334
|
deps.store.remove(sessionId);
|
|
352
|
-
|
|
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 {
|
|
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":"AAAA,yEAAyE;AACzE,wEAAwE;AACxE,4EAA4E;AAC5E,uEAAuE;AACvE,8EAA8E;AAC9E,qEAAqE;AACrE,yDAAyD;AACzD,EAAE;AACF,0EAA0E;AAC1E,qEAAqE;AACrE,wEAAwE;AACxE,2EAA2E;AAC3E,yEAAyE;AACzE,kCAAkC;AAClC,EAAE;AACF,uEAAuE;AACvE,mEAAmE;AACnE,6EAA6E;AAE7E,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEzC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAElD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAGrD,uEAAuE;AACvE,wEAAwE;AACxE,qDAAqD;AACrD,MAAM,YAAY,GAAG,yBAAyB,CAAA;AAC9C,iEAAiE;AACjE,sEAAsE;AACtE,oEAAoE;AACpE,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,CAAA;AAC/B,uEAAuE;AACvE,0EAA0E;AAC1E,qDAAqD;AACrD,MAAM,kBAAkB,GAAG,IAAI,CAAA;AAO/B,SAAS,aAAa,CAAC,GAAc;IACnC,IAAI,GAAG,GAAG,EAAE,CAAA;IACZ,IAAI,GAAG,GAA+B,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACxD,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;QACrC,IAAI,GAAG,CAAC,MAAM,GAAG,cAAc;YAAE,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,cAAc,CAAC,CAAA;IAC/E,CAAC,CAAC,CAAA;IACF,OAAO;QACL,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG;QAClB,OAAO,EAAE,GAAG,EAAE;YACZ,IAAI,GAAG,EAAE,CAAC;gBAAC,GAAG,CAAC,OAAO,EAAE,CAAC;gBAAC,GAAG,GAAG,IAAI,CAAA;YAAC,CAAC;QACxC,CAAC;KACF,CAAA;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACzF,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;AAChC,CAAC;AAED,OAAO,EACL,yBAAyB,GAG1B,MAAM,oBAAoB,CAAA;AA0F3B,MAAM,CAAC,MAAM,gBAAgB,GAA8B,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAiBrG;;;;;;;;mDAQmD;AACnD,SAAS,kBAAkB,CACzB,GAAW,EACX,IAAsC;IAEtC,OAAO,GAAG,CAAC,OAAO,CAAC,2BAA2B,EAAE,CAAC,CAAC,EAAE,IAAY,EAAE,EAAE;QAClE,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1E,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,CAAuB;IACrD,gEAAgE;IAChE,2EAA2E;IAC3E,qEAAqE;IACrE,uEAAuE;IACvE,MAAM,cAAc,GAAkG,EAAE,CAAA;IACxH,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACvB,wCAAwC;QACxC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,UAAU;YAAE,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;IACxF,CAAC;SAAM,CAAC;QACN,qEAAqE;QACrE,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAA;QAC3C,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;YACrC,qEAAqE;YACrE,qEAAqE;YACrE,gEAAgE;YAChE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;YAClC,IAAI,CAAC;gBAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACpC,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;YACpD,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;QACpE,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAA2B;QAC3C,aAAa,EAAE,CAAC,CAAC,YAAY;QAC7B,oBAAoB,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,iBAAiB,CAAC;QACtE,UAAU,EAAE,CAAC,CAAC,SAAS;QACvB,UAAU,EAAE,CAAC,CAAC,gBAAgB;QAC9B,OAAO,EAAE,CAAC,CAAC,MAAM;KAClB,CAAA;IAED,MAAM,UAAU,GAAsF,EAAE,CAAA;IACxG,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,cAAc,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAsE;YAC/E,OAAO,EAAE,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC;YACvD,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;SAChE,CAAA;QACD,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAA2B,EAAE,CAAA;YACtC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,GAAG,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,CAAC,EAAE,YAAY,CAAC,CAAA;YAC3F,KAAK,CAAC,GAAG,GAAG,GAAG,CAAA;QACjB,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAA;IAC1B,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IACvD,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,OAAO,CAAA;IACtF,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IAC1C,IAAI,CAAC;QACH,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC3C,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC5D,CAAC,CAAC,MAAM,CAAC,kCAAkC,MAAM,QAAQ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC/E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;IACnC,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,cAAc,CAAC,MAAM,EAAE,CAAA;AAClH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAe,EAAE,IAAe;IACvE,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACxB,MAAM,YAAY,GAChB,IAAI,CAAC,iBAAiB,KAAK,SAAS;QAClC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,iBAAiB,EAAE;QACrD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA;IACf,MAAM,QAAQ,GAAG,yBAAyB,CACxC,YAAY,EACZ,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAChD,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CACrE,CAAA;IACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,IAAI,QAAQ,CAAC,MAAM,KAAK,iBAAiB,EAAE,CAAC;YAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,iCAAiC,CAAA;YACnF,IAAI,CAAC,MAAM,CAAC,2DAA2D,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;YACpG,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,yBAAyB,EAAE,UAAU,EAAE,CAAA;QACrE,CAAC;QACD,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QAC5C,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAA;QACtE,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QACzD,IAAI,CAAC,MAAM,CACT,kEAAkE,IAAI,CAAC,UAAU,SAAS,IAAI,CAAC,IAAI,SAAS,IAAI,QAAQ,GAAG,EAAE,CAC9H,CAAA;QACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAA;IAClF,CAAC;IACD,MAAM,kBAAkB,GAAG,QAAQ,CAAC,KAAK,CAAA;IACzC,IAAI,CAAC,MAAM,CACT,iCAAiC,IAAI,CAAC,IAAI,eAAe,IAAI,CAAC,UAAU,4BAA4B,MAAM,CAAC,UAAU,CAAC,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,QAAQ,CAAC,aAAa,cAAc,QAAQ,CAAC,SAAS,oBAAoB,QAAQ,CAAC,eAAe,wBAAwB,QAAQ,CAAC,mBAAmB,EAAE,CAC5T,CAAA;IACD,MAAM,IAAI,GAAa;QACrB,WAAW;QACX,kBAAkB;QAClB,wBAAwB;QACxB,kBAAkB;KACnB,CAAA;IACD,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAA;IACnD,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;IACvC,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;QAC7B,CAAC;IACH,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAA;IAC5F,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAA;IAC7C,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAA;IACpC,CAAC;IACD,MAAM,cAAc,GAClB,IAAI,CAAC,IAAI,KAAK,QAAQ;QACpB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAChH,CAAC,CAAC,EAAE,CAAA;IACR,IAAI,CAAC,MAAM,CAAC,uBAAuB,IAAI,CAAC,IAAI,UAAU,OAAO,CAAC,MAAM,aAAa,cAAc,EAAE,CAAC,CAAA;IAClG,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,cAAc,CAAC,CAAA;IACrD,CAAC;IAED,2EAA2E;IAC3E,wEAAwE;IACxE,0EAA0E;IAC1E,0BAA0B;IAC1B,MAAM,eAAe,GAAG,sBAAsB,CAAC;QAC7C,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,gBAAgB,EAAE,IAAI,CAAC,QAAQ;QAC/B,SAAS,EAAE,IAAI,CAAC,YAAY,IAAI,MAAM,EAAE;QACxC,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC,CAAA;IACF,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,CAAC;QACxB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,yBAAyB,EAAE,UAAU,EAAE,eAAe,CAAC,MAAM,EAAE,CAAA;IAC7F,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,IAAI,CAAC,CAAA;IAE/C,uDAAuD;IACvD,qEAAqE;IACrE,sEAAsE;IACtE,iEAAiE;IACjE,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IACjD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,wBAAwB,CAAC,EAAE,CAAC;QACvE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;IAC/C,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;QACzB,IAAI,CAAC,MAAM,CAAC,6BAA6B,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,CAAA;IACjE,CAAC;IACD,IAAI,CAAC,MAAM,CACT,gCAAgC,eAAe,CAAC,WAAW,UAAU,OAAO,CAAC,MAAM,UAAU,eAAe,CAAC,KAAK,SAAS,eAAe,CAAC,IAAI,EAAE,CAClJ,CAAA;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACjD,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAClD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;QAC1C,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,IAAI,CAAC,aAAa,MAAM,CAAC,CAAA;IAChE,CAAC;IAED,IAAI,CAAC,MAAM,CACT,6BAA6B,IAAI,CAAC,SAAS,eAAe,IAAI,CAAC,MAAM,+BAA+B,MAAM,CAAC,UAAU,CAAC,kBAAkB,EAAE,MAAM,CAAC,oBAAoB,IAAI,CAAC,cAAc,IAAI,SAAS,WAAW,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAC5P,CAAA;IACD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAChC,IAAI,GAAc,CAAA;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE;YACxC,GAAG,OAAO,CAAC,GAAG;YACd,IAAI,EAAE,gBAAgB;YACtB,kEAAkE;YAClE,kEAAkE;YAClE,oDAAoD;YACpD,iBAAiB,EAAE,IAAI,CAAC,IAAI;YAC5B,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;SAC3C,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,GAA4B,CAAA;QACtC,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,kBAAkB,CAAA;QAClF,MAAM,UAAU,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;QAC/C,IAAI,CAAC,MAAM,CAAC,uBAAuB,MAAM,gBAAgB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,iBAAiB,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,EAAE,CAAC,CAAA;QACjI,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAA;IAC1C,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,mBAAmB,GAAG,CAAC,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,EAAE,CAAC,CAAA;IAE1E,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;IAE/B,OAAO,MAAM,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,EAAE;QAChD,IAAI,OAAO,GAAG,KAAK,CAAA;QACnB,MAAM,MAAM,GAAG,CAAC,OAAoB,EAAQ,EAAE;YAC5C,IAAI,OAAO;gBAAE,OAAM;YACnB,OAAO,GAAG,IAAI,CAAA;YACd,OAAO,CAAC,OAAO,CAAC,CAAA;QAClB,CAAC,CAAA;QAED,eAAe,CAAC;YACd,GAAG;YACH,SAAS,EAAE,IAAI,CAAC,mBAAmB;YACnC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE;gBACb,MAAM,YAAY,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAA;gBAC7C,IAAI,CAAC,MAAM,CAAC,kCAAkC,YAAY,IAAI,MAAM,QAAQ,GAAG,EAAE,CAAC,CAAA;gBAClF,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClB,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;oBACnB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;oBACjC,IAAI,CAAC,MAAM,CAAC,qDAAqD,GAAG,gBAAgB,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;oBACnH,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,2BAA2B,EAAE,UAAU,EAAE,CAAC,CAAA;oBACtE,OAAM;gBACR,CAAC;gBAED,MAAM,OAAO,GAAkB;oBAC7B,YAAY;oBACZ,eAAe,EAAE,IAAI;oBACrB,GAAG,EAAE,GAAG,CAAC,GAAG;oBACZ,GAAG;oBACH,SAAS;oBACT,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,SAAS,EAAE,IAAI;oBACf,GAAG;oBACH,MAAM,EAAE,KAAK;oBACb,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,IAAI;oBAC5B,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;iBACpC,CAAA;gBACD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;gBAC9B,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;oBACzB,IAAI,CAAC,MAAM,CACT,2BAA2B,IAAI,CAAC,UAAU,IAAI,MAAM,iBAAiB,YAAY,QAAQ,GAAG,CAAC,GAAG,EAAE,CACnG,CAAA;gBACH,CAAC;gBACD,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;oBACpC,IAAI,CAAC;wBACH,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,CAAA;oBACrC,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;wBAC5D,IAAI,CAAC,MAAM,CAAC,0CAA0C,YAAY,YAAY,GAAG,EAAE,CAAC,CAAA;oBACtF,CAAC;gBACH,CAAC;gBAED,iEAAiE;gBACjE,mEAAmE;gBACnE,kEAAkE;gBAClE,mEAAmE;gBACnE,qBAAqB;gBACrB,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC,CAAA;gBAC3D,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;oBACpC,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACd,2DAA2D;wBAC3D,wDAAwD;wBACxD,OAAM;oBACR,CAAC;oBACD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CACjC,YAAY,EACZ,QAAQ,CAAC,eAAe,EACxB,QAAQ,CAAC,SAAS,CACnB,CAAA;oBACD,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACd,iEAAiE;wBACjE,OAAM;oBACR,CAAC;oBACD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAA;oBACjC,IAAI,CAAC,MAAM,CACT,sBAAsB,GAAG,CAAC,GAAG,cAAc,QAAQ,CAAC,eAAe,iBAAiB,YAAY,SAAS,QAAQ,CAAC,SAAS,YAAY,MAAM,EAAE,CAChJ,CAAA;oBACD,IAAI,CAAC,MAAM,CACT,oCAAoC,YAAY,cAAc,QAAQ,CAAC,eAAe,QAAQ,GAAG,CAAC,GAAG,EAAE,CACxG,CAAA;oBACD,IAAI,CAAC,MAAM,CACT,yBAAyB,QAAQ,CAAC,eAAe,4BAA4B,MAAM,CAAC,UAAU,CAAC,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,QAAQ,CAAC,aAAa,cAAc,QAAQ,CAAC,SAAS,oBAAoB,QAAQ,CAAC,eAAe,wBAAwB,QAAQ,CAAC,mBAAmB,eAAe,IAAI,CAAC,UAAU,SAAS,IAAI,CAAC,IAAI,aAAa,IAAI,CAAC,IAAI,CAAC,QAAQ,YAAY,IAAI,CAAC,IAAI,CAAC,OAAO,aAAa,IAAI,CAAC,IAAI,CAAC,QAAQ,cAAc,YAAY,CAAC,SAAS,IAAI,MAAM,EAAE,CAC9d,CAAA;oBACD,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC,CAAA;gBAClC,CAAC,CAAC,CAAA;gBAEF,gEAAgE;gBAChE,gEAAgE;gBAChE,mEAAmE;gBACnE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;oBACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAA;oBACrB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;oBACjC,IAAI,CAAC,OAAO,EAAE,CAAA;oBACd,WAAW,CAAC,MAAM,EAAE,CAAA;oBACpB,IAAI,OAAO,CAAC,eAAe,KAAK,IAAI,EAAE,CAAC;wBACrC,8CAA8C;wBAC9C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;wBAC/B,IAAI,CAAC,MAAM,CAAC,oCAAoC,YAAY,QAAQ,GAAG,CAAC,GAAG,EAAE,CAAC,CAAA;oBAChF,CAAC;oBACD,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,GAAG,oCAAoC,CAAC,CAAC,QAAQ,WAAW,CAAC,CAAC,MAAM,IAAI,MAAM,gBAAgB,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;gBAC3J,CAAC,CAAC,CAAA;gBAEF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAA;gBACrC,IAAI,CAAC,MAAM,CACT,wCAAwC,YAAY,QAAQ,GAAG,CAAC,GAAG,OAAO,UAAU,EAAE,CACvF,CAAA;gBACD,IAAI,CAAC,MAAM,CACT,aAAa,GAAG,CAAC,GAAG,eAAe,GAAG,aAAa,IAAI,CAAC,QAAQ,SAAS,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,OAAO,mBAAmB,IAAI,CAAC,cAAc,IAAI,SAAS,eAAe,UAAU,EAAE,CACzL,CAAA;gBACD,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;YAC/B,CAAC;YACD,SAAS,EAAE,GAAG,EAAE;gBACd,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;gBACnB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;gBACjC,IAAI,CAAC,MAAM,CAAC,uDAAuD,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;gBAClG,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,UAAU,EAAE,CAAC,CAAA;YAClE,CAAC;SACF,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAgB,EAChB,SAAiB;IAEjB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACnC,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;IAC3C,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;QACb,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QAC5B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IACpC,CAAC;IACD,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACrB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,CAAC,CAAC,MAAM;gBAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YACpC,OAAO,EAAE,CAAA;QACX,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;QACpB,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE;YAChB,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,OAAO,EAAE,CAAA;QACX,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IACF,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IAC5B,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,sCAAsC,CAAC,CAAA;IACpE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;AACpC,CAAC"}
|
|
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
|