@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,577 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session CRUD storage for ARCS projects.
|
|
3
|
+
*
|
|
4
|
+
* Tracks agent runtime sessions (opencode, claude-code) that are attached to a
|
|
5
|
+
* project. Unlike tasks/plans/knowledge these records are volatile runtime
|
|
6
|
+
* state: they carry no markdown mirror and never invalidate the graph cache.
|
|
7
|
+
*/
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import { invalidSessionId, invalidSessionLink, itemNotFound, normalizedIdCollision, } from "./errors.js";
|
|
10
|
+
import { withLock } from "./file-lock.js";
|
|
11
|
+
import { readJsonSafe } from "./json.js";
|
|
12
|
+
import { readPlanIndex } from "./plan-store.js";
|
|
13
|
+
import { normalizeIdentifier } from "./slug.js";
|
|
14
|
+
import { ensureDir, fileExists, nowISO, validateSessionLinkedNodeType, validateSessionRuntimeType, validateSessionStatus, writeJson, } from "./storage-utils.js";
|
|
15
|
+
import { getTask } from "./task-store.js";
|
|
16
|
+
export { SESSION_LINKED_NODE_TYPES, SESSION_RUNTIME_TYPES, SESSION_STATUSES, } from "./storage-utils.js";
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Origin
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
/**
|
|
21
|
+
* Where a session record came from — its provenance, not its state.
|
|
22
|
+
*
|
|
23
|
+
* - `observed` — a runtime session ARCS merely watches: a terminal `claude`
|
|
24
|
+
* session announcing itself through the hook bridge, or an opencode session
|
|
25
|
+
* discovered (or created) on a live opencode server. ARCS can nudge it, but
|
|
26
|
+
* something outside ARCS drives it.
|
|
27
|
+
* - `arcs` — a record ARCS minted for itself (the headless oneshot/stable
|
|
28
|
+
* threads). No terminal is attached, so nothing ever drains its message
|
|
29
|
+
* queue; it is driven by headless runs only.
|
|
30
|
+
*
|
|
31
|
+
* Declared here rather than in storage-utils alongside the other session enums
|
|
32
|
+
* because origin is derived by this module (legacy promotion below) and every
|
|
33
|
+
* consumer already imports the session enums through this file.
|
|
34
|
+
*/
|
|
35
|
+
export const SESSION_ORIGINS = ["observed", "arcs"];
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// Index helpers
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
/**
|
|
40
|
+
* Fills in `origin` for a record persisted before the field existed.
|
|
41
|
+
*
|
|
42
|
+
* Legacy ARCS-minted records are recognisable by the marker the run route used
|
|
43
|
+
* to write, `metadata.control === "arcs-owned"`; every other record was a
|
|
44
|
+
* session ARCS observed. Promotion happens on READ, so there is no migration
|
|
45
|
+
* script and no flag day: the derived value is persisted the next time the
|
|
46
|
+
* record is written through this store. A record created after this change
|
|
47
|
+
* always carries a real `origin`, so `metadata.control` can never influence it.
|
|
48
|
+
*/
|
|
49
|
+
function withDerivedOrigin(session) {
|
|
50
|
+
// Typed as required, but absent on disk for pre-origin records — and a
|
|
51
|
+
// hand-edited index could hold anything, so validate rather than trust.
|
|
52
|
+
const persisted = session.origin;
|
|
53
|
+
if (persisted !== undefined && SESSION_ORIGINS.includes(persisted)) {
|
|
54
|
+
return session;
|
|
55
|
+
}
|
|
56
|
+
return { ...session, origin: session.metadata?.control === "arcs-owned" ? "arcs" : "observed" };
|
|
57
|
+
}
|
|
58
|
+
export async function readSessionIndex(projectDir) {
|
|
59
|
+
const sessionsDir = join(projectDir, "sessions");
|
|
60
|
+
if (!(await fileExists(sessionsDir))) {
|
|
61
|
+
return { sessions: [] };
|
|
62
|
+
}
|
|
63
|
+
const indexPath = join(sessionsDir, "index.json");
|
|
64
|
+
const index = await readJsonSafe(indexPath);
|
|
65
|
+
if (!index || !Array.isArray(index.sessions)) {
|
|
66
|
+
return { sessions: [] };
|
|
67
|
+
}
|
|
68
|
+
// Every read path in this module funnels through here, so the promotion is
|
|
69
|
+
// applied exactly once — reads, writes and capability checks all agree.
|
|
70
|
+
return { sessions: index.sessions.map(withDerivedOrigin) };
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Capability: may a message be handed to this session through `messageQueue`?
|
|
74
|
+
*
|
|
75
|
+
* Queued delivery only works when something drains the queue, and the only
|
|
76
|
+
* drainer is the Claude Code hook script running inside a real terminal
|
|
77
|
+
* session — an `observed` claude-code record. An `arcs`-origin thread has no
|
|
78
|
+
* terminal attached, so a message queued for it would sit there forever
|
|
79
|
+
* (that black hole is what the queue refusal on POST /message closes), and
|
|
80
|
+
* opencode records take live injection instead of ever queueing.
|
|
81
|
+
*
|
|
82
|
+
* Derived from `origin`, never from a metadata string.
|
|
83
|
+
*/
|
|
84
|
+
export function canQueue(session) {
|
|
85
|
+
return session.origin === "observed" && session.runtimeType === "claude-code";
|
|
86
|
+
}
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
// Derived phase
|
|
89
|
+
// ---------------------------------------------------------------------------
|
|
90
|
+
/**
|
|
91
|
+
* What a session is doing right now, as a reader of the UI would say it.
|
|
92
|
+
*
|
|
93
|
+
* DERIVED, never stored: there is no `phase` field on `SessionMeta` and no way
|
|
94
|
+
* to write one through this module. A stored phase is a second source of truth
|
|
95
|
+
* that goes stale the instant a process dies without telling anyone — which is
|
|
96
|
+
* precisely the "stuck on running forever" failure this replaces.
|
|
97
|
+
*/
|
|
98
|
+
export const SESSION_PHASES = ["running", "idle", "failed", "ended"];
|
|
99
|
+
/**
|
|
100
|
+
* Outcome vocabulary persisted on `metadata.run.outcome`. A superset of the
|
|
101
|
+
* runner's own `RunOutcome` ("success" | "error" | "timeout"): `interrupted` is
|
|
102
|
+
* never produced BY a run, it is written FOR a run whose process disappeared
|
|
103
|
+
* without ever settling — a restart's orphan. Declared here rather than
|
|
104
|
+
* imported from the web server because `utils/` must not depend on
|
|
105
|
+
* `web-server/`; claude-runner's union stays exactly what a child can return.
|
|
106
|
+
*/
|
|
107
|
+
export const SESSION_RUN_OUTCOMES = ["success", "error", "timeout", "interrupted"];
|
|
108
|
+
/**
|
|
109
|
+
* How long a run claim's heartbeat counts as proof of life. Sized to the
|
|
110
|
+
* runner's default 10-minute run ceiling because nothing refreshes the
|
|
111
|
+
* heartbeat mid-run yet (see `SessionMeta.heartbeatAt`) — a shorter window
|
|
112
|
+
* would demote a perfectly healthy long run to `idle`.
|
|
113
|
+
*/
|
|
114
|
+
export const RUN_HEARTBEAT_TTL_MS = 10 * 60 * 1000;
|
|
115
|
+
/**
|
|
116
|
+
* How long a runtime checkpoint counts as proof of life for an observed
|
|
117
|
+
* session. Deliberately shorter than the run TTL: checkpoints arrive at every
|
|
118
|
+
* prompt and every turn end, so a terminal that has produced neither in five
|
|
119
|
+
* minutes is waiting on a human, not working.
|
|
120
|
+
*/
|
|
121
|
+
export const CHECKPOINT_TTL_MS = 5 * 60 * 1000;
|
|
122
|
+
/**
|
|
123
|
+
* The record's run claim, or `undefined` when it holds none. Validated rather
|
|
124
|
+
* than trusted: a hand-edited index can carry anything under this key.
|
|
125
|
+
*/
|
|
126
|
+
export function sessionRunClaim(session) {
|
|
127
|
+
const runId = session.currentRunId;
|
|
128
|
+
return typeof runId === "string" && runId !== "" ? runId : undefined;
|
|
129
|
+
}
|
|
130
|
+
/** Whether an ISO timestamp is within `ttlMs` of `now` (epoch ms). */
|
|
131
|
+
function isFresh(timestamp, now, ttlMs) {
|
|
132
|
+
if (typeof timestamp !== "string" || timestamp === "")
|
|
133
|
+
return false;
|
|
134
|
+
const at = Date.parse(timestamp);
|
|
135
|
+
if (Number.isNaN(at))
|
|
136
|
+
return false;
|
|
137
|
+
// A future timestamp (clock skew between the hook script and the server)
|
|
138
|
+
// still counts as fresh — only age ever demotes.
|
|
139
|
+
return now - at <= ttlMs;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Derives a session's phase from its own persisted evidence, in one place.
|
|
143
|
+
*
|
|
144
|
+
* Precedence, strongest first:
|
|
145
|
+
* 1. a terminal `status` — `failed` is `failed`, `completed`/`disconnected`
|
|
146
|
+
* are `ended`. Nothing observed later reopens a session that is over.
|
|
147
|
+
* 2. a run claim (`currentRunId`) — ARCS spawned a child for this record, so
|
|
148
|
+
* its `heartbeatAt` is the freshest evidence there is. Stale means the
|
|
149
|
+
* claim outlived its proof of life, which reads `idle`, not `failed`: the
|
|
150
|
+
* run is settled by the reconciler, not guessed at here.
|
|
151
|
+
* 3. `lastCheckpointAt` — the only signal an observed terminal session emits.
|
|
152
|
+
*
|
|
153
|
+
* `metadata.run.outcome` is deliberately NOT an input. That field is run-level
|
|
154
|
+
* history (rendered next to the run), while phase answers "is this session live
|
|
155
|
+
* right now" — a run that failed an hour ago leaves the session idle and ready
|
|
156
|
+
* for the next one, not permanently `failed`.
|
|
157
|
+
*
|
|
158
|
+
* Pure: a record plus a clock, no I/O, no process probing. Liveness that needs
|
|
159
|
+
* the world (a pid, `claude agents`) belongs to the reconciler, which starts
|
|
160
|
+
* from this value and can only ever demote it.
|
|
161
|
+
*
|
|
162
|
+
* SHORTCUT: checkpoint freshness cannot tell `UserPromptSubmit` (turn started)
|
|
163
|
+
* from `Stop` (turn ended), so a session reads `running` for the TTL after its
|
|
164
|
+
* last turn; upgrade to a persisted checkpoint kind when the panel needs
|
|
165
|
+
* turn-level precision.
|
|
166
|
+
*/
|
|
167
|
+
export function deriveSessionPhase(session, options = {}) {
|
|
168
|
+
if (session.status === "failed")
|
|
169
|
+
return "failed";
|
|
170
|
+
if (session.status === "completed" || session.status === "disconnected")
|
|
171
|
+
return "ended";
|
|
172
|
+
const now = options.now ?? Date.now();
|
|
173
|
+
if (sessionRunClaim(session) !== undefined) {
|
|
174
|
+
const ttlMs = options.heartbeatTtlMs ?? RUN_HEARTBEAT_TTL_MS;
|
|
175
|
+
return isFresh(session.heartbeatAt, now, ttlMs) ? "running" : "idle";
|
|
176
|
+
}
|
|
177
|
+
const ttlMs = options.checkpointTtlMs ?? CHECKPOINT_TTL_MS;
|
|
178
|
+
return isFresh(session.lastCheckpointAt, now, ttlMs) ? "running" : "idle";
|
|
179
|
+
}
|
|
180
|
+
function sessionStoreLockPath(projectDir) {
|
|
181
|
+
return join(projectDir, "sessions", ".store");
|
|
182
|
+
}
|
|
183
|
+
async function writeSessionState(projectDir, index) {
|
|
184
|
+
const sessionsDir = join(projectDir, "sessions");
|
|
185
|
+
await ensureDir(sessionsDir);
|
|
186
|
+
await writeJson(join(sessionsDir, "index.json"), index);
|
|
187
|
+
}
|
|
188
|
+
function buildSession(input, normalizedId) {
|
|
189
|
+
const ts = nowISO(input.now);
|
|
190
|
+
return {
|
|
191
|
+
id: normalizedId,
|
|
192
|
+
normalizedId,
|
|
193
|
+
runtimeType: input.runtimeType,
|
|
194
|
+
runtimeSessionId: input.runtimeSessionId,
|
|
195
|
+
origin: input.origin ?? "observed",
|
|
196
|
+
status: input.status ?? "active",
|
|
197
|
+
startedAt: input.startedAt ?? ts,
|
|
198
|
+
...(input.lastMessageAt && { lastMessageAt: input.lastMessageAt }),
|
|
199
|
+
updatedAt: ts,
|
|
200
|
+
...(input.userEmail && { userEmail: input.userEmail }),
|
|
201
|
+
...(input.metadata && { metadata: input.metadata }),
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Validates a create/upsert payload and returns the canonical normalized id.
|
|
206
|
+
* Runtime session ids are opaque runtime-native strings, so the only structural
|
|
207
|
+
* requirement is that they normalize to a non-empty identifier.
|
|
208
|
+
*/
|
|
209
|
+
function validateCreateInput(input) {
|
|
210
|
+
validateSessionRuntimeType(input.runtimeType);
|
|
211
|
+
validateSessionStatus(input.status ?? "active");
|
|
212
|
+
const normalizedId = normalizeIdentifier(input.runtimeSessionId);
|
|
213
|
+
if (!normalizedId) {
|
|
214
|
+
throw invalidSessionId(input.runtimeSessionId);
|
|
215
|
+
}
|
|
216
|
+
return normalizedId;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Resolves a link target against the task/plan store and returns its canonical
|
|
220
|
+
* normalized id. Throws `ITEM_NOT_FOUND` when the target does not exist, so a
|
|
221
|
+
* session can never point at a task/plan that was never created (or was
|
|
222
|
+
* deleted). There is no cross-store validation helper to share here — the
|
|
223
|
+
* task/plan stores are the only source of truth for their own ids.
|
|
224
|
+
*/
|
|
225
|
+
async function resolveLinkedNodeId(projectDir, nodeType, nodeId) {
|
|
226
|
+
if (nodeType === "task") {
|
|
227
|
+
return (await getTask(projectDir, nodeId)).normalizedId;
|
|
228
|
+
}
|
|
229
|
+
const normalizedId = normalizeIdentifier(nodeId);
|
|
230
|
+
const { plans } = await readPlanIndex(projectDir);
|
|
231
|
+
const plan = plans.find((p) => p.normalizedId === normalizedId);
|
|
232
|
+
if (!plan) {
|
|
233
|
+
throw itemNotFound("plan", nodeId);
|
|
234
|
+
}
|
|
235
|
+
return plan.normalizedId;
|
|
236
|
+
}
|
|
237
|
+
// ---------------------------------------------------------------------------
|
|
238
|
+
// Public API
|
|
239
|
+
// ---------------------------------------------------------------------------
|
|
240
|
+
async function createSessionUnlocked(projectDir, input) {
|
|
241
|
+
const normalizedId = validateCreateInput(input);
|
|
242
|
+
const index = await readSessionIndex(projectDir);
|
|
243
|
+
if (index.sessions.some((s) => s.normalizedId === normalizedId)) {
|
|
244
|
+
throw normalizedIdCollision("session", input.runtimeSessionId, normalizedId);
|
|
245
|
+
}
|
|
246
|
+
const meta = buildSession(input, normalizedId);
|
|
247
|
+
index.sessions.push(meta);
|
|
248
|
+
await writeSessionState(projectDir, index);
|
|
249
|
+
return meta;
|
|
250
|
+
}
|
|
251
|
+
export async function createSession(projectDir, input) {
|
|
252
|
+
await ensureDir(join(projectDir, "sessions"));
|
|
253
|
+
return withLock(sessionStoreLockPath(projectDir), () => createSessionUnlocked(projectDir, input));
|
|
254
|
+
}
|
|
255
|
+
async function upsertSessionUnlocked(projectDir, input) {
|
|
256
|
+
const normalizedId = validateCreateInput(input);
|
|
257
|
+
const index = await readSessionIndex(projectDir);
|
|
258
|
+
const existingIndex = index.sessions.findIndex((s) => s.normalizedId === normalizedId);
|
|
259
|
+
if (existingIndex === -1) {
|
|
260
|
+
const meta = buildSession(input, normalizedId);
|
|
261
|
+
index.sessions.push(meta);
|
|
262
|
+
await writeSessionState(projectDir, index);
|
|
263
|
+
return meta;
|
|
264
|
+
}
|
|
265
|
+
const existing = index.sessions[existingIndex];
|
|
266
|
+
// `origin` is deliberately absent from this merge: it is provenance, so the
|
|
267
|
+
// creating writer fixes it for good. A hook observation must not demote an
|
|
268
|
+
// ARCS-owned thread (that would reopen the queue black hole), and an ARCS run
|
|
269
|
+
// claiming an existing record as its write-target must not erase the fact
|
|
270
|
+
// that a real terminal session is attached to it.
|
|
271
|
+
const merged = {
|
|
272
|
+
...existing,
|
|
273
|
+
runtimeType: input.runtimeType,
|
|
274
|
+
runtimeSessionId: input.runtimeSessionId,
|
|
275
|
+
...(input.status && { status: input.status }),
|
|
276
|
+
...(input.startedAt && { startedAt: input.startedAt }),
|
|
277
|
+
...(input.lastMessageAt && { lastMessageAt: input.lastMessageAt }),
|
|
278
|
+
...(input.userEmail && { userEmail: input.userEmail }),
|
|
279
|
+
...(input.metadata && { metadata: { ...existing.metadata, ...input.metadata } }),
|
|
280
|
+
updatedAt: nowISO(input.now),
|
|
281
|
+
};
|
|
282
|
+
index.sessions[existingIndex] = merged;
|
|
283
|
+
await writeSessionState(projectDir, index);
|
|
284
|
+
return merged;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Create-or-update by runtime session id. Used by runtime discovery bridges,
|
|
288
|
+
* which see the same session many times and must stay idempotent.
|
|
289
|
+
*
|
|
290
|
+
* Deliberately never touches `linkedNodeType`/`linkedNodeId`: discovery
|
|
291
|
+
* refreshes carry status/metadata only and must not silently unlink a session
|
|
292
|
+
* a human just linked. Linkage is `updateSession`-only.
|
|
293
|
+
*/
|
|
294
|
+
export async function upsertSession(projectDir, input) {
|
|
295
|
+
await ensureDir(join(projectDir, "sessions"));
|
|
296
|
+
return withLock(sessionStoreLockPath(projectDir), () => upsertSessionUnlocked(projectDir, input));
|
|
297
|
+
}
|
|
298
|
+
export async function listSessions(projectDir, filters) {
|
|
299
|
+
const index = await readSessionIndex(projectDir);
|
|
300
|
+
let sessions = index.sessions;
|
|
301
|
+
if (filters?.status) {
|
|
302
|
+
sessions = sessions.filter((s) => s.status === filters.status);
|
|
303
|
+
}
|
|
304
|
+
if (filters?.runtimeType) {
|
|
305
|
+
sessions = sessions.filter((s) => s.runtimeType === filters.runtimeType);
|
|
306
|
+
}
|
|
307
|
+
return sessions;
|
|
308
|
+
}
|
|
309
|
+
export async function getSession(projectDir, sessionId) {
|
|
310
|
+
const normalizedId = normalizeIdentifier(sessionId);
|
|
311
|
+
const index = await readSessionIndex(projectDir);
|
|
312
|
+
const session = index.sessions.find((s) => s.normalizedId === normalizedId);
|
|
313
|
+
if (!session) {
|
|
314
|
+
throw itemNotFound("session", sessionId);
|
|
315
|
+
}
|
|
316
|
+
return session;
|
|
317
|
+
}
|
|
318
|
+
async function updateSessionUnlocked(projectDir, input) {
|
|
319
|
+
if (input.status !== undefined) {
|
|
320
|
+
validateSessionStatus(input.status);
|
|
321
|
+
}
|
|
322
|
+
const normalizedId = normalizeIdentifier(input.id);
|
|
323
|
+
const index = await readSessionIndex(projectDir);
|
|
324
|
+
const sessionIndex = index.sessions.findIndex((s) => s.normalizedId === normalizedId);
|
|
325
|
+
if (sessionIndex === -1) {
|
|
326
|
+
throw itemNotFound("session", input.id);
|
|
327
|
+
}
|
|
328
|
+
const session = index.sessions[sessionIndex];
|
|
329
|
+
if (input.status !== undefined)
|
|
330
|
+
session.status = input.status;
|
|
331
|
+
if (input.lastMessageAt !== undefined) {
|
|
332
|
+
if (input.lastMessageAt === null || input.lastMessageAt === "") {
|
|
333
|
+
delete session.lastMessageAt;
|
|
334
|
+
}
|
|
335
|
+
else {
|
|
336
|
+
session.lastMessageAt = input.lastMessageAt;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
if (input.lastCheckpointAt !== undefined) {
|
|
340
|
+
if (input.lastCheckpointAt === null || input.lastCheckpointAt === "") {
|
|
341
|
+
delete session.lastCheckpointAt;
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
session.lastCheckpointAt = input.lastCheckpointAt;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
if (input.userEmail !== undefined) {
|
|
348
|
+
if (input.userEmail === null || input.userEmail === "") {
|
|
349
|
+
delete session.userEmail;
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
session.userEmail = input.userEmail;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
if (input.metadata !== undefined) {
|
|
356
|
+
if (input.metadata === null) {
|
|
357
|
+
delete session.metadata;
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
session.metadata = { ...session.metadata, ...input.metadata };
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
if (input.messageQueue !== undefined) {
|
|
364
|
+
if (input.messageQueue === null || input.messageQueue.length === 0) {
|
|
365
|
+
delete session.messageQueue;
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
session.messageQueue = [...input.messageQueue];
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
if (input.linkedNodeType !== undefined || input.linkedNodeId !== undefined) {
|
|
372
|
+
const clearing = input.linkedNodeType === null || input.linkedNodeId === null || input.linkedNodeId === "";
|
|
373
|
+
if (clearing) {
|
|
374
|
+
// Unlinking is atomic: both halves go, never one without the other.
|
|
375
|
+
delete session.linkedNodeType;
|
|
376
|
+
delete session.linkedNodeId;
|
|
377
|
+
}
|
|
378
|
+
else {
|
|
379
|
+
const nodeType = input.linkedNodeType ?? session.linkedNodeType;
|
|
380
|
+
const nodeId = input.linkedNodeId ?? session.linkedNodeId;
|
|
381
|
+
if (!nodeType || !nodeId) {
|
|
382
|
+
throw invalidSessionLink("linkedNodeType and linkedNodeId must be set together");
|
|
383
|
+
}
|
|
384
|
+
validateSessionLinkedNodeType(nodeType);
|
|
385
|
+
session.linkedNodeId = await resolveLinkedNodeId(projectDir, nodeType, nodeId);
|
|
386
|
+
session.linkedNodeType = nodeType;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
session.updatedAt = nowISO(input.now);
|
|
390
|
+
index.sessions[sessionIndex] = session;
|
|
391
|
+
await writeSessionState(projectDir, index);
|
|
392
|
+
return session;
|
|
393
|
+
}
|
|
394
|
+
export async function updateSession(projectDir, input) {
|
|
395
|
+
await ensureDir(join(projectDir, "sessions"));
|
|
396
|
+
return withLock(sessionStoreLockPath(projectDir), () => updateSessionUnlocked(projectDir, input));
|
|
397
|
+
}
|
|
398
|
+
function findSessionIndex(index, sessionId) {
|
|
399
|
+
const normalizedId = normalizeIdentifier(sessionId);
|
|
400
|
+
const position = index.sessions.findIndex((s) => s.normalizedId === normalizedId);
|
|
401
|
+
if (position === -1) {
|
|
402
|
+
throw itemNotFound("session", sessionId);
|
|
403
|
+
}
|
|
404
|
+
return position;
|
|
405
|
+
}
|
|
406
|
+
async function enqueueSessionMessageUnlocked(projectDir, sessionId, message) {
|
|
407
|
+
const index = await readSessionIndex(projectDir);
|
|
408
|
+
const position = findSessionIndex(index, sessionId);
|
|
409
|
+
const session = index.sessions[position];
|
|
410
|
+
session.messageQueue = [...(session.messageQueue ?? []), message];
|
|
411
|
+
session.updatedAt = nowISO();
|
|
412
|
+
index.sessions[position] = session;
|
|
413
|
+
await writeSessionState(projectDir, index);
|
|
414
|
+
return session;
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Appends a message to a session's pending queue.
|
|
418
|
+
*
|
|
419
|
+
* Deliberately not part of `updateSession`: the generic path shallow-merges
|
|
420
|
+
* whatever the caller passes, which would let two concurrent senders read the
|
|
421
|
+
* same array and write back a queue missing one message. Append happens inside
|
|
422
|
+
* the store lock, so the read-modify-write is atomic.
|
|
423
|
+
*
|
|
424
|
+
* The message is stored verbatim — callers validate content (the route rejects
|
|
425
|
+
* empty strings before it gets here).
|
|
426
|
+
*/
|
|
427
|
+
export async function enqueueSessionMessage(projectDir, sessionId, message) {
|
|
428
|
+
await ensureDir(join(projectDir, "sessions"));
|
|
429
|
+
return withLock(sessionStoreLockPath(projectDir), () => enqueueSessionMessageUnlocked(projectDir, sessionId, message));
|
|
430
|
+
}
|
|
431
|
+
async function drainSessionMessageQueueUnlocked(projectDir, sessionId) {
|
|
432
|
+
const index = await readSessionIndex(projectDir);
|
|
433
|
+
const position = findSessionIndex(index, sessionId);
|
|
434
|
+
const session = index.sessions[position];
|
|
435
|
+
const drained = session.messageQueue ?? [];
|
|
436
|
+
if (drained.length === 0) {
|
|
437
|
+
// Nothing pending — the common case at a checkpoint. Skip the write so an
|
|
438
|
+
// idle session's index.json does not churn on every prompt.
|
|
439
|
+
return [];
|
|
440
|
+
}
|
|
441
|
+
delete session.messageQueue;
|
|
442
|
+
session.lastMessageAt = nowISO();
|
|
443
|
+
session.updatedAt = session.lastMessageAt;
|
|
444
|
+
index.sessions[position] = session;
|
|
445
|
+
await writeSessionState(projectDir, index);
|
|
446
|
+
return drained;
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Reads and clears a session's pending queue in one lock acquisition.
|
|
450
|
+
*
|
|
451
|
+
* Read-then-clear must be atomic: a checkpoint that read the queue and cleared
|
|
452
|
+
* it in two calls would drop any message enqueued in between. Delivery is
|
|
453
|
+
* at-most-once — a consumer that crashes after draining loses the batch, which
|
|
454
|
+
* is the accepted trade for never replaying a message twice into a session.
|
|
455
|
+
*/
|
|
456
|
+
export async function drainSessionMessageQueue(projectDir, sessionId) {
|
|
457
|
+
await ensureDir(join(projectDir, "sessions"));
|
|
458
|
+
return withLock(sessionStoreLockPath(projectDir), () => drainSessionMessageQueueUnlocked(projectDir, sessionId));
|
|
459
|
+
}
|
|
460
|
+
/** Epoch ms for an ISO stamp, falling back to now for an unparsable override. */
|
|
461
|
+
function epochMs(isoTimestamp) {
|
|
462
|
+
const parsed = Date.parse(isoTimestamp);
|
|
463
|
+
return Number.isNaN(parsed) ? Date.now() : parsed;
|
|
464
|
+
}
|
|
465
|
+
/** Existing `metadata.run` as a mergeable object — anything else reads empty. */
|
|
466
|
+
function existingRunMetadata(session) {
|
|
467
|
+
const run = session.metadata?.run;
|
|
468
|
+
if (typeof run !== "object" || run === null || Array.isArray(run))
|
|
469
|
+
return {};
|
|
470
|
+
return run;
|
|
471
|
+
}
|
|
472
|
+
async function beginSessionRunUnlocked(projectDir, sessionId, input) {
|
|
473
|
+
const index = await readSessionIndex(projectDir);
|
|
474
|
+
const position = findSessionIndex(index, sessionId);
|
|
475
|
+
const session = index.sessions[position];
|
|
476
|
+
const ts = nowISO(input.now);
|
|
477
|
+
const pid = typeof input.pid === "number" && Number.isInteger(input.pid) && input.pid > 0
|
|
478
|
+
? input.pid
|
|
479
|
+
: undefined;
|
|
480
|
+
session.currentRunId = input.runId;
|
|
481
|
+
if (pid === undefined)
|
|
482
|
+
delete session.currentRunPid;
|
|
483
|
+
else
|
|
484
|
+
session.currentRunPid = pid;
|
|
485
|
+
session.heartbeatAt = ts;
|
|
486
|
+
// A fresh claim REPLACES metadata.run rather than merging into it: one run
|
|
487
|
+
// object per record, so a live claim can never sit next to the previous run's
|
|
488
|
+
// outcome. Epoch ms here, matching every other metadata.run timestamp.
|
|
489
|
+
session.metadata = {
|
|
490
|
+
...session.metadata,
|
|
491
|
+
run: { runId: input.runId, pid: pid ?? null, startedAt: epochMs(ts) },
|
|
492
|
+
};
|
|
493
|
+
session.updatedAt = ts;
|
|
494
|
+
index.sessions[position] = session;
|
|
495
|
+
await writeSessionState(projectDir, index);
|
|
496
|
+
return session;
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* Claims a session for a headless run: persists the run id, the child's pid and
|
|
500
|
+
* the first heartbeat, all of which survive the server process that made them.
|
|
501
|
+
*
|
|
502
|
+
* The claim is what makes a run recoverable. In-memory liveness (the runner's
|
|
503
|
+
* `liveRuns` map) dies with the server, so without a persisted claim a run
|
|
504
|
+
* interrupted by a restart would leave the session reading `running` forever
|
|
505
|
+
* with nothing left that could ever settle it.
|
|
506
|
+
*/
|
|
507
|
+
export async function beginSessionRun(projectDir, sessionId, input) {
|
|
508
|
+
await ensureDir(join(projectDir, "sessions"));
|
|
509
|
+
return withLock(sessionStoreLockPath(projectDir), () => beginSessionRunUnlocked(projectDir, sessionId, input));
|
|
510
|
+
}
|
|
511
|
+
async function settleSessionRunUnlocked(projectDir, sessionId, input) {
|
|
512
|
+
const index = await readSessionIndex(projectDir);
|
|
513
|
+
const position = findSessionIndex(index, sessionId);
|
|
514
|
+
const session = index.sessions[position];
|
|
515
|
+
const claim = sessionRunClaim(session);
|
|
516
|
+
// Either there is nothing to settle, or a newer run already owns the record.
|
|
517
|
+
// Both mean the caller is settling a run that is no longer current, so the
|
|
518
|
+
// record is left byte-identical — no write, no churn, no clobbered outcome.
|
|
519
|
+
if (claim === undefined)
|
|
520
|
+
return session;
|
|
521
|
+
if (input.runId !== undefined && input.runId !== claim)
|
|
522
|
+
return session;
|
|
523
|
+
const ts = nowISO(input.now);
|
|
524
|
+
const run = {
|
|
525
|
+
...existingRunMetadata(session),
|
|
526
|
+
...input.run,
|
|
527
|
+
outcome: input.outcome,
|
|
528
|
+
endedAt: input.endedAt ?? epochMs(ts),
|
|
529
|
+
...(input.error !== undefined && { error: input.error }),
|
|
530
|
+
};
|
|
531
|
+
// The claim and its proof of life go together: a heartbeat left behind on a
|
|
532
|
+
// settled record would be evidence for a process that is no longer running.
|
|
533
|
+
delete session.currentRunId;
|
|
534
|
+
delete session.currentRunPid;
|
|
535
|
+
delete session.heartbeatAt;
|
|
536
|
+
session.metadata = { ...session.metadata, ...input.metadata, run };
|
|
537
|
+
session.updatedAt = ts;
|
|
538
|
+
index.sessions[position] = session;
|
|
539
|
+
await writeSessionState(projectDir, index);
|
|
540
|
+
return session;
|
|
541
|
+
}
|
|
542
|
+
/**
|
|
543
|
+
* Releases a session's run claim, records how the run ended on `metadata.run`,
|
|
544
|
+
* and applies whatever the settle repaired — in ONE lock acquisition.
|
|
545
|
+
*
|
|
546
|
+
* Read-modify-write has to be atomic: `metadata.run` is replaced wholesale by
|
|
547
|
+
* every writer, so settling through the generic `updateSession` would race the
|
|
548
|
+
* route's own write-back and could drop the run's pid/startedAt.
|
|
549
|
+
*
|
|
550
|
+
* Everything a settle concludes therefore goes in HERE rather than in a
|
|
551
|
+
* follow-up `updateSession`. The claim is the only thing serializing a run
|
|
552
|
+
* against the next one, and releasing it is the LAST thing this write does — so
|
|
553
|
+
* a conclusion left to a second write is both observable in the gap (the record
|
|
554
|
+
* reads settled while still carrying the state the run just disproved) and
|
|
555
|
+
* unguarded outside it: the `input.runId` check above holds only for the
|
|
556
|
+
* duration of this lock, and a newer run can claim the record the moment it is
|
|
557
|
+
* released.
|
|
558
|
+
*/
|
|
559
|
+
export async function settleSessionRun(projectDir, sessionId, input) {
|
|
560
|
+
await ensureDir(join(projectDir, "sessions"));
|
|
561
|
+
return withLock(sessionStoreLockPath(projectDir), () => settleSessionRunUnlocked(projectDir, sessionId, input));
|
|
562
|
+
}
|
|
563
|
+
async function deleteSessionUnlocked(projectDir, sessionId) {
|
|
564
|
+
const normalizedId = normalizeIdentifier(sessionId);
|
|
565
|
+
const index = await readSessionIndex(projectDir);
|
|
566
|
+
const session = index.sessions.find((s) => s.normalizedId === normalizedId);
|
|
567
|
+
if (!session) {
|
|
568
|
+
throw itemNotFound("session", sessionId);
|
|
569
|
+
}
|
|
570
|
+
index.sessions = index.sessions.filter((s) => s.normalizedId !== normalizedId);
|
|
571
|
+
await writeSessionState(projectDir, index);
|
|
572
|
+
}
|
|
573
|
+
export async function deleteSession(projectDir, sessionId) {
|
|
574
|
+
await ensureDir(join(projectDir, "sessions"));
|
|
575
|
+
await withLock(sessionStoreLockPath(projectDir), () => deleteSessionUnlocked(projectDir, sessionId));
|
|
576
|
+
}
|
|
577
|
+
//# sourceMappingURL=session-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/utils/session-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,17 @@ export declare const TASK_STATUSES: readonly ["backlog", "in_progress", "done",
|
|
|
14
14
|
export type TaskStatus = (typeof TASK_STATUSES)[number];
|
|
15
15
|
export declare const TASK_PRIORITIES: readonly ["critical", "high", "medium", "low"];
|
|
16
16
|
export type TaskPriority = (typeof TASK_PRIORITIES)[number];
|
|
17
|
+
export declare const SESSION_STATUSES: readonly ["active", "idle", "completed", "failed", "disconnected"];
|
|
18
|
+
export type SessionStatus = (typeof SESSION_STATUSES)[number];
|
|
19
|
+
export declare const SESSION_RUNTIME_TYPES: readonly ["opencode", "claude-code"];
|
|
20
|
+
export type SessionRuntimeType = (typeof SESSION_RUNTIME_TYPES)[number];
|
|
21
|
+
/**
|
|
22
|
+
* DAG node kinds a session may be linked to. Linkage always keys on the
|
|
23
|
+
* task/plan normalized id — never on a diagram node id (T001…), which is
|
|
24
|
+
* regenerated by `arcs diagram sort-metadata`.
|
|
25
|
+
*/
|
|
26
|
+
export declare const SESSION_LINKED_NODE_TYPES: readonly ["task", "plan"];
|
|
27
|
+
export type SessionLinkedNodeType = (typeof SESSION_LINKED_NODE_TYPES)[number];
|
|
17
28
|
export interface FileRef {
|
|
18
29
|
path: string;
|
|
19
30
|
anchor?: string;
|
|
@@ -30,10 +41,30 @@ export declare function validatePlanStatus(status: string): asserts status is Pl
|
|
|
30
41
|
export declare function validateKnowledgeKind(kind: string): asserts kind is KnowledgeKind;
|
|
31
42
|
export declare function validateTaskStatus(status: string): asserts status is TaskStatus;
|
|
32
43
|
export declare function validateTaskPriority(priority: string): asserts priority is TaskPriority;
|
|
44
|
+
export declare function validateSessionStatus(status: string): asserts status is SessionStatus;
|
|
45
|
+
export declare function validateSessionRuntimeType(runtimeType: string): asserts runtimeType is SessionRuntimeType;
|
|
46
|
+
export declare function validateSessionLinkedNodeType(nodeType: string): asserts nodeType is SessionLinkedNodeType;
|
|
33
47
|
/** A valid keyword is a non-empty, lowercase, alpha-numeric-or-dash string. */
|
|
34
48
|
export declare function sanitizeKeywords(raw: string[]): string[];
|
|
35
49
|
export declare function fileExists(path: string): Promise<boolean>;
|
|
36
50
|
export declare function ensureDir(dir: string): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Durably replace a text file: fsync the staged file, rename atomically, then
|
|
53
|
+
* fsync the parent directory where supported.
|
|
54
|
+
*/
|
|
55
|
+
export declare function writeTextAtomic(filePath: string, content: string): Promise<void>;
|
|
56
|
+
export interface FileMutation {
|
|
57
|
+
path: string;
|
|
58
|
+
/** null removes the file. */
|
|
59
|
+
content: string | null;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Best-effort multi-file transaction. Every file replacement is individually
|
|
63
|
+
* atomic/durable; if a later mutation fails, prior files are restored from
|
|
64
|
+
* their snapshots before the error is rethrown. Callers must hold the
|
|
65
|
+
* collection-level advisory lock for the whole operation.
|
|
66
|
+
*/
|
|
67
|
+
export declare function writeFilesTransaction(mutations: FileMutation[]): Promise<void>;
|
|
37
68
|
export declare function writeJson(filePath: string, data: unknown): Promise<void>;
|
|
38
69
|
export declare function nowISO(override?: string): string;
|
|
39
70
|
/**
|