@rubytech/create-maxy-code 0.1.357 → 0.1.359
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/claude-ptys-slice.test.js +36 -1
- package/dist/__tests__/neo4j-pidfile-scrub.test.js +103 -0
- package/dist/index.js +42 -7
- package/dist/neo4j-pidfile-scrub.js +90 -0
- package/dist/port-resolution.js +18 -1
- package/package.json +1 -1
- package/payload/platform/package-lock.json +237 -0
- package/payload/platform/plugins/admin/mcp/dist/__tests__/capabilities-here.test.js +79 -1
- package/payload/platform/plugins/admin/mcp/dist/__tests__/capabilities-here.test.js.map +1 -1
- package/payload/platform/plugins/admin/mcp/dist/index.js +17 -3
- package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/admin/mcp/dist/tools/capabilities-here.d.ts +16 -0
- package/payload/platform/plugins/admin/mcp/dist/tools/capabilities-here.d.ts.map +1 -1
- package/payload/platform/plugins/admin/mcp/dist/tools/capabilities-here.js +52 -0
- package/payload/platform/plugins/admin/mcp/dist/tools/capabilities-here.js.map +1 -1
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +61 -1
- package/payload/platform/plugins/cloudflare/PLUGIN.md +7 -1
- package/payload/platform/plugins/cloudflare/bin/__tests__/cf-token.test.sh +195 -0
- package/payload/platform/plugins/cloudflare/bin/cf-token.sh +157 -0
- package/payload/platform/plugins/cloudflare/references/api.md +2 -0
- package/payload/platform/plugins/cloudflare/skills/cloudflare/SKILL.md +14 -0
- package/payload/platform/plugins/cloudflare/skills/site-deploy/SKILL.md +10 -1
- package/payload/platform/plugins/docs/PLUGIN.md +2 -0
- package/payload/platform/plugins/docs/references/admin-ui.md +2 -0
- package/payload/platform/plugins/docs/references/claudeai-connectors.md +45 -0
- package/payload/platform/plugins/docs/references/cloudflare.md +6 -0
- package/payload/platform/plugins/docs/references/troubleshooting.md +2 -0
- package/payload/platform/plugins/email/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/email/PLUGIN.md +7 -3
- package/payload/platform/plugins/email/mcp/dist/__tests__/body-extract.test.d.ts +2 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/body-extract.test.d.ts.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/body-extract.test.js +99 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/body-extract.test.js.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/compose-draft-id.test.d.ts +2 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/compose-draft-id.test.d.ts.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/compose-draft-id.test.js +32 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/compose-draft-id.test.js.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/email-draft-edit.test.js +64 -6
- package/payload/platform/plugins/email/mcp/dist/__tests__/email-draft-edit.test.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/__tests__/email-draft.test.js +12 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/email-draft.test.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/__tests__/email-status.test.d.ts +2 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/email-status.test.d.ts.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/email-status.test.js +58 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/email-status.test.js.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/imap-drafts.test.js +94 -9
- package/payload/platform/plugins/email/mcp/dist/__tests__/imap-drafts.test.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/__tests__/imap-probe.test.js +109 -1
- package/payload/platform/plugins/email/mcp/dist/__tests__/imap-probe.test.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/__tests__/mail-options.test.js +4 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/mail-options.test.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/index.js +39 -2
- package/payload/platform/plugins/email/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/compose.d.ts +5 -0
- package/payload/platform/plugins/email/mcp/dist/lib/compose.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/compose.js +8 -1
- package/payload/platform/plugins/email/mcp/dist/lib/compose.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/credentials.d.ts +13 -0
- package/payload/platform/plugins/email/mcp/dist/lib/credentials.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/credentials.js +35 -0
- package/payload/platform/plugins/email/mcp/dist/lib/credentials.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts +83 -30
- package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/imap.js +327 -112
- package/payload/platform/plugins/email/mcp/dist/lib/imap.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/setup-probe.d.ts +19 -0
- package/payload/platform/plugins/email/mcp/dist/lib/setup-probe.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/setup-probe.js +33 -0
- package/payload/platform/plugins/email/mcp/dist/lib/setup-probe.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/smtp.d.ts +6 -0
- package/payload/platform/plugins/email/mcp/dist/lib/smtp.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/smtp.js +4 -0
- package/payload/platform/plugins/email/mcp/dist/lib/smtp.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-draft-edit.d.ts +8 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-draft-edit.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-draft-edit.js +10 -6
- package/payload/platform/plugins/email/mcp/dist/tools/email-draft-edit.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-draft.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-draft.js +4 -2
- package/payload/platform/plugins/email/mcp/dist/tools/email-draft.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-fetch-body.d.ts +15 -0
- package/payload/platform/plugins/email/mcp/dist/tools/email-fetch-body.d.ts.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/tools/email-fetch-body.js +29 -0
- package/payload/platform/plugins/email/mcp/dist/tools/email-fetch-body.js.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/tools/email-setup.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-setup.js +11 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-setup.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-status.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-status.js +24 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-status.js.map +1 -1
- package/payload/platform/plugins/email/mcp/package.json +2 -0
- package/payload/platform/plugins/email/references/email-reference.md +30 -3
- package/payload/platform/scripts/rss-sampler.sh +21 -0
- package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +1 -0
- package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/connector-auth.d.ts +31 -0
- package/payload/platform/services/claude-session-manager/dist/connector-auth.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/connector-auth.js +49 -0
- package/payload/platform/services/claude-session-manager/dist/connector-auth.js.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +24 -0
- 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 +214 -17
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts +13 -5
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.js +46 -11
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.js.map +1 -1
- package/payload/platform/services/webchat-channel/dist/instructions.d.ts +1 -0
- package/payload/platform/services/webchat-channel/dist/instructions.d.ts.map +1 -1
- package/payload/platform/services/webchat-channel/dist/instructions.js +28 -0
- package/payload/platform/services/webchat-channel/dist/instructions.js.map +1 -1
- package/payload/platform/services/webchat-channel/dist/server.d.ts.map +1 -1
- package/payload/platform/services/webchat-channel/dist/server.js +75 -5
- package/payload/platform/services/webchat-channel/dist/server.js.map +1 -1
- package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
- package/payload/server/public/assets/{AdminLoginScreens-BW1UgfoI.js → AdminLoginScreens-tHyAPNnQ.js} +1 -1
- package/payload/server/public/assets/AdminShell-Ce9izNVZ.js +1 -0
- package/payload/server/public/assets/{Checkbox-O1qvMk_u.js → Checkbox-Cq6SJJlX.js} +1 -1
- package/payload/server/public/assets/OperatorConversations-BERW_hUa.css +1 -0
- package/payload/server/public/assets/OperatorConversations-m2lz6Ss7.js +9 -0
- package/payload/server/public/assets/admin-D9iMgdbN.js +1 -0
- package/payload/server/public/assets/{arc-DpkSQNto.js → arc-Crkz45LN.js} +1 -1
- package/payload/server/public/assets/architecture-YZFGNWBL-Dma4Bgha.js +1 -0
- package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-Bw7Yq8O9.js → architectureDiagram-Q4EWVU46-C9JThHgP.js} +1 -1
- package/payload/server/public/assets/{blockDiagram-DXYQGD6D-BBtJQFSz.js → blockDiagram-DXYQGD6D-DpsV_HXT.js} +1 -1
- package/payload/server/public/assets/{browser-CySvj140.js → browser-CZWi0EAP.js} +1 -1
- package/payload/server/public/assets/{c4Diagram-AHTNJAMY-JAMgxzOr.js → c4Diagram-AHTNJAMY-CTm_6aKi.js} +1 -1
- package/payload/server/public/assets/calendar-DUAh-_kx.js +1 -0
- package/payload/server/public/assets/channel-B_-5bau1.js +1 -0
- package/payload/server/public/assets/chat-DHuibPfc.js +1 -0
- package/payload/server/public/assets/{chunk-2KRD3SAO-eDugsc2L.js → chunk-2KRD3SAO-1KSJW1q6.js} +1 -1
- package/payload/server/public/assets/{chunk-336JU56O-BXfECwdC.js → chunk-336JU56O-C3t08Ip-.js} +2 -2
- package/payload/server/public/assets/chunk-426QAEUC-Dirxdwjh.js +1 -0
- package/payload/server/public/assets/{chunk-4BX2VUAB-CByVeKCY.js → chunk-4BX2VUAB-kl1ze33n.js} +1 -1
- package/payload/server/public/assets/{chunk-4TB4RGXK-CpY0DcUB.js → chunk-4TB4RGXK-DxpoDoHg.js} +1 -1
- package/payload/server/public/assets/{chunk-55IACEB6-C3YxgyIb.js → chunk-55IACEB6-WM9VJzha.js} +1 -1
- package/payload/server/public/assets/{chunk-5FUZZQ4R-Bc0d7j8A.js → chunk-5FUZZQ4R-CLH63ZH3.js} +1 -1
- package/payload/server/public/assets/{chunk-5PVQY5BW-CTUGMRIa.js → chunk-5PVQY5BW-DCTb8IAT.js} +1 -1
- package/payload/server/public/assets/{chunk-67CJDMHE-CbdPnpLd.js → chunk-67CJDMHE-BSYzyaoH.js} +1 -1
- package/payload/server/public/assets/{chunk-7N4EOEYR-Cjl2kevz.js → chunk-7N4EOEYR-CarJ7O2P.js} +1 -1
- package/payload/server/public/assets/{chunk-AA7GKIK3-BgozIh5p.js → chunk-AA7GKIK3-DTNLyBpH.js} +1 -1
- package/payload/server/public/assets/{chunk-BSJP7CBP-6Ufq45NW.js → chunk-BSJP7CBP-BFmHflHY.js} +1 -1
- package/payload/server/public/assets/{chunk-CIAEETIT-BhhYuMnA.js → chunk-CIAEETIT-BpjG0IzU.js} +1 -1
- package/payload/server/public/assets/{chunk-EDXVE4YY-BfaJ3yDD.js → chunk-EDXVE4YY-2fSowhlW.js} +1 -1
- package/payload/server/public/assets/{chunk-ENJZ2VHE-C7-hIGVC.js → chunk-ENJZ2VHE-ClcranGV.js} +1 -1
- package/payload/server/public/assets/{chunk-FMBD7UC4-BQvvyocF.js → chunk-FMBD7UC4-DLq4BItQ.js} +1 -1
- package/payload/server/public/assets/{chunk-FOC6F5B3-C6rBDOxH.js → chunk-FOC6F5B3-B9QI3Guz.js} +1 -1
- package/payload/server/public/assets/{chunk-ICPOFSXX-BjOJvkVa.js → chunk-ICPOFSXX-BAr-Mv1Z.js} +2 -2
- package/payload/server/public/assets/{chunk-K5T4RW27-kKowRHhn.js → chunk-K5T4RW27-8PvAHasY.js} +1 -1
- package/payload/server/public/assets/{chunk-KGLVRYIC-bAEV_5eH.js → chunk-KGLVRYIC--aGaDRH5.js} +1 -1
- package/payload/server/public/assets/{chunk-LIHQZDEY-BLvsQAfg.js → chunk-LIHQZDEY-BrWj7mw2.js} +1 -1
- package/payload/server/public/assets/{chunk-ORNJ4GCN-BzYZfPZ7.js → chunk-ORNJ4GCN-kYQmkMTi.js} +1 -1
- package/payload/server/public/assets/{chunk-OYMX7WX6-CL7WRw42.js → chunk-OYMX7WX6-CIsryCWH.js} +1 -1
- package/payload/server/public/assets/chunk-QZHKN3VN-Duipo1kI.js +1 -0
- package/payload/server/public/assets/{chunk-U2HBQHQK-BdcVGjau.js → chunk-U2HBQHQK-68X653e3.js} +1 -1
- package/payload/server/public/assets/{chunk-X2U36JSP-C0CL_Jin.js → chunk-X2U36JSP-v3v9soX3.js} +1 -1
- package/payload/server/public/assets/{chunk-XPW4576I-CsV7CUxH.js → chunk-XPW4576I-CW5DPpop.js} +1 -1
- package/payload/server/public/assets/{chunk-YZCP3GAM-Cj0_fLkR.js → chunk-YZCP3GAM-B1VP7Rl2.js} +1 -1
- package/payload/server/public/assets/{chunk-ZZ45TVLE-DLuquyoY.js → chunk-ZZ45TVLE-DiJrujNY.js} +1 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-B3kX5SuB.js +1 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-D761c7Lr.js +1 -0
- package/payload/server/public/assets/clone-BrhFv6Tb.js +1 -0
- package/payload/server/public/assets/{cose-bilkent-S5V4N54A-BU3EOLXX.js → cose-bilkent-S5V4N54A-BscXxLMc.js} +1 -1
- package/payload/server/public/assets/{dagre-KV5264BT-CoCAYhFc.js → dagre-KV5264BT-DVgGlTQ1.js} +1 -1
- package/payload/server/public/assets/{dagre-BRq8C9NU.js → dagre-MBv6WlCS.js} +1 -1
- package/payload/server/public/assets/data-CoOcAR_2.js +1 -0
- package/payload/server/public/assets/{diagram-5BDNPKRD-DBy5GNaQ.js → diagram-5BDNPKRD-BmhCaO0a.js} +1 -1
- package/payload/server/public/assets/{diagram-G4DWMVQ6-l93MsBLv.js → diagram-G4DWMVQ6-ChU9L8vz.js} +1 -1
- package/payload/server/public/assets/{diagram-MMDJMWI5-BIfXkVlL.js → diagram-MMDJMWI5-Oy409Zc_.js} +1 -1
- package/payload/server/public/assets/{diagram-TYMM5635-BuTJLBny.js → diagram-TYMM5635-Cn1YByqk.js} +1 -1
- package/payload/server/public/assets/{erDiagram-SMLLAGMA-BwPxWDbP.js → erDiagram-SMLLAGMA-e17yfLvr.js} +1 -1
- package/payload/server/public/assets/{flatten-DtM0XAMt.js → flatten-Cl1Bc3dR.js} +1 -1
- package/payload/server/public/assets/{flowDiagram-DWJPFMVM-BhPtHXMR.js → flowDiagram-DWJPFMVM-Dqt7sCVZ.js} +1 -1
- package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-BlXjprdD.js → ganttDiagram-T4ZO3ILL-B4IhwS2r.js} +1 -1
- package/payload/server/public/assets/gitGraph-7Q5UKJZL-BCQAqtLy.js +1 -0
- package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-BW36BDiu.js → gitGraphDiagram-UUTBAWPF-BDw-PKcI.js} +1 -1
- package/payload/server/public/assets/{graph-uFhGyOZR.js → graph-Dc_votDd.js} +3 -3
- package/payload/server/public/assets/{graph-labels-BNnhRQqM.js → graph-labels-jqagxwhW.js} +1 -1
- package/payload/server/public/assets/{graphlib-Bjg3Tq-k.js → graphlib-DPIYk_sg.js} +1 -1
- package/payload/server/public/assets/info-OMHHGYJF-qU7hK50T.js +1 -0
- package/payload/server/public/assets/infoDiagram-42DDH7IO-KGdcJeTs.js +2 -0
- package/payload/server/public/assets/{isEmpty-D__iH1WQ.js → isEmpty-D1pGOD1J.js} +1 -1
- package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-CmB-bA_O.js → ishikawaDiagram-UXIWVN3A-BRIHsB3G.js} +1 -1
- package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-Bt1fJKmc.js → journeyDiagram-VCZTEJTY-aKNgmoHd.js} +1 -1
- package/payload/server/public/assets/{kanban-definition-6JOO6SKY-DVbksz_J.js → kanban-definition-6JOO6SKY-cwBwT-nm.js} +1 -1
- package/payload/server/public/assets/{line-BX2Ugx3B.js → line-DVtVRzUA.js} +1 -1
- package/payload/server/public/assets/{linear-Bdc-QJWI.js → linear-DtoOFPO2.js} +1 -1
- package/payload/server/public/assets/{mermaid-parser.core-qv1e-J5x.js → mermaid-parser.core-G7YD_zO3.js} +2 -2
- package/payload/server/public/assets/{mermaid.core-C_d9YQX_.js → mermaid.core-DpFyndHm.js} +3 -3
- package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-DwKGvF14.js → mindmap-definition-QFDTVHPH-CYXK_Pvz.js} +1 -1
- package/payload/server/public/assets/operator-KYXcuQ4Y.js +1 -0
- package/payload/server/public/assets/{ordinal-BRQ5CzZY.js → ordinal-CBZeH4Yp.js} +1 -1
- package/payload/server/public/assets/packet-4T2RLAQJ-DiU2yS9m.js +1 -0
- package/payload/server/public/assets/page-Cfsv97nq.js +32 -0
- package/payload/server/public/assets/pie-ZZUOXDRM-zHUKKlVv.js +1 -0
- package/payload/server/public/assets/{pieDiagram-DEJITSTG-dUvQC_4S.js → pieDiagram-DEJITSTG-DFo4N6WH.js} +1 -1
- package/payload/server/public/assets/{public-DgltXhnD.js → public-49guEjCh.js} +1 -1
- package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-CebX_oPa.js → quadrantDiagram-34T5L4WZ-BlH5iIhl.js} +1 -1
- package/payload/server/public/assets/radar-PYXPWWZC-BUnVoaPg.js +1 -0
- package/payload/server/public/assets/{reduce-CkcXOmmJ.js → reduce-PuPlFPRX.js} +1 -1
- package/payload/server/public/assets/{requirementDiagram-MS252O5E-h2euIqGj.js → requirementDiagram-MS252O5E-D5WLty8A.js} +1 -1
- package/payload/server/public/assets/rotate-ccw-CyR5o3Nq.js +1 -0
- package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-DCii3fkF.js → sankeyDiagram-XADWPNL6-vB85IxHG.js} +1 -1
- package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-CQSGYmlq.js → sequenceDiagram-FGHM5R23-Cxraa0Ee.js} +1 -1
- package/payload/server/public/assets/{stateDiagram-FHFEXIEX-CVtU0iXH.js → stateDiagram-FHFEXIEX-BBPssYBx.js} +1 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BWmmUwDt.js +1 -0
- package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-ChvsBltI.js → timeline-definition-GMOUNBTQ-Bgk6PT62.js} +1 -1
- package/payload/server/public/assets/treeView-SZITEDCU-C3Y-Q52h.js +1 -0
- package/payload/server/public/assets/treemap-W4RFUUIX-Dk0qZpAg.js +1 -0
- package/payload/server/public/assets/{vennDiagram-DHZGUBPP-e-EZiiba.js → vennDiagram-DHZGUBPP-B-APTs3L.js} +1 -1
- package/payload/server/public/assets/wardley-RL74JXVD-BAWI02OA.js +1 -0
- package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-4JaRn1s5.js → wardleyDiagram-NUSXRM2D-CkXJSs_i.js} +1 -1
- package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-kxwmCNuM.js → xychartDiagram-5P7HB3ND-BkyshPMV.js} +1 -1
- package/payload/server/public/browser.html +4 -4
- package/payload/server/public/calendar.html +4 -4
- package/payload/server/public/chat.html +7 -6
- package/payload/server/public/data.html +4 -4
- package/payload/server/public/graph.html +7 -6
- package/payload/server/public/index.html +6 -6
- package/payload/server/public/operator.html +9 -8
- package/payload/server/public/public.html +7 -6
- package/payload/server/server.js +244 -24
- package/payload/server/public/assets/AdminShell-CDQDkT1R.js +0 -1
- package/payload/server/public/assets/OperatorConversations-CVH-FoJo.css +0 -1
- package/payload/server/public/assets/OperatorConversations-jqaPCHwB.js +0 -9
- package/payload/server/public/assets/admin-BkYc54bi.js +0 -1
- package/payload/server/public/assets/architecture-YZFGNWBL-Csj53u5T.js +0 -1
- package/payload/server/public/assets/calendar-DgP7lal2.js +0 -1
- package/payload/server/public/assets/channel-BUQUAUts.js +0 -1
- package/payload/server/public/assets/chat-gls5aV50.js +0 -1
- package/payload/server/public/assets/chunk-426QAEUC-CdknReB2.js +0 -1
- package/payload/server/public/assets/chunk-QZHKN3VN-8tHoEDE9.js +0 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-BEGZ3DLg.js +0 -1
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DsLxnm5U.js +0 -1
- package/payload/server/public/assets/clone-uiXbH_kh.js +0 -1
- package/payload/server/public/assets/data-CbI8-CX3.js +0 -1
- package/payload/server/public/assets/gitGraph-7Q5UKJZL-D_2KrZoP.js +0 -1
- package/payload/server/public/assets/info-OMHHGYJF-BP2TNwQ4.js +0 -1
- package/payload/server/public/assets/infoDiagram-42DDH7IO-D1kDtBOY.js +0 -2
- package/payload/server/public/assets/operator-DeCk_qYw.js +0 -1
- package/payload/server/public/assets/packet-4T2RLAQJ-BDg8fde8.js +0 -1
- package/payload/server/public/assets/page-jGwq-DpW.js +0 -32
- package/payload/server/public/assets/pie-ZZUOXDRM-CXDyYMkZ.js +0 -1
- package/payload/server/public/assets/radar-PYXPWWZC-xen_zv8F.js +0 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BywcXjtb.js +0 -1
- package/payload/server/public/assets/treeView-SZITEDCU-2FBf_1It.js +0 -1
- package/payload/server/public/assets/treemap-W4RFUUIX-BDdb30P-.js +0 -1
- package/payload/server/public/assets/wardley-RL74JXVD-BLq5MxjR.js +0 -1
- /package/payload/server/public/assets/{_baseFor-SRtUHe7G.js → _baseFor-brRjpUOX.js} +0 -0
- /package/payload/server/public/assets/{array-BpsnM-Py.js → array-BGFCBI0e.js} +0 -0
- /package/payload/server/public/assets/{cytoscape.esm-D4Rl1H5h.js → cytoscape.esm-TvRJ2tGX.js} +0 -0
- /package/payload/server/public/assets/{defaultLocale-C7sQPl-O.js → defaultLocale-CRZydyG6.js} +0 -0
- /package/payload/server/public/assets/{dist-CtUNt3w8.js → dist-B0CkUodR.js} +0 -0
- /package/payload/server/public/assets/{init-BydxaDEV.js → init-B8gtcn7T.js} +0 -0
- /package/payload/server/public/assets/{katex-B0fVeDx4.js → katex-RxgSu_dy.js} +0 -0
- /package/payload/server/public/assets/{path-jlWYQ2i9.js → path-DZF-JdEe.js} +0 -0
- /package/payload/server/public/assets/{preload-helper-uTix4PVD.js → preload-helper-CQ36nxok.js} +0 -0
- /package/payload/server/public/assets/{rough.esm-c4PR5shF.js → rough.esm-6CnTHTkH.js} +0 -0
- /package/payload/server/public/assets/{src-48kCpScq.js → src-CR_MU8uy.js} +0 -0
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
// manager does not know.
|
|
21
21
|
import { Hono } from 'hono';
|
|
22
22
|
import { stream } from 'hono/streaming';
|
|
23
|
-
import { existsSync, statSync, createReadStream, watchFile, unwatchFile, rmSync, mkdirSync, renameSync, readFileSync, writeFileSync, openSync, readSync, closeSync } from 'node:fs';
|
|
23
|
+
import { existsSync, statSync, createReadStream, watchFile, unwatchFile, rmSync, mkdirSync, renameSync, readFileSync, writeFileSync, appendFileSync, openSync, readSync, closeSync } from 'node:fs';
|
|
24
24
|
import { tmpdir } from 'node:os';
|
|
25
25
|
import { buildWaChannelMcpServers, buildWaChannelArgv, waChannelMcpConfigPath, isDevChannelPrompt } from './wa-channel-mcp.js';
|
|
26
26
|
import { buildWebchatChannelMcpServers, buildWebchatChannelArgv, webchatChannelMcpConfigPath } from './webchat-channel-mcp.js';
|
|
@@ -28,8 +28,9 @@ import { buildTelegramChannelMcpServers, buildTelegramChannelArgv, telegramChann
|
|
|
28
28
|
import { buildChannelMcpServers, buildChannelArgv, channelMcpConfigPath } from './channel-mcp.js';
|
|
29
29
|
import { mergeTarget, isMultiTarget, targetKinds } from './channel-targets.js';
|
|
30
30
|
import { randomUUID } from 'node:crypto';
|
|
31
|
-
import { execFileSync } from 'node:child_process';
|
|
31
|
+
import { execFile, execFileSync } from 'node:child_process';
|
|
32
32
|
import { buildRcChildEnv, reapplyAdminLevers } from './rc-daemon.js';
|
|
33
|
+
import { runConnectorAuthLogin } from './connector-auth.js';
|
|
33
34
|
import { isEffortLevel, isNewSessionEffortLevel, isPermissionMode, SONNET_MODEL } from '../../../lib/models/dist/index.js';
|
|
34
35
|
import { spawnClaudeSession, stopSession, writeInterruptToPty, isLive, onPtyExit, livePtyCount, liveSessionIds, getPtyTrackerForTests, livePidForSession, classifyLiveness, priorExitedCountForSession, PERMISSION_MODES, openFdCount, registerRcSpawnPty, } from './pty-spawner.js';
|
|
35
36
|
import { writeScopeRecord, removeScopeRecord } from './scope-record.js';
|
|
@@ -155,17 +156,17 @@ function finitePositive(raw, fallback) {
|
|
|
155
156
|
const n = Number(raw);
|
|
156
157
|
return Number.isFinite(n) && n > 0 ? n : fallback;
|
|
157
158
|
}
|
|
158
|
-
/** Task 1090 Phase 2 — the
|
|
159
|
-
*
|
|
160
|
-
* that
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
function
|
|
159
|
+
/** Task 1090 Phase 2 + Task 1184 — the `tool_use` ids in the bounded tail with
|
|
160
|
+
* no matching `tool_result` after them: the signature of an interrupt or death
|
|
161
|
+
* that landed mid-tool-call, which would corrupt a later `--resume` (the API
|
|
162
|
+
* rejects a tool_use with no following tool_result). Bounded (last 64KB) so a
|
|
163
|
+
* large transcript never blocks the check; the window only needs the last
|
|
164
|
+
* turn's tool pairing. Returns [] on any read error (no file yet, gone) —
|
|
165
|
+
* absence of evidence is not a dangling use. Order-preserving. */
|
|
166
|
+
export function danglingToolUseIds(jsonlPath) {
|
|
166
167
|
try {
|
|
167
168
|
if (!existsSync(jsonlPath))
|
|
168
|
-
return
|
|
169
|
+
return [];
|
|
169
170
|
const size = statSync(jsonlPath).size;
|
|
170
171
|
const window = 64 * 1024;
|
|
171
172
|
const fd = openSync(jsonlPath, 'r');
|
|
@@ -175,7 +176,7 @@ function tailHasDanglingToolUse(jsonlPath) {
|
|
|
175
176
|
const buf = Buffer.alloc(len);
|
|
176
177
|
readSync(fd, buf, 0, len, start);
|
|
177
178
|
const lines = buf.toString('utf8').split('\n');
|
|
178
|
-
const used =
|
|
179
|
+
const used = [];
|
|
179
180
|
const resulted = new Set();
|
|
180
181
|
for (const line of lines) {
|
|
181
182
|
if (!line)
|
|
@@ -193,15 +194,116 @@ function tailHasDanglingToolUse(jsonlPath) {
|
|
|
193
194
|
continue;
|
|
194
195
|
for (const c of content) {
|
|
195
196
|
if (c.type === 'tool_use' && typeof c.id === 'string')
|
|
196
|
-
used.
|
|
197
|
+
used.push(c.id);
|
|
197
198
|
if (c.type === 'tool_result' && typeof c.tool_use_id === 'string')
|
|
198
199
|
resulted.add(c.tool_use_id);
|
|
199
200
|
}
|
|
200
201
|
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
202
|
+
return used.filter((id) => !resulted.has(id));
|
|
203
|
+
}
|
|
204
|
+
finally {
|
|
205
|
+
closeSync(fd);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
return [];
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
function tailHasDanglingToolUse(jsonlPath) {
|
|
213
|
+
return danglingToolUseIds(jsonlPath).length > 0;
|
|
214
|
+
}
|
|
215
|
+
/** Task 1184 — append one synthetic user record supplying an is_error
|
|
216
|
+
* tool_result for each dangling tool_use, so a `--resume` of a session whose
|
|
217
|
+
* child died mid-tool-call has no unmatched tool_use. Envelope fields
|
|
218
|
+
* (cwd/version/gitBranch/parentUuid) are copied forward from the last on-disk
|
|
219
|
+
* record so the synthetic record matches claude's own shape; uuid and
|
|
220
|
+
* timestamp are minted. Idempotent: returns false when nothing dangles or on
|
|
221
|
+
* any error. */
|
|
222
|
+
export function appendTurnAbortTerminator(jsonlPath, sessionId) {
|
|
223
|
+
try {
|
|
224
|
+
const ids = danglingToolUseIds(jsonlPath);
|
|
225
|
+
if (ids.length === 0)
|
|
204
226
|
return false;
|
|
227
|
+
const raw = readFileSync(jsonlPath, 'utf8').trimEnd().split('\n');
|
|
228
|
+
let envelope = {};
|
|
229
|
+
for (let i = raw.length - 1; i >= 0; i--) {
|
|
230
|
+
try {
|
|
231
|
+
envelope = JSON.parse(raw[i]);
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
catch { /* skip non-JSON */ }
|
|
235
|
+
}
|
|
236
|
+
const record = {
|
|
237
|
+
parentUuid: typeof envelope.uuid === 'string' ? envelope.uuid : null,
|
|
238
|
+
isSidechain: false,
|
|
239
|
+
userType: 'external',
|
|
240
|
+
cwd: typeof envelope.cwd === 'string' ? envelope.cwd : undefined,
|
|
241
|
+
sessionId,
|
|
242
|
+
version: typeof envelope.version === 'string' ? envelope.version : undefined,
|
|
243
|
+
gitBranch: typeof envelope.gitBranch === 'string' ? envelope.gitBranch : undefined,
|
|
244
|
+
type: 'user',
|
|
245
|
+
uuid: randomUUID(),
|
|
246
|
+
timestamp: new Date().toISOString(),
|
|
247
|
+
message: {
|
|
248
|
+
role: 'user',
|
|
249
|
+
content: ids.map((id) => ({
|
|
250
|
+
tool_use_id: id,
|
|
251
|
+
type: 'tool_result',
|
|
252
|
+
content: 'Turn aborted: the agent process exited before this tool finished.',
|
|
253
|
+
is_error: true,
|
|
254
|
+
})),
|
|
255
|
+
},
|
|
256
|
+
};
|
|
257
|
+
appendFileSync(jsonlPath, JSON.stringify(record) + '\n');
|
|
258
|
+
return true;
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
return false;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
const TERMINAL_STOP_REASONS = new Set(['end_turn', 'stop_sequence', 'max_tokens']);
|
|
265
|
+
/** Task 1184 — the open-turn signature of a dead-child phantom. Reads the
|
|
266
|
+
* bounded tail (last 64KB) and reports whether the last assistant record
|
|
267
|
+
* carries no terminal `stop_reason` — the turn was streaming when the child
|
|
268
|
+
* died (no end_turn was ever written). A terminal stop (end_turn /
|
|
269
|
+
* stop_sequence / max_tokens) is a completed turn → false. No assistant
|
|
270
|
+
* record in the window, or any read error → false (absence of evidence is
|
|
271
|
+
* not an open turn). */
|
|
272
|
+
export function tailIsOpenTurn(jsonlPath) {
|
|
273
|
+
try {
|
|
274
|
+
if (!existsSync(jsonlPath))
|
|
275
|
+
return false;
|
|
276
|
+
const size = statSync(jsonlPath).size;
|
|
277
|
+
const window = 64 * 1024;
|
|
278
|
+
const fd = openSync(jsonlPath, 'r');
|
|
279
|
+
try {
|
|
280
|
+
const start = size > window ? size - window : 0;
|
|
281
|
+
const len = size - start;
|
|
282
|
+
const buf = Buffer.alloc(len);
|
|
283
|
+
readSync(fd, buf, 0, len, start);
|
|
284
|
+
const lines = buf.toString('utf8').split('\n');
|
|
285
|
+
let lastAssistantStop = null;
|
|
286
|
+
let sawAssistant = false;
|
|
287
|
+
for (const line of lines) {
|
|
288
|
+
if (!line)
|
|
289
|
+
continue;
|
|
290
|
+
let o;
|
|
291
|
+
try {
|
|
292
|
+
o = JSON.parse(line);
|
|
293
|
+
}
|
|
294
|
+
catch {
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
const rec = o;
|
|
298
|
+
if (rec.type === 'assistant' || rec.message?.role === 'assistant') {
|
|
299
|
+
sawAssistant = true;
|
|
300
|
+
const sr = rec.message?.stop_reason;
|
|
301
|
+
lastAssistantStop = typeof sr === 'string' ? sr : null;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
if (!sawAssistant)
|
|
305
|
+
return false;
|
|
306
|
+
return !(lastAssistantStop !== null && TERMINAL_STOP_REASONS.has(lastAssistantStop));
|
|
205
307
|
}
|
|
206
308
|
finally {
|
|
207
309
|
closeSync(fd);
|
|
@@ -502,6 +604,22 @@ function detectCliVersion(claudeBin) {
|
|
|
502
604
|
}
|
|
503
605
|
return cachedCliVersion;
|
|
504
606
|
}
|
|
607
|
+
// Task 1153 — connectors resumed once this manager lifetime, keyed
|
|
608
|
+
// `${sessionId}::${name}`. A second authenticate-needed for the same pair after a
|
|
609
|
+
// resume is the unexpected case, surfaced via `outcome=still-needs-auth-after-resume`.
|
|
610
|
+
const connectorResumedOnce = new Set();
|
|
611
|
+
// Task 1153 — run `claude mcp login "<name>"` headless under the brand config dir.
|
|
612
|
+
// A claude.ai connector login prints the sdk-cli consent URL and exits 0 with no
|
|
613
|
+
// TTY. Never throws; returns combined stdout+stderr and the exit code.
|
|
614
|
+
function execMcpLogin(claudeBin, claudeConfigDir, name) {
|
|
615
|
+
return new Promise((resolve) => {
|
|
616
|
+
execFile(claudeBin, ['mcp', 'login', name], { env: { ...process.env, CLAUDE_CONFIG_DIR: claudeConfigDir }, timeout: 20_000, encoding: 'utf8' }, (err, stdout, stderr) => {
|
|
617
|
+
const output = `${stdout ?? ''}\n${stderr ?? ''}`;
|
|
618
|
+
const code = err ? (typeof err.code === 'number' ? err.code : 1) : 0;
|
|
619
|
+
resolve({ output, code });
|
|
620
|
+
});
|
|
621
|
+
});
|
|
622
|
+
}
|
|
505
623
|
export function buildHttpApp(deps) {
|
|
506
624
|
const app = new Hono();
|
|
507
625
|
// Task 702 — the dir holding pid files and rc-spawn scope records.
|
|
@@ -745,6 +863,22 @@ export function buildHttpApp(deps) {
|
|
|
745
863
|
// post-Task-260 rows surface their specialist even if the JSONL
|
|
746
864
|
// doesn't include an agent-setting record.
|
|
747
865
|
const specialist = row.agent ?? row.cachedAgentSetting ?? row.sidecarSpecialist;
|
|
866
|
+
// Task 1184 — read-time activity reconcile. A busy stamp can outlive its
|
|
867
|
+
// child: an OOM SIGKILL leaves the PID file on disk, so the watcher row
|
|
868
|
+
// stays `busy` with no live PTY to ever flip it. Reconcile here so the
|
|
869
|
+
// pointer poll stops reporting an in-flight turn for a dead child — and,
|
|
870
|
+
// when the transcript tail is an open turn, mark it `aborted` so the UI
|
|
871
|
+
// shows the resume notice. This cannot persist past one read.
|
|
872
|
+
let activity = row.status;
|
|
873
|
+
let turnAborted;
|
|
874
|
+
if (row.status === 'busy' && !isLive(row.sessionId)) {
|
|
875
|
+
if (hasJsonl && tailIsOpenTurn(jsonlPath)) {
|
|
876
|
+
activity = 'aborted';
|
|
877
|
+
turnAborted = true;
|
|
878
|
+
}
|
|
879
|
+
else
|
|
880
|
+
activity = 'idle';
|
|
881
|
+
}
|
|
748
882
|
return {
|
|
749
883
|
sessionId: row.sessionId,
|
|
750
884
|
pid: row.pid,
|
|
@@ -767,7 +901,8 @@ export function buildHttpApp(deps) {
|
|
|
767
901
|
model,
|
|
768
902
|
permissionMode: row.permissionMode,
|
|
769
903
|
effectivePermissionMode: row.effectivePermissionMode,
|
|
770
|
-
activity
|
|
904
|
+
activity,
|
|
905
|
+
turnAborted,
|
|
771
906
|
};
|
|
772
907
|
}
|
|
773
908
|
app.post('/public-spawn', async (c) => {
|
|
@@ -1395,6 +1530,39 @@ export function buildHttpApp(deps) {
|
|
|
1395
1530
|
return c.json({ ok: true, sessionId, titleSource: 'user', renamedAt: entry.renamedAt }, 200);
|
|
1396
1531
|
});
|
|
1397
1532
|
// SIGTERM-only stop. Idempotent on already-dead PTYs. JSONL untouched.
|
|
1533
|
+
// Task 1153 — TUI-free claude.ai connector authentication for the admin webchat.
|
|
1534
|
+
// The webchat-channel `connector_authenticate` tool reaches here via the UI
|
|
1535
|
+
// gateway. `completed:false` runs `claude mcp login` and returns the consent URL;
|
|
1536
|
+
// `completed:true` recycles the session so the operator's next inbound re-spawns
|
|
1537
|
+
// with --resume and reads the new grant. Decision logic lives in connector-auth.ts.
|
|
1538
|
+
app.post('/connector-auth-login', async (c) => {
|
|
1539
|
+
const start = Date.now();
|
|
1540
|
+
const body = await c.req.json().catch(() => null);
|
|
1541
|
+
const sessionId = body?.sessionId;
|
|
1542
|
+
const name = body?.name;
|
|
1543
|
+
const completed = body?.completed === true;
|
|
1544
|
+
if (typeof sessionId !== 'string' || !SESSION_ID_PATTERN.test(sessionId) || typeof name !== 'string' || !name.trim()) {
|
|
1545
|
+
timed(deps.logger, 'POST', '/connector-auth-login', 400, Date.now() - start);
|
|
1546
|
+
return c.json({ error: 'sessionId and name required' }, 400);
|
|
1547
|
+
}
|
|
1548
|
+
const result = await runConnectorAuthLogin({
|
|
1549
|
+
logger: deps.logger,
|
|
1550
|
+
runMcpLogin: (n) => execMcpLogin(deps.claudeBin, deps.claudeConfigDir, n),
|
|
1551
|
+
recycleSession: async (sid) => {
|
|
1552
|
+
const row = resolveRow(deps.watcher, sid);
|
|
1553
|
+
await stopSession({
|
|
1554
|
+
killGraceMs: deps.killGraceMs,
|
|
1555
|
+
logger: deps.logger,
|
|
1556
|
+
runSystemctl: deps.runSystemctl,
|
|
1557
|
+
rowScopeUnitToken: row?.scopeUnitToken ?? null,
|
|
1558
|
+
rowPid: row?.pid ?? null,
|
|
1559
|
+
}, sid);
|
|
1560
|
+
},
|
|
1561
|
+
resumedOnce: connectorResumedOnce,
|
|
1562
|
+
}, { sessionId, name, completed });
|
|
1563
|
+
timed(deps.logger, 'POST', '/connector-auth-login', 200, Date.now() - start);
|
|
1564
|
+
return c.json(result, 200);
|
|
1565
|
+
});
|
|
1398
1566
|
app.post('/:sessionId/stop', async (c) => {
|
|
1399
1567
|
const start = Date.now();
|
|
1400
1568
|
const id = c.req.param('sessionId');
|
|
@@ -1581,6 +1749,19 @@ export function buildHttpApp(deps) {
|
|
|
1581
1749
|
deps.logger(`[webchat-interrupt] op=interrupt-requested intId=${intId} sessionId=${sessionId.slice(0, 8)} trigger=${trigger}`);
|
|
1582
1750
|
const result = writeInterruptToPty(sessionId, byte, deps.logger);
|
|
1583
1751
|
if (!result.ok) {
|
|
1752
|
+
if (result.error === 'not-found' || result.error === 'exited') {
|
|
1753
|
+
const jsonlPath = jsonlPathForSessionId(deps.spawnCwd, sessionId);
|
|
1754
|
+
// Task 1184 — a dead-child phantom: no live PTY and the transcript tail
|
|
1755
|
+
// is an open turn. Recover instead of bare-404 so the operator's stop
|
|
1756
|
+
// press clears the phantom and a later --resume is clean.
|
|
1757
|
+
if (!isLive(sessionId) && tailIsOpenTurn(jsonlPath)) {
|
|
1758
|
+
appendTurnAbortTerminator(jsonlPath, sessionId);
|
|
1759
|
+
const tailTurnClosed = !tailIsOpenTurn(jsonlPath);
|
|
1760
|
+
deps.logger(`[webchat-interrupt] op=dead-child-recovered intId=${intId} sessionId=${sessionId.slice(0, 8)} tailTurnClosed=${tailTurnClosed}`);
|
|
1761
|
+
timed(deps.logger, 'POST', `/${id}/interrupt`, 200, Date.now() - start);
|
|
1762
|
+
return c.json({ ok: true, deadChild: true, resumable: true }, 200);
|
|
1763
|
+
}
|
|
1764
|
+
}
|
|
1584
1765
|
if (result.error === 'not-found') {
|
|
1585
1766
|
timed(deps.logger, 'POST', `/${id}/interrupt`, 404, Date.now() - start);
|
|
1586
1767
|
return c.json({ error: 'session-not-found' }, 404);
|
|
@@ -2741,6 +2922,22 @@ export function buildHttpApp(deps) {
|
|
|
2741
2922
|
// 500 ms idle deadline before the child exited.
|
|
2742
2923
|
if (!outputEmitted)
|
|
2743
2924
|
emitChildOutput();
|
|
2925
|
+
// Task 1184 — self-heal a dead-child phantom. If the child exits while
|
|
2926
|
+
// its transcript tail is an open turn, emit the abort event and write
|
|
2927
|
+
// the terminator so a later --resume is clean. Only a known (resumed)
|
|
2928
|
+
// session has a JSONL to reconcile; a fresh spawn that dies before
|
|
2929
|
+
// binding has no id and no transcript. The visible turnActive flip
|
|
2930
|
+
// happens via the read-time activity reconcile on the next poll.
|
|
2931
|
+
if (sessionId) {
|
|
2932
|
+
try {
|
|
2933
|
+
const jsonlPath = jsonlPathForSessionId(deps.spawnCwd, sessionId);
|
|
2934
|
+
if (tailIsOpenTurn(jsonlPath)) {
|
|
2935
|
+
deps.logger(`[rc-life] op=turn-aborted sessionId=${sessionId.slice(0, 8)} reason=child-exit-mid-turn`);
|
|
2936
|
+
appendTurnAbortTerminator(jsonlPath, sessionId);
|
|
2937
|
+
}
|
|
2938
|
+
}
|
|
2939
|
+
catch { /* exit path must never throw */ }
|
|
2940
|
+
}
|
|
2744
2941
|
// Task 977 — close the per-session child log on exit.
|
|
2745
2942
|
childLog.close();
|
|
2746
2943
|
});
|