@rryando/arcs 3.10.0 → 4.0.0
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/README.md +172 -146
- package/dist/cli/agent-registry.d.ts +12 -0
- package/dist/cli/agent-registry.d.ts.map +1 -0
- package/dist/cli/agent-registry.js +67 -0
- package/dist/cli/agent-registry.js.map +1 -0
- package/dist/cli/arcs-flash.d.ts +2 -0
- package/dist/cli/arcs-flash.d.ts.map +1 -0
- package/dist/cli/arcs-flash.js +68 -0
- package/dist/cli/arcs-flash.js.map +1 -0
- package/dist/cli/arcs-orchestrate-caveman.d.ts +2 -14
- package/dist/cli/arcs-orchestrate-caveman.d.ts.map +1 -1
- package/dist/cli/arcs-orchestrate-caveman.js +6 -97
- package/dist/cli/arcs-orchestrate-caveman.js.map +1 -1
- package/dist/cli/arcs-orchestrate.d.ts +1 -1
- package/dist/cli/arcs-orchestrate.d.ts.map +1 -1
- package/dist/cli/arcs-orchestrate.js +40 -383
- package/dist/cli/arcs-orchestrate.js.map +1 -1
- package/dist/cli/bundle-installer.d.ts +10 -4
- package/dist/cli/bundle-installer.d.ts.map +1 -1
- package/dist/cli/bundle-installer.js +99 -6
- package/dist/cli/bundle-installer.js.map +1 -1
- package/dist/cli/commands/batch.js +4 -0
- package/dist/cli/commands/batch.js.map +1 -1
- package/dist/cli/commands/hooks.d.ts +76 -0
- package/dist/cli/commands/hooks.d.ts.map +1 -0
- package/dist/cli/commands/hooks.js +436 -0
- package/dist/cli/commands/hooks.js.map +1 -0
- package/dist/cli/commands/index.d.ts +2 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +2 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/project.js +27 -0
- package/dist/cli/commands/project.js.map +1 -1
- package/dist/cli/commands/task.js +16 -1
- package/dist/cli/commands/task.js.map +1 -1
- package/dist/cli/commands/web.d.ts +2 -0
- package/dist/cli/commands/web.d.ts.map +1 -0
- package/dist/cli/commands/web.js +66 -0
- package/dist/cli/commands/web.js.map +1 -0
- package/dist/cli/config.d.ts +46 -3
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +95 -38
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/instructions.d.ts +32 -7
- package/dist/cli/instructions.d.ts.map +1 -1
- package/dist/cli/instructions.js +99 -34
- package/dist/cli/instructions.js.map +1 -1
- package/dist/cli/orchestrator-shared-blocks.d.ts +31 -0
- package/dist/cli/orchestrator-shared-blocks.d.ts.map +1 -0
- package/dist/cli/orchestrator-shared-blocks.js +148 -0
- package/dist/cli/orchestrator-shared-blocks.js.map +1 -0
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +230 -91
- package/dist/cli/setup.js.map +1 -1
- package/dist/retrieval/index-builder.d.ts.map +1 -1
- package/dist/retrieval/index-builder.js +29 -1
- package/dist/retrieval/index-builder.js.map +1 -1
- package/dist/shared/session-vocabulary.d.ts +88 -0
- package/dist/shared/session-vocabulary.d.ts.map +1 -0
- package/dist/shared/session-vocabulary.js +114 -0
- package/dist/shared/session-vocabulary.js.map +1 -0
- package/dist/utils/claude-code-hook-install.d.ts +80 -0
- package/dist/utils/claude-code-hook-install.d.ts.map +1 -0
- package/dist/utils/claude-code-hook-install.js +211 -0
- package/dist/utils/claude-code-hook-install.js.map +1 -0
- package/dist/utils/claude-transcript.d.ts +206 -0
- package/dist/utils/claude-transcript.d.ts.map +1 -0
- package/dist/utils/claude-transcript.js +384 -0
- package/dist/utils/claude-transcript.js.map +1 -0
- package/dist/utils/diagram-generator.d.ts +1 -1
- package/dist/utils/diagram-generator.d.ts.map +1 -1
- package/dist/utils/diagram-generator.js +3 -2
- package/dist/utils/diagram-generator.js.map +1 -1
- package/dist/utils/errors.d.ts +6 -2
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +12 -0
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/git.d.ts +21 -0
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +65 -1
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/hook-contract.d.ts +36 -0
- package/dist/utils/hook-contract.d.ts.map +1 -0
- package/dist/utils/hook-contract.js +35 -0
- package/dist/utils/hook-contract.js.map +1 -0
- package/dist/utils/hook-token-store.d.ts +61 -0
- package/dist/utils/hook-token-store.d.ts.map +1 -0
- package/dist/utils/hook-token-store.js +86 -0
- package/dist/utils/hook-token-store.js.map +1 -0
- package/dist/utils/json-schemas.d.ts +186 -2
- package/dist/utils/json-schemas.d.ts.map +1 -1
- package/dist/utils/json-schemas.js +48 -4
- package/dist/utils/json-schemas.js.map +1 -1
- package/dist/utils/knowledge-store.d.ts +7 -1
- package/dist/utils/knowledge-store.d.ts.map +1 -1
- package/dist/utils/knowledge-store.js +97 -65
- package/dist/utils/knowledge-store.js.map +1 -1
- package/dist/utils/plan-store.d.ts +8 -0
- package/dist/utils/plan-store.d.ts.map +1 -1
- package/dist/utils/plan-store.js +98 -59
- package/dist/utils/plan-store.js.map +1 -1
- package/dist/utils/project-resolver.d.ts +8 -0
- package/dist/utils/project-resolver.d.ts.map +1 -1
- package/dist/utils/project-resolver.js +7 -2
- package/dist/utils/project-resolver.js.map +1 -1
- package/dist/utils/session-store.d.ts +339 -0
- package/dist/utils/session-store.d.ts.map +1 -0
- package/dist/utils/session-store.js +577 -0
- package/dist/utils/session-store.js.map +1 -0
- package/dist/utils/storage-utils.d.ts +31 -0
- package/dist/utils/storage-utils.d.ts.map +1 -1
- package/dist/utils/storage-utils.js +116 -5
- package/dist/utils/storage-utils.js.map +1 -1
- package/dist/utils/task-store.d.ts +7 -0
- package/dist/utils/task-store.d.ts.map +1 -1
- package/dist/utils/task-store.js +73 -23
- package/dist/utils/task-store.js.map +1 -1
- package/dist/web-client/assets/GraphCanvas-CTyf_XXQ.js +1 -0
- package/dist/web-client/assets/MarkdownEditor-af2vwQOX.js +77 -0
- package/dist/web-client/assets/abnfDiagram-VRR7QNED-CdxcKX9t.js +1 -0
- package/dist/web-client/assets/arc-Bfaogrm1.js +1 -0
- package/dist/web-client/assets/architecture-TIHT7OUA-Bt2-DmfV.js +1 -0
- package/dist/web-client/assets/architectureDiagram-ZJ3FMSHR-DOISDv6o.js +36 -0
- package/dist/web-client/assets/array-BifhSqXX.js +1 -0
- package/dist/web-client/assets/blockDiagram-677ZJIJ3-DKwtbttM.js +132 -0
- package/dist/web-client/assets/c4Diagram-LMCZKHZV-CilqK-Mm.js +10 -0
- package/dist/web-client/assets/channel-C2mb9np_.js +1 -0
- package/dist/web-client/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- package/dist/web-client/assets/chunk-32BRIVSS-C79m1mkG.js +1 -0
- package/dist/web-client/assets/chunk-52WLFC77-C6WelGWJ.js +10 -0
- package/dist/web-client/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- package/dist/web-client/assets/chunk-7BUUIJ7U-Bb538aSH.js +1 -0
- package/dist/web-client/assets/chunk-C7G6YPKG-DLg7ryWI.js +1 -0
- package/dist/web-client/assets/chunk-EX3LRPZG-DjWgo4gL.js +231 -0
- package/dist/web-client/assets/chunk-FWX5IMBZ-BgS9p_zy.js +2 -0
- package/dist/web-client/assets/chunk-HOUHSVGY-DuVR7dZO.js +1 -0
- package/dist/web-client/assets/chunk-ICXQ74PX-Y8DlnIJM.js +2 -0
- package/dist/web-client/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- package/dist/web-client/assets/chunk-KEIR6QF5-DEvma7oi.js +161 -0
- package/dist/web-client/assets/chunk-MOJQB5TN-BEM3QgeD.js +88 -0
- package/dist/web-client/assets/chunk-OGEWGWER-DlM8LxGr.js +1 -0
- package/dist/web-client/assets/chunk-PUDLZKDR-c6cqNVTx.js +156 -0
- package/dist/web-client/assets/chunk-Q4XR5HBZ-C5lNmcka.js +70 -0
- package/dist/web-client/assets/chunk-RYQCIY6F-np2RyIY1.js +1 -0
- package/dist/web-client/assets/chunk-V7JOEXUC-nSswxvSG.js +206 -0
- package/dist/web-client/assets/chunk-VAUOI2AC-CqJkCkT0.js +1 -0
- package/dist/web-client/assets/chunk-VR4S4FIN-D3pFchin.js +1 -0
- package/dist/web-client/assets/chunk-WYO6CB5R-BI9c-NzI.js +125 -0
- package/dist/web-client/assets/chunk-XXDRQBXY-BvKO0v-W.js +1 -0
- package/dist/web-client/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- package/dist/web-client/assets/chunk-ZGVPDNZ5-CKTF2kLR.js +62 -0
- package/dist/web-client/assets/chunk-ZIRB5QZD-BpeS1aZ7.js +32 -0
- package/dist/web-client/assets/classDiagram-OUVF2IWQ-CPd_w3Zr.js +1 -0
- package/dist/web-client/assets/classDiagram-v2-EOCWNBFH-CPd_w3Zr.js +1 -0
- package/dist/web-client/assets/cose-bilkent-JH36ORCC-BebHqzgp.js +1 -0
- package/dist/web-client/assets/cynefin-VYW2F7L2-BrJrnfh1.js +1 -0
- package/dist/web-client/assets/cynefinDiagram-TSTJHNR4-9jYzPWJZ.js +62 -0
- package/dist/web-client/assets/cytoscape-fcose-peAzqedC.js +1 -0
- package/dist/web-client/assets/cytoscape.esm-C3UvhD5t.js +321 -0
- package/dist/web-client/assets/dagre-Buvkdvvj.js +1 -0
- package/dist/web-client/assets/dagre-VKFMJZFB-B705Djpu.js +4 -0
- package/dist/web-client/assets/defaultLocale-BFoDCU3G.js +1 -0
- package/dist/web-client/assets/diagram-FQU43EPY-BfQAlUlJ.js +3 -0
- package/dist/web-client/assets/diagram-G47NLZAW-s1YDe06A.js +24 -0
- package/dist/web-client/assets/diagram-NH7WQ7WH-Dy3z11Hc.js +24 -0
- package/dist/web-client/assets/diagram-OA4YK3LP-Bius2xUN.js +30 -0
- package/dist/web-client/assets/diagram-WEI45ONY-D7x4VcHM.js +41 -0
- package/dist/web-client/assets/dist-B_J_HbC0.js +1 -0
- package/dist/web-client/assets/ebnfDiagram-CCIWWBDH-CBg1xrmD.js +1 -0
- package/dist/web-client/assets/erDiagram-Q63AITRT-CJRvTFvd.js +85 -0
- package/dist/web-client/assets/eventmodeling-45OFAUF4-CTKRC2Yj.js +1 -0
- package/dist/web-client/assets/flowDiagram-23GEKE2U-CaZjFyU1.js +1 -0
- package/dist/web-client/assets/ganttDiagram-NO4QXBWP-C_LsypZ4.js +292 -0
- package/dist/web-client/assets/gitGraph-TEB2WS4Q-Dx2XxdGk.js +1 -0
- package/dist/web-client/assets/gitGraphDiagram-IHSO6WYX-DiKWkGWQ.js +106 -0
- package/dist/web-client/assets/graphlib-DS17s2tU.js +1 -0
- package/dist/web-client/assets/index-CYwhkPtc.js +60 -0
- package/dist/web-client/assets/index-wSzUPvml.css +2 -0
- package/dist/web-client/assets/info-DKCQHKI2-DORwHenK.js +1 -0
- package/dist/web-client/assets/infoDiagram-FWYZ7A6U-CQecXS1E.js +2 -0
- package/dist/web-client/assets/init-C-OQMol4.js +1 -0
- package/dist/web-client/assets/ishikawaDiagram-FXEZZL3T-CWhj60Zp.js +70 -0
- package/dist/web-client/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
- package/dist/web-client/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
- package/dist/web-client/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
- package/dist/web-client/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
- package/dist/web-client/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
- package/dist/web-client/assets/journeyDiagram-5HDEW3XC-Cj3z2U8u.js +139 -0
- package/dist/web-client/assets/kanban-definition-HUTT4EX6-DFmBRenP.js +89 -0
- package/dist/web-client/assets/katex-DolUETbr.js +257 -0
- package/dist/web-client/assets/line-C_Hxz9xb.js +1 -0
- package/dist/web-client/assets/linear-DeUiD2wj.js +1 -0
- package/dist/web-client/assets/map-BaFkSB1l.js +1 -0
- package/dist/web-client/assets/mermaid-parser.core-E3xRdzPn.js +7 -0
- package/dist/web-client/assets/mermaid.core-C2_CcotH.js +11 -0
- package/dist/web-client/assets/mindmap-definition-LN4V7U3C-Bs7VxPid.js +96 -0
- package/dist/web-client/assets/ordinal-BDEzSJ7C.js +1 -0
- package/dist/web-client/assets/packet-7NZHBO7P-D2nqso7i.js +1 -0
- package/dist/web-client/assets/path-COt_16Va.js +1 -0
- package/dist/web-client/assets/pegDiagram-2B236MQR-Cepo1sIu.js +1 -0
- package/dist/web-client/assets/pie-RZYD4A2V-Sx0IGbXt.js +1 -0
- package/dist/web-client/assets/pieDiagram-ENE6RG2P-D-PMDNhk.js +39 -0
- package/dist/web-client/assets/quadrantDiagram-ABIIQ3AL-BNGC7Fms.js +7 -0
- package/dist/web-client/assets/radar-I7S5WNFK-CFf_-2OC.js +1 -0
- package/dist/web-client/assets/railroad-3IZDKUUU-BvZeVRGh.js +1 -0
- package/dist/web-client/assets/railroad-abnf-AHOZXSZD-DnGh6x2O.js +1 -0
- package/dist/web-client/assets/railroad-ebnf-EBAXGLYW-CGfgCoaE.js +1 -0
- package/dist/web-client/assets/railroad-peg-LSFZ7HO6-BzQxYdqp.js +1 -0
- package/dist/web-client/assets/railroadDiagram-RFXS5EU6-D0iK_k84.js +1 -0
- package/dist/web-client/assets/requirementDiagram-TGXJPOKE-BPdsw9tz.js +84 -0
- package/dist/web-client/assets/rolldown-runtime-Dd_uD5pT.js +1 -0
- package/dist/web-client/assets/rough.esm-By172zw-.js +1 -0
- package/dist/web-client/assets/sankeyDiagram-HTMAVEWB-maA6ukOJ.js +40 -0
- package/dist/web-client/assets/sequenceDiagram-DBY2YBRQ-DKmAjmgr.js +162 -0
- package/dist/web-client/assets/sizeCapture-X5ZJPWSS-B0uUizjq.js +1 -0
- package/dist/web-client/assets/src-oBChb5qS.js +1 -0
- package/dist/web-client/assets/stateDiagram-2N3HPSRC-esxmzk3w.js +1 -0
- package/dist/web-client/assets/stateDiagram-v2-6OUMAXLB-hcBqlOLc.js +1 -0
- package/dist/web-client/assets/swimlanes-5IMT3BWC-DFd-wGBv.js +2 -0
- package/dist/web-client/assets/swimlanesDiagram-G3AALYLV-DbSrPBYr.js +8 -0
- package/dist/web-client/assets/timeline-definition-FHXFAJF6-C7SG8MQH.js +120 -0
- package/dist/web-client/assets/treeView-QDETBFTQ-M0rhxbs2.js +1 -0
- package/dist/web-client/assets/treemap-6X3UGDF4-BQfkQxSh.js +1 -0
- package/dist/web-client/assets/vennDiagram-L72KCM5P-CyIlb8ju.js +34 -0
- package/dist/web-client/assets/wardley-OPB4EBWU-EE-7q8M1.js +1 -0
- package/dist/web-client/assets/wardleyDiagram-EHGQE667-bY8XdYYS.js +78 -0
- package/dist/web-client/assets/xychartDiagram-FW5EYKEG-AhuXJ3de.js +7 -0
- package/dist/web-client/index.html +15 -0
- package/dist/web-server/app.d.ts +16 -0
- package/dist/web-server/app.d.ts.map +1 -0
- package/dist/web-server/app.js +77 -0
- package/dist/web-server/app.js.map +1 -0
- package/dist/web-server/claude-runner.d.ts +188 -0
- package/dist/web-server/claude-runner.d.ts.map +1 -0
- package/dist/web-server/claude-runner.js +599 -0
- package/dist/web-server/claude-runner.js.map +1 -0
- package/dist/web-server/hook-auth.d.ts +12 -0
- package/dist/web-server/hook-auth.d.ts.map +1 -0
- package/dist/web-server/hook-auth.js +36 -0
- package/dist/web-server/hook-auth.js.map +1 -0
- package/dist/web-server/index.d.ts +23 -0
- package/dist/web-server/index.d.ts.map +1 -0
- package/dist/web-server/index.js +50 -0
- package/dist/web-server/index.js.map +1 -0
- package/dist/web-server/opencode-client.d.ts +123 -0
- package/dist/web-server/opencode-client.d.ts.map +1 -0
- package/dist/web-server/opencode-client.js +514 -0
- package/dist/web-server/opencode-client.js.map +1 -0
- package/dist/web-server/permission-policy.d.ts +46 -0
- package/dist/web-server/permission-policy.d.ts.map +1 -0
- package/dist/web-server/permission-policy.js +96 -0
- package/dist/web-server/permission-policy.js.map +1 -0
- package/dist/web-server/prompt-assembly.d.ts +454 -0
- package/dist/web-server/prompt-assembly.d.ts.map +1 -0
- package/dist/web-server/prompt-assembly.js +1122 -0
- package/dist/web-server/prompt-assembly.js.map +1 -0
- package/dist/web-server/respond.d.ts +33 -0
- package/dist/web-server/respond.d.ts.map +1 -0
- package/dist/web-server/respond.js +79 -0
- package/dist/web-server/respond.js.map +1 -0
- package/dist/web-server/routes/collections.d.ts +11 -0
- package/dist/web-server/routes/collections.d.ts.map +1 -0
- package/dist/web-server/routes/collections.js +217 -0
- package/dist/web-server/routes/collections.js.map +1 -0
- package/dist/web-server/routes/discovery.d.ts +7 -0
- package/dist/web-server/routes/discovery.d.ts.map +1 -0
- package/dist/web-server/routes/discovery.js +159 -0
- package/dist/web-server/routes/discovery.js.map +1 -0
- package/dist/web-server/routes/events.d.ts +6 -0
- package/dist/web-server/routes/events.d.ts.map +1 -0
- package/dist/web-server/routes/events.js +25 -0
- package/dist/web-server/routes/events.js.map +1 -0
- package/dist/web-server/routes/hook-events.d.ts +44 -0
- package/dist/web-server/routes/hook-events.d.ts.map +1 -0
- package/dist/web-server/routes/hook-events.js +320 -0
- package/dist/web-server/routes/hook-events.js.map +1 -0
- package/dist/web-server/routes/projects.d.ts +7 -0
- package/dist/web-server/routes/projects.d.ts.map +1 -0
- package/dist/web-server/routes/projects.js +272 -0
- package/dist/web-server/routes/projects.js.map +1 -0
- package/dist/web-server/routes/sessions.d.ts +18 -0
- package/dist/web-server/routes/sessions.d.ts.map +1 -0
- package/dist/web-server/routes/sessions.js +1298 -0
- package/dist/web-server/routes/sessions.js.map +1 -0
- package/dist/web-server/routes/workspace.d.ts +27 -0
- package/dist/web-server/routes/workspace.d.ts.map +1 -0
- package/dist/web-server/routes/workspace.js +280 -0
- package/dist/web-server/routes/workspace.js.map +1 -0
- package/dist/web-server/run-event-log.d.ts +167 -0
- package/dist/web-server/run-event-log.d.ts.map +1 -0
- package/dist/web-server/run-event-log.js +468 -0
- package/dist/web-server/run-event-log.js.map +1 -0
- package/dist/web-server/security.d.ts +7 -0
- package/dist/web-server/security.d.ts.map +1 -0
- package/dist/web-server/security.js +41 -0
- package/dist/web-server/security.js.map +1 -0
- package/dist/web-server/session-reconciler.d.ts +162 -0
- package/dist/web-server/session-reconciler.d.ts.map +1 -0
- package/dist/web-server/session-reconciler.js +363 -0
- package/dist/web-server/session-reconciler.js.map +1 -0
- package/dist/web-server/static.d.ts +17 -0
- package/dist/web-server/static.d.ts.map +1 -0
- package/dist/web-server/static.js +79 -0
- package/dist/web-server/static.js.map +1 -0
- package/dist/web-server/storage.d.ts +17 -0
- package/dist/web-server/storage.d.ts.map +1 -0
- package/dist/web-server/storage.js +42 -0
- package/dist/web-server/storage.js.map +1 -0
- package/dist/web-server/watcher.d.ts +37 -0
- package/dist/web-server/watcher.d.ts.map +1 -0
- package/dist/web-server/watcher.js +181 -0
- package/dist/web-server/watcher.js.map +1 -0
- package/dist/web-server/web-auth.d.ts +17 -0
- package/dist/web-server/web-auth.d.ts.map +1 -0
- package/dist/web-server/web-auth.js +33 -0
- package/dist/web-server/web-auth.js.map +1 -0
- package/dist/web-server/web-token.d.ts +39 -0
- package/dist/web-server/web-token.d.ts.map +1 -0
- package/dist/web-server/web-token.js +71 -0
- package/dist/web-server/web-token.js.map +1 -0
- package/opencode/arcs/bundle-runtime.json +5 -13
- package/opencode/arcs/manifest.json +215 -151
- package/opencode/arcs/prompts/arcs-docs.txt +53 -47
- package/opencode/arcs/prompts/arcs-flash.txt +190 -0
- package/opencode/arcs/prompts/arcs-orchestrate-caveman.txt +116 -422
- package/opencode/arcs/prompts/arcs-orchestrate.txt +114 -341
- package/opencode/arcs/prompts/code-reviewer.txt +37 -98
- package/opencode/arcs/prompts/devil-advocate.txt +44 -115
- package/opencode/arcs/prompts/graph-explorer.txt +31 -179
- package/opencode/arcs/prompts/software-engineer.txt +24 -6
- package/opencode/arcs/prompts/tech-architect.txt +25 -9
- package/opencode/arcs/skills/brainstorming/SKILL.md +65 -105
- package/opencode/arcs/skills/deep-pr-review/SKILL.md +5 -5
- package/opencode/arcs/skills/deep-pr-review/review-template.md +1 -1
- package/opencode/arcs/skills/enriching-codegraph-proposals/SKILL.md +17 -18
- package/opencode/arcs/skills/executing-plans/SKILL.md +26 -234
- package/opencode/arcs/skills/implementation/SKILL.md +61 -0
- package/opencode/arcs/skills/init-project/SKILL.md +16 -15
- package/opencode/arcs/skills/install-claude-code-hook/SKILL.md +143 -0
- package/opencode/arcs/skills/systematic-debugging/SKILL.md +7 -7
- package/opencode/arcs/skills/test-driven-development/SKILL.md +1 -1
- package/opencode/arcs/skills/to-diagram/SKILL.md +8 -3
- package/opencode/arcs/skills/writing-knowledge/SKILL.md +7 -6
- package/opencode/arcs/skills/writing-plans/SKILL.md +80 -130
- package/opencode/arcs/skills/writing-plans/plan-document-reviewer-prompt.md +38 -30
- package/package.json +14 -6
- package/scripts/build-opencode-bundle.mjs +22 -7
- package/scripts/claude-code-session-hook.mjs +171 -0
- package/scripts/deploy-claudecode-bundle.mjs +206 -132
- package/scripts/deploy-opencode-bundle.mjs +181 -5
- package/scripts/lib/bundle-helpers.mjs +26 -0
- package/scripts/lint-bundle.mjs +123 -3
- package/skills/explore-dag.md +5 -3
- package/skills/init-project.md +27 -26
- package/skills/orchestrate.md +29 -13
- package/skills/update-docs.md +8 -13
- package/opencode/arcs/prompts/docs-researcher.txt +0 -79
- package/opencode/arcs/prompts/oncall-ops.txt +0 -85
- package/opencode/arcs/skills/code-agent/SKILL.md +0 -63
- package/opencode/arcs/skills/executing-plans/code-quality-reviewer-prompt.md +0 -57
- package/opencode/arcs/skills/executing-plans/implementer-prompt.md +0 -152
- package/opencode/arcs/skills/executing-plans/spec-reviewer-prompt.md +0 -91
- package/opencode/arcs/skills/quick-dev/SKILL.md +0 -52
- package/opencode/arcs/skills/requesting-code-review/SKILL.md +0 -59
- package/opencode/arcs/skills/requesting-code-review/code-reviewer.md +0 -139
- package/opencode/arcs/skills/the-ladder/SKILL.md +0 -54
|
@@ -0,0 +1,599 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Headless `claude -p` run lifecycle (T001 of the session-panel async-runs plan).
|
|
3
|
+
*
|
|
4
|
+
* Owns everything between "the web route decided to run a job" and a finished
|
|
5
|
+
* run record: spawn, streaming stdout capture, timeout escalation, NDJSON event
|
|
6
|
+
* parsing, exit mapping, per-write-target concurrency serialization and
|
|
7
|
+
* ARCS_HOOK_* env scrubbing. The route supplies argv/cwd and this module never
|
|
8
|
+
* decides what the child *does* — but it does own the child's OUTPUT CONTRACT:
|
|
9
|
+
* every run is normalized onto `--output-format stream-json
|
|
10
|
+
* --include-partial-messages --verbose` (see withStreamJsonArgv), so stdout is
|
|
11
|
+
* always the newline-delimited event stream the reader below understands. When
|
|
12
|
+
* the caller supplies an `eventLog` target, that stream is ALSO persisted
|
|
13
|
+
* verbatim to the run's own event log before the reader parses a byte of it
|
|
14
|
+
* (see run-event-log.ts) — the log is the durable record, parsing is a consumer.
|
|
15
|
+
* The route's post-run write-back (transcript mirror + metadata.run finalization)
|
|
16
|
+
* plugs in as the per-job `onSettled` callback, invoked after the child exits.
|
|
17
|
+
*
|
|
18
|
+
* Injectable `spawnImpl` + `binary` keep tests free of real children; the
|
|
19
|
+
* default impl is plain node child_process `spawn` with `stdio:
|
|
20
|
+
* ["ignore","pipe","pipe"]`. Every child-side failure resolves to an outcome
|
|
21
|
+
* record — this module never throws on spawn/exit/timeout paths.
|
|
22
|
+
*/
|
|
23
|
+
import { spawn } from "node:child_process";
|
|
24
|
+
import { openRunEventLog } from "./run-event-log.js";
|
|
25
|
+
const DEFAULT_TIMEOUT_MS = 10 * 60 * 1000; // 10 min
|
|
26
|
+
const DEFAULT_KILL_GRACE_MS = 5_000;
|
|
27
|
+
/**
|
|
28
|
+
* Bound on the *raw* stdout tail kept as the last-resort reply for a child that
|
|
29
|
+
* emits no usable events. It no longer truncates real replies — those are
|
|
30
|
+
* assembled from whole event lines as they arrive.
|
|
31
|
+
*/
|
|
32
|
+
export const STDOUT_CAP = 1024 * 1024; // 1 MB
|
|
33
|
+
export const STDERR_CAP = 4 * 1024; // 4 KB
|
|
34
|
+
/**
|
|
35
|
+
* Ceiling on a single *unterminated* line the NDJSON reader will buffer — a
|
|
36
|
+
* memory guard against a child that never emits a newline, not a reply cap. It
|
|
37
|
+
* sits well above any single claude event (one message cannot approach 8 MB), so
|
|
38
|
+
* a long reply split across chunks still reassembles whole.
|
|
39
|
+
*/
|
|
40
|
+
export const MAX_EVENT_LINE = 8 * STDOUT_CAP; // 8 MB
|
|
41
|
+
/**
|
|
42
|
+
* Output contract the runner forces onto every child. `--include-partial-messages`
|
|
43
|
+
* is what makes first-token timing observable at all, and claude >= 2.x refuses
|
|
44
|
+
* both companions in print mode: "--include-partial-messages requires --print and
|
|
45
|
+
* --output-format=stream-json" and "When using --print, --output-format=stream-json
|
|
46
|
+
* requires --verbose" — both exit 1 at flag validation, before any network call.
|
|
47
|
+
* The three therefore travel together and are never split.
|
|
48
|
+
*/
|
|
49
|
+
const STREAM_JSON_ARGV = [
|
|
50
|
+
"--output-format",
|
|
51
|
+
"stream-json",
|
|
52
|
+
"--include-partial-messages",
|
|
53
|
+
"--verbose",
|
|
54
|
+
];
|
|
55
|
+
/** Keys never forwarded to the child env — the hook handshake must not leak. */
|
|
56
|
+
const ENV_SCRUB_KEYS = ["ARCS_HOOK_TOKEN", "ARCS_HOOK_SLUG", "ARCS_HOOK_URL"];
|
|
57
|
+
/**
|
|
58
|
+
* Rewrites caller argv onto the runner's output contract: drops any
|
|
59
|
+
* `--output-format <v>` / `--output-format=<v>` the caller chose (routes still
|
|
60
|
+
* build plain `--output-format json`) plus any duplicate stream companions, then
|
|
61
|
+
* appends STREAM_JSON_ARGV. Everything else — `-p`, the prompt, `--resume`,
|
|
62
|
+
* `--session-id` — passes through untouched and in order.
|
|
63
|
+
*/
|
|
64
|
+
export function withStreamJsonArgv(argv) {
|
|
65
|
+
const rest = [];
|
|
66
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
67
|
+
const arg = argv[i];
|
|
68
|
+
if (arg === "--output-format") {
|
|
69
|
+
i += 1; // drop the flag together with its value
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (arg.startsWith("--output-format="))
|
|
73
|
+
continue;
|
|
74
|
+
if (arg === "--include-partial-messages" || arg === "--verbose")
|
|
75
|
+
continue;
|
|
76
|
+
rest.push(arg);
|
|
77
|
+
}
|
|
78
|
+
return [...rest, ...STREAM_JSON_ARGV];
|
|
79
|
+
}
|
|
80
|
+
/** writeTargetKey → live child. Module-level: shared across all web routes. */
|
|
81
|
+
const liveRuns = new Map();
|
|
82
|
+
/**
|
|
83
|
+
* Atomically claims the slot for a write-target key. Returns a typed refusal
|
|
84
|
+
* when a live run already holds it. Synchronous and called immediately after
|
|
85
|
+
* spawn (no await in between), so two overlapping requests cannot both win.
|
|
86
|
+
*/
|
|
87
|
+
export function beginRun(writeTargetKey, child) {
|
|
88
|
+
if (liveRuns.has(writeTargetKey)) {
|
|
89
|
+
return {
|
|
90
|
+
ok: false,
|
|
91
|
+
reason: "ALREADY_RUNNING",
|
|
92
|
+
message: `a claude run for "${writeTargetKey}" is already in progress`,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
const startedAt = Date.now();
|
|
96
|
+
liveRuns.set(writeTargetKey, { child, startedAt });
|
|
97
|
+
return { ok: true, startedAt };
|
|
98
|
+
}
|
|
99
|
+
/** Releases the slot for a write-target key (idempotent). */
|
|
100
|
+
export function endRun(writeTargetKey) {
|
|
101
|
+
liveRuns.delete(writeTargetKey);
|
|
102
|
+
}
|
|
103
|
+
/** Read-only liveness probe for the same slot (routes / UI status). */
|
|
104
|
+
export function isRunLive(writeTargetKey) {
|
|
105
|
+
return liveRuns.has(writeTargetKey);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Pid of the child currently holding a write-target's slot.
|
|
109
|
+
*
|
|
110
|
+
* `undefined` means no live run (the spawn threw, or the slot was refused);
|
|
111
|
+
* `null` means a live run whose child never reported a pid (an async spawn
|
|
112
|
+
* failure — node reports ENOENT on the `error` event, not at spawn).
|
|
113
|
+
*
|
|
114
|
+
* Exists so the run route can persist the child's pid on the session's run
|
|
115
|
+
* claim: `runClaudeJob` spawns synchronously (nothing is awaited before
|
|
116
|
+
* `beginRun`), so a caller that reads this immediately after calling it —
|
|
117
|
+
* before its own first await — sees the pid of the child it just started.
|
|
118
|
+
* Read-only: it cannot start, stop or observe anything else about the run.
|
|
119
|
+
*/
|
|
120
|
+
export function liveRunPid(writeTargetKey) {
|
|
121
|
+
const live = liveRuns.get(writeTargetKey);
|
|
122
|
+
if (live === undefined)
|
|
123
|
+
return undefined;
|
|
124
|
+
return live.child.pid ?? null;
|
|
125
|
+
}
|
|
126
|
+
// ---------------------------------------------------------------------------
|
|
127
|
+
// runClaudeJob
|
|
128
|
+
// ---------------------------------------------------------------------------
|
|
129
|
+
export async function runClaudeJob(input, options = {}) {
|
|
130
|
+
const { argv, cwd, writeTargetKey } = input;
|
|
131
|
+
const spawnImpl = options.spawnImpl ?? spawn;
|
|
132
|
+
const binary = options.binary ?? "claude";
|
|
133
|
+
const killGraceMs = options.killGraceMs ?? DEFAULT_KILL_GRACE_MS;
|
|
134
|
+
const env = input.env ?? process.env;
|
|
135
|
+
const timeoutMs = resolveTimeoutMs(input.timeoutMs, env);
|
|
136
|
+
const startedAt = Date.now();
|
|
137
|
+
const fail = (outcome, error) => ({
|
|
138
|
+
pid: null,
|
|
139
|
+
startedAt,
|
|
140
|
+
endedAt: Date.now(),
|
|
141
|
+
outcome,
|
|
142
|
+
error,
|
|
143
|
+
});
|
|
144
|
+
let child;
|
|
145
|
+
try {
|
|
146
|
+
// NOTE: no "--cwd" flag — claude >= 2.x rejects it; the working directory
|
|
147
|
+
// rides spawn options only.
|
|
148
|
+
child = spawnImpl(binary, withStreamJsonArgv(argv), {
|
|
149
|
+
cwd,
|
|
150
|
+
env: scrubEnv(env),
|
|
151
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
// Some spawn failures surface synchronously (fake impls, odd platforms).
|
|
156
|
+
return writeBack(input, fail("error", spawnErrorMessage(err, binary)));
|
|
157
|
+
}
|
|
158
|
+
const begin = beginRun(writeTargetKey, child);
|
|
159
|
+
if (!begin.ok) {
|
|
160
|
+
// A live run holds the slot — drop the freshly spawned child immediately.
|
|
161
|
+
// Attach a no-op error listener first: the refused child has no other
|
|
162
|
+
// listeners, so a spawn failure surfacing on it would otherwise crash.
|
|
163
|
+
child.on("error", () => { });
|
|
164
|
+
safeKill(child, "SIGKILL");
|
|
165
|
+
return writeBack(input, fail("error", begin.message));
|
|
166
|
+
}
|
|
167
|
+
const record = { pid: child.pid ?? null, startedAt, outcome: "success" };
|
|
168
|
+
try {
|
|
169
|
+
const settled = await settleRun(child, {
|
|
170
|
+
timeoutMs,
|
|
171
|
+
killGraceMs,
|
|
172
|
+
binary,
|
|
173
|
+
...(input.eventLog !== undefined && { eventLog: input.eventLog }),
|
|
174
|
+
});
|
|
175
|
+
record.endedAt = settled.endedAt;
|
|
176
|
+
record.outcome = settled.outcome;
|
|
177
|
+
if (settled.error !== undefined)
|
|
178
|
+
record.error = settled.error;
|
|
179
|
+
if (settled.replyText !== undefined) {
|
|
180
|
+
record.replyText = settled.replyText;
|
|
181
|
+
record.replyChars = settled.replyText.length;
|
|
182
|
+
}
|
|
183
|
+
// Streamed observations survive every outcome — a timed-out run that spoke
|
|
184
|
+
// before the kill still carries its TTFT number.
|
|
185
|
+
if (settled.firstTokenAt !== undefined)
|
|
186
|
+
record.firstTokenAt = settled.firstTokenAt;
|
|
187
|
+
if (settled.skippedLines !== undefined)
|
|
188
|
+
record.skippedLines = settled.skippedLines;
|
|
189
|
+
if (settled.eventLogLines !== undefined)
|
|
190
|
+
record.eventLogLines = settled.eventLogLines;
|
|
191
|
+
if (settled.eventLogTruncated !== undefined) {
|
|
192
|
+
record.eventLogTruncated = settled.eventLogTruncated;
|
|
193
|
+
}
|
|
194
|
+
if (settled.eventLogError !== undefined)
|
|
195
|
+
record.eventLogError = settled.eventLogError;
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
// Never throw on child-side failures — every path resolves to a record.
|
|
199
|
+
record.outcome = "error";
|
|
200
|
+
record.error = `runner failed: ${String(err)}`;
|
|
201
|
+
}
|
|
202
|
+
finally {
|
|
203
|
+
endRun(writeTargetKey);
|
|
204
|
+
}
|
|
205
|
+
return writeBack(input, record);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Fires the route-registered write-back (onSettled) against the settled record.
|
|
209
|
+
* Runs after endRun so the concurrency slot frees before the write-back's store
|
|
210
|
+
* work begins. Every record-producing path funnels through here — including
|
|
211
|
+
* sync spawn failures and refused overlaps — so the route can mirror the
|
|
212
|
+
* runtime transcript and finalize metadata.run regardless of outcome. Callback
|
|
213
|
+
* errors are swallowed: the write-back is best-effort and never changes the
|
|
214
|
+
* returned record.
|
|
215
|
+
*/
|
|
216
|
+
async function writeBack(input, record) {
|
|
217
|
+
if (input.onSettled === undefined)
|
|
218
|
+
return record;
|
|
219
|
+
try {
|
|
220
|
+
await input.onSettled(record);
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
// Write-back failure is a swallowed no-op — the run itself already settled.
|
|
224
|
+
}
|
|
225
|
+
return record;
|
|
226
|
+
}
|
|
227
|
+
function settleRun(child, ctx) {
|
|
228
|
+
return new Promise((resolve) => {
|
|
229
|
+
const stdout = makeStreamReader({ rawCap: STDOUT_CAP, lineCap: MAX_EVENT_LINE });
|
|
230
|
+
const stderr = makeTailBuffer(STDERR_CAP);
|
|
231
|
+
// Opened before any listener attaches, so the file exists even for a child
|
|
232
|
+
// that never writes a byte — an error or timeout run still leaves a log.
|
|
233
|
+
const events = openRunEventLog(ctx.eventLog);
|
|
234
|
+
let settled = false;
|
|
235
|
+
let timedOut = false;
|
|
236
|
+
let termTimer = null;
|
|
237
|
+
let killTimer = null;
|
|
238
|
+
const clearTimers = () => {
|
|
239
|
+
if (termTimer)
|
|
240
|
+
clearTimeout(termTimer);
|
|
241
|
+
if (killTimer)
|
|
242
|
+
clearTimeout(killTimer);
|
|
243
|
+
termTimer = null;
|
|
244
|
+
killTimer = null;
|
|
245
|
+
};
|
|
246
|
+
// Every settle path — error, close, timeout — carries whatever the stream
|
|
247
|
+
// already observed, so these two never depend on how the run ended.
|
|
248
|
+
const settle = (result) => {
|
|
249
|
+
if (settled)
|
|
250
|
+
return;
|
|
251
|
+
settled = true;
|
|
252
|
+
clearTimers();
|
|
253
|
+
child.removeAllListeners();
|
|
254
|
+
child.stdout?.removeAllListeners();
|
|
255
|
+
child.stderr?.removeAllListeners();
|
|
256
|
+
// The log closes on EVERY settle path — error, close and timeout — so the
|
|
257
|
+
// durable record of what the child said outlives how the run ended.
|
|
258
|
+
events.flush();
|
|
259
|
+
const log = events.close();
|
|
260
|
+
const seen = stdout.snapshot();
|
|
261
|
+
resolve({
|
|
262
|
+
...result,
|
|
263
|
+
...(seen.firstTokenAt !== undefined && { firstTokenAt: seen.firstTokenAt }),
|
|
264
|
+
...(seen.skippedLines > 0 && { skippedLines: seen.skippedLines }),
|
|
265
|
+
...(ctx.eventLog !== undefined && { eventLogLines: log.lines }),
|
|
266
|
+
// Only when it engaged. A log that hit its cap and one from a silent
|
|
267
|
+
// child both report zero lines, so the count alone cannot tell them
|
|
268
|
+
// apart — this flag is the difference, and dropping it here is what
|
|
269
|
+
// made the cap invisible to every consumer of the record.
|
|
270
|
+
...(log.truncated && { eventLogTruncated: true }),
|
|
271
|
+
...(log.error !== undefined && { eventLogError: log.error }),
|
|
272
|
+
});
|
|
273
|
+
};
|
|
274
|
+
termTimer = setTimeout(() => {
|
|
275
|
+
timedOut = true;
|
|
276
|
+
safeKill(child, "SIGTERM");
|
|
277
|
+
killTimer = setTimeout(() => {
|
|
278
|
+
safeKill(child, "SIGKILL");
|
|
279
|
+
}, ctx.killGraceMs);
|
|
280
|
+
}, ctx.timeoutMs);
|
|
281
|
+
child.stdout?.on("data", (chunk) => {
|
|
282
|
+
// DURABLE FIRST. The raw bytes hit disk synchronously here, before the
|
|
283
|
+
// reader below is given a chance to parse them — the log is the source of
|
|
284
|
+
// truth and the reader is a consumer, so a line the reader cannot use (or
|
|
285
|
+
// a process that dies on the very next statement) still leaves the line
|
|
286
|
+
// on disk. Never throws: openRunEventLog reports failures instead.
|
|
287
|
+
events.push(chunk);
|
|
288
|
+
stdout.push(String(chunk));
|
|
289
|
+
});
|
|
290
|
+
child.stderr?.on("data", (chunk) => stderr.push(String(chunk)));
|
|
291
|
+
child.on("error", (err) => {
|
|
292
|
+
settle({
|
|
293
|
+
endedAt: Date.now(),
|
|
294
|
+
outcome: "error",
|
|
295
|
+
error: spawnErrorMessage(err, ctx.binary),
|
|
296
|
+
});
|
|
297
|
+
});
|
|
298
|
+
// Resolve on `close` (after stdio drained) rather than `exit` so the reader
|
|
299
|
+
// sees the complete output. `close` also fires after a failed spawn.
|
|
300
|
+
child.on("close", (code, signal) => {
|
|
301
|
+
// A final line that never got its newline is still a line.
|
|
302
|
+
stdout.flush();
|
|
303
|
+
settle(mapExit({
|
|
304
|
+
code,
|
|
305
|
+
signal: signal ?? null,
|
|
306
|
+
timedOut,
|
|
307
|
+
stdout: stdout.snapshot(),
|
|
308
|
+
stderr,
|
|
309
|
+
timeoutMs: ctx.timeoutMs,
|
|
310
|
+
}));
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
function mapExit(input) {
|
|
315
|
+
const endedAt = Date.now();
|
|
316
|
+
if (input.timedOut) {
|
|
317
|
+
return {
|
|
318
|
+
endedAt,
|
|
319
|
+
outcome: "timeout",
|
|
320
|
+
error: `claude run timed out after ${input.timeoutMs}ms (SIGTERM, then SIGKILL)`,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
if (input.code === 0) {
|
|
324
|
+
const { result } = input.stdout;
|
|
325
|
+
if (result?.isError) {
|
|
326
|
+
return {
|
|
327
|
+
endedAt,
|
|
328
|
+
outcome: "error",
|
|
329
|
+
error: result.text?.trim() || "claude reported an error (is_error)",
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
return { endedAt, outcome: "success", replyText: replyFrom(input.stdout) };
|
|
333
|
+
}
|
|
334
|
+
if (input.signal) {
|
|
335
|
+
return {
|
|
336
|
+
endedAt,
|
|
337
|
+
outcome: "error",
|
|
338
|
+
error: `claude run was terminated by signal ${input.signal}`,
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
const stderrTail = input.stderr.text().trim();
|
|
342
|
+
return {
|
|
343
|
+
endedAt,
|
|
344
|
+
outcome: "error",
|
|
345
|
+
error: stderrTail || `claude exited with status ${input.code}`,
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Reply precedence, most authoritative first: the terminal `result` event's own
|
|
350
|
+
* text (verbatim, never trimmed — the model owns its whitespace), then the
|
|
351
|
+
* assembled text of the completed assistant messages, then the raw stdout tail
|
|
352
|
+
* for a child that spoke no events at all. Only the last one is STDOUT_CAP-bound.
|
|
353
|
+
*/
|
|
354
|
+
function replyFrom(stream) {
|
|
355
|
+
if (typeof stream.result?.text === "string")
|
|
356
|
+
return stream.result.text;
|
|
357
|
+
const assistant = stream.assistantText.trim();
|
|
358
|
+
if (assistant)
|
|
359
|
+
return assistant;
|
|
360
|
+
return stream.rawTail.trim();
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* The ceiling a run will actually be killed at: an explicit override first,
|
|
364
|
+
* then ARCS_CLAUDE_RUN_TIMEOUT_MS, then the 10-minute default.
|
|
365
|
+
*
|
|
366
|
+
* Exported because the run route has to persist the resulting DEADLINE with the
|
|
367
|
+
* session's run claim (a claim is only proof of life until the child is killed),
|
|
368
|
+
* and a second copy of this precedence in the route would silently drift from
|
|
369
|
+
* the one the timer here is armed with.
|
|
370
|
+
*/
|
|
371
|
+
export function resolveTimeoutMs(timeoutMs, env = process.env) {
|
|
372
|
+
if (typeof timeoutMs === "number" && Number.isFinite(timeoutMs) && timeoutMs > 0) {
|
|
373
|
+
return timeoutMs;
|
|
374
|
+
}
|
|
375
|
+
const raw = env.ARCS_CLAUDE_RUN_TIMEOUT_MS;
|
|
376
|
+
if (raw) {
|
|
377
|
+
const parsed = Number.parseInt(raw, 10);
|
|
378
|
+
if (Number.isInteger(parsed) && parsed > 0)
|
|
379
|
+
return parsed;
|
|
380
|
+
}
|
|
381
|
+
return DEFAULT_TIMEOUT_MS;
|
|
382
|
+
}
|
|
383
|
+
/** process.env minus the ARCS_HOOK_* handshake keys (the explicit 3-key
|
|
384
|
+
* denylist above — not a prefix wildcard scrub). */
|
|
385
|
+
function scrubEnv(env) {
|
|
386
|
+
const childEnv = {};
|
|
387
|
+
for (const [key, value] of Object.entries(env)) {
|
|
388
|
+
if (value === undefined)
|
|
389
|
+
continue;
|
|
390
|
+
if (ENV_SCRUB_KEYS.includes(key))
|
|
391
|
+
continue;
|
|
392
|
+
childEnv[key] = value;
|
|
393
|
+
}
|
|
394
|
+
return childEnv;
|
|
395
|
+
}
|
|
396
|
+
function spawnErrorMessage(err, binary) {
|
|
397
|
+
const code = err?.code;
|
|
398
|
+
if (code === "ENOENT")
|
|
399
|
+
return "claude not found on PATH";
|
|
400
|
+
return `failed to spawn ${binary}: ${String(err)}`;
|
|
401
|
+
}
|
|
402
|
+
function safeKill(child, signal) {
|
|
403
|
+
try {
|
|
404
|
+
child.kill(signal);
|
|
405
|
+
}
|
|
406
|
+
catch {
|
|
407
|
+
// Child already exited — nothing to signal.
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Accumulates output keeping only the most recent `limit` characters, dropping
|
|
412
|
+
* overflow from the head. Used so a runaway child cannot balloon memory while
|
|
413
|
+
* the important (tail) output survives.
|
|
414
|
+
*
|
|
415
|
+
* SHORTCUT: caps count UTF-16 code units, not bytes; upgrade to
|
|
416
|
+
* Buffer.byteLength accounting when non-ASCII payloads sit at the cap boundary.
|
|
417
|
+
*/
|
|
418
|
+
function makeTailBuffer(limit) {
|
|
419
|
+
const chunks = [];
|
|
420
|
+
let size = 0;
|
|
421
|
+
return {
|
|
422
|
+
push(chunk) {
|
|
423
|
+
if (chunk.length === 0)
|
|
424
|
+
return;
|
|
425
|
+
chunks.push(chunk);
|
|
426
|
+
size += chunk.length;
|
|
427
|
+
while (size > limit && chunks.length > 1) {
|
|
428
|
+
size -= chunks[0].length;
|
|
429
|
+
chunks.shift();
|
|
430
|
+
}
|
|
431
|
+
if (size > limit) {
|
|
432
|
+
// Single chunk larger than the cap — keep its tail.
|
|
433
|
+
const overflow = size - limit;
|
|
434
|
+
chunks[0] = chunks[0].slice(overflow);
|
|
435
|
+
size -= overflow;
|
|
436
|
+
}
|
|
437
|
+
},
|
|
438
|
+
text() {
|
|
439
|
+
return chunks.join("");
|
|
440
|
+
},
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
/** Event types the reader knows; anything else is ignored (and counted). */
|
|
444
|
+
const KNOWN_EVENT_TYPES = new Set(["result", "assistant", "user", "system", "stream_event"]);
|
|
445
|
+
/**
|
|
446
|
+
* Line-oriented reader over `--output-format stream-json` stdout.
|
|
447
|
+
*
|
|
448
|
+
* Tolerant by construction, because the wire schema is claude's to change:
|
|
449
|
+
* unknown event types are ignored rather than fatal, unparsable lines are
|
|
450
|
+
* skipped and counted, and no shape assumption is made beyond "JSON object with
|
|
451
|
+
* a string `type`". It never throws — a reader that can fail a run would make
|
|
452
|
+
* every future claude release a potential outage.
|
|
453
|
+
*
|
|
454
|
+
* Chunk boundaries are irrelevant: a chunk that ends mid-JSON leaves the partial
|
|
455
|
+
* line buffered until its newline arrives, and one line split across ten chunks
|
|
456
|
+
* parses exactly once. Because complete lines are consumed as they arrive, the
|
|
457
|
+
* reply is never truncated by either cap — `rawCap` bounds only the unused raw
|
|
458
|
+
* fallback tail, and `lineCap` only a single *unterminated* line (a runaway
|
|
459
|
+
* child with no newlines), which is then dropped along with the rest of it.
|
|
460
|
+
*/
|
|
461
|
+
function makeStreamReader(caps) {
|
|
462
|
+
const { rawCap, lineCap } = caps;
|
|
463
|
+
const raw = makeTailBuffer(rawCap);
|
|
464
|
+
const state = { assistantText: "", rawTail: "", skippedLines: 0 };
|
|
465
|
+
let pending = "";
|
|
466
|
+
let dropping = false;
|
|
467
|
+
const consumeLine = (line) => {
|
|
468
|
+
// Tolerate CRLF: the trailing \r is not part of the JSON.
|
|
469
|
+
const text = (line.endsWith("\r") ? line.slice(0, -1) : line).trim();
|
|
470
|
+
if (text === "")
|
|
471
|
+
return; // blank separator lines are normal, not drift
|
|
472
|
+
let value;
|
|
473
|
+
try {
|
|
474
|
+
value = JSON.parse(text);
|
|
475
|
+
}
|
|
476
|
+
catch {
|
|
477
|
+
state.skippedLines += 1;
|
|
478
|
+
return;
|
|
479
|
+
}
|
|
480
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
481
|
+
state.skippedLines += 1;
|
|
482
|
+
return;
|
|
483
|
+
}
|
|
484
|
+
applyEvent(value, state);
|
|
485
|
+
};
|
|
486
|
+
return {
|
|
487
|
+
push(chunk) {
|
|
488
|
+
raw.push(chunk);
|
|
489
|
+
const parts = (pending + chunk).split("\n");
|
|
490
|
+
// The last part has not met its newline yet — it stays buffered, which is
|
|
491
|
+
// exactly how a chunk that ends mid-JSON survives to be parsed once.
|
|
492
|
+
pending = parts.pop() ?? "";
|
|
493
|
+
for (const line of parts) {
|
|
494
|
+
// The tail of an over-cap line ends here; the next line is clean again.
|
|
495
|
+
if (dropping)
|
|
496
|
+
dropping = false;
|
|
497
|
+
else
|
|
498
|
+
consumeLine(line);
|
|
499
|
+
}
|
|
500
|
+
if (dropping) {
|
|
501
|
+
pending = "";
|
|
502
|
+
}
|
|
503
|
+
else if (pending.length > lineCap) {
|
|
504
|
+
// One line longer than the cap with no newline in sight — drop it (and
|
|
505
|
+
// the rest of it) so a runaway child cannot balloon memory.
|
|
506
|
+
state.skippedLines += 1;
|
|
507
|
+
dropping = true;
|
|
508
|
+
pending = "";
|
|
509
|
+
}
|
|
510
|
+
},
|
|
511
|
+
flush() {
|
|
512
|
+
if (!dropping && pending !== "")
|
|
513
|
+
consumeLine(pending);
|
|
514
|
+
pending = "";
|
|
515
|
+
dropping = false;
|
|
516
|
+
},
|
|
517
|
+
snapshot() {
|
|
518
|
+
return { ...state, rawTail: raw.text() };
|
|
519
|
+
},
|
|
520
|
+
};
|
|
521
|
+
}
|
|
522
|
+
/**
|
|
523
|
+
* Folds one decoded event into the snapshot. Every branch is defensive about
|
|
524
|
+
* field types — a `result` without a string `result`, an `assistant` without
|
|
525
|
+
* content, a `stream_event` with a shape we have never seen are all survivable.
|
|
526
|
+
*/
|
|
527
|
+
function applyEvent(event, state) {
|
|
528
|
+
const type = typeof event.type === "string" ? event.type : "";
|
|
529
|
+
if (type === "result" || (!KNOWN_EVENT_TYPES.has(type) && isLegacyEnvelope(event))) {
|
|
530
|
+
// The legacy single-object `--output-format json` envelope has no `type`;
|
|
531
|
+
// an older or wrapped claude still settles the same way.
|
|
532
|
+
state.result = {
|
|
533
|
+
isError: event.is_error === true,
|
|
534
|
+
...(typeof event.result === "string" && { text: event.result }),
|
|
535
|
+
};
|
|
536
|
+
return;
|
|
537
|
+
}
|
|
538
|
+
if (type === "assistant") {
|
|
539
|
+
const text = assistantMessageText(event.message);
|
|
540
|
+
if (text !== "") {
|
|
541
|
+
state.assistantText += text;
|
|
542
|
+
markFirstToken(state);
|
|
543
|
+
}
|
|
544
|
+
return;
|
|
545
|
+
}
|
|
546
|
+
if (type === "stream_event") {
|
|
547
|
+
// Partial deltas are the earliest possible content signal — this is the
|
|
548
|
+
// line `--include-partial-messages` exists to deliver, and where TTFT is
|
|
549
|
+
// actually measured. Their text is NOT accumulated: the completed
|
|
550
|
+
// `assistant` message repeats it, and double-counting would duplicate the
|
|
551
|
+
// fallback reply.
|
|
552
|
+
if (partialText(event.event) !== "")
|
|
553
|
+
markFirstToken(state);
|
|
554
|
+
return;
|
|
555
|
+
}
|
|
556
|
+
// `user`, `system` and friends carry no reply text — known, so not drift.
|
|
557
|
+
if (!KNOWN_EVENT_TYPES.has(type))
|
|
558
|
+
state.skippedLines += 1;
|
|
559
|
+
}
|
|
560
|
+
/** The pre-stream `{is_error?, result?}` object, recognized by shape alone. */
|
|
561
|
+
function isLegacyEnvelope(event) {
|
|
562
|
+
return typeof event.is_error === "boolean" || typeof event.result === "string";
|
|
563
|
+
}
|
|
564
|
+
function markFirstToken(state) {
|
|
565
|
+
if (state.firstTokenAt === undefined)
|
|
566
|
+
state.firstTokenAt = Date.now();
|
|
567
|
+
}
|
|
568
|
+
/** Text blocks of a completed assistant message, tolerant of string content. */
|
|
569
|
+
function assistantMessageText(message) {
|
|
570
|
+
const content = readField(message, "content");
|
|
571
|
+
if (typeof content === "string")
|
|
572
|
+
return content;
|
|
573
|
+
if (!Array.isArray(content))
|
|
574
|
+
return "";
|
|
575
|
+
let text = "";
|
|
576
|
+
for (const block of content) {
|
|
577
|
+
if (readField(block, "type") !== "text")
|
|
578
|
+
continue;
|
|
579
|
+
const blockText = readField(block, "text");
|
|
580
|
+
if (typeof blockText === "string")
|
|
581
|
+
text += blockText;
|
|
582
|
+
}
|
|
583
|
+
return text;
|
|
584
|
+
}
|
|
585
|
+
/** Text carried by a partial-message event (`content_block_delta` and kin). */
|
|
586
|
+
function partialText(inner) {
|
|
587
|
+
for (const key of ["delta", "content_block"]) {
|
|
588
|
+
const text = readField(readField(inner, key), "text");
|
|
589
|
+
if (typeof text === "string" && text !== "")
|
|
590
|
+
return text;
|
|
591
|
+
}
|
|
592
|
+
return "";
|
|
593
|
+
}
|
|
594
|
+
function readField(node, key) {
|
|
595
|
+
if (typeof node !== "object" || node === null)
|
|
596
|
+
return undefined;
|
|
597
|
+
return node[key];
|
|
598
|
+
}
|
|
599
|
+
//# sourceMappingURL=claude-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-runner.js","sourceRoot":"","sources":["../../src/web-server/claude-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bearer-token gate for `/api/hook/*`.
|
|
3
|
+
*
|
|
4
|
+
* Layered on top of (never instead of) the global loopback-only
|
|
5
|
+
* `secureLocalRequest`: loopback proves the caller is on this machine, the
|
|
6
|
+
* token proves it is this project's installed hook script. Browser-facing
|
|
7
|
+
* routes stay token-free — only the hook endpoint carries a shared secret,
|
|
8
|
+
* because only it is called by something that is not the ARCS web UI.
|
|
9
|
+
*/
|
|
10
|
+
import type { MiddlewareHandler } from "hono";
|
|
11
|
+
export declare const requireHookToken: MiddlewareHandler;
|
|
12
|
+
//# sourceMappingURL=hook-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-auth.d.ts","sourceRoot":"","sources":["../../src/web-server/hook-auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAY9C,eAAO,MAAM,gBAAgB,EAAE,iBAmB9B,CAAC"}
|