@rryando/arcs 5.2.0 → 5.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/README.md +29 -16
  2. package/dist/cli/commands/bundle.js +39 -0
  3. package/dist/cli/commands/bundle.js.map +1 -1
  4. package/dist/cli/commands/web.js +2 -2
  5. package/dist/cli/commands/web.js.map +1 -1
  6. package/dist/cli/config.d.ts +18 -0
  7. package/dist/cli/config.d.ts.map +1 -1
  8. package/dist/cli/config.js +46 -0
  9. package/dist/cli/config.js.map +1 -1
  10. package/dist/cli/setup.d.ts.map +1 -1
  11. package/dist/cli/setup.js +218 -35
  12. package/dist/cli/setup.js.map +1 -1
  13. package/dist/utils/json-schemas.d.ts +9 -9
  14. package/dist/utils/json-schemas.d.ts.map +1 -1
  15. package/dist/utils/json-schemas.js +1 -1
  16. package/dist/utils/json-schemas.js.map +1 -1
  17. package/dist/utils/run-transcript.d.ts +138 -0
  18. package/dist/utils/run-transcript.d.ts.map +1 -0
  19. package/dist/utils/run-transcript.js +146 -0
  20. package/dist/utils/run-transcript.js.map +1 -0
  21. package/dist/utils/storage-utils.d.ts +1 -1
  22. package/dist/utils/storage-utils.d.ts.map +1 -1
  23. package/dist/utils/storage-utils.js +1 -1
  24. package/dist/utils/storage-utils.js.map +1 -1
  25. package/dist/web-client/assets/{GraphCanvas-DvTmx2os.js → GraphCanvas-BgWF1rB_.js} +1 -1
  26. package/dist/web-client/assets/{MarkdownEditor-B8j_5lK7.js → MarkdownEditor-5buYPQ1d.js} +1 -1
  27. package/dist/web-client/assets/{abnfDiagram-VRR7QNED-DZ5c8NM5.js → abnfDiagram-VRR7QNED-AjQ08-zY.js} +1 -1
  28. package/dist/web-client/assets/architecture-TIHT7OUA-a3lTAuFS.js +1 -0
  29. package/dist/web-client/assets/{architectureDiagram-ZJ3FMSHR-DeNroB33.js → architectureDiagram-ZJ3FMSHR-CtW2pYEp.js} +1 -1
  30. package/dist/web-client/assets/{blockDiagram-677ZJIJ3-C92i1GHh.js → blockDiagram-677ZJIJ3-DE6HRcpA.js} +1 -1
  31. package/dist/web-client/assets/{c4Diagram-LMCZKHZV-BniYzyYJ.js → c4Diagram-LMCZKHZV-Rn6iQdUl.js} +1 -1
  32. package/dist/web-client/assets/channel-Rxk7gzWl.js +1 -0
  33. package/dist/web-client/assets/{chunk-32BRIVSS-DXA4fMwe.js → chunk-32BRIVSS-C4-ay_Qd.js} +1 -1
  34. package/dist/web-client/assets/{chunk-52WLFC77-DxLpDT5g.js → chunk-52WLFC77-Bib0DU0H.js} +1 -1
  35. package/dist/web-client/assets/{chunk-C7G6YPKG-DC22BvA6.js → chunk-C7G6YPKG-BLphnESE.js} +1 -1
  36. package/dist/web-client/assets/{chunk-EX3LRPZG-CP5bMsNz.js → chunk-EX3LRPZG-CzvkrPNM.js} +1 -1
  37. package/dist/web-client/assets/{chunk-FWX5IMBZ-CRhTkdyH.js → chunk-FWX5IMBZ-BFTR_OLz.js} +2 -2
  38. package/dist/web-client/assets/{chunk-HOUHSVGY-BL8xdKlN.js → chunk-HOUHSVGY-CZS3ExUR.js} +1 -1
  39. package/dist/web-client/assets/{chunk-ICXQ74PX-B7Ur00R9.js → chunk-ICXQ74PX-iWFpNZgv.js} +1 -1
  40. package/dist/web-client/assets/{chunk-MOJQB5TN-D9EnTuIj.js → chunk-MOJQB5TN-opEQCwVq.js} +1 -1
  41. package/dist/web-client/assets/{chunk-OGEWGWER-Dr-xsHrU.js → chunk-OGEWGWER-NCfmjyhi.js} +1 -1
  42. package/dist/web-client/assets/{chunk-PUDLZKDR-BIrspPOB.js → chunk-PUDLZKDR-D3_A--Z2.js} +1 -1
  43. package/dist/web-client/assets/{chunk-Q4XR5HBZ-Dfip_4XA.js → chunk-Q4XR5HBZ-D6s-qZLi.js} +1 -1
  44. package/dist/web-client/assets/{chunk-V7JOEXUC-CWqwzV_g.js → chunk-V7JOEXUC-DTqLR-bZ.js} +1 -1
  45. package/dist/web-client/assets/{chunk-VAUOI2AC-EosDVEFn.js → chunk-VAUOI2AC-Gsd0Itap.js} +1 -1
  46. package/dist/web-client/assets/{chunk-VR4S4FIN-DnMox7F5.js → chunk-VR4S4FIN-Cdo_MeDQ.js} +1 -1
  47. package/dist/web-client/assets/{chunk-WYO6CB5R-B3xja0Q5.js → chunk-WYO6CB5R-n7FhYrli.js} +1 -1
  48. package/dist/web-client/assets/{chunk-ZGVPDNZ5-BGoIOVsc.js → chunk-ZGVPDNZ5-DU1Jcue0.js} +1 -1
  49. package/dist/web-client/assets/classDiagram-OUVF2IWQ-BG5uYDvC.js +1 -0
  50. package/dist/web-client/assets/classDiagram-v2-EOCWNBFH-BG5uYDvC.js +1 -0
  51. package/dist/web-client/assets/{cynefin-VYW2F7L2-BlBnSViH.js → cynefin-VYW2F7L2-D-gD9LCO.js} +1 -1
  52. package/dist/web-client/assets/{cynefinDiagram-TSTJHNR4-jRcAddSh.js → cynefinDiagram-TSTJHNR4-BFGkcrNl.js} +1 -1
  53. package/dist/web-client/assets/{dagre-VKFMJZFB-D4elj7jV.js → dagre-VKFMJZFB-BUaC6fks.js} +1 -1
  54. package/dist/web-client/assets/{diagram-FQU43EPY-D7OKzbLh.js → diagram-FQU43EPY-Ckgu02XC.js} +1 -1
  55. package/dist/web-client/assets/{diagram-G47NLZAW-DBF9p-RV.js → diagram-G47NLZAW-BickHhmE.js} +1 -1
  56. package/dist/web-client/assets/{diagram-NH7WQ7WH-CpE02PRM.js → diagram-NH7WQ7WH-CoqgJpcU.js} +1 -1
  57. package/dist/web-client/assets/{diagram-OA4YK3LP-BdJ1lOcZ.js → diagram-OA4YK3LP-CTSZWqCe.js} +1 -1
  58. package/dist/web-client/assets/{diagram-WEI45ONY-BpPxpOcu.js → diagram-WEI45ONY-D7xd1naU.js} +1 -1
  59. package/dist/web-client/assets/{ebnfDiagram-CCIWWBDH-DLKdgImF.js → ebnfDiagram-CCIWWBDH-FESKYpKQ.js} +1 -1
  60. package/dist/web-client/assets/{erDiagram-Q63AITRT-c0bbf0vk.js → erDiagram-Q63AITRT-C-879ftU.js} +1 -1
  61. package/dist/web-client/assets/eventmodeling-45OFAUF4-C3kRZCei.js +1 -0
  62. package/dist/web-client/assets/flowDiagram-23GEKE2U-QKWFycdH.js +1 -0
  63. package/dist/web-client/assets/{ganttDiagram-NO4QXBWP-Ynj8Qkax.js → ganttDiagram-NO4QXBWP-mIX5nPpv.js} +1 -1
  64. package/dist/web-client/assets/{gitGraph-TEB2WS4Q-j-MdxZrn.js → gitGraph-TEB2WS4Q-DlEDJ1IK.js} +1 -1
  65. package/dist/web-client/assets/{gitGraphDiagram-IHSO6WYX-SaPe2Npn.js → gitGraphDiagram-IHSO6WYX-D2fXD4AO.js} +1 -1
  66. package/dist/web-client/assets/index-BsYR-C8u.js +61 -0
  67. package/dist/web-client/assets/index-Cc5DCTOr.css +2 -0
  68. package/dist/web-client/assets/{info-DKCQHKI2-DzsnPugh.js → info-DKCQHKI2-jinbCROt.js} +1 -1
  69. package/dist/web-client/assets/{infoDiagram-FWYZ7A6U-e6BJvSRj.js → infoDiagram-FWYZ7A6U-CM-A4TL8.js} +1 -1
  70. package/dist/web-client/assets/{ishikawaDiagram-FXEZZL3T-DI1KDN2v.js → ishikawaDiagram-FXEZZL3T-BdFpHwp4.js} +1 -1
  71. package/dist/web-client/assets/{journeyDiagram-5HDEW3XC-BQbFOIm6.js → journeyDiagram-5HDEW3XC-BwDWz25z.js} +1 -1
  72. package/dist/web-client/assets/{kanban-definition-HUTT4EX6-D5DV7Dh0.js → kanban-definition-HUTT4EX6-_2QXjSvx.js} +1 -1
  73. package/dist/web-client/assets/{line-D_qHyqs1.js → line-HCziev87.js} +1 -1
  74. package/dist/web-client/assets/{mermaid-parser.core-VzGX5B89.js → mermaid-parser.core-C4139mkz.js} +3 -3
  75. package/dist/web-client/assets/{mermaid.core-BqWcehVs.js → mermaid.core-ocHwkZiF.js} +3 -3
  76. package/dist/web-client/assets/{mindmap-definition-LN4V7U3C-CcZZrFcy.js → mindmap-definition-LN4V7U3C-DHyCmflp.js} +1 -1
  77. package/dist/web-client/assets/{packet-7NZHBO7P-DWMuocpD.js → packet-7NZHBO7P-Bk0w_irl.js} +1 -1
  78. package/dist/web-client/assets/{pegDiagram-2B236MQR-CQfp4S-y.js → pegDiagram-2B236MQR-D_GrmL93.js} +1 -1
  79. package/dist/web-client/assets/{pie-RZYD4A2V-BlI6y28n.js → pie-RZYD4A2V-B6VIAbyj.js} +1 -1
  80. package/dist/web-client/assets/{pieDiagram-ENE6RG2P-DEsRhIVS.js → pieDiagram-ENE6RG2P-CiR2Y8y2.js} +1 -1
  81. package/dist/web-client/assets/{quadrantDiagram-ABIIQ3AL-BZCSbtlm.js → quadrantDiagram-ABIIQ3AL-CLlicKmV.js} +1 -1
  82. package/dist/web-client/assets/{radar-I7S5WNFK-DlwfjSpa.js → radar-I7S5WNFK-B53XVRSZ.js} +1 -1
  83. package/dist/web-client/assets/{railroad-3IZDKUUU-Be-bZpf0.js → railroad-3IZDKUUU-Dn8TN2M-.js} +1 -1
  84. package/dist/web-client/assets/railroad-abnf-AHOZXSZD-UrOKy6yx.js +1 -0
  85. package/dist/web-client/assets/railroad-ebnf-EBAXGLYW-Bx73sfMZ.js +1 -0
  86. package/dist/web-client/assets/railroad-peg-LSFZ7HO6-C4QEje-y.js +1 -0
  87. package/dist/web-client/assets/{railroadDiagram-RFXS5EU6-ClVubHv1.js → railroadDiagram-RFXS5EU6-C6kZwOio.js} +1 -1
  88. package/dist/web-client/assets/{requirementDiagram-TGXJPOKE-swYyFYJk.js → requirementDiagram-TGXJPOKE-D2b1MeP8.js} +1 -1
  89. package/dist/web-client/assets/{sankeyDiagram-HTMAVEWB-LAu1XR2n.js → sankeyDiagram-HTMAVEWB-pS_Ufq1E.js} +1 -1
  90. package/dist/web-client/assets/{sequenceDiagram-DBY2YBRQ-XvIU8hX9.js → sequenceDiagram-DBY2YBRQ-BrsKXNzu.js} +1 -1
  91. package/dist/web-client/assets/{stateDiagram-2N3HPSRC-C3nbJ1dX.js → stateDiagram-2N3HPSRC-BuQKu3i0.js} +1 -1
  92. package/dist/web-client/assets/stateDiagram-v2-6OUMAXLB-BhqgaxDu.js +1 -0
  93. package/dist/web-client/assets/{swimlanes-5IMT3BWC-BF5fFeNe.js → swimlanes-5IMT3BWC-CzoImfTA.js} +1 -1
  94. package/dist/web-client/assets/swimlanesDiagram-G3AALYLV-CHOEI9hI.js +8 -0
  95. package/dist/web-client/assets/{timeline-definition-FHXFAJF6-CjK82kFp.js → timeline-definition-FHXFAJF6-DvezW7Fr.js} +1 -1
  96. package/dist/web-client/assets/{treeView-QDETBFTQ-DBRGCYnY.js → treeView-QDETBFTQ-xu58R4kS.js} +1 -1
  97. package/dist/web-client/assets/{treemap-6X3UGDF4-BIexMw3j.js → treemap-6X3UGDF4-DMYBAOW1.js} +1 -1
  98. package/dist/web-client/assets/{vennDiagram-L72KCM5P-DOjvh0XG.js → vennDiagram-L72KCM5P-l1CbC7Ig.js} +1 -1
  99. package/dist/web-client/assets/{wardley-OPB4EBWU-Dxw6mW95.js → wardley-OPB4EBWU-G3zmnnM0.js} +1 -1
  100. package/dist/web-client/assets/{wardleyDiagram-EHGQE667-D1A7JTB_.js → wardleyDiagram-EHGQE667-Dl2I79Vx.js} +1 -1
  101. package/dist/web-client/assets/{xychartDiagram-FW5EYKEG-CxvobQJD.js → xychartDiagram-FW5EYKEG-BWfge21N.js} +1 -1
  102. package/dist/web-client/index.html +2 -2
  103. package/dist/web-server/app.d.ts.map +1 -1
  104. package/dist/web-server/app.js +11 -7
  105. package/dist/web-server/app.js.map +1 -1
  106. package/dist/web-server/ask-prompt.d.ts +70 -0
  107. package/dist/web-server/ask-prompt.d.ts.map +1 -0
  108. package/dist/web-server/ask-prompt.js +238 -0
  109. package/dist/web-server/ask-prompt.js.map +1 -0
  110. package/dist/web-server/index.d.ts.map +1 -1
  111. package/dist/web-server/index.js +56 -3
  112. package/dist/web-server/index.js.map +1 -1
  113. package/dist/web-server/respond.d.ts.map +1 -1
  114. package/dist/web-server/respond.js +2 -1
  115. package/dist/web-server/respond.js.map +1 -1
  116. package/dist/web-server/routes/ask.d.ts +29 -0
  117. package/dist/web-server/routes/ask.d.ts.map +1 -0
  118. package/dist/web-server/routes/ask.js +698 -0
  119. package/dist/web-server/routes/ask.js.map +1 -0
  120. package/dist/web-server/routes/changes.d.ts +35 -0
  121. package/dist/web-server/routes/changes.d.ts.map +1 -0
  122. package/dist/web-server/routes/changes.js +93 -0
  123. package/dist/web-server/routes/changes.js.map +1 -0
  124. package/dist/web-server/routes/runners.d.ts +15 -0
  125. package/dist/web-server/routes/runners.d.ts.map +1 -0
  126. package/dist/web-server/routes/runners.js +66 -0
  127. package/dist/web-server/routes/runners.js.map +1 -0
  128. package/dist/web-server/routes/workspace.d.ts +2 -2
  129. package/dist/web-server/routes/workspace.js +4 -4
  130. package/dist/web-server/run-diff.d.ts +188 -0
  131. package/dist/web-server/run-diff.d.ts.map +1 -0
  132. package/dist/web-server/run-diff.js +739 -0
  133. package/dist/web-server/run-diff.js.map +1 -0
  134. package/dist/web-server/run-driver.d.ts +102 -2
  135. package/dist/web-server/run-driver.d.ts.map +1 -1
  136. package/dist/web-server/run-driver.js +495 -1
  137. package/dist/web-server/run-driver.js.map +1 -1
  138. package/dist/web-server/run-event-log.d.ts +13 -6
  139. package/dist/web-server/run-event-log.d.ts.map +1 -1
  140. package/dist/web-server/run-event-log.js +70 -25
  141. package/dist/web-server/run-event-log.js.map +1 -1
  142. package/dist/web-server/run-store.d.ts +201 -0
  143. package/dist/web-server/run-store.d.ts.map +1 -0
  144. package/dist/web-server/run-store.js +304 -0
  145. package/dist/web-server/run-store.js.map +1 -0
  146. package/dist/web-server/watcher.d.ts.map +1 -1
  147. package/dist/web-server/watcher.js +4 -0
  148. package/dist/web-server/watcher.js.map +1 -1
  149. package/opencode/arcs/manifest.json +8 -8
  150. package/package.json +1 -1
  151. package/scripts/deploy-claudecode-bundle.mjs +1 -1
  152. package/scripts/deploy-opencode-bundle.mjs +1 -1
  153. package/scripts/deploy-pi-bundle.mjs +468 -0
  154. package/scripts/lint-bundle.mjs +1 -1
  155. package/dist/shared/session-vocabulary.d.ts +0 -88
  156. package/dist/shared/session-vocabulary.d.ts.map +0 -1
  157. package/dist/shared/session-vocabulary.js +0 -114
  158. package/dist/shared/session-vocabulary.js.map +0 -1
  159. package/dist/utils/claude-transcript.d.ts +0 -206
  160. package/dist/utils/claude-transcript.d.ts.map +0 -1
  161. package/dist/utils/claude-transcript.js +0 -384
  162. package/dist/utils/claude-transcript.js.map +0 -1
  163. package/dist/utils/session-store.d.ts +0 -313
  164. package/dist/utils/session-store.d.ts.map +0 -1
  165. package/dist/utils/session-store.js +0 -513
  166. package/dist/utils/session-store.js.map +0 -1
  167. package/dist/web-client/assets/architecture-TIHT7OUA-B6H7ClR9.js +0 -1
  168. package/dist/web-client/assets/channel-CinHQ6_V.js +0 -1
  169. package/dist/web-client/assets/classDiagram-OUVF2IWQ-D_fljwRI.js +0 -1
  170. package/dist/web-client/assets/classDiagram-v2-EOCWNBFH-D_fljwRI.js +0 -1
  171. package/dist/web-client/assets/eventmodeling-45OFAUF4-DT6B-Tvn.js +0 -1
  172. package/dist/web-client/assets/flowDiagram-23GEKE2U-fbZofWHf.js +0 -1
  173. package/dist/web-client/assets/index-C1WQ25Ow.js +0 -60
  174. package/dist/web-client/assets/index-CHdOvANQ.css +0 -2
  175. package/dist/web-client/assets/railroad-abnf-AHOZXSZD-C5-D4PxJ.js +0 -1
  176. package/dist/web-client/assets/railroad-ebnf-EBAXGLYW-pJcCXE74.js +0 -1
  177. package/dist/web-client/assets/railroad-peg-LSFZ7HO6-B33ruY8f.js +0 -1
  178. package/dist/web-client/assets/stateDiagram-v2-6OUMAXLB-Da0ex-S_.js +0 -1
  179. package/dist/web-client/assets/swimlanesDiagram-G3AALYLV-cc5MstHU.js +0 -8
  180. package/dist/web-server/permission-policy.d.ts +0 -46
  181. package/dist/web-server/permission-policy.d.ts.map +0 -1
  182. package/dist/web-server/permission-policy.js +0 -96
  183. package/dist/web-server/permission-policy.js.map +0 -1
  184. package/dist/web-server/prompt-assembly.d.ts +0 -454
  185. package/dist/web-server/prompt-assembly.d.ts.map +0 -1
  186. package/dist/web-server/prompt-assembly.js +0 -1121
  187. package/dist/web-server/prompt-assembly.js.map +0 -1
  188. package/dist/web-server/routes/sessions.d.ts +0 -19
  189. package/dist/web-server/routes/sessions.d.ts.map +0 -1
  190. package/dist/web-server/routes/sessions.js +0 -1296
  191. package/dist/web-server/routes/sessions.js.map +0 -1
  192. package/dist/web-server/session-reconciler.d.ts +0 -162
  193. package/dist/web-server/session-reconciler.d.ts.map +0 -1
  194. package/dist/web-server/session-reconciler.js +0 -363
  195. package/dist/web-server/session-reconciler.js.map +0 -1
@@ -0,0 +1,304 @@
1
+ /**
2
+ * Per-run claims — the durable spine of the stateless Ask-AI turn surface.
3
+ *
4
+ * Replaces the sessions-entity run claims (session-store's `currentRunId` +
5
+ * `metadata.run`) with a store keyed by RUN, not by session: per-project
6
+ * `runs/index.json` records every run a project spawned, and a record with no
7
+ * `outcome` IS the live claim. There is no thread record anywhere — a run is
8
+ * the only unit of persistence, and everything a client needs to continue a
9
+ * conversation (the end frame's `runtimeSessionId`, harvested by the fold)
10
+ * reaches it out of band.
11
+ *
12
+ * Concurrency: ONE live run per project. `beginRun` refuses (DagError
13
+ * `RUN_IN_PROGRESS`, mapped to HTTP 409 by respond.ts) while an unsettled
14
+ * claim holds the index — the same single overlap signal the sessions route
15
+ * used, renamed.
16
+ *
17
+ * Liveness survives a restart the same way it always did: the claim persists
18
+ * the child's pid, and `settleOrphanedRuns` (the startup sweep) probes it.
19
+ * Deliberately narrowed from the old reconciler: a dead pid alone no longer
20
+ * settles — the run's own deadline must also have passed, so a claim written
21
+ * by a previous server process whose child outlived the restart is left alone,
22
+ * and a claim whose child died mid-run settles `interrupted` exactly once.
23
+ */
24
+ import { join, resolve } from "node:path";
25
+ import { readRootMeta } from "../utils/dag.js";
26
+ import { DagError } from "../utils/errors.js";
27
+ import { withLock } from "../utils/file-lock.js";
28
+ import { readJsonSafe } from "../utils/json.js";
29
+ import { getDataDir } from "../utils/paths.js";
30
+ import { ensureDir, writeJson } from "../utils/storage-utils.js";
31
+ import { pruneRunEventLogs } from "./run-event-log.js";
32
+ // ---------------------------------------------------------------------------
33
+ // Index IO
34
+ // ---------------------------------------------------------------------------
35
+ /** Index path — the pattern session-store used for `sessions/index.json`. */
36
+ export function runsIndexPath(projectDir) {
37
+ return join(projectDir, "runs", "index.json");
38
+ }
39
+ function runStoreLockPath(projectDir) {
40
+ return join(projectDir, "runs", ".store");
41
+ }
42
+ /** A decoded record that is usable as a run — anything else is dropped on
43
+ * read, exactly as session-store dropped records with unknown runtime types. */
44
+ function isRunRecord(value) {
45
+ if (typeof value !== "object" || value === null || Array.isArray(value))
46
+ return false;
47
+ const record = value;
48
+ if (typeof record.runId !== "string" || record.runId === "")
49
+ return false;
50
+ const startedAt = record.startedAt;
51
+ if (typeof startedAt !== "number" || !Number.isFinite(startedAt))
52
+ return false;
53
+ const runtimeType = record.runtimeType;
54
+ if (typeof runtimeType !== "string" || runtimeType === "")
55
+ return false;
56
+ return true;
57
+ }
58
+ async function readRunsIndex(projectDir) {
59
+ const index = await readJsonSafe(runsIndexPath(projectDir));
60
+ if (!index || !Array.isArray(index.runs))
61
+ return [];
62
+ return index.runs.filter(isRunRecord);
63
+ }
64
+ async function writeRunsIndex(projectDir, runs) {
65
+ await ensureDir(join(projectDir, "runs"));
66
+ await writeJson(runsIndexPath(projectDir), { runs });
67
+ }
68
+ /**
69
+ * Claims the project's one live-run slot for `runId`.
70
+ *
71
+ * Refuses with `RUN_IN_PROGRESS` (409 on the wire) while ANY unsettled claim
72
+ * holds the index — the atomic single-live-run gate, checked under the same
73
+ * lock the settle releases it under, so two overlapping POSTs cannot both win.
74
+ * The claim lands BEFORE the child exists: from here on, a server that dies
75
+ * mid-run leaves a claim behind rather than an invisible orphan, and the
76
+ * startup sweep is what settles it.
77
+ */
78
+ export async function beginRun(projectDir, input) {
79
+ await ensureDir(join(projectDir, "runs"));
80
+ return withLock(runStoreLockPath(projectDir), async () => {
81
+ const runs = await readRunsIndex(projectDir);
82
+ const live = runs.find((run) => run.outcome === undefined);
83
+ if (live !== undefined) {
84
+ throw new DagError("RUN_IN_PROGRESS", `a run for this project is already in progress (run ${live.runId})`);
85
+ }
86
+ const pid = typeof input.pid === "number" && Number.isInteger(input.pid) && input.pid > 0
87
+ ? input.pid
88
+ : undefined;
89
+ const claim = {
90
+ runId: input.runId,
91
+ startedAt: Date.now(),
92
+ deadlineAt: input.deadlineAt,
93
+ runtimeType: input.runtimeType,
94
+ runner: input.runner,
95
+ logSegment: input.logSegment,
96
+ ...(pid !== undefined && { pid }),
97
+ ...(input.continueSessionId !== undefined &&
98
+ input.continueSessionId !== "" && {
99
+ continueSessionId: input.continueSessionId,
100
+ }),
101
+ };
102
+ runs.push(claim);
103
+ await writeRunsIndex(projectDir, runs);
104
+ return claim;
105
+ });
106
+ }
107
+ /** Records the child's pid on the claim AFTER the spawn produced one. No-op
108
+ * when the claim is already gone (the run settled in the gap) — a pid write
109
+ * must never resurrect a settled run. */
110
+ export async function updateRunPid(projectDir, input) {
111
+ await ensureDir(join(projectDir, "runs"));
112
+ await withLock(runStoreLockPath(projectDir), async () => {
113
+ const runs = await readRunsIndex(projectDir);
114
+ const claim = runs.find((run) => run.runId === input.runId);
115
+ if (claim === undefined || claim.outcome !== undefined)
116
+ return;
117
+ claim.pid = input.pid;
118
+ await writeRunsIndex(projectDir, runs);
119
+ });
120
+ }
121
+ /**
122
+ * Stamps the outcome onto the run's claim in ONE lock acquisition — the same
123
+ * write that releases the claim, so "claim gone" and "outcome readable" can
124
+ * never disagree (the stream's end frame depends on that).
125
+ *
126
+ * Keyed on the run id: a settle whose run has already settled (a cancel that
127
+ * won the race, or a newer claim) is a byte-identical no-op.
128
+ */
129
+ export async function settleRun(projectDir, input) {
130
+ await ensureDir(join(projectDir, "runs"));
131
+ return withLock(runStoreLockPath(projectDir), async () => {
132
+ const runs = await readRunsIndex(projectDir);
133
+ const claim = runs.find((run) => run.runId === input.runId);
134
+ if (claim === undefined || claim.outcome !== undefined)
135
+ return claim;
136
+ claim.outcome = input.outcome;
137
+ claim.endedAt = input.endedAt ?? Date.now();
138
+ if (input.error !== undefined)
139
+ claim.error = input.error;
140
+ if (input.replyChars !== undefined)
141
+ claim.replyChars = input.replyChars;
142
+ if (input.runtimeSessionId !== undefined)
143
+ claim.runtimeSessionId = input.runtimeSessionId;
144
+ if (input.errorCode !== undefined)
145
+ claim.errorCode = input.errorCode;
146
+ // Only ever written `true` (the runner omits the flag otherwise), so its
147
+ // absence on a settled record means the log is whole.
148
+ if (input.eventLogTruncated === true)
149
+ claim.eventLogTruncated = true;
150
+ await writeRunsIndex(projectDir, runs);
151
+ return claim;
152
+ });
153
+ }
154
+ /** One run record, or `undefined` when the index does not list the run id. */
155
+ export async function getRun(projectDir, runId) {
156
+ const runs = await readRunsIndex(projectDir);
157
+ return runs.find((run) => run.runId === runId);
158
+ }
159
+ // ---------------------------------------------------------------------------
160
+ // Revert state
161
+ // ---------------------------------------------------------------------------
162
+ /**
163
+ * Stamps the run's workspace changes as reverted (POST /revert), once.
164
+ *
165
+ * Refuses with `RUN_ALREADY_REVERTED` (409 on the wire) when the run has
166
+ * already been reverted, `RUN_NOT_FOUND` when the run is not in the index, and
167
+ * `RUN_NOT_SETTLED` while the run is still live — a claim in flight may still
168
+ * be writing, so its changes are not final and must not be reverted.
169
+ * Under the same lock every other mutation uses, so a second revert racing
170
+ * the first can never both win.
171
+ */
172
+ export async function markRunReverted(projectDir, runId) {
173
+ await ensureDir(join(projectDir, "runs"));
174
+ return withLock(runStoreLockPath(projectDir), async () => {
175
+ const runs = await readRunsIndex(projectDir);
176
+ const claim = runs.find((run) => run.runId === runId);
177
+ if (claim === undefined) {
178
+ throw new DagError("RUN_NOT_FOUND", `no run "${runId}" on this project`);
179
+ }
180
+ if (claim.outcome === undefined) {
181
+ throw new DagError("RUN_NOT_SETTLED", `run "${runId}" is still live — only a settled run's changes can be reverted`);
182
+ }
183
+ if (claim.revertedAt !== undefined) {
184
+ throw new DagError("RUN_ALREADY_REVERTED", `the changes of run "${runId}" were already reverted`);
185
+ }
186
+ claim.revertedAt = Date.now();
187
+ await writeRunsIndex(projectDir, runs);
188
+ return claim;
189
+ });
190
+ }
191
+ /** The project's current in-flight run claim, or `undefined`. */
192
+ export async function liveRun(projectDir) {
193
+ const runs = await readRunsIndex(projectDir);
194
+ return runs.find((run) => run.outcome === undefined);
195
+ }
196
+ // ---------------------------------------------------------------------------
197
+ // Liveness
198
+ // ---------------------------------------------------------------------------
199
+ /**
200
+ * Whether a pid is a live process, via signal 0 (no signal delivered).
201
+ *
202
+ * SHORTCUT: pids are reused, so a recycled pid reads alive and keeps an orphan
203
+ * claim standing; upgrade to a start-time check (`/proc/<pid>/stat` field 22 or
204
+ * `ps -o lstart`) when a stuck claim is ever actually observed.
205
+ */
206
+ export function isProcessAlive(pid) {
207
+ if (!Number.isInteger(pid) || pid <= 0)
208
+ return false;
209
+ try {
210
+ process.kill(pid, 0);
211
+ return true;
212
+ }
213
+ catch (err) {
214
+ // EPERM means the process exists but belongs to another user — alive.
215
+ return err?.code === "EPERM";
216
+ }
217
+ }
218
+ function orphanError(pid) {
219
+ return pid === undefined
220
+ ? "run was interrupted: no pid was recorded for it, so nothing could report how it ended"
221
+ : `run was interrupted: its process (pid ${pid}) is gone and never reported an outcome`;
222
+ }
223
+ /**
224
+ * Settles every run claim in a project whose process is gone AND whose
225
+ * deadline has passed, as `interrupted`.
226
+ *
227
+ * A claim only stands while its pid is still alive within its own deadline — a
228
+ * run spawned by a previous server process either outlived the restart (leave
229
+ * it be; it still holds the project's slot) or died with it, and a dead claim
230
+ * that is never cleared is a project stuck on "a run is in progress" forever.
231
+ * The deadline condition is what keeps a claim whose child merely outlived a
232
+ * crash from being settled out from under a live process.
233
+ *
234
+ * A settle here also prunes the project's run event logs, exactly as the
235
+ * route's own write-back does — this is the ONLY settle an interrupted run
236
+ * ever gets, so it is the only place that can bound the logs of a project
237
+ * whose runs never settle normally.
238
+ *
239
+ * Never throws: a project whose index cannot be read is skipped, and a record
240
+ * deleted mid-sweep is simply not settled.
241
+ */
242
+ export async function settleOrphanedRuns(projectDir, options = {}) {
243
+ const alive = options.isAlive ?? isProcessAlive;
244
+ const now = options.now ?? Date.now();
245
+ const runs = await readRunsIndex(projectDir);
246
+ const settled = [];
247
+ for (const claim of runs) {
248
+ if (claim.outcome !== undefined)
249
+ continue;
250
+ if (typeof claim.pid === "number" && alive(claim.pid))
251
+ continue;
252
+ // The pid is dead (or was never recorded) — settle only once the run's own
253
+ // deadline has passed. A non-finite/missing deadline is treated as passed:
254
+ // every claim this store writes carries one, so anything else un-wedges.
255
+ const deadlineAt = claim.deadlineAt;
256
+ if (typeof deadlineAt === "number" && Number.isFinite(deadlineAt) && deadlineAt > now) {
257
+ continue;
258
+ }
259
+ const settledClaim = await settleRun(projectDir, {
260
+ runId: claim.runId,
261
+ outcome: "interrupted",
262
+ error: orphanError(claim.pid),
263
+ endedAt: now,
264
+ });
265
+ if (settledClaim !== undefined)
266
+ settled.push(settledClaim);
267
+ // Retention belongs to every settle, and this is the one settle path that
268
+ // is not a run's own write-back. A server that dies mid-run never reaches
269
+ // the route's prune, so a project whose runs are always interrupted would
270
+ // otherwise accumulate one RUN_EVENT_LOG_MAX_BYTES log per run forever.
271
+ try {
272
+ await pruneRunEventLogs(projectDir, claim.logSegment, RUN_LOG_RETENTION_KEEP);
273
+ }
274
+ catch {
275
+ // Pruning never throws; this catch is defensive only.
276
+ }
277
+ }
278
+ return settled;
279
+ }
280
+ /** The log-retention budget the sweep prunes to after an interrupted settle.
281
+ * Mirrors run-event-log's default, stated here so the sweep cannot drift. */
282
+ const RUN_LOG_RETENTION_KEEP = 5;
283
+ /**
284
+ * Startup sweep across every registered project, keyed by RUN. Composition-time
285
+ * work (app.ts calls it once, fire-and-forget) — one pass, never a poller.
286
+ *
287
+ * Never throws — a data dir without a readable meta.json settles nothing,
288
+ * rather than taking the server down at boot.
289
+ */
290
+ export async function settleOrphanedRunsOnStartup(dataDir = getDataDir(), options = {}) {
291
+ let slugs;
292
+ try {
293
+ slugs = (await readRootMeta(dataDir)).projects.map((project) => project.id);
294
+ }
295
+ catch {
296
+ return [];
297
+ }
298
+ const settled = [];
299
+ for (const slug of slugs) {
300
+ settled.push(...(await settleOrphanedRuns(resolve(dataDir, "projects", slug), options)));
301
+ }
302
+ return settled;
303
+ }
304
+ //# sourceMappingURL=run-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-store.js","sourceRoot":"","sources":["../../src/web-server/run-store.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/web-server/watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EACA,MAAM,GACN,WAAW,GACX,OAAO,GACP,OAAO,GACP,WAAW,GACX,UAAU,GACV,MAAM,GACN,MAAM,GACN,OAAO,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,KAAK,QAAQ,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;AAY7C,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,IAAI,CAK3D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,MAAM,GACnB;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAAE,GAAG,IAAI,CAkB3D;AAiFD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAO,GACxC,WAAW,GAAG,UAAU,CAoB1B;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAgBlC"}
1
+ {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/web-server/watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EACA,MAAM,GACN,WAAW,GACX,OAAO,GACP,OAAO,GACP,WAAW,GACX,UAAU,GACV,MAAM,GACN,MAAM,GACN,OAAO,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,KAAK,QAAQ,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;AAY7C,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,IAAI,CAK3D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,MAAM,GACnB;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAAE,GAAG,IAAI,CAqB3D;AAiFD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAO,GACxC,WAAW,GAAG,UAAU,CAoB1B;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAgBlC"}
@@ -45,6 +45,10 @@ export function classifyChange(relativePath) {
45
45
  return { slug, area: "proposals" };
46
46
  if (rest === "sessions" || rest.startsWith("sessions/"))
47
47
  return { slug, area: "sessions" };
48
+ // The run store is the ask surface's persistence — the client's invalidation
49
+ // path keys on the `sessions` area, so run claims/settles keep triggering it.
50
+ if (rest === "runs" || rest.startsWith("runs/"))
51
+ return { slug, area: "sessions" };
48
52
  if (rest === "meta.json")
49
53
  return { slug, area: "meta" };
50
54
  if (rest.endsWith(".md"))
@@ -1 +1 @@
1
- {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/web-server/watcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/web-server/watcher.ts"],"names":[],"mappings":"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"}
@@ -13,7 +13,7 @@
13
13
  "status": "active",
14
14
  "kind": "subagent",
15
15
  "tier": "heavy",
16
- "modes": ["opencode", "claudecode"],
16
+ "modes": ["opencode", "claudecode", "pi"],
17
17
  "source": "prompts/software-engineer.txt",
18
18
  "destination": "prompts/software-engineer.txt",
19
19
  "description": "Implementation specialist. Writes code, runs tests, and ships verified work using orchestrator-selected implementation bounded or inspect mode.",
@@ -30,7 +30,7 @@
30
30
  "status": "active",
31
31
  "kind": "subagent",
32
32
  "tier": "heavy",
33
- "modes": ["opencode", "claudecode"],
33
+ "modes": ["opencode", "claudecode", "pi"],
34
34
  "source": "prompts/tech-architect.txt",
35
35
  "destination": "prompts/tech-architect.txt",
36
36
  "description": "Architecture, analysis, and cited research specialist. Produces read-only structural guidance, trade-off evaluation, and DAG-first research synthesis.",
@@ -65,7 +65,7 @@
65
65
  "status": "active",
66
66
  "kind": "subagent",
67
67
  "tier": "standard",
68
- "modes": ["opencode", "claudecode"],
68
+ "modes": ["opencode", "claudecode", "pi"],
69
69
  "source": "prompts/arcs-docs.txt",
70
70
  "destination": "prompts/arcs-docs.txt",
71
71
  "description": "ARCS documentation specialist. Manages plans, knowledge entries, diagrams, and DAG health. Knows ARCS structure intimately.",
@@ -82,7 +82,7 @@
82
82
  "status": "active",
83
83
  "kind": "subagent",
84
84
  "tier": "standard",
85
- "modes": ["opencode", "claudecode"],
85
+ "modes": ["opencode", "claudecode", "pi"],
86
86
  "source": "prompts/code-reviewer.txt",
87
87
  "destination": "prompts/code-reviewer.txt",
88
88
  "description": "Reviews code changes for production readiness and catches correctness, maintainability, and testing issues.",
@@ -135,7 +135,7 @@
135
135
  "status": "active",
136
136
  "kind": "subagent",
137
137
  "tier": "light",
138
- "modes": ["opencode", "claudecode"],
138
+ "modes": ["opencode", "claudecode", "pi"],
139
139
  "source": "prompts/graph-explorer.txt",
140
140
  "destination": "prompts/graph-explorer.txt",
141
141
  "description": "DAG-first codebase and knowledge exploration specialist. Queries arcs search, related, and context first, then codegraph MCP code-intelligence tools, before falling back to raw file-system tools. Replaces vanilla explore for ARCS projects.",
@@ -152,7 +152,7 @@
152
152
  "status": "active",
153
153
  "kind": "primary",
154
154
  "tier": "standard",
155
- "modes": ["opencode", "claudecode"],
155
+ "modes": ["opencode", "claudecode", "pi"],
156
156
  "source": "prompts/arcs-orchestrate.txt",
157
157
  "destination": "prompts/arcs-orchestrate.txt",
158
158
  "description": "The central coordinator for executing plans, managing agent dispatch, and handling DAG workflows.",
@@ -169,7 +169,7 @@
169
169
  "status": "active",
170
170
  "kind": "primary",
171
171
  "tier": "standard",
172
- "modes": ["opencode", "claudecode"],
172
+ "modes": ["opencode", "claudecode", "pi"],
173
173
  "source": "prompts/arcs-orchestrate-caveman.txt",
174
174
  "destination": "prompts/arcs-orchestrate-caveman.txt",
175
175
  "description": "A terse, high-efficiency orchestrator that drives tasks without extra commentary.",
@@ -186,7 +186,7 @@
186
186
  "status": "active",
187
187
  "kind": "primary",
188
188
  "tier": "standard",
189
- "modes": ["opencode", "claudecode"],
189
+ "modes": ["opencode", "claudecode", "pi"],
190
190
  "source": "prompts/arcs-flash.txt",
191
191
  "destination": "prompts/arcs-flash.txt",
192
192
  "description": "A speed-optimized orchestrator that sources context from arcs knowledge first and maximizes parallel sub-agent dispatch under tiered gates.",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rryando/arcs",
3
- "version": "5.2.0",
3
+ "version": "5.2.1",
4
4
  "description": "ARCS — DAG-based task orchestration for AI agents. Persistent workflow continuity via graph-structured context.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -134,7 +134,7 @@ function readAgentRegistry() {
134
134
  ["heavy", "standard", "light"].includes(agent.tier) &&
135
135
  Array.isArray(agent.modes) &&
136
136
  agent.modes.length > 0 &&
137
- agent.modes.every((mode) => ["opencode", "claudecode"].includes(mode)) &&
137
+ agent.modes.every((mode) => ["opencode", "claudecode", "pi"].includes(mode)) &&
138
138
  isPromptPath(agent.source) &&
139
139
  isPromptPath(agent.destination) &&
140
140
  typeof agent.description === "string" &&
@@ -137,7 +137,7 @@ function validateAgentRegistry(agents) {
137
137
  if (
138
138
  !Array.isArray(agent.modes) ||
139
139
  agent.modes.length === 0 ||
140
- agent.modes.some((mode) => mode !== "opencode" && mode !== "claudecode")
140
+ agent.modes.some((mode) => mode !== "opencode" && mode !== "claudecode" && mode !== "pi")
141
141
  ) {
142
142
  throw new Error(`Invalid agent registry modes for ${agent.id}`);
143
143
  }