@rryando/arcs 3.11.0 → 4.1.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.
Files changed (200) hide show
  1. package/README.md +1 -1
  2. package/dist/cli/commands/hooks.d.ts +46 -6
  3. package/dist/cli/commands/hooks.d.ts.map +1 -1
  4. package/dist/cli/commands/hooks.js +190 -52
  5. package/dist/cli/commands/hooks.js.map +1 -1
  6. package/dist/cli/commands/web.js +14 -4
  7. package/dist/cli/commands/web.js.map +1 -1
  8. package/dist/cli/config.d.ts +14 -3
  9. package/dist/cli/config.d.ts.map +1 -1
  10. package/dist/cli/config.js +39 -38
  11. package/dist/cli/config.js.map +1 -1
  12. package/dist/cli/instructions.d.ts +13 -1
  13. package/dist/cli/instructions.d.ts.map +1 -1
  14. package/dist/cli/instructions.js +38 -3
  15. package/dist/cli/instructions.js.map +1 -1
  16. package/dist/cli/setup.d.ts.map +1 -1
  17. package/dist/cli/setup.js +76 -11
  18. package/dist/cli/setup.js.map +1 -1
  19. package/dist/shared/session-vocabulary.d.ts +88 -0
  20. package/dist/shared/session-vocabulary.d.ts.map +1 -0
  21. package/dist/shared/session-vocabulary.js +114 -0
  22. package/dist/shared/session-vocabulary.js.map +1 -0
  23. package/dist/utils/claude-code-hook-install.d.ts +1 -1
  24. package/dist/utils/claude-code-hook-install.d.ts.map +1 -1
  25. package/dist/utils/claude-code-hook-install.js +71 -5
  26. package/dist/utils/claude-code-hook-install.js.map +1 -1
  27. package/dist/utils/claude-transcript.d.ts +81 -2
  28. package/dist/utils/claude-transcript.d.ts.map +1 -1
  29. package/dist/utils/claude-transcript.js +33 -2
  30. package/dist/utils/claude-transcript.js.map +1 -1
  31. package/dist/utils/git.d.ts +21 -0
  32. package/dist/utils/git.d.ts.map +1 -1
  33. package/dist/utils/git.js +65 -1
  34. package/dist/utils/git.js.map +1 -1
  35. package/dist/utils/hook-contract.d.ts +36 -0
  36. package/dist/utils/hook-contract.d.ts.map +1 -0
  37. package/dist/utils/hook-contract.js +35 -0
  38. package/dist/utils/hook-contract.js.map +1 -0
  39. package/dist/utils/hook-token-store.d.ts +44 -3
  40. package/dist/utils/hook-token-store.d.ts.map +1 -1
  41. package/dist/utils/hook-token-store.js +51 -6
  42. package/dist/utils/hook-token-store.js.map +1 -1
  43. package/dist/utils/session-store.d.ts +207 -29
  44. package/dist/utils/session-store.d.ts.map +1 -1
  45. package/dist/utils/session-store.js +236 -44
  46. package/dist/utils/session-store.js.map +1 -1
  47. package/dist/utils/storage-utils.d.ts +1 -1
  48. package/dist/utils/storage-utils.d.ts.map +1 -1
  49. package/dist/utils/storage-utils.js +1 -1
  50. package/dist/utils/storage-utils.js.map +1 -1
  51. package/dist/web-client/assets/{GraphCanvas-dNyZ458L.js → GraphCanvas-BPDgvsyT.js} +1 -1
  52. package/dist/web-client/assets/{MarkdownEditor-BmU9mdkN.js → MarkdownEditor-D7TLp78z.js} +1 -1
  53. package/dist/web-client/assets/{abnfDiagram-VRR7QNED-D1BFBoeF.js → abnfDiagram-VRR7QNED-CyuP2N9t.js} +1 -1
  54. package/dist/web-client/assets/architecture-TIHT7OUA-Bdo2Yvm9.js +1 -0
  55. package/dist/web-client/assets/{architectureDiagram-ZJ3FMSHR-CA8hTWUK.js → architectureDiagram-ZJ3FMSHR-DZ0ul9QX.js} +1 -1
  56. package/dist/web-client/assets/{blockDiagram-677ZJIJ3-CQpb_KwX.js → blockDiagram-677ZJIJ3-LLGzlc9l.js} +1 -1
  57. package/dist/web-client/assets/{c4Diagram-LMCZKHZV-BhpHX84V.js → c4Diagram-LMCZKHZV-CViu3CTc.js} +1 -1
  58. package/dist/web-client/assets/channel-DBNmizpo.js +1 -0
  59. package/dist/web-client/assets/{chunk-32BRIVSS-BUusQQa_.js → chunk-32BRIVSS-Bw_IuJCM.js} +1 -1
  60. package/dist/web-client/assets/{chunk-52WLFC77-nNYwlftl.js → chunk-52WLFC77-C29h440W.js} +1 -1
  61. package/dist/web-client/assets/{chunk-C7G6YPKG-D0a-yqnK.js → chunk-C7G6YPKG-hhOrvw5w.js} +1 -1
  62. package/dist/web-client/assets/{chunk-EX3LRPZG-IDuRMN-4.js → chunk-EX3LRPZG-COMzol-M.js} +1 -1
  63. package/dist/web-client/assets/{chunk-FWX5IMBZ-D_spTcqi.js → chunk-FWX5IMBZ-6vdX9EUn.js} +2 -2
  64. package/dist/web-client/assets/{chunk-HOUHSVGY-C-bcxwZS.js → chunk-HOUHSVGY-DWDW6sxp.js} +1 -1
  65. package/dist/web-client/assets/{chunk-ICXQ74PX-CjmK2bAM.js → chunk-ICXQ74PX-BdMYglo2.js} +1 -1
  66. package/dist/web-client/assets/{chunk-MOJQB5TN-Bkc08KWY.js → chunk-MOJQB5TN-C0LAX_dC.js} +1 -1
  67. package/dist/web-client/assets/{chunk-OGEWGWER-BAAYYvG9.js → chunk-OGEWGWER-CBx8MB7f.js} +1 -1
  68. package/dist/web-client/assets/{chunk-PUDLZKDR-WXbPY7NM.js → chunk-PUDLZKDR-DKssR1nf.js} +1 -1
  69. package/dist/web-client/assets/{chunk-Q4XR5HBZ-DcbnjxQE.js → chunk-Q4XR5HBZ-B3kcxFE-.js} +1 -1
  70. package/dist/web-client/assets/{chunk-V7JOEXUC-C6t75PAp.js → chunk-V7JOEXUC-CAlymndy.js} +1 -1
  71. package/dist/web-client/assets/{chunk-VAUOI2AC-DVrJ0Ic7.js → chunk-VAUOI2AC-BowfsmTW.js} +1 -1
  72. package/dist/web-client/assets/{chunk-VR4S4FIN-MOOFvGS0.js → chunk-VR4S4FIN-BBOydgvt.js} +1 -1
  73. package/dist/web-client/assets/{chunk-WYO6CB5R-sK7Y2NZD.js → chunk-WYO6CB5R-DcymFbES.js} +1 -1
  74. package/dist/web-client/assets/{chunk-ZGVPDNZ5-a13RQsku.js → chunk-ZGVPDNZ5--uKFP-Lr.js} +1 -1
  75. package/dist/web-client/assets/classDiagram-OUVF2IWQ-CB3HiA1_.js +1 -0
  76. package/dist/web-client/assets/classDiagram-v2-EOCWNBFH-CB3HiA1_.js +1 -0
  77. package/dist/web-client/assets/{cynefin-VYW2F7L2-D8xaH-wO.js → cynefin-VYW2F7L2-CjboUOMA.js} +1 -1
  78. package/dist/web-client/assets/{cynefinDiagram-TSTJHNR4-Bt__EqJW.js → cynefinDiagram-TSTJHNR4-BcxygBP7.js} +1 -1
  79. package/dist/web-client/assets/{dagre-VKFMJZFB-Bwgjwflz.js → dagre-VKFMJZFB-D-tiERQE.js} +1 -1
  80. package/dist/web-client/assets/{diagram-FQU43EPY-CaPDVUq2.js → diagram-FQU43EPY-ChPXczaS.js} +1 -1
  81. package/dist/web-client/assets/{diagram-G47NLZAW-BQLB9YYA.js → diagram-G47NLZAW-CVL3Y91h.js} +1 -1
  82. package/dist/web-client/assets/{diagram-NH7WQ7WH-BWo84w8Y.js → diagram-NH7WQ7WH-DsaNA9Lh.js} +1 -1
  83. package/dist/web-client/assets/{diagram-OA4YK3LP-bKn6Pz5s.js → diagram-OA4YK3LP-CXhrhdhU.js} +1 -1
  84. package/dist/web-client/assets/{diagram-WEI45ONY-BRqV5Oy6.js → diagram-WEI45ONY-BTVPnk4E.js} +1 -1
  85. package/dist/web-client/assets/{ebnfDiagram-CCIWWBDH-DhUXL1-7.js → ebnfDiagram-CCIWWBDH-BAyrRBtM.js} +1 -1
  86. package/dist/web-client/assets/{erDiagram-Q63AITRT-HXAQQ-_F.js → erDiagram-Q63AITRT-Qm24Wepm.js} +1 -1
  87. package/dist/web-client/assets/eventmodeling-45OFAUF4-DoTBIvl5.js +1 -0
  88. package/dist/web-client/assets/flowDiagram-23GEKE2U-BEH23L1A.js +1 -0
  89. package/dist/web-client/assets/{ganttDiagram-NO4QXBWP-D-Ddf_Ii.js → ganttDiagram-NO4QXBWP-D8h7l3XJ.js} +1 -1
  90. package/dist/web-client/assets/{gitGraph-TEB2WS4Q-BmHzs0uF.js → gitGraph-TEB2WS4Q-DIBml1SB.js} +1 -1
  91. package/dist/web-client/assets/{gitGraphDiagram-IHSO6WYX-YnQWrlh_.js → gitGraphDiagram-IHSO6WYX-CtkYoXjn.js} +1 -1
  92. package/dist/web-client/assets/{index-DCWxuIeQ.js → index-DOSH4Q9H.js} +38 -36
  93. package/dist/web-client/assets/index-wSzUPvml.css +2 -0
  94. package/dist/web-client/assets/{info-DKCQHKI2-DCT_B7RN.js → info-DKCQHKI2-DLEUtV5Q.js} +1 -1
  95. package/dist/web-client/assets/{infoDiagram-FWYZ7A6U-D-le1Zhq.js → infoDiagram-FWYZ7A6U-BJQ7aQux.js} +1 -1
  96. package/dist/web-client/assets/{ishikawaDiagram-FXEZZL3T-Jr1x2VJB.js → ishikawaDiagram-FXEZZL3T-BPM11FvG.js} +1 -1
  97. package/dist/web-client/assets/{journeyDiagram-5HDEW3XC-BF9ELxj-.js → journeyDiagram-5HDEW3XC-C0aX2z3c.js} +1 -1
  98. package/dist/web-client/assets/{kanban-definition-HUTT4EX6-C4fJqAxu.js → kanban-definition-HUTT4EX6-C56F29Ib.js} +1 -1
  99. package/dist/web-client/assets/{line-7N7ikFxa.js → line-BLFHLF2N.js} +1 -1
  100. package/dist/web-client/assets/{mermaid-parser.core-QbC1icPt.js → mermaid-parser.core-BLC8FhgU.js} +3 -3
  101. package/dist/web-client/assets/{mermaid.core-C26d_UJm.js → mermaid.core-BBqkKuXt.js} +3 -3
  102. package/dist/web-client/assets/{mindmap-definition-LN4V7U3C-D6TV1JDf.js → mindmap-definition-LN4V7U3C-aVZbsoPc.js} +1 -1
  103. package/dist/web-client/assets/{packet-7NZHBO7P-CR1vrGj3.js → packet-7NZHBO7P-D4aqSQfB.js} +1 -1
  104. package/dist/web-client/assets/{pegDiagram-2B236MQR-xOMBBtfV.js → pegDiagram-2B236MQR-DjfyNI0U.js} +1 -1
  105. package/dist/web-client/assets/{pie-RZYD4A2V-BbWuhjwy.js → pie-RZYD4A2V-ChCwYsYj.js} +1 -1
  106. package/dist/web-client/assets/{pieDiagram-ENE6RG2P-MsfnsqgW.js → pieDiagram-ENE6RG2P-BeHLKkXC.js} +1 -1
  107. package/dist/web-client/assets/{quadrantDiagram-ABIIQ3AL-BoI7zKXF.js → quadrantDiagram-ABIIQ3AL-stga3gvq.js} +1 -1
  108. package/dist/web-client/assets/{radar-I7S5WNFK-CbYXKToJ.js → radar-I7S5WNFK-DOGheiwT.js} +1 -1
  109. package/dist/web-client/assets/{railroad-3IZDKUUU-6LxHDkLe.js → railroad-3IZDKUUU-_JnU7M6L.js} +1 -1
  110. package/dist/web-client/assets/railroad-abnf-AHOZXSZD-nhNub7LE.js +1 -0
  111. package/dist/web-client/assets/railroad-ebnf-EBAXGLYW-BlQYe7Yf.js +1 -0
  112. package/dist/web-client/assets/railroad-peg-LSFZ7HO6-B3E8pRVN.js +1 -0
  113. package/dist/web-client/assets/{railroadDiagram-RFXS5EU6-D6RUoUki.js → railroadDiagram-RFXS5EU6-C0CkMsOd.js} +1 -1
  114. package/dist/web-client/assets/{requirementDiagram-TGXJPOKE-B6k4BDpE.js → requirementDiagram-TGXJPOKE-DuImwoRD.js} +1 -1
  115. package/dist/web-client/assets/{sankeyDiagram-HTMAVEWB-BUDF-UFr.js → sankeyDiagram-HTMAVEWB-kprq0XF9.js} +1 -1
  116. package/dist/web-client/assets/{sequenceDiagram-DBY2YBRQ-D6GqcsUi.js → sequenceDiagram-DBY2YBRQ-DiXKJMF6.js} +1 -1
  117. package/dist/web-client/assets/{stateDiagram-2N3HPSRC-WfJCQAK5.js → stateDiagram-2N3HPSRC-D5qbVStE.js} +1 -1
  118. package/dist/web-client/assets/stateDiagram-v2-6OUMAXLB-DWwTAG1r.js +1 -0
  119. package/dist/web-client/assets/{swimlanes-5IMT3BWC-BtMo82mC.js → swimlanes-5IMT3BWC-DCbw389c.js} +1 -1
  120. package/dist/web-client/assets/swimlanesDiagram-G3AALYLV-DabrCsjZ.js +8 -0
  121. package/dist/web-client/assets/{timeline-definition-FHXFAJF6-CoAmv2Sn.js → timeline-definition-FHXFAJF6-CQeaYN_9.js} +1 -1
  122. package/dist/web-client/assets/{treeView-QDETBFTQ-BWsKzE1s.js → treeView-QDETBFTQ-Cf7Sq3qo.js} +1 -1
  123. package/dist/web-client/assets/{treemap-6X3UGDF4-i_qGtB3o.js → treemap-6X3UGDF4-BovzvoTU.js} +1 -1
  124. package/dist/web-client/assets/{vennDiagram-L72KCM5P-DYkiLe-P.js → vennDiagram-L72KCM5P-CZsJy139.js} +1 -1
  125. package/dist/web-client/assets/{wardley-OPB4EBWU-Daaqr1Vp.js → wardley-OPB4EBWU-DJ7MS6XZ.js} +1 -1
  126. package/dist/web-client/assets/{wardleyDiagram-EHGQE667-Bofbsg3J.js → wardleyDiagram-EHGQE667-rqhcmsbM.js} +1 -1
  127. package/dist/web-client/assets/{xychartDiagram-FW5EYKEG-KNF4VTfL.js → xychartDiagram-FW5EYKEG-HuK4Seps.js} +1 -1
  128. package/dist/web-client/index.html +2 -2
  129. package/dist/web-server/app.d.ts +4 -1
  130. package/dist/web-server/app.d.ts.map +1 -1
  131. package/dist/web-server/app.js +19 -3
  132. package/dist/web-server/app.js.map +1 -1
  133. package/dist/web-server/claude-runner.d.ts +109 -7
  134. package/dist/web-server/claude-runner.d.ts.map +1 -1
  135. package/dist/web-server/claude-runner.js +329 -50
  136. package/dist/web-server/claude-runner.js.map +1 -1
  137. package/dist/web-server/index.d.ts +2 -2
  138. package/dist/web-server/index.d.ts.map +1 -1
  139. package/dist/web-server/index.js +3 -2
  140. package/dist/web-server/index.js.map +1 -1
  141. package/dist/web-server/permission-policy.d.ts +46 -0
  142. package/dist/web-server/permission-policy.d.ts.map +1 -0
  143. package/dist/web-server/permission-policy.js +96 -0
  144. package/dist/web-server/permission-policy.js.map +1 -0
  145. package/dist/web-server/prompt-assembly.d.ts +454 -0
  146. package/dist/web-server/prompt-assembly.d.ts.map +1 -0
  147. package/dist/web-server/prompt-assembly.js +1122 -0
  148. package/dist/web-server/prompt-assembly.js.map +1 -0
  149. package/dist/web-server/routes/hook-events.d.ts +28 -4
  150. package/dist/web-server/routes/hook-events.d.ts.map +1 -1
  151. package/dist/web-server/routes/hook-events.js +218 -37
  152. package/dist/web-server/routes/hook-events.js.map +1 -1
  153. package/dist/web-server/routes/sessions.d.ts +8 -8
  154. package/dist/web-server/routes/sessions.d.ts.map +1 -1
  155. package/dist/web-server/routes/sessions.js +1007 -261
  156. package/dist/web-server/routes/sessions.js.map +1 -1
  157. package/dist/web-server/routes/workspace.d.ts +27 -0
  158. package/dist/web-server/routes/workspace.d.ts.map +1 -0
  159. package/dist/web-server/routes/workspace.js +280 -0
  160. package/dist/web-server/routes/workspace.js.map +1 -0
  161. package/dist/web-server/run-event-log.d.ts +167 -0
  162. package/dist/web-server/run-event-log.d.ts.map +1 -0
  163. package/dist/web-server/run-event-log.js +468 -0
  164. package/dist/web-server/run-event-log.js.map +1 -0
  165. package/dist/web-server/session-reconciler.d.ts +162 -0
  166. package/dist/web-server/session-reconciler.d.ts.map +1 -0
  167. package/dist/web-server/session-reconciler.js +363 -0
  168. package/dist/web-server/session-reconciler.js.map +1 -0
  169. package/dist/web-server/static.d.ts +7 -0
  170. package/dist/web-server/static.d.ts.map +1 -1
  171. package/dist/web-server/static.js +46 -3
  172. package/dist/web-server/static.js.map +1 -1
  173. package/dist/web-server/web-auth.d.ts +17 -0
  174. package/dist/web-server/web-auth.d.ts.map +1 -0
  175. package/dist/web-server/web-auth.js +33 -0
  176. package/dist/web-server/web-auth.js.map +1 -0
  177. package/dist/web-server/web-token.d.ts +39 -0
  178. package/dist/web-server/web-token.d.ts.map +1 -0
  179. package/dist/web-server/web-token.js +71 -0
  180. package/dist/web-server/web-token.js.map +1 -0
  181. package/opencode/arcs/manifest.json +8 -8
  182. package/package.json +1 -1
  183. package/scripts/claude-code-session-hook.mjs +37 -16
  184. package/scripts/deploy-claudecode-bundle.mjs +24 -3
  185. package/dist/web-client/assets/architecture-TIHT7OUA-CJqI5wNI.js +0 -1
  186. package/dist/web-client/assets/channel-C8DlmyVe.js +0 -1
  187. package/dist/web-client/assets/classDiagram-OUVF2IWQ-p32N1P_G.js +0 -1
  188. package/dist/web-client/assets/classDiagram-v2-EOCWNBFH-p32N1P_G.js +0 -1
  189. package/dist/web-client/assets/eventmodeling-45OFAUF4-Bj5P8mZJ.js +0 -1
  190. package/dist/web-client/assets/flowDiagram-23GEKE2U-37BztFri.js +0 -1
  191. package/dist/web-client/assets/index-3mNPVkix.css +0 -2
  192. package/dist/web-client/assets/railroad-abnf-AHOZXSZD-2Dg9wu0J.js +0 -1
  193. package/dist/web-client/assets/railroad-ebnf-EBAXGLYW-C_E2ot0R.js +0 -1
  194. package/dist/web-client/assets/railroad-peg-LSFZ7HO6-Bs9UQR1b.js +0 -1
  195. package/dist/web-client/assets/stateDiagram-v2-6OUMAXLB-BCMWGnsJ.js +0 -1
  196. package/dist/web-client/assets/swimlanesDiagram-G3AALYLV-DmudmLcK.js +0 -8
  197. package/dist/web-server/opencode-client.d.ts +0 -123
  198. package/dist/web-server/opencode-client.d.ts.map +0 -1
  199. package/dist/web-server/opencode-client.js +0 -514
  200. package/dist/web-server/opencode-client.js.map +0 -1
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Per-server auth token for the browser-facing mutating API.
3
+ *
4
+ * The loopback + Origin checks in security.ts stop remote and cross-site
5
+ * callers, but they authenticate a NETWORK LOCATION, not a process: every other
6
+ * program on this machine shares localhost, and the mutating routes now spawn
7
+ * `claude` subprocesses. This token proves the caller is a page THIS server
8
+ * served — it is minted fresh at every server start and injected into the
9
+ * served index.html (see static.ts), so the SPA holds it from first paint and
10
+ * no other local process can guess it.
11
+ *
12
+ * Deliberately per-SERVER, not per-project (unlike hook-token-store, which
13
+ * authenticates a per-project hook install): it authenticates the browser tab,
14
+ * and one tab drives every project. Verification always reads the in-memory
15
+ * value, never the file, so a second server started against the same data dir
16
+ * cannot authorize requests to this one — it only replaces the on-disk copy.
17
+ * Exactly one token is live per PROCESS: a second createApp in the same process
18
+ * rotates it and every app then verifies against the newest value. ARCS runs
19
+ * one server per process, so that is a test-only nuance.
20
+ *
21
+ * The file exists for out-of-band consumers (scripts, tests) and is written
22
+ * 0o600: the token is never passed on an argv or in an env var a `ps` can read.
23
+ */
24
+ import { randomBytes, timingSafeEqual } from "node:crypto";
25
+ import { chmodSync, mkdirSync, writeFileSync } from "node:fs";
26
+ import { dirname, join } from "node:path";
27
+ import { getDataDir } from "../utils/paths.js";
28
+ import { nowISO } from "../utils/storage-utils.js";
29
+ const TOKEN_BYTES = 32;
30
+ let currentToken;
31
+ export function webTokenPath() {
32
+ return join(getDataDir(), "web-token.json");
33
+ }
34
+ /**
35
+ * Mints this server's token, replacing any previous one, and persists it 0o600.
36
+ * Called once from createApp, before any route can be served: the middleware
37
+ * and the index.html transform both read the value it installs.
38
+ */
39
+ export function mintWebToken() {
40
+ const token = randomBytes(TOKEN_BYTES).toString("hex");
41
+ const file = { token, createdAt: nowISO() };
42
+ const path = webTokenPath();
43
+ mkdirSync(dirname(path), { recursive: true });
44
+ // The `mode` option only applies when writeFileSync CREATES the file, so an
45
+ // existing token file keeps whatever mode it had — chmod unconditionally.
46
+ // A world-readable token file is the exact failure this whole module exists
47
+ // to avoid.
48
+ writeFileSync(path, `${JSON.stringify(file, null, 2)}\n`, { encoding: "utf-8", mode: 0o600 });
49
+ chmodSync(path, 0o600);
50
+ currentToken = token;
51
+ return token;
52
+ }
53
+ /** This server's live token, or undefined before mintWebToken() has run. */
54
+ export function currentWebToken() {
55
+ return currentToken;
56
+ }
57
+ /**
58
+ * Constant-time token comparison. Returns false when no token has been minted
59
+ * yet, so a request that arrives before startup finished cannot be authorized
60
+ * by an empty header.
61
+ */
62
+ export function verifyWebToken(candidate) {
63
+ if (!currentToken || !candidate)
64
+ return false;
65
+ const expected = Buffer.from(currentToken, "utf-8");
66
+ const actual = Buffer.from(candidate, "utf-8");
67
+ if (expected.length !== actual.length)
68
+ return false;
69
+ return timingSafeEqual(expected, actual);
70
+ }
71
+ //# sourceMappingURL=web-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-token.js","sourceRoot":"","sources":["../../src/web-server/web-token.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAQnD,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB,IAAI,YAAgC,CAAC;AAErC,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,UAAU,EAAE,EAAE,gBAAgB,CAAC,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACvD,MAAM,IAAI,GAAiB,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC;IAC1D,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAE5B,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,4EAA4E;IAC5E,0EAA0E;IAC1E,4EAA4E;IAC5E,YAAY;IACZ,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9F,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAEvB,YAAY,GAAG,KAAK,CAAC;IACrB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,eAAe;IAC7B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,IAAI,CAAC,YAAY,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAE9C,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/C,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACpD,OAAO,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC"}
@@ -29,7 +29,7 @@
29
29
  "id": "tech-architect",
30
30
  "status": "active",
31
31
  "kind": "subagent",
32
- "tier": "standard",
32
+ "tier": "heavy",
33
33
  "modes": ["opencode", "claudecode"],
34
34
  "source": "prompts/tech-architect.txt",
35
35
  "destination": "prompts/tech-architect.txt",
@@ -64,7 +64,7 @@
64
64
  "id": "arcs-docs",
65
65
  "status": "active",
66
66
  "kind": "subagent",
67
- "tier": "heavy",
67
+ "tier": "standard",
68
68
  "modes": ["opencode", "claudecode"],
69
69
  "source": "prompts/arcs-docs.txt",
70
70
  "destination": "prompts/arcs-docs.txt",
@@ -81,7 +81,7 @@
81
81
  "id": "code-reviewer",
82
82
  "status": "active",
83
83
  "kind": "subagent",
84
- "tier": "light",
84
+ "tier": "standard",
85
85
  "modes": ["opencode", "claudecode"],
86
86
  "source": "prompts/code-reviewer.txt",
87
87
  "destination": "prompts/code-reviewer.txt",
@@ -116,7 +116,7 @@
116
116
  "id": "devil-advocate",
117
117
  "status": "active",
118
118
  "kind": "subagent",
119
- "tier": "standard",
119
+ "tier": "heavy",
120
120
  "modes": ["opencode", "claudecode"],
121
121
  "source": "prompts/devil-advocate.txt",
122
122
  "destination": "prompts/devil-advocate.txt",
@@ -283,7 +283,7 @@
283
283
  "value": {
284
284
  "description": "Reviews code changes for production readiness and catches correctness, maintainability, and testing issues.",
285
285
  "mode": "subagent",
286
- "model": "github-copilot/claude-haiku-4.5",
286
+ "model": "github-copilot/claude-sonnet-4.6",
287
287
  "temperature": 0.5,
288
288
  "prompt": "{file:./prompts/code-reviewer.txt}",
289
289
  "permission": {
@@ -301,7 +301,7 @@
301
301
  "value": {
302
302
  "description": "Architecture, analysis, and cited research specialist. Produces read-only structural guidance, trade-off evaluation, and DAG-first research synthesis.",
303
303
  "mode": "subagent",
304
- "model": "github-copilot/claude-sonnet-4.6",
304
+ "model": "github-copilot/claude-opus-4.6",
305
305
  "temperature": 0.4,
306
306
  "permission": {
307
307
  "edit": "deny",
@@ -337,7 +337,7 @@
337
337
  "value": {
338
338
  "description": "ARCS documentation specialist. Manages plans, knowledge entries, diagrams, and DAG health. Knows ARCS structure intimately.",
339
339
  "mode": "subagent",
340
- "model": "github-copilot/claude-opus-4.6",
340
+ "model": "github-copilot/claude-sonnet-4.6",
341
341
  "temperature": 0.1,
342
342
  "permission": {
343
343
  "edit": "allow",
@@ -355,7 +355,7 @@
355
355
  "value": {
356
356
  "description": "Adversarial phase-gate agent. Checks work at phase boundaries using KISS/YAGNI/DRY principles. Runs tests, reads diffs, delivers pass/block verdicts. Cannot edit code.",
357
357
  "mode": "subagent",
358
- "model": "github-copilot/claude-sonnet-4.6",
358
+ "model": "github-copilot/claude-opus-4.6",
359
359
  "temperature": 0.7,
360
360
  "permission": {
361
361
  "edit": "deny",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rryando/arcs",
3
- "version": "3.11.0",
3
+ "version": "4.1.0",
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",
@@ -7,6 +7,11 @@
7
7
  * Claude Code writes to stdin. Install with `arcs hooks install-claude-code
8
8
  * <slug>`, which generates the token and prints the snippet to paste.
9
9
  *
10
+ * One of the four can put text in front of the model: SessionStart mirrors
11
+ * ARCS's staged environment (project, workspace, DAG position) into the new
12
+ * session, emitting Claude Code's `hookSpecificOutput` envelope on stdout; the
13
+ * other three print nothing.
14
+ *
10
15
  * HARD RULE: this script never blocks the session. Any failure — ARCS not
11
16
  * running, token rejected, timeout, malformed JSON — is swallowed, nothing is
12
17
  * printed, and the exit code stays 0. Exit code 2 (the "block" signal) is never
@@ -20,10 +25,28 @@
20
25
  * ARCS_HOOK_URL ARCS web server URL (default http://127.0.0.1:4173)
21
26
  */
22
27
 
28
+ // DEFAULT_URL and EVENTS are literals on purpose: this file runs standalone out
29
+ // of the user's settings.json and importing ARCS would give the HARD RULE above
30
+ // a way to fail. `src/utils/hook-contract.ts` owns the same two values for the
31
+ // TypeScript side, and `test/hook-contract-parity.test.ts` parses THIS source
32
+ // and fails if the two ever diverge — so keep the shapes greppable: a
33
+ // double-quoted DEFAULT_URL, and a flat `new Set([...])` of string literals.
23
34
  const DEFAULT_URL = "http://127.0.0.1:4173";
24
35
  /** Short by design: a hung ARCS server must not stall prompt submission. */
25
36
  const TIMEOUT_MS = 1500;
26
37
  const EVENTS = new Set(["SessionStart", "UserPromptSubmit", "SessionEnd", "Stop"]);
38
+ /**
39
+ * Refusal bound on a context block the server sends, in characters.
40
+ *
41
+ * The server caps the SessionStart block at 2500 (`SESSION_START_STAGE_CAP` in
42
+ * `src/web-server/routes/hook-events.ts`); this is the CLIENT's own limit, so a
43
+ * misbehaving, mismatched or hostile ARCS cannot shove an unbounded body into
44
+ * the head of the user's live session. Over the bound the block is dropped
45
+ * whole rather than clipped — a clip would sever a wrapper's closing delimiter.
46
+ * `test/claude-code-hook-script.test.ts` parses this literal and fails if the
47
+ * server's cap ever climbs above it, so the two cannot silently cross.
48
+ */
49
+ const MAX_CONTEXT_CHARS = 4000;
27
50
 
28
51
  /** Never rejects: an unreadable stdin yields "" and the run turns into a no-op. */
29
52
  function readStdin() {
@@ -48,15 +71,6 @@ function readStdin() {
48
71
  });
49
72
  }
50
73
 
51
- /**
52
- * Labelled and separated so the agent can tell queued out-of-band instructions
53
- * from the prompt the user just typed.
54
- */
55
- function formatQueued(messages) {
56
- const body = messages.map((m, i) => `[${i + 1}] ${String(m).trim()}`).join("\n\n");
57
- return `Messages queued from the ARCS web UI, delivered at this checkpoint:\n\n${body}`;
58
- }
59
-
60
74
  async function main() {
61
75
  const raw = await readStdin();
62
76
  if (!raw.trim()) return;
@@ -89,19 +103,26 @@ async function main() {
89
103
  });
90
104
  if (!response.ok) return;
91
105
 
92
- // Only UserPromptSubmit can inject context; the other events are pure
93
- // notifications and answer with empty stdout.
94
- if (eventName !== "UserPromptSubmit") return;
106
+ // Only SessionStart can inject context: it mirrors ARCS's staged environment
107
+ // into the fresh session. UserPromptSubmit, SessionEnd and Stop are pure
108
+ // notifications and answer with empty stdout, so only SessionStart reads the
109
+ // response body at all.
110
+ if (eventName !== "SessionStart") return;
95
111
 
96
112
  const envelope = await response.json();
97
- const messages = envelope?.data?.queuedMessages;
98
- if (!Array.isArray(messages) || messages.length === 0) return;
113
+
114
+ const staged = envelope?.data?.stagedContext;
115
+ // Every rejection here is a silent no-op, never a repair: an absent field,
116
+ // a non-string, an empty string and an oversized body all mean "ARCS has
117
+ // nothing usable to stage", and the session proceeds exactly as if the
118
+ // bridge were not installed.
119
+ if (typeof staged !== "string" || staged === "" || staged.length > MAX_CONTEXT_CHARS) return;
99
120
 
100
121
  process.stdout.write(
101
122
  JSON.stringify({
102
123
  hookSpecificOutput: {
103
- hookEventName: "UserPromptSubmit",
104
- additionalContext: formatQueued(messages),
124
+ hookEventName: "SessionStart",
125
+ additionalContext: staged,
105
126
  },
106
127
  }),
107
128
  );
@@ -9,8 +9,9 @@
9
9
  // 2. Skills tree → <destination>/skills/arcs-<name>/...
10
10
  // (Claude Code skills must be flat under skills/; we use the `arcs-`
11
11
  // prefix as a namespace so orphan pruning never touches user skills.)
12
- // 3. Default agent → settings.json `agent` field, resolved through the
13
- // explicit DEFAULT_AGENT_PRECEDENCE list (default: "arcs-orchestrate")
12
+ // 3. Default agent → settings.json `agent` field, resolved from an
13
+ // explicit DEPLOY_PRIMARY_AGENT selection, else through the
14
+ // DEFAULT_AGENT_PRECEDENCE list (default: "arcs-orchestrate")
14
15
  //
15
16
  // Env vars:
16
17
  // DEPLOY_BUNDLE_ROOT — override bundle root (default: opencode/arcs)
@@ -18,6 +19,8 @@
18
19
  // DEPLOY_PROJECT_ROOT — override project root (default: repository root)
19
20
  // DEPLOY_SCOPE — `global` or `project` (default: `global`)
20
21
  // DEPLOY_DRY_RUN — "false" to actually write; anything else = dry-run (default: dry-run)
22
+ // DEPLOY_PRIMARY_AGENT — user-selected default primary agent id; empty/unset falls
23
+ // back to DEFAULT_AGENT_PRECEDENCE
21
24
  //
22
25
  // Outputs JSON to stdout: DeployResult
23
26
  // Exit code: 0 on success, 1 on error.
@@ -297,10 +300,28 @@ function buildSkillSources() {
297
300
  // lower-ranked primary is a fallback, never a silent replacement.
298
301
  const DEFAULT_AGENT_PRECEDENCE = ["arcs-orchestrate", "arcs-orchestrate-caveman", "arcs-flash"];
299
302
 
303
+ function isSelectablePrimary(agent) {
304
+ return Boolean(agent) && agent.kind === "primary" && isActiveAgentForMode(agent, "claudecode");
305
+ }
306
+
300
307
  function selectDefaultAgent(registry) {
308
+ // An explicit user selection outranks the pinned precedence — but only when it
309
+ // names a real Claude-Code-active primary. A user who asked for X must never
310
+ // silently get Y, so an unusable selection hard-fails instead of degrading
311
+ // into the precedence walk.
312
+ const requestedId = (process.env.DEPLOY_PRIMARY_AGENT ?? "").trim();
313
+ if (requestedId !== "") {
314
+ const requested = registry.find((record) => record.id === requestedId);
315
+ if (isSelectablePrimary(requested)) return requested;
316
+ const selectable = registry.filter(isSelectablePrimary).map((record) => record.id);
317
+ throw new Error(
318
+ `DEPLOY_PRIMARY_AGENT "${requestedId}" is not an active Claude Code primary agent. Selectable: ${selectable.join(", ") || "(none)"}`,
319
+ );
320
+ }
321
+
301
322
  for (const id of DEFAULT_AGENT_PRECEDENCE) {
302
323
  const agent = registry.find((record) => record.id === id);
303
- if (agent && agent.kind === "primary" && isActiveAgentForMode(agent, "claudecode")) {
324
+ if (isSelectablePrimary(agent)) {
304
325
  return agent;
305
326
  }
306
327
  }
@@ -1 +0,0 @@
1
- import"./chunk-KEIR6QF5-DEvma7oi.js";import{M as e}from"./mermaid-parser.core-QbC1icPt.js";export{e as createArchitectureServices};
@@ -1 +0,0 @@
1
- import{at as e,it as t}from"./chunk-WYO6CB5R-sK7Y2NZD.js";var n=(n,r)=>e.lang.round(t.parse(n)[r]);export{n as t};
@@ -1 +0,0 @@
1
- import{n as e}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import"./src-oBChb5qS.js";import"./chunk-WYO6CB5R-sK7Y2NZD.js";import"./chunk-ICXQ74PX-CjmK2bAM.js";import"./chunk-HOUHSVGY-C-bcxwZS.js";import"./chunk-Q4XR5HBZ-DcbnjxQE.js";import"./chunk-7BUUIJ7U-Bb538aSH.js";import"./chunk-OGEWGWER-BAAYYvG9.js";import"./chunk-32BRIVSS-BUusQQa_.js";import"./chunk-XXDRQBXY-BvKO0v-W.js";import"./chunk-VR4S4FIN-MOOFvGS0.js";import"./chunk-C7G6YPKG-D0a-yqnK.js";import"./chunk-ZGVPDNZ5-a13RQsku.js";import"./chunk-52WLFC77-nNYwlftl.js";import"./chunk-FWX5IMBZ-D_spTcqi.js";import{i as t,n,r,t as i}from"./chunk-V7JOEXUC-C6t75PAp.js";var a={parser:n,get db(){return new i},renderer:r,styles:t,init:e(e=>{e.class||={},e.class.arrowMarkerAbsolute=e.arrowMarkerAbsolute},`init`)};export{a as diagram};
@@ -1 +0,0 @@
1
- import{n as e}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import"./src-oBChb5qS.js";import"./chunk-WYO6CB5R-sK7Y2NZD.js";import"./chunk-ICXQ74PX-CjmK2bAM.js";import"./chunk-HOUHSVGY-C-bcxwZS.js";import"./chunk-Q4XR5HBZ-DcbnjxQE.js";import"./chunk-7BUUIJ7U-Bb538aSH.js";import"./chunk-OGEWGWER-BAAYYvG9.js";import"./chunk-32BRIVSS-BUusQQa_.js";import"./chunk-XXDRQBXY-BvKO0v-W.js";import"./chunk-VR4S4FIN-MOOFvGS0.js";import"./chunk-C7G6YPKG-D0a-yqnK.js";import"./chunk-ZGVPDNZ5-a13RQsku.js";import"./chunk-52WLFC77-nNYwlftl.js";import"./chunk-FWX5IMBZ-D_spTcqi.js";import{i as t,n,r,t as i}from"./chunk-V7JOEXUC-C6t75PAp.js";var a={parser:n,get db(){return new i},renderer:r,styles:t,init:e(e=>{e.class||={},e.class.arrowMarkerAbsolute=e.arrowMarkerAbsolute},`init`)};export{a as diagram};
@@ -1 +0,0 @@
1
- import"./chunk-KEIR6QF5-DEvma7oi.js";import{O as e}from"./mermaid-parser.core-QbC1icPt.js";export{e as createEventModelingServices};
@@ -1 +0,0 @@
1
- import"./src-oBChb5qS.js";import"./chunk-WYO6CB5R-sK7Y2NZD.js";import"./chunk-ICXQ74PX-CjmK2bAM.js";import"./chunk-HOUHSVGY-C-bcxwZS.js";import"./chunk-Q4XR5HBZ-DcbnjxQE.js";import"./chunk-7BUUIJ7U-Bb538aSH.js";import"./chunk-OGEWGWER-BAAYYvG9.js";import"./chunk-32BRIVSS-BUusQQa_.js";import"./chunk-XXDRQBXY-BvKO0v-W.js";import"./chunk-VR4S4FIN-MOOFvGS0.js";import"./chunk-C7G6YPKG-D0a-yqnK.js";import"./chunk-ZGVPDNZ5-a13RQsku.js";import"./chunk-52WLFC77-nNYwlftl.js";import"./chunk-FWX5IMBZ-D_spTcqi.js";import"./chunk-ZIRB5QZD-BpeS1aZ7.js";import{n as e}from"./chunk-PUDLZKDR-WXbPY7NM.js";export{e as diagram};
@@ -1,2 +0,0 @@
1
- /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:"JetBrains Mono Variable", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;--color-emerald-500:oklch(69.6% .17 162.48);--color-black:#000;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-4xl:56rem;--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-normal:400;--font-weight-bold:700;--tracking-wide:.025em;--leading-snug:1.375;--leading-relaxed:1.625;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-term-bg:#050505;--color-term-panel:#101010;--color-term-inset:#1a1a1a;--color-term-border:#2c2c2c;--color-term-border-hi:#474747;--color-term-fg:#f2f2f2;--color-term-dim:#8f8f8f;--color-term-green:#4ade80;--color-term-amber:#fbbf24;--color-term-red:#f87171;--color-term-cyan:#22d3ee;--color-term-magenta:#e879f9;--color-term-blue:#60a5fa;--color-term-purple:#a78bfa;--color-term-orange:#fb923c;--color-term-teal:#2dd4bf;--color-term-lime:#a3e635}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}html,body,#root{height:100%}body{background-color:var(--color-term-bg);font-family:var(--font-mono);--tw-leading:var(--leading-relaxed);font-size:13px;line-height:var(--leading-relaxed);color:var(--color-term-fg);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}::selection{background:var(--color-term-fg);color:var(--color-term-bg)}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:var(--color-term-bg)}::-webkit-scrollbar-thumb{background:var(--color-term-border)}::-webkit-scrollbar-thumb:hover{background:var(--color-term-border-hi)}input,textarea,select,button{font:inherit}select,option{background:var(--color-term-inset);color:var(--color-term-fg)}}@layer components{.kbd{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-term-border);background-color:var(--color-term-panel);padding-inline:var(--spacing);--tw-leading:calc(var(--spacing) * 4);font-size:11px;line-height:calc(var(--spacing) * 4);color:var(--color-term-dim);display:inline-block}.scanlines{pointer-events:none;z-index:60;background:repeating-linear-gradient(0deg,#0000 0 2px,#0000000b 3px,#0000 4px);position:fixed;inset:0}.md{--tw-leading:var(--leading-relaxed);max-width:none;font-size:13px;line-height:var(--leading-relaxed)}.md h1{margin-top:0;margin-bottom:calc(var(--spacing) * 4);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-term-border);padding-bottom:calc(var(--spacing) * 2);font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);color:var(--color-term-green)}.md h2{margin-top:calc(var(--spacing) * 7);margin-bottom:calc(var(--spacing) * 3);border-bottom-style:var(--tw-border-style);border-color:#2c2c2c99;border-bottom-width:1px}@supports (color:color-mix(in lab, red, red)){.md h2{border-color:color-mix(in oklab, var(--color-term-border) 60%, transparent)}}.md h2{padding-bottom:var(--spacing);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);color:var(--color-term-green)}.md h3{margin-top:calc(var(--spacing) * 5);margin-bottom:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);color:var(--color-term-cyan)}.md h4{margin-top:calc(var(--spacing) * 4);margin-bottom:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);color:var(--color-term-fg)}.md p{margin-block:calc(var(--spacing) * 3)}.md ul{margin-block:calc(var(--spacing) * 3);padding-left:calc(var(--spacing) * 4);list-style-type:none}.md ul>li{margin-block:var(--spacing);position:relative}.md ul>li:before{content:"▸";left:calc(var(--spacing) * -4);color:var(--color-term-dim);position:absolute}.md ul>li>ul{margin-block:var(--spacing)}.md ol{margin-block:calc(var(--spacing) * 3);padding-left:calc(var(--spacing) * 6);list-style-type:decimal}.md ol ::marker{color:var(--color-term-dim)}.md ol::marker{color:var(--color-term-dim)}.md ol ::-webkit-details-marker{color:var(--color-term-dim)}.md ol::-webkit-details-marker{color:var(--color-term-dim)}.md a{color:var(--color-term-cyan);text-underline-offset:2px;text-decoration-line:underline}@media (hover:hover){.md a:hover{color:var(--color-term-green)}}.md strong{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);color:var(--color-term-fg)}.md code:not(pre code){border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-term-border);background-color:var(--color-term-panel);padding-inline:var(--spacing);padding-block:calc(var(--spacing) * .5);color:var(--color-term-amber);font-size:12px}.md pre{margin-block:calc(var(--spacing) * 4);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-term-border);background-color:var(--color-term-inset);padding:calc(var(--spacing) * 3);overflow-x:auto}.md pre code{background:0 0;font-size:12px}.md blockquote{margin-block:calc(var(--spacing) * 3);border-left-style:var(--tw-border-style);border-color:#fbbf2499;border-left-width:2px}@supports (color:color-mix(in lab, red, red)){.md blockquote{border-color:color-mix(in oklab, var(--color-term-amber) 60%, transparent)}}.md blockquote{padding-left:calc(var(--spacing) * 3);color:var(--color-term-dim)}.md table{margin-block:calc(var(--spacing) * 4);border-collapse:collapse;width:100%}.md th{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-term-border);background-color:var(--color-term-panel);padding-inline:calc(var(--spacing) * 2);padding-block:var(--spacing);text-align:left;--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);color:var(--color-term-green)}.md td{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-term-border);padding-inline:calc(var(--spacing) * 2);padding-block:var(--spacing);vertical-align:top}.md hr{margin-block:calc(var(--spacing) * 6);border-color:var(--color-term-border)}.md input[type=checkbox]{margin-right:var(--spacing);accent-color:var(--color-emerald-500)}.hljs{background:0 0}.cm-host,.cm-host .cm-editor{height:100%}.cm-host .cm-editor{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-term-border);--tw-outline-style:none;background-color:#0000;outline-style:none;font-size:13px}.cm-host .cm-scroller{font-family:var(--font-mono)}}@layer utilities{.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.top-0{top:0}.top-2{top:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.bottom-8{bottom:calc(var(--spacing) * 8)}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.col-span-2{grid-column:span 2/span 2}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-1{margin-right:var(--spacing)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-1{margin-left:var(--spacing)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-6{margin-left:calc(var(--spacing) * 6)}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-64{height:calc(var(--spacing) * 64)}.h-\[calc\(100\%-25px\)\]{height:calc(100% - 25px)}.h-\[calc\(100\%-33px\)\]{height:calc(100% - 33px)}.h-full{height:100%}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-\[55vh\]{max-height:55vh}.min-h-0{min-height:0}.min-h-14{min-height:calc(var(--spacing) * 14)}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-20{min-height:calc(var(--spacing) * 20)}.min-h-40{min-height:calc(var(--spacing) * 40)}.min-h-96{min-height:calc(var(--spacing) * 96)}.w-3{width:calc(var(--spacing) * 3)}.w-6{width:calc(var(--spacing) * 6)}.w-12{width:calc(var(--spacing) * 12)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-28{width:calc(var(--spacing) * 28)}.w-32{width:calc(var(--spacing) * 32)}.w-36{width:calc(var(--spacing) * 36)}.w-44{width:calc(var(--spacing) * 44)}.w-48{width:calc(var(--spacing) * 48)}.w-56{width:calc(var(--spacing) * 56)}.w-60{width:calc(var(--spacing) * 60)}.w-72{width:calc(var(--spacing) * 72)}.w-96{width:calc(var(--spacing) * 96)}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:0}.flex-1{flex:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.resize-y{resize:vertical}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\[8rem_1fr\]{grid-template-columns:8rem 1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-px{gap:1px}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-y-1{row-gap:var(--spacing)}.gap-y-3{row-gap:calc(var(--spacing) * 3)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-term-border\/40>:not(:last-child)){border-color:#2c2c2c66}@supports (color:color-mix(in lab, red, red)){:where(.divide-term-border\/40>:not(:last-child)){border-color:color-mix(in oklab, var(--color-term-border) 40%, transparent)}}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-term-amber\/40{border-color:#fbbf2466}@supports (color:color-mix(in lab, red, red)){.border-term-amber\/40{border-color:color-mix(in oklab, var(--color-term-amber) 40%, transparent)}}.border-term-bg\/50{border-color:#05050580}@supports (color:color-mix(in lab, red, red)){.border-term-bg\/50{border-color:color-mix(in oklab, var(--color-term-bg) 50%, transparent)}}.border-term-blue\/40{border-color:#60a5fa66}@supports (color:color-mix(in lab, red, red)){.border-term-blue\/40{border-color:color-mix(in oklab, var(--color-term-blue) 40%, transparent)}}.border-term-border{border-color:var(--color-term-border)}.border-term-border-hi{border-color:var(--color-term-border-hi)}.border-term-border\/30{border-color:#2c2c2c4d}@supports (color:color-mix(in lab, red, red)){.border-term-border\/30{border-color:color-mix(in oklab, var(--color-term-border) 30%, transparent)}}.border-term-border\/40{border-color:#2c2c2c66}@supports (color:color-mix(in lab, red, red)){.border-term-border\/40{border-color:color-mix(in oklab, var(--color-term-border) 40%, transparent)}}.border-term-border\/60{border-color:#2c2c2c99}@supports (color:color-mix(in lab, red, red)){.border-term-border\/60{border-color:color-mix(in oklab, var(--color-term-border) 60%, transparent)}}.border-term-cyan\/40{border-color:#22d3ee66}@supports (color:color-mix(in lab, red, red)){.border-term-cyan\/40{border-color:color-mix(in oklab, var(--color-term-cyan) 40%, transparent)}}.border-term-green\/40{border-color:#4ade8066}@supports (color:color-mix(in lab, red, red)){.border-term-green\/40{border-color:color-mix(in oklab, var(--color-term-green) 40%, transparent)}}.border-term-green\/60{border-color:#4ade8099}@supports (color:color-mix(in lab, red, red)){.border-term-green\/60{border-color:color-mix(in oklab, var(--color-term-green) 60%, transparent)}}.border-term-lime\/40{border-color:#a3e63566}@supports (color:color-mix(in lab, red, red)){.border-term-lime\/40{border-color:color-mix(in oklab, var(--color-term-lime) 40%, transparent)}}.border-term-magenta\/40{border-color:#e879f966}@supports (color:color-mix(in lab, red, red)){.border-term-magenta\/40{border-color:color-mix(in oklab, var(--color-term-magenta) 40%, transparent)}}.border-term-orange\/40{border-color:#fb923c66}@supports (color:color-mix(in lab, red, red)){.border-term-orange\/40{border-color:color-mix(in oklab, var(--color-term-orange) 40%, transparent)}}.border-term-purple\/40{border-color:#a78bfa66}@supports (color:color-mix(in lab, red, red)){.border-term-purple\/40{border-color:color-mix(in oklab, var(--color-term-purple) 40%, transparent)}}.border-term-red\/40{border-color:#f8717166}@supports (color:color-mix(in lab, red, red)){.border-term-red\/40{border-color:color-mix(in oklab, var(--color-term-red) 40%, transparent)}}.border-term-red\/50{border-color:#f8717180}@supports (color:color-mix(in lab, red, red)){.border-term-red\/50{border-color:color-mix(in oklab, var(--color-term-red) 50%, transparent)}}.border-term-red\/60{border-color:#f8717199}@supports (color:color-mix(in lab, red, red)){.border-term-red\/60{border-color:color-mix(in oklab, var(--color-term-red) 60%, transparent)}}.border-term-teal\/40{border-color:#2dd4bf66}@supports (color:color-mix(in lab, red, red)){.border-term-teal\/40{border-color:color-mix(in oklab, var(--color-term-teal) 40%, transparent)}}.border-transparent{border-color:#0000}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab, red, red)){.bg-black\/60{background-color:color-mix(in oklab, var(--color-black) 60%, transparent)}}.bg-term-bg{background-color:var(--color-term-bg)}.bg-term-bg\/70{background-color:#050505b3}@supports (color:color-mix(in lab, red, red)){.bg-term-bg\/70{background-color:color-mix(in oklab, var(--color-term-bg) 70%, transparent)}}.bg-term-green{background-color:var(--color-term-green)}.bg-term-green\/60{background-color:#4ade8099}@supports (color:color-mix(in lab, red, red)){.bg-term-green\/60{background-color:color-mix(in oklab, var(--color-term-green) 60%, transparent)}}.bg-term-inset{background-color:var(--color-term-inset)}.bg-term-panel{background-color:var(--color-term-panel)}.p-0{padding:0}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-\[12vh\]{padding-top:12vh}.pt-\[15vh\]{padding-top:15vh}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.pb-1{padding-bottom:var(--spacing)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[15px\]{font-size:15px}.leading-4{--tw-leading:calc(var(--spacing) * 4);line-height:calc(var(--spacing) * 4)}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-inherit{color:inherit}.text-term-amber{color:var(--color-term-amber)}.text-term-bg{color:var(--color-term-bg)}.text-term-bg\/70{color:#050505b3}@supports (color:color-mix(in lab, red, red)){.text-term-bg\/70{color:color-mix(in oklab, var(--color-term-bg) 70%, transparent)}}.text-term-bg\/80{color:#050505cc}@supports (color:color-mix(in lab, red, red)){.text-term-bg\/80{color:color-mix(in oklab, var(--color-term-bg) 80%, transparent)}}.text-term-blue{color:var(--color-term-blue)}.text-term-border-hi{color:var(--color-term-border-hi)}.text-term-cyan{color:var(--color-term-cyan)}.text-term-dim{color:var(--color-term-dim)}.text-term-dim\/40{color:#8f8f8f66}@supports (color:color-mix(in lab, red, red)){.text-term-dim\/40{color:color-mix(in oklab, var(--color-term-dim) 40%, transparent)}}.text-term-dim\/70{color:#8f8f8fb3}@supports (color:color-mix(in lab, red, red)){.text-term-dim\/70{color:color-mix(in oklab, var(--color-term-dim) 70%, transparent)}}.text-term-dim\/80{color:#8f8f8fcc}@supports (color:color-mix(in lab, red, red)){.text-term-dim\/80{color:color-mix(in oklab, var(--color-term-dim) 80%, transparent)}}.text-term-fg{color:var(--color-term-fg)}.text-term-green{color:var(--color-term-green)}.text-term-lime{color:var(--color-term-lime)}.text-term-magenta{color:var(--color-term-magenta)}.text-term-orange{color:var(--color-term-orange)}.text-term-purple{color:var(--color-term-purple)}.text-term-red{color:var(--color-term-red)}.text-term-teal{color:var(--color-term-teal)}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.opacity-40{opacity:.4}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-100{opacity:1}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-black\/50{--tw-shadow-color:#00000080}@supports (color:color-mix(in lab, red, red)){.shadow-black\/50{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 50%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/60{--tw-shadow-color:#0009}@supports (color:color-mix(in lab, red, red)){.shadow-black\/60{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 60%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/70{--tw-shadow-color:#000000b3}@supports (color:color-mix(in lab, red, red)){.shadow-black\/70{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 70%, transparent) var(--tw-shadow-alpha), transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.placeholder\:text-term-dim\/50::placeholder{color:#8f8f8f80}@supports (color:color-mix(in lab, red, red)){.placeholder\:text-term-dim\/50::placeholder{color:color-mix(in oklab, var(--color-term-dim) 50%, transparent)}}.placeholder\:text-term-dim\/60::placeholder{color:#8f8f8f99}@supports (color:color-mix(in lab, red, red)){.placeholder\:text-term-dim\/60::placeholder{color:color-mix(in oklab, var(--color-term-dim) 60%, transparent)}}@media (hover:hover){.hover\:border-term-cyan\/80:hover{border-color:#22d3eecc}@supports (color:color-mix(in lab, red, red)){.hover\:border-term-cyan\/80:hover{border-color:color-mix(in oklab, var(--color-term-cyan) 80%, transparent)}}.hover\:bg-term-fg\/5:hover{background-color:#f2f2f20d}@supports (color:color-mix(in lab, red, red)){.hover\:bg-term-fg\/5:hover{background-color:color-mix(in oklab, var(--color-term-fg) 5%, transparent)}}.hover\:bg-term-green:hover{background-color:var(--color-term-green)}.hover\:bg-term-red:hover{background-color:var(--color-term-red)}.hover\:font-bold:hover{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.hover\:text-term-bg:hover{color:var(--color-term-bg)}.hover\:text-term-cyan:hover{color:var(--color-term-cyan)}.hover\:text-term-fg:hover{color:var(--color-term-fg)}.hover\:text-term-green:hover{color:var(--color-term-green)}.hover\:text-term-red:hover{color:var(--color-term-red)}}.focus\:border-term-green\/60:focus{border-color:#4ade8099}@supports (color:color-mix(in lab, red, red)){.focus\:border-term-green\/60:focus{border-color:color-mix(in oklab, var(--color-term-green) 60%, transparent)}}.focus\:bg-term-green:focus{background-color:var(--color-term-green)}.focus\:text-term-bg:focus{color:var(--color-term-bg)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:opacity-100:focus-visible{opacity:1}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}@media (width>=48rem){.md\:col-span-4{grid-column:span 4/span 4}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (width>=64rem){.lg\:col-span-5{grid-column:span 5/span 5}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:inline-flex{display:inline-flex}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}@media (width>=80rem){.xl\:inline{display:inline}}}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(data:font/woff2;base64,d09GMgABAAAAAAfsABQAAAAAEAwAAAeCAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhwbHhwoP0hWQVJbBmA/U1RBVIFiJyYAdC9qEQgKhGSEAAsgADCGCAE2AiQDOgQgBYlMB4EUDAcbLQ4onoexrSC/2ZyLAa8p8VHB8/x3Vue+V0hVJalMJg2nx/TCrQXxBeqLjQG7FyM1WEa/X1tEXN7cFz9EJEMmMUz3RihWSSKeQCbcIou0izz/C8v+fq3VfajEa9gDD11CImXS7qL/RJFVzC1qiB6KmKeD6TZdQ6IRGv78dL6uSVVCfgni5mzu7kcgQBgAEAQTQRCoL++STTYybkJxNfQxAAIAGu8OdEB9teW2jh4BpgDqFjAeSEByW3zFP0CBBgNMsMCGEDjgggdhiEAUAeIIED7ABTDUEnkIE9Q9ahFgKttcVhApo4ACB4qobHaccgDfEjFO6aaWUhjMLt2SyIvHKoDqoA4CSUwEIYQCEjhAO9R1G6keDeDZGjNo+AhxOjCEGTr1WeIF3kYBiLAOKvkJSMiKX0VdAyQt3SDJClCkxJCHkCzfqyVTriJZLcolS32JZHUekq2TYNkYtCtjYHMQXSxGjXDz2t/yLWXzDzxz+o3zFwDEaN23F+13pyMdQAEaSKAR9vcGq4A4MTSKCElGW+M7UcY7xqkggITb28ZJhlqc9q2twYKTt0NjixBgYvO9BIihEBLYuOFXQzfIQ7dXGUEEEgFDooBfAzqiQbpJrhiWSuKJCRFKYbHCyJKI2G5GiZbNAvgAu5pc3vwx4G+g3aDkhklABiSz0BICXrYghtYhx/cdJ+44rY2oZ0aMNRFz3VZjb6W33F3gzltqtOCV8tTHSpOeXuItfvr5lCdfzFpqtEitvqdcdGGFd28ZqqC0tPbeChGXgrIlnhSWu/eUso4uKWFLugyDzQJhflY4659+WjQ++6x72WUMv9G8mw6QJl7BVxX5fe/kpUsOvnZwee9uQ0cGXYd0o89XB2748sDSnt8d2VphdOTTgceDVvOds0v9P/s7HPq15aGun/6Vllb56f1dl0t1LejqrNkpdRZsG8TOnM5vkBG5oiVyVGnS8LHps5cfNWJs6qKPfaNSxiQNBUm3cKNWROr0GSur7Za31k1vieq7LH11VF+jXdRIasRKflc7jkobm1Z9te1IyZA0pDkhLR98+H37Zf1c/8at+dB7x+7GfVyTfJMPiYztsnl59Y5l4j+0n1RXlpHnF3Tq7HecmNF/CJodEMAikruxiyJaGLvHOdAfoA+oDvpjBm2b91cHGRZMU9n25xEU0A8fgEEAdKI3Q1iDtc034sug5YVMkE2jsE+BIkwSoQ3gxXMqz9tELp48bd0cFKOKS7xYjEuXBnZP5ia7DyiO/X/YI+PQSbt2uSdqAkWL9nQbV1XB94/+uPfdZz8dnXYFBYrcTl2SIR/ybxJNJPz/Gupb0JaZeens2ekC7EKr8t+Ls/P5VJPYJdHKyqfg2nqU6bhlidzcddQV/7MmecTzJ5VPcKXkNKSEogHjYFx6QZ7rQ+FSe8njaiNuOnXS8H2ScQ619c2mC3VTtauL0rRbXd/CkSOP37FY9Zkjz8+GibYUMOEWF+RdrFS8Ecv1SHOpPUPZGEIpjPvFyU5cXKjd6OXqorTqy9GwRd++HVufPGnVsW+aO3vggKZ18jR9sXaTC1PWTEsVUaK0FkNySbTQDqlm2PfDjZcu4aalnSLKjnOoYQ0nUlqqXcGpPu/4VgV/xU2pAqW4BW3qzhQ8/hFKhV2qE3+BKAtDqBXjfgnVdH4y0wg5tbVNRenNdTWOrenWLcupQdmsbq5b+18piTe/xRdp1xbILxNPJGInm2z6hoB21Lal0i+ePTtd7B45+3XhFJ329evskXm7qurUVREotqSluSo/L29d3qDhI4YOQqWhI4YNvBNfsMHeXKemXrxQfKeuPOGRVayA3JtkJKEgbPp+dXUDluddutRYLFoXGXWX6N3WFaGLbQtRSitVYNacTNSdy7AaG/HSaUEANcBoGXNdcZvZsOqQ1icBDv21/gzAoYPHH/WDW0qNR3QTYKEAEHig6o13NXbND06CQPlRtYjGNnSktRc09k1mAMDvAlDKfQjgy6fssInlfzmNAjKkDxoxHOBLdVRAIVt9j4qo+hA1w9T1aNBNTUOTTNUHLbqokE+UAfJXCIGw/IxCSL5GRUJeR40rL/UxTm4Q08H6MbCs70ObuNyIIXrINHQYInF06UUlevTjbQzTh5upiDMzMMogUtEnjPs/Y7jAHCJeB0GBHh04tC6FiB6ZFB1oArUSIoFoqhzCeAN6lHwm0T4C3VVPWvjpSMXReuWesMEcoqrmgtNBGd2noWeV0hNAz9rFeShNJxHGsPa3HXeKTk8b55hahySYHaYKKFFLpCfN8rsoaJn01CR04Gkc+5k7KVTCmClX8Q10HCrUEkVlSX+XO33oQR9609tJ516H497WSobWs5Up6TLaS10/dessIskgJSLiDlWvHVUywpkQ7hdPZqGyiEF0uVQerVcPamT1A3eKXdyI1vG9OoflrSXihZ1qqGE3nhmAgiIbRCQgPLEPtOM3UQwTLYaYYomNlpA44opnjV6jkD6id80OOrzf6BzmMD6eEa1zKyeYG1fzfEf16V6jw9XYOaar1/b2kP/IYX8oR2mcFvv2GtBV3JXgd437AQAA)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2)format("woff2-variations");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}pre code.hljs{padding:1em;display:block;overflow-x:auto}code.hljs{padding:3px 5px}.hljs-meta,.hljs-comment{color:#565f89}.hljs-tag,.hljs-doctag,.hljs-selector-id,.hljs-selector-class,.hljs-regexp,.hljs-template-tag,.hljs-selector-pseudo,.hljs-selector-attr,.hljs-variable.language_,.hljs-deletion{color:#f7768e}.hljs-variable,.hljs-template-variable,.hljs-number,.hljs-literal,.hljs-type,.hljs-params,.hljs-link{color:#ff9e64}.hljs-built_in,.hljs-attribute{color:#e0af68}.hljs-keyword,.hljs-title.function_,.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-subst,.hljs-property{color:#7dcfff}.hljs-selector-tag{color:#73daca}.hljs-quote,.hljs-string,.hljs-symbol,.hljs-bullet,.hljs-addition{color:#9ece6a}.hljs-code,.hljs-formula,.hljs-section{color:#7aa2f7}.hljs-name,.hljs-keyword,.hljs-operator,.hljs-keyword,.hljs-char.escape_,.hljs-attr{color:#bb9af7}.hljs-punctuation{color:#c0caf5}.hljs{color:#9aa5ce;background:#1a1b26}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}
@@ -1 +0,0 @@
1
- import"./chunk-KEIR6QF5-DEvma7oi.js";import{m as e}from"./mermaid-parser.core-QbC1icPt.js";export{e as createRailroadAbnfServices};
@@ -1 +0,0 @@
1
- import"./chunk-KEIR6QF5-DEvma7oi.js";import{f as e}from"./mermaid-parser.core-QbC1icPt.js";export{e as createRailroadEbnfServices};
@@ -1 +0,0 @@
1
- import"./chunk-KEIR6QF5-DEvma7oi.js";import{u as e}from"./mermaid-parser.core-QbC1icPt.js";export{e as createRailroadPegServices};
@@ -1 +0,0 @@
1
- import{n as e}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import"./src-oBChb5qS.js";import"./chunk-WYO6CB5R-sK7Y2NZD.js";import"./chunk-ICXQ74PX-CjmK2bAM.js";import"./chunk-HOUHSVGY-C-bcxwZS.js";import"./chunk-Q4XR5HBZ-DcbnjxQE.js";import"./chunk-7BUUIJ7U-Bb538aSH.js";import"./chunk-OGEWGWER-BAAYYvG9.js";import"./chunk-32BRIVSS-BUusQQa_.js";import"./chunk-XXDRQBXY-BvKO0v-W.js";import"./chunk-VR4S4FIN-MOOFvGS0.js";import"./chunk-C7G6YPKG-D0a-yqnK.js";import"./chunk-ZGVPDNZ5-a13RQsku.js";import"./chunk-52WLFC77-nNYwlftl.js";import"./chunk-FWX5IMBZ-D_spTcqi.js";import{i as t,n,r,t as i}from"./chunk-EX3LRPZG-IDuRMN-4.js";var a={parser:n,get db(){return new i(2)},renderer:r,styles:t,init:e(e=>{e.state||={},e.state.arrowMarkerAbsolute=e.arrowMarkerAbsolute},`init`)};export{a as diagram};
@@ -1,8 +0,0 @@
1
- import{n as e}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import"./src-oBChb5qS.js";import"./chunk-WYO6CB5R-sK7Y2NZD.js";import"./chunk-ICXQ74PX-CjmK2bAM.js";import"./chunk-HOUHSVGY-C-bcxwZS.js";import"./chunk-Q4XR5HBZ-DcbnjxQE.js";import"./chunk-7BUUIJ7U-Bb538aSH.js";import"./chunk-OGEWGWER-BAAYYvG9.js";import"./chunk-32BRIVSS-BUusQQa_.js";import"./chunk-XXDRQBXY-BvKO0v-W.js";import"./chunk-VR4S4FIN-MOOFvGS0.js";import"./chunk-C7G6YPKG-D0a-yqnK.js";import"./chunk-ZGVPDNZ5-a13RQsku.js";import"./chunk-52WLFC77-nNYwlftl.js";import"./chunk-FWX5IMBZ-D_spTcqi.js";import"./chunk-ZIRB5QZD-BpeS1aZ7.js";import{r as t,t as n}from"./chunk-PUDLZKDR-WXbPY7NM.js";var r=n({defaultLayout:`swimlane`,styles:e(e=>`${t(e)}
2
- .swimlane.cluster rect {
3
- stroke: ${e.clusterBorder} !important;
4
- }
5
- [data-look="neo"].cluster rect {
6
- filter: none;
7
- }
8
- `,`getStyles`)});export{r as diagram};
@@ -1,123 +0,0 @@
1
- /**
2
- * opencode session discovery bridge (Phase 1 — observability only).
3
- *
4
- * ARCS never spawns or manages an opencode server; it attaches to an already
5
- * running `opencode serve` instance as a thin client, subscribes to the
6
- * cross-instance `/global/event` SSE stream, and mirrors what it sees into the
7
- * per-project session store. Everything here is best-effort: if opencode is
8
- * not configured, not running, or speaks a different dialect, the ARCS web
9
- * server keeps working and the sessions list is simply empty or stale.
10
- *
11
- * Verified against opencode 0.0.0-main-202607110203:
12
- * - `opencode serve` defaults to port 0 (ephemeral), so a port/URL must be
13
- * supplied explicitly via env — there is no safe default to guess.
14
- * - `OPENCODE_SERVER_PASSWORD` is enforced as HTTP Basic auth with the literal
15
- * username "opencode"; any other username is rejected with 401.
16
- * - `/event` is scoped to one instance (`?directory=`); `/global/event` is the
17
- * cross-directory stream and wraps each event as `{ directory, project,
18
- * payload }`. Frames carry no `event:` field, only `data:`.
19
- */
20
- import { type SessionStatus } from "../utils/session-store.js";
21
- export interface OpencodeConfig {
22
- baseUrl: string;
23
- password?: string;
24
- }
25
- /**
26
- * Reads bridge configuration from the environment. Returns null (discovery
27
- * disabled) when no opencode endpoint is configured.
28
- */
29
- export declare function readOpencodeConfig(env?: NodeJS.ProcessEnv): OpencodeConfig | null;
30
- export interface OpencodeMessageTarget {
31
- /** opencode-native session id ("ses_…") — never the ARCS normalized id. */
32
- runtimeSessionId: string;
33
- /** Worktree the session belongs to, when known — scopes opencode's lookup. */
34
- directory?: string;
35
- }
36
- /**
37
- * Injects a user message into a live opencode session.
38
- *
39
- * Unlike the rest of this module (best-effort observability) this is a user
40
- * mutation, so failures throw a typed DagError the web routes can surface.
41
- *
42
- * Verified against opencode 1.0.0 (`GET /doc`) plus a live server:
43
- * - `POST /session/:sessionID/prompt_async` acks with 204 and runs the turn in
44
- * the background. `POST /session/:sessionID/message` takes the same body but
45
- * only responds once the assistant has finished its whole turn — minutes, for
46
- * a browser request — so async delivery is the one that fits a web form.
47
- * - the body requires `parts`; a text part is `{ type: "text", text }`.
48
- * - `?directory=` is optional (an unscoped send still lands) but is passed when
49
- * known so the lookup is unambiguous across worktrees.
50
- */
51
- export declare function sendOpencodeMessage(config: OpencodeConfig, target: OpencodeMessageTarget, text: string): Promise<void>;
52
- export interface CreateOpencodeSessionInput {
53
- /** Worktree the session runs in — required, see the directory note below. */
54
- directory: string;
55
- title?: string;
56
- }
57
- /** Only what ARCS needs to mirror the session; the SSE stream fills in the rest. */
58
- export interface CreatedOpencodeSession {
59
- runtimeSessionId: string;
60
- title?: string;
61
- }
62
- /**
63
- * Creates a live opencode session bound to a worktree.
64
- *
65
- * Verified against opencode 0.0.0-main-202607110203 (`GET /doc`, operationId
66
- * `session.create`) plus a live server:
67
- * - the route is `POST /session` — NOT `/api/session`. opencode serves its own
68
- * web UI from the same port and answers every unknown path with a 200
69
- * text/html SPA shell, so a wrong path looks like a success until the body is
70
- * read. That is why the id is checked below rather than trusting `res.ok`.
71
- * - `directory` is a *query* parameter and never a body field. Omitting it does
72
- * not fail; opencode silently creates the session in its own working
73
- * directory, so the caller must always pass the worktree explicitly.
74
- * - `title` is the only body field ARCS sets; the response is a full session
75
- * object (`{ id, slug, directory, title, time }`).
76
- * - `DELETE /session/:sessionID` exists, so nothing created here is permanent.
77
- */
78
- export declare function createOpencodeSession(config: OpencodeConfig, input: CreateOpencodeSessionInput): Promise<CreatedOpencodeSession>;
79
- interface OpencodeSessionInfo {
80
- id?: string;
81
- slug?: string;
82
- title?: string;
83
- directory?: string;
84
- projectID?: string;
85
- time?: {
86
- created?: number;
87
- updated?: number;
88
- };
89
- project?: {
90
- worktree?: string;
91
- };
92
- }
93
- interface OpencodeEvent {
94
- type?: string;
95
- properties?: {
96
- sessionID?: string;
97
- info?: OpencodeSessionInfo;
98
- status?: {
99
- type?: string;
100
- };
101
- };
102
- }
103
- /**
104
- * Maps an opencode event type to the ARCS session status it implies.
105
- * Returns null for events that carry no status transition (the record is
106
- * refreshed but its status is left alone).
107
- */
108
- export declare function statusForOpencodeEvent(event: OpencodeEvent): SessionStatus | null;
109
- export interface OpencodeDiscoveryState {
110
- enabled: boolean;
111
- connected: boolean;
112
- baseUrl: string | null;
113
- }
114
- export declare function opencodeDiscoveryState(): OpencodeDiscoveryState;
115
- /**
116
- * Starts the discovery loop if an opencode endpoint is configured. Idempotent;
117
- * returns false when discovery is disabled (no configuration present).
118
- */
119
- export declare function startOpencodeDiscovery(config?: OpencodeConfig | null): boolean;
120
- /** Stops the discovery loop (test cleanup / server shutdown). */
121
- export declare function stopOpencodeDiscovery(): Promise<void>;
122
- export {};
123
- //# sourceMappingURL=opencode-client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"opencode-client.d.ts","sourceRoot":"","sources":["../../src/web-server/opencode-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAOH,OAAO,EAEL,KAAK,aAAa,EAGnB,MAAM,2BAA2B,CAAC;AAanC,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,cAAc,GAAG,IAAI,CAc9F;AAYD,MAAM,WAAW,qBAAqB;IACpC,2EAA2E;IAC3E,gBAAgB,EAAE,MAAM,CAAC;IACzB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,qBAAqB,EAC7B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAiCf;AAMD,MAAM,WAAW,0BAA0B;IACzC,6EAA6E;IAC7E,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,oFAAoF;AACpF,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,sBAAsB,CAAC,CAyCjC;AAeD,UAAU,mBAAmB;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACjC;AAED,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE;QACX,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,mBAAmB,CAAC;QAC3B,MAAM,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KAC5B,CAAC;CACH;AAQD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,GAAG,aAAa,GAAG,IAAI,CAuBjF;AA2DD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,wBAAgB,sBAAsB,IAAI,sBAAsB,CAE/D;AAoQD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,wBAAuB,GAAG,OAAO,CAW7E;AAED,iEAAiE;AACjE,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAa3D"}