@rryando/arcs 3.11.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/dist/cli/commands/hooks.d.ts +46 -6
  2. package/dist/cli/commands/hooks.d.ts.map +1 -1
  3. package/dist/cli/commands/hooks.js +190 -52
  4. package/dist/cli/commands/hooks.js.map +1 -1
  5. package/dist/cli/commands/web.js +14 -4
  6. package/dist/cli/commands/web.js.map +1 -1
  7. package/dist/cli/config.d.ts +14 -3
  8. package/dist/cli/config.d.ts.map +1 -1
  9. package/dist/cli/config.js +39 -38
  10. package/dist/cli/config.js.map +1 -1
  11. package/dist/cli/instructions.d.ts +13 -1
  12. package/dist/cli/instructions.d.ts.map +1 -1
  13. package/dist/cli/instructions.js +38 -3
  14. package/dist/cli/instructions.js.map +1 -1
  15. package/dist/cli/setup.d.ts.map +1 -1
  16. package/dist/cli/setup.js +76 -11
  17. package/dist/cli/setup.js.map +1 -1
  18. package/dist/shared/session-vocabulary.d.ts +88 -0
  19. package/dist/shared/session-vocabulary.d.ts.map +1 -0
  20. package/dist/shared/session-vocabulary.js +114 -0
  21. package/dist/shared/session-vocabulary.js.map +1 -0
  22. package/dist/utils/claude-code-hook-install.d.ts +1 -1
  23. package/dist/utils/claude-code-hook-install.d.ts.map +1 -1
  24. package/dist/utils/claude-code-hook-install.js +68 -3
  25. package/dist/utils/claude-code-hook-install.js.map +1 -1
  26. package/dist/utils/claude-transcript.d.ts +81 -2
  27. package/dist/utils/claude-transcript.d.ts.map +1 -1
  28. package/dist/utils/claude-transcript.js +33 -2
  29. package/dist/utils/claude-transcript.js.map +1 -1
  30. package/dist/utils/git.d.ts +21 -0
  31. package/dist/utils/git.d.ts.map +1 -1
  32. package/dist/utils/git.js +65 -1
  33. package/dist/utils/git.js.map +1 -1
  34. package/dist/utils/hook-contract.d.ts +36 -0
  35. package/dist/utils/hook-contract.d.ts.map +1 -0
  36. package/dist/utils/hook-contract.js +35 -0
  37. package/dist/utils/hook-contract.js.map +1 -0
  38. package/dist/utils/hook-token-store.d.ts +39 -0
  39. package/dist/utils/hook-token-store.d.ts.map +1 -1
  40. package/dist/utils/hook-token-store.js +46 -3
  41. package/dist/utils/hook-token-store.js.map +1 -1
  42. package/dist/utils/session-store.d.ts +226 -0
  43. package/dist/utils/session-store.d.ts.map +1 -1
  44. package/dist/utils/session-store.js +266 -1
  45. package/dist/utils/session-store.js.map +1 -1
  46. package/dist/web-client/assets/{GraphCanvas-dNyZ458L.js → GraphCanvas-CTyf_XXQ.js} +1 -1
  47. package/dist/web-client/assets/{MarkdownEditor-BmU9mdkN.js → MarkdownEditor-af2vwQOX.js} +1 -1
  48. package/dist/web-client/assets/{abnfDiagram-VRR7QNED-D1BFBoeF.js → abnfDiagram-VRR7QNED-CdxcKX9t.js} +1 -1
  49. package/dist/web-client/assets/architecture-TIHT7OUA-Bt2-DmfV.js +1 -0
  50. package/dist/web-client/assets/{architectureDiagram-ZJ3FMSHR-CA8hTWUK.js → architectureDiagram-ZJ3FMSHR-DOISDv6o.js} +1 -1
  51. package/dist/web-client/assets/{blockDiagram-677ZJIJ3-CQpb_KwX.js → blockDiagram-677ZJIJ3-DKwtbttM.js} +1 -1
  52. package/dist/web-client/assets/{c4Diagram-LMCZKHZV-BhpHX84V.js → c4Diagram-LMCZKHZV-CilqK-Mm.js} +1 -1
  53. package/dist/web-client/assets/channel-C2mb9np_.js +1 -0
  54. package/dist/web-client/assets/{chunk-32BRIVSS-BUusQQa_.js → chunk-32BRIVSS-C79m1mkG.js} +1 -1
  55. package/dist/web-client/assets/{chunk-52WLFC77-nNYwlftl.js → chunk-52WLFC77-C6WelGWJ.js} +1 -1
  56. package/dist/web-client/assets/{chunk-C7G6YPKG-D0a-yqnK.js → chunk-C7G6YPKG-DLg7ryWI.js} +1 -1
  57. package/dist/web-client/assets/{chunk-EX3LRPZG-IDuRMN-4.js → chunk-EX3LRPZG-DjWgo4gL.js} +1 -1
  58. package/dist/web-client/assets/{chunk-FWX5IMBZ-D_spTcqi.js → chunk-FWX5IMBZ-BgS9p_zy.js} +2 -2
  59. package/dist/web-client/assets/{chunk-HOUHSVGY-C-bcxwZS.js → chunk-HOUHSVGY-DuVR7dZO.js} +1 -1
  60. package/dist/web-client/assets/{chunk-ICXQ74PX-CjmK2bAM.js → chunk-ICXQ74PX-Y8DlnIJM.js} +1 -1
  61. package/dist/web-client/assets/{chunk-MOJQB5TN-Bkc08KWY.js → chunk-MOJQB5TN-BEM3QgeD.js} +1 -1
  62. package/dist/web-client/assets/{chunk-OGEWGWER-BAAYYvG9.js → chunk-OGEWGWER-DlM8LxGr.js} +1 -1
  63. package/dist/web-client/assets/{chunk-PUDLZKDR-WXbPY7NM.js → chunk-PUDLZKDR-c6cqNVTx.js} +1 -1
  64. package/dist/web-client/assets/{chunk-Q4XR5HBZ-DcbnjxQE.js → chunk-Q4XR5HBZ-C5lNmcka.js} +1 -1
  65. package/dist/web-client/assets/{chunk-V7JOEXUC-C6t75PAp.js → chunk-V7JOEXUC-nSswxvSG.js} +1 -1
  66. package/dist/web-client/assets/{chunk-VAUOI2AC-DVrJ0Ic7.js → chunk-VAUOI2AC-CqJkCkT0.js} +1 -1
  67. package/dist/web-client/assets/{chunk-VR4S4FIN-MOOFvGS0.js → chunk-VR4S4FIN-D3pFchin.js} +1 -1
  68. package/dist/web-client/assets/{chunk-WYO6CB5R-sK7Y2NZD.js → chunk-WYO6CB5R-BI9c-NzI.js} +1 -1
  69. package/dist/web-client/assets/{chunk-ZGVPDNZ5-a13RQsku.js → chunk-ZGVPDNZ5-CKTF2kLR.js} +1 -1
  70. package/dist/web-client/assets/classDiagram-OUVF2IWQ-CPd_w3Zr.js +1 -0
  71. package/dist/web-client/assets/classDiagram-v2-EOCWNBFH-CPd_w3Zr.js +1 -0
  72. package/dist/web-client/assets/{cynefin-VYW2F7L2-D8xaH-wO.js → cynefin-VYW2F7L2-BrJrnfh1.js} +1 -1
  73. package/dist/web-client/assets/{cynefinDiagram-TSTJHNR4-Bt__EqJW.js → cynefinDiagram-TSTJHNR4-9jYzPWJZ.js} +1 -1
  74. package/dist/web-client/assets/{dagre-VKFMJZFB-Bwgjwflz.js → dagre-VKFMJZFB-B705Djpu.js} +1 -1
  75. package/dist/web-client/assets/{diagram-FQU43EPY-CaPDVUq2.js → diagram-FQU43EPY-BfQAlUlJ.js} +1 -1
  76. package/dist/web-client/assets/{diagram-G47NLZAW-BQLB9YYA.js → diagram-G47NLZAW-s1YDe06A.js} +1 -1
  77. package/dist/web-client/assets/{diagram-NH7WQ7WH-BWo84w8Y.js → diagram-NH7WQ7WH-Dy3z11Hc.js} +1 -1
  78. package/dist/web-client/assets/{diagram-OA4YK3LP-bKn6Pz5s.js → diagram-OA4YK3LP-Bius2xUN.js} +1 -1
  79. package/dist/web-client/assets/{diagram-WEI45ONY-BRqV5Oy6.js → diagram-WEI45ONY-D7x4VcHM.js} +1 -1
  80. package/dist/web-client/assets/{ebnfDiagram-CCIWWBDH-DhUXL1-7.js → ebnfDiagram-CCIWWBDH-CBg1xrmD.js} +1 -1
  81. package/dist/web-client/assets/{erDiagram-Q63AITRT-HXAQQ-_F.js → erDiagram-Q63AITRT-CJRvTFvd.js} +1 -1
  82. package/dist/web-client/assets/eventmodeling-45OFAUF4-CTKRC2Yj.js +1 -0
  83. package/dist/web-client/assets/flowDiagram-23GEKE2U-CaZjFyU1.js +1 -0
  84. package/dist/web-client/assets/{ganttDiagram-NO4QXBWP-D-Ddf_Ii.js → ganttDiagram-NO4QXBWP-C_LsypZ4.js} +1 -1
  85. package/dist/web-client/assets/{gitGraph-TEB2WS4Q-BmHzs0uF.js → gitGraph-TEB2WS4Q-Dx2XxdGk.js} +1 -1
  86. package/dist/web-client/assets/{gitGraphDiagram-IHSO6WYX-YnQWrlh_.js → gitGraphDiagram-IHSO6WYX-DiKWkGWQ.js} +1 -1
  87. package/dist/web-client/assets/{index-DCWxuIeQ.js → index-CYwhkPtc.js} +38 -36
  88. package/dist/web-client/assets/index-wSzUPvml.css +2 -0
  89. package/dist/web-client/assets/{info-DKCQHKI2-DCT_B7RN.js → info-DKCQHKI2-DORwHenK.js} +1 -1
  90. package/dist/web-client/assets/{infoDiagram-FWYZ7A6U-D-le1Zhq.js → infoDiagram-FWYZ7A6U-CQecXS1E.js} +1 -1
  91. package/dist/web-client/assets/{ishikawaDiagram-FXEZZL3T-Jr1x2VJB.js → ishikawaDiagram-FXEZZL3T-CWhj60Zp.js} +1 -1
  92. package/dist/web-client/assets/{journeyDiagram-5HDEW3XC-BF9ELxj-.js → journeyDiagram-5HDEW3XC-Cj3z2U8u.js} +1 -1
  93. package/dist/web-client/assets/{kanban-definition-HUTT4EX6-C4fJqAxu.js → kanban-definition-HUTT4EX6-DFmBRenP.js} +1 -1
  94. package/dist/web-client/assets/{line-7N7ikFxa.js → line-C_Hxz9xb.js} +1 -1
  95. package/dist/web-client/assets/{mermaid-parser.core-QbC1icPt.js → mermaid-parser.core-E3xRdzPn.js} +3 -3
  96. package/dist/web-client/assets/{mermaid.core-C26d_UJm.js → mermaid.core-C2_CcotH.js} +3 -3
  97. package/dist/web-client/assets/{mindmap-definition-LN4V7U3C-D6TV1JDf.js → mindmap-definition-LN4V7U3C-Bs7VxPid.js} +1 -1
  98. package/dist/web-client/assets/{packet-7NZHBO7P-CR1vrGj3.js → packet-7NZHBO7P-D2nqso7i.js} +1 -1
  99. package/dist/web-client/assets/{pegDiagram-2B236MQR-xOMBBtfV.js → pegDiagram-2B236MQR-Cepo1sIu.js} +1 -1
  100. package/dist/web-client/assets/{pie-RZYD4A2V-BbWuhjwy.js → pie-RZYD4A2V-Sx0IGbXt.js} +1 -1
  101. package/dist/web-client/assets/{pieDiagram-ENE6RG2P-MsfnsqgW.js → pieDiagram-ENE6RG2P-D-PMDNhk.js} +1 -1
  102. package/dist/web-client/assets/{quadrantDiagram-ABIIQ3AL-BoI7zKXF.js → quadrantDiagram-ABIIQ3AL-BNGC7Fms.js} +1 -1
  103. package/dist/web-client/assets/{radar-I7S5WNFK-CbYXKToJ.js → radar-I7S5WNFK-CFf_-2OC.js} +1 -1
  104. package/dist/web-client/assets/{railroad-3IZDKUUU-6LxHDkLe.js → railroad-3IZDKUUU-BvZeVRGh.js} +1 -1
  105. package/dist/web-client/assets/railroad-abnf-AHOZXSZD-DnGh6x2O.js +1 -0
  106. package/dist/web-client/assets/railroad-ebnf-EBAXGLYW-CGfgCoaE.js +1 -0
  107. package/dist/web-client/assets/railroad-peg-LSFZ7HO6-BzQxYdqp.js +1 -0
  108. package/dist/web-client/assets/{railroadDiagram-RFXS5EU6-D6RUoUki.js → railroadDiagram-RFXS5EU6-D0iK_k84.js} +1 -1
  109. package/dist/web-client/assets/{requirementDiagram-TGXJPOKE-B6k4BDpE.js → requirementDiagram-TGXJPOKE-BPdsw9tz.js} +1 -1
  110. package/dist/web-client/assets/{sankeyDiagram-HTMAVEWB-BUDF-UFr.js → sankeyDiagram-HTMAVEWB-maA6ukOJ.js} +1 -1
  111. package/dist/web-client/assets/{sequenceDiagram-DBY2YBRQ-D6GqcsUi.js → sequenceDiagram-DBY2YBRQ-DKmAjmgr.js} +1 -1
  112. package/dist/web-client/assets/{stateDiagram-2N3HPSRC-WfJCQAK5.js → stateDiagram-2N3HPSRC-esxmzk3w.js} +1 -1
  113. package/dist/web-client/assets/stateDiagram-v2-6OUMAXLB-hcBqlOLc.js +1 -0
  114. package/dist/web-client/assets/{swimlanes-5IMT3BWC-BtMo82mC.js → swimlanes-5IMT3BWC-DFd-wGBv.js} +1 -1
  115. package/dist/web-client/assets/swimlanesDiagram-G3AALYLV-DbSrPBYr.js +8 -0
  116. package/dist/web-client/assets/{timeline-definition-FHXFAJF6-CoAmv2Sn.js → timeline-definition-FHXFAJF6-C7SG8MQH.js} +1 -1
  117. package/dist/web-client/assets/{treeView-QDETBFTQ-BWsKzE1s.js → treeView-QDETBFTQ-M0rhxbs2.js} +1 -1
  118. package/dist/web-client/assets/{treemap-6X3UGDF4-i_qGtB3o.js → treemap-6X3UGDF4-BQfkQxSh.js} +1 -1
  119. package/dist/web-client/assets/{vennDiagram-L72KCM5P-DYkiLe-P.js → vennDiagram-L72KCM5P-CyIlb8ju.js} +1 -1
  120. package/dist/web-client/assets/{wardley-OPB4EBWU-Daaqr1Vp.js → wardley-OPB4EBWU-EE-7q8M1.js} +1 -1
  121. package/dist/web-client/assets/{wardleyDiagram-EHGQE667-Bofbsg3J.js → wardleyDiagram-EHGQE667-bY8XdYYS.js} +1 -1
  122. package/dist/web-client/assets/{xychartDiagram-FW5EYKEG-KNF4VTfL.js → xychartDiagram-FW5EYKEG-AhuXJ3de.js} +1 -1
  123. package/dist/web-client/index.html +2 -2
  124. package/dist/web-server/app.d.ts +4 -1
  125. package/dist/web-server/app.d.ts.map +1 -1
  126. package/dist/web-server/app.js +19 -0
  127. package/dist/web-server/app.js.map +1 -1
  128. package/dist/web-server/claude-runner.d.ts +109 -7
  129. package/dist/web-server/claude-runner.d.ts.map +1 -1
  130. package/dist/web-server/claude-runner.js +329 -50
  131. package/dist/web-server/claude-runner.js.map +1 -1
  132. package/dist/web-server/index.d.ts +2 -2
  133. package/dist/web-server/index.d.ts.map +1 -1
  134. package/dist/web-server/index.js +3 -2
  135. package/dist/web-server/index.js.map +1 -1
  136. package/dist/web-server/permission-policy.d.ts +46 -0
  137. package/dist/web-server/permission-policy.d.ts.map +1 -0
  138. package/dist/web-server/permission-policy.js +96 -0
  139. package/dist/web-server/permission-policy.js.map +1 -0
  140. package/dist/web-server/prompt-assembly.d.ts +454 -0
  141. package/dist/web-server/prompt-assembly.d.ts.map +1 -0
  142. package/dist/web-server/prompt-assembly.js +1122 -0
  143. package/dist/web-server/prompt-assembly.js.map +1 -0
  144. package/dist/web-server/routes/hook-events.d.ts +28 -3
  145. package/dist/web-server/routes/hook-events.d.ts.map +1 -1
  146. package/dist/web-server/routes/hook-events.js +209 -24
  147. package/dist/web-server/routes/hook-events.js.map +1 -1
  148. package/dist/web-server/routes/sessions.d.ts +7 -5
  149. package/dist/web-server/routes/sessions.d.ts.map +1 -1
  150. package/dist/web-server/routes/sessions.js +1030 -174
  151. package/dist/web-server/routes/sessions.js.map +1 -1
  152. package/dist/web-server/routes/workspace.d.ts +27 -0
  153. package/dist/web-server/routes/workspace.d.ts.map +1 -0
  154. package/dist/web-server/routes/workspace.js +280 -0
  155. package/dist/web-server/routes/workspace.js.map +1 -0
  156. package/dist/web-server/run-event-log.d.ts +167 -0
  157. package/dist/web-server/run-event-log.d.ts.map +1 -0
  158. package/dist/web-server/run-event-log.js +468 -0
  159. package/dist/web-server/run-event-log.js.map +1 -0
  160. package/dist/web-server/session-reconciler.d.ts +162 -0
  161. package/dist/web-server/session-reconciler.d.ts.map +1 -0
  162. package/dist/web-server/session-reconciler.js +363 -0
  163. package/dist/web-server/session-reconciler.js.map +1 -0
  164. package/dist/web-server/static.d.ts +7 -0
  165. package/dist/web-server/static.d.ts.map +1 -1
  166. package/dist/web-server/static.js +46 -3
  167. package/dist/web-server/static.js.map +1 -1
  168. package/dist/web-server/web-auth.d.ts +17 -0
  169. package/dist/web-server/web-auth.d.ts.map +1 -0
  170. package/dist/web-server/web-auth.js +33 -0
  171. package/dist/web-server/web-auth.js.map +1 -0
  172. package/dist/web-server/web-token.d.ts +39 -0
  173. package/dist/web-server/web-token.d.ts.map +1 -0
  174. package/dist/web-server/web-token.js +71 -0
  175. package/dist/web-server/web-token.js.map +1 -0
  176. package/opencode/arcs/manifest.json +8 -8
  177. package/package.json +1 -1
  178. package/scripts/claude-code-session-hook.mjs +49 -3
  179. package/scripts/deploy-claudecode-bundle.mjs +24 -3
  180. package/dist/web-client/assets/architecture-TIHT7OUA-CJqI5wNI.js +0 -1
  181. package/dist/web-client/assets/channel-C8DlmyVe.js +0 -1
  182. package/dist/web-client/assets/classDiagram-OUVF2IWQ-p32N1P_G.js +0 -1
  183. package/dist/web-client/assets/classDiagram-v2-EOCWNBFH-p32N1P_G.js +0 -1
  184. package/dist/web-client/assets/eventmodeling-45OFAUF4-Bj5P8mZJ.js +0 -1
  185. package/dist/web-client/assets/flowDiagram-23GEKE2U-37BztFri.js +0 -1
  186. package/dist/web-client/assets/index-3mNPVkix.css +0 -2
  187. package/dist/web-client/assets/railroad-abnf-AHOZXSZD-2Dg9wu0J.js +0 -1
  188. package/dist/web-client/assets/railroad-ebnf-EBAXGLYW-C_E2ot0R.js +0 -1
  189. package/dist/web-client/assets/railroad-peg-LSFZ7HO6-Bs9UQR1b.js +0 -1
  190. package/dist/web-client/assets/stateDiagram-v2-6OUMAXLB-BCMWGnsJ.js +0 -1
  191. package/dist/web-client/assets/swimlanesDiagram-G3AALYLV-DmudmLcK.js +0 -8
@@ -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.0.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,12 @@
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
+ * Two 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, and UserPromptSubmit delivers messages queued from the web UI. Both
13
+ * emit Claude Code's `hookSpecificOutput` envelope on stdout; the other two
14
+ * print nothing.
15
+ *
10
16
  * HARD RULE: this script never blocks the session. Any failure — ARCS not
11
17
  * running, token rejected, timeout, malformed JSON — is swallowed, nothing is
12
18
  * printed, and the exit code stays 0. Exit code 2 (the "block" signal) is never
@@ -20,10 +26,28 @@
20
26
  * ARCS_HOOK_URL ARCS web server URL (default http://127.0.0.1:4173)
21
27
  */
22
28
 
29
+ // DEFAULT_URL and EVENTS are literals on purpose: this file runs standalone out
30
+ // of the user's settings.json and importing ARCS would give the HARD RULE above
31
+ // a way to fail. `src/utils/hook-contract.ts` owns the same two values for the
32
+ // TypeScript side, and `test/hook-contract-parity.test.ts` parses THIS source
33
+ // and fails if the two ever diverge — so keep the shapes greppable: a
34
+ // double-quoted DEFAULT_URL, and a flat `new Set([...])` of string literals.
23
35
  const DEFAULT_URL = "http://127.0.0.1:4173";
24
36
  /** Short by design: a hung ARCS server must not stall prompt submission. */
25
37
  const TIMEOUT_MS = 1500;
26
38
  const EVENTS = new Set(["SessionStart", "UserPromptSubmit", "SessionEnd", "Stop"]);
39
+ /**
40
+ * Refusal bound on a context block the server sends, in characters.
41
+ *
42
+ * The server caps the SessionStart block at 2500 (`SESSION_START_STAGE_CAP` in
43
+ * `src/web-server/routes/hook-events.ts`); this is the CLIENT's own limit, so a
44
+ * misbehaving, mismatched or hostile ARCS cannot shove an unbounded body into
45
+ * the head of the user's live session. Over the bound the block is dropped
46
+ * whole rather than clipped — a clip would sever a wrapper's closing delimiter.
47
+ * `test/claude-code-hook-script.test.ts` parses this literal and fails if the
48
+ * server's cap ever climbs above it, so the two cannot silently cross.
49
+ */
50
+ const MAX_CONTEXT_CHARS = 4000;
27
51
 
28
52
  /** Never rejects: an unreadable stdin yields "" and the run turns into a no-op. */
29
53
  function readStdin() {
@@ -89,11 +113,33 @@ async function main() {
89
113
  });
90
114
  if (!response.ok) return;
91
115
 
92
- // Only UserPromptSubmit can inject context; the other events are pure
93
- // notifications and answer with empty stdout.
94
- if (eventName !== "UserPromptSubmit") return;
116
+ // Two events can inject context: SessionStart mirrors ARCS's staged
117
+ // environment into the fresh session, UserPromptSubmit delivers whatever the
118
+ // web UI queued. SessionEnd and Stop are pure notifications and answer with
119
+ // empty stdout.
120
+ if (eventName !== "SessionStart" && eventName !== "UserPromptSubmit") return;
95
121
 
96
122
  const envelope = await response.json();
123
+
124
+ if (eventName === "SessionStart") {
125
+ const staged = envelope?.data?.stagedContext;
126
+ // Every rejection here is a silent no-op, never a repair: an absent field,
127
+ // a non-string, an empty string and an oversized body all mean "ARCS has
128
+ // nothing usable to stage", and the session proceeds exactly as if the
129
+ // bridge were not installed.
130
+ if (typeof staged !== "string" || staged === "" || staged.length > MAX_CONTEXT_CHARS) return;
131
+
132
+ process.stdout.write(
133
+ JSON.stringify({
134
+ hookSpecificOutput: {
135
+ hookEventName: "SessionStart",
136
+ additionalContext: staged,
137
+ },
138
+ }),
139
+ );
140
+ return;
141
+ }
142
+
97
143
  const messages = envelope?.data?.queuedMessages;
98
144
  if (!Array.isArray(messages) || messages.length === 0) return;
99
145
 
@@ -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};