@rryando/arcs 4.2.1 → 5.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 (192) hide show
  1. package/README.md +17 -0
  2. package/dist/cli/arcs-flash.d.ts +1 -1
  3. package/dist/cli/arcs-flash.d.ts.map +1 -1
  4. package/dist/cli/arcs-flash.js +8 -4
  5. package/dist/cli/arcs-flash.js.map +1 -1
  6. package/dist/cli/arcs-orchestrate.d.ts +1 -1
  7. package/dist/cli/arcs-orchestrate.d.ts.map +1 -1
  8. package/dist/cli/arcs-orchestrate.js +6 -2
  9. package/dist/cli/arcs-orchestrate.js.map +1 -1
  10. package/dist/cli/arg-parser.d.ts +1 -0
  11. package/dist/cli/arg-parser.d.ts.map +1 -1
  12. package/dist/cli/arg-parser.js +12 -2
  13. package/dist/cli/arg-parser.js.map +1 -1
  14. package/dist/cli/command-registry.d.ts +2 -0
  15. package/dist/cli/command-registry.d.ts.map +1 -1
  16. package/dist/cli/command-registry.js.map +1 -1
  17. package/dist/cli/commands/index.d.ts +2 -0
  18. package/dist/cli/commands/index.d.ts.map +1 -1
  19. package/dist/cli/commands/index.js +2 -0
  20. package/dist/cli/commands/index.js.map +1 -1
  21. package/dist/cli/commands/proposal-doc.js +3 -2
  22. package/dist/cli/commands/proposal-doc.js.map +1 -1
  23. package/dist/cli/commands/remember.js +1 -0
  24. package/dist/cli/commands/remember.js.map +1 -1
  25. package/dist/cli/commands/worktree.d.ts +2 -0
  26. package/dist/cli/commands/worktree.d.ts.map +1 -0
  27. package/dist/cli/commands/worktree.js +608 -0
  28. package/dist/cli/commands/worktree.js.map +1 -0
  29. package/dist/cli/dag-commands.d.ts +9 -0
  30. package/dist/cli/dag-commands.d.ts.map +1 -1
  31. package/dist/cli/dag-commands.js +37 -26
  32. package/dist/cli/dag-commands.js.map +1 -1
  33. package/dist/cli/help-generator.d.ts.map +1 -1
  34. package/dist/cli/help-generator.js +3 -0
  35. package/dist/cli/help-generator.js.map +1 -1
  36. package/dist/cli/index.d.ts.map +1 -1
  37. package/dist/cli/index.js +14 -24
  38. package/dist/cli/index.js.map +1 -1
  39. package/dist/cli/orchestrator-shared-blocks.d.ts +7 -5
  40. package/dist/cli/orchestrator-shared-blocks.d.ts.map +1 -1
  41. package/dist/cli/orchestrator-shared-blocks.js +45 -21
  42. package/dist/cli/orchestrator-shared-blocks.js.map +1 -1
  43. package/dist/cli/write-gate.d.ts +20 -0
  44. package/dist/cli/write-gate.d.ts.map +1 -0
  45. package/dist/cli/write-gate.js +39 -0
  46. package/dist/cli/write-gate.js.map +1 -0
  47. package/dist/utils/worktree-store.d.ts +54 -0
  48. package/dist/utils/worktree-store.d.ts.map +1 -0
  49. package/dist/utils/worktree-store.js +150 -0
  50. package/dist/utils/worktree-store.js.map +1 -0
  51. package/dist/utils/worktree.d.ts +71 -0
  52. package/dist/utils/worktree.d.ts.map +1 -0
  53. package/dist/utils/worktree.js +197 -0
  54. package/dist/utils/worktree.js.map +1 -0
  55. package/dist/web-client/assets/{GraphCanvas-Dw6EcoDb.js → GraphCanvas-BYZE4sO9.js} +1 -1
  56. package/dist/web-client/assets/{MarkdownEditor-Cz5_44Ej.js → MarkdownEditor-BKx6M1cw.js} +1 -1
  57. package/dist/web-client/assets/{abnfDiagram-VRR7QNED-CFJzLuew.js → abnfDiagram-VRR7QNED-D4kt0l2y.js} +1 -1
  58. package/dist/web-client/assets/architecture-TIHT7OUA-CIdGE6VO.js +1 -0
  59. package/dist/web-client/assets/{architectureDiagram-ZJ3FMSHR-FRlSgnnW.js → architectureDiagram-ZJ3FMSHR-bu29SJFS.js} +1 -1
  60. package/dist/web-client/assets/{blockDiagram-677ZJIJ3-WUkkunPZ.js → blockDiagram-677ZJIJ3-hsu7mXKw.js} +1 -1
  61. package/dist/web-client/assets/{c4Diagram-LMCZKHZV-BKeAsL6F.js → c4Diagram-LMCZKHZV-DMllRlT_.js} +1 -1
  62. package/dist/web-client/assets/channel-CBg-s-ZD.js +1 -0
  63. package/dist/web-client/assets/{chunk-32BRIVSS-B0b9kUcF.js → chunk-32BRIVSS-BSzwj5eM.js} +1 -1
  64. package/dist/web-client/assets/{chunk-52WLFC77-i6Y-vfL3.js → chunk-52WLFC77-RDdZn6yY.js} +1 -1
  65. package/dist/web-client/assets/{chunk-C7G6YPKG-atYWm6iP.js → chunk-C7G6YPKG-DQr--txT.js} +1 -1
  66. package/dist/web-client/assets/{chunk-EX3LRPZG-CZD6y0UU.js → chunk-EX3LRPZG-Bb8nc4z4.js} +1 -1
  67. package/dist/web-client/assets/{chunk-FWX5IMBZ-CVErR-UZ.js → chunk-FWX5IMBZ-QvBpOcOg.js} +2 -2
  68. package/dist/web-client/assets/{chunk-HOUHSVGY-BlHO2iQ3.js → chunk-HOUHSVGY-B0mX_yjc.js} +1 -1
  69. package/dist/web-client/assets/{chunk-ICXQ74PX-Ar8kfXfa.js → chunk-ICXQ74PX-BmJSQqOH.js} +1 -1
  70. package/dist/web-client/assets/{chunk-MOJQB5TN-DKrK867P.js → chunk-MOJQB5TN-BrEI4GGn.js} +1 -1
  71. package/dist/web-client/assets/{chunk-OGEWGWER-BmGykUeg.js → chunk-OGEWGWER-CrqDPOWP.js} +1 -1
  72. package/dist/web-client/assets/{chunk-PUDLZKDR-Bq23pnso.js → chunk-PUDLZKDR-DfPKldpG.js} +1 -1
  73. package/dist/web-client/assets/{chunk-Q4XR5HBZ-g15qvFAN.js → chunk-Q4XR5HBZ-ekATI9aV.js} +1 -1
  74. package/dist/web-client/assets/{chunk-V7JOEXUC-uyXA7S9r.js → chunk-V7JOEXUC-C5APsP1t.js} +1 -1
  75. package/dist/web-client/assets/{chunk-VAUOI2AC-WofZ-2M0.js → chunk-VAUOI2AC-BhfSWJZI.js} +1 -1
  76. package/dist/web-client/assets/{chunk-VR4S4FIN-DtTkK86v.js → chunk-VR4S4FIN-BGa-44J7.js} +1 -1
  77. package/dist/web-client/assets/{chunk-WYO6CB5R-zVyUwJq3.js → chunk-WYO6CB5R-By1K0guW.js} +1 -1
  78. package/dist/web-client/assets/{chunk-ZGVPDNZ5-CA1Oe3TK.js → chunk-ZGVPDNZ5-Vnzpc76F.js} +1 -1
  79. package/dist/web-client/assets/classDiagram-OUVF2IWQ-ciwDjhUR.js +1 -0
  80. package/dist/web-client/assets/classDiagram-v2-EOCWNBFH-ciwDjhUR.js +1 -0
  81. package/dist/web-client/assets/{cynefin-VYW2F7L2-ivJY1h_9.js → cynefin-VYW2F7L2-C6MOMOOz.js} +1 -1
  82. package/dist/web-client/assets/{cynefinDiagram-TSTJHNR4-D2DstShq.js → cynefinDiagram-TSTJHNR4-Cseyu79b.js} +1 -1
  83. package/dist/web-client/assets/{dagre-VKFMJZFB-CwnMRy0K.js → dagre-VKFMJZFB-CQJlIuNh.js} +1 -1
  84. package/dist/web-client/assets/{diagram-FQU43EPY-BKJv6Cvw.js → diagram-FQU43EPY-DpqDxhq4.js} +1 -1
  85. package/dist/web-client/assets/{diagram-G47NLZAW-CwCXcgU5.js → diagram-G47NLZAW-C11fYYaF.js} +1 -1
  86. package/dist/web-client/assets/{diagram-NH7WQ7WH-CkghU1-6.js → diagram-NH7WQ7WH-BiG-uRAF.js} +1 -1
  87. package/dist/web-client/assets/{diagram-OA4YK3LP-D3siQIGu.js → diagram-OA4YK3LP-CIXWWjq-.js} +1 -1
  88. package/dist/web-client/assets/{diagram-WEI45ONY-CSs9xTBn.js → diagram-WEI45ONY-C3OgIWu9.js} +1 -1
  89. package/dist/web-client/assets/{ebnfDiagram-CCIWWBDH--i52vMiv.js → ebnfDiagram-CCIWWBDH-BHF_NA3_.js} +1 -1
  90. package/dist/web-client/assets/{erDiagram-Q63AITRT-q2hgOBY1.js → erDiagram-Q63AITRT-CUOJCrLy.js} +1 -1
  91. package/dist/web-client/assets/eventmodeling-45OFAUF4-DxfboL1J.js +1 -0
  92. package/dist/web-client/assets/flowDiagram-23GEKE2U-C3NzpTtI.js +1 -0
  93. package/dist/web-client/assets/{ganttDiagram-NO4QXBWP-BZ2rBbTe.js → ganttDiagram-NO4QXBWP-D_4BMJ-g.js} +1 -1
  94. package/dist/web-client/assets/{gitGraph-TEB2WS4Q-OnJ8tHgt.js → gitGraph-TEB2WS4Q-CBuaZBId.js} +1 -1
  95. package/dist/web-client/assets/{gitGraphDiagram-IHSO6WYX-CPNExFAr.js → gitGraphDiagram-IHSO6WYX-BbztsGuO.js} +1 -1
  96. package/dist/web-client/assets/index-B1KVIr80.css +2 -0
  97. package/dist/web-client/assets/{index-DCBn-YrR.js → index-BWd2fBNL.js} +38 -38
  98. package/dist/web-client/assets/{info-DKCQHKI2-DGuJbmdY.js → info-DKCQHKI2-Bzi0Xjro.js} +1 -1
  99. package/dist/web-client/assets/{infoDiagram-FWYZ7A6U-ADIAn-P5.js → infoDiagram-FWYZ7A6U-BkeEKcr0.js} +1 -1
  100. package/dist/web-client/assets/{ishikawaDiagram-FXEZZL3T-CUx-RGfg.js → ishikawaDiagram-FXEZZL3T-CVusWu0p.js} +1 -1
  101. package/dist/web-client/assets/{journeyDiagram-5HDEW3XC-BH7-tBBy.js → journeyDiagram-5HDEW3XC-BUxu71zw.js} +1 -1
  102. package/dist/web-client/assets/{kanban-definition-HUTT4EX6-BGEXBnI2.js → kanban-definition-HUTT4EX6-BE8Hv4Kd.js} +1 -1
  103. package/dist/web-client/assets/{line-CC-5ezU8.js → line-CiAoINJS.js} +1 -1
  104. package/dist/web-client/assets/{mermaid-parser.core-Dw18Fjbq.js → mermaid-parser.core-BW47khiS.js} +3 -3
  105. package/dist/web-client/assets/{mermaid.core-CMQBgE43.js → mermaid.core-DP--Jl9R.js} +3 -3
  106. package/dist/web-client/assets/{mindmap-definition-LN4V7U3C-CGtjw8tB.js → mindmap-definition-LN4V7U3C-CvWJUqdq.js} +1 -1
  107. package/dist/web-client/assets/{packet-7NZHBO7P-w71Y4Hzd.js → packet-7NZHBO7P-XtzX9SaQ.js} +1 -1
  108. package/dist/web-client/assets/{pegDiagram-2B236MQR-DWtfEm4T.js → pegDiagram-2B236MQR-XNo0K1ct.js} +1 -1
  109. package/dist/web-client/assets/{pie-RZYD4A2V-S9ztgnWs.js → pie-RZYD4A2V-B1eUd9yt.js} +1 -1
  110. package/dist/web-client/assets/{pieDiagram-ENE6RG2P-BWZQPN4m.js → pieDiagram-ENE6RG2P-CRSb5z-4.js} +1 -1
  111. package/dist/web-client/assets/{quadrantDiagram-ABIIQ3AL-DINDwblH.js → quadrantDiagram-ABIIQ3AL-DziMaQxE.js} +1 -1
  112. package/dist/web-client/assets/{radar-I7S5WNFK-BOGl9krB.js → radar-I7S5WNFK-BpRqZH2g.js} +1 -1
  113. package/dist/web-client/assets/{railroad-3IZDKUUU-CR9kuYSZ.js → railroad-3IZDKUUU-FDIHW04k.js} +1 -1
  114. package/dist/web-client/assets/railroad-abnf-AHOZXSZD-BKj6JAhH.js +1 -0
  115. package/dist/web-client/assets/railroad-ebnf-EBAXGLYW-ChDM1OBv.js +1 -0
  116. package/dist/web-client/assets/railroad-peg-LSFZ7HO6-DvwA2e0i.js +1 -0
  117. package/dist/web-client/assets/{railroadDiagram-RFXS5EU6-byLCs9hp.js → railroadDiagram-RFXS5EU6-Cs7EVBaz.js} +1 -1
  118. package/dist/web-client/assets/{requirementDiagram-TGXJPOKE-Dn_FtbqW.js → requirementDiagram-TGXJPOKE-B9_Lj1ga.js} +1 -1
  119. package/dist/web-client/assets/{sankeyDiagram-HTMAVEWB-DUjRrCeC.js → sankeyDiagram-HTMAVEWB-DuTJTiy0.js} +1 -1
  120. package/dist/web-client/assets/{sequenceDiagram-DBY2YBRQ-BmBz8Wpq.js → sequenceDiagram-DBY2YBRQ-vOCU5UoE.js} +1 -1
  121. package/dist/web-client/assets/{stateDiagram-2N3HPSRC-BAYHjmqB.js → stateDiagram-2N3HPSRC-rxAnfzWn.js} +1 -1
  122. package/dist/web-client/assets/stateDiagram-v2-6OUMAXLB-B3EvQPEe.js +1 -0
  123. package/dist/web-client/assets/{swimlanes-5IMT3BWC-Bm942AR-.js → swimlanes-5IMT3BWC-gdVZUnPe.js} +1 -1
  124. package/dist/web-client/assets/swimlanesDiagram-G3AALYLV-WcOXuCPg.js +8 -0
  125. package/dist/web-client/assets/{timeline-definition-FHXFAJF6-CHAZHhQk.js → timeline-definition-FHXFAJF6-Do68JyGy.js} +1 -1
  126. package/dist/web-client/assets/{treeView-QDETBFTQ-DHHkLsSy.js → treeView-QDETBFTQ-CdZkmg80.js} +1 -1
  127. package/dist/web-client/assets/{treemap-6X3UGDF4-BUxZ8fhY.js → treemap-6X3UGDF4-ub54fmpW.js} +1 -1
  128. package/dist/web-client/assets/{vennDiagram-L72KCM5P-BL9TRcUU.js → vennDiagram-L72KCM5P-D-r8NBEp.js} +1 -1
  129. package/dist/web-client/assets/{wardley-OPB4EBWU-CfJ5mO-y.js → wardley-OPB4EBWU-CTleH1-J.js} +1 -1
  130. package/dist/web-client/assets/{wardleyDiagram-EHGQE667-BlH1TSjy.js → wardleyDiagram-EHGQE667-BU8Kw39F.js} +1 -1
  131. package/dist/web-client/assets/{xychartDiagram-FW5EYKEG-BJN6wtrV.js → xychartDiagram-FW5EYKEG-CfNnag6i.js} +1 -1
  132. package/dist/web-client/index.html +2 -2
  133. package/dist/web-server/routes/sessions.js +43 -2
  134. package/dist/web-server/routes/sessions.js.map +1 -1
  135. package/opencode/arcs/.opencode/plugins/arcs.js +5 -1
  136. package/opencode/arcs/bundle-runtime.json +3 -0
  137. package/opencode/arcs/prompts/arcs-docs.txt +1 -1
  138. package/opencode/arcs/prompts/arcs-flash.txt +46 -20
  139. package/opencode/arcs/prompts/arcs-orchestrate-caveman.txt +47 -21
  140. package/opencode/arcs/prompts/arcs-orchestrate.txt +47 -21
  141. package/opencode/arcs/prompts/software-engineer.txt +6 -0
  142. package/opencode/arcs/skills/writing-proposals/SKILL.md +90 -0
  143. package/package.json +2 -2
  144. package/scripts/build-opencode-bundle.mjs +7 -8
  145. package/dist/cli/commands/hooks.d.ts +0 -76
  146. package/dist/cli/commands/hooks.d.ts.map +0 -1
  147. package/dist/cli/commands/hooks.js +0 -436
  148. package/dist/cli/commands/hooks.js.map +0 -1
  149. package/dist/utils/claude-code-hook-install.d.ts +0 -80
  150. package/dist/utils/claude-code-hook-install.d.ts.map +0 -1
  151. package/dist/utils/claude-code-hook-install.js +0 -212
  152. package/dist/utils/claude-code-hook-install.js.map +0 -1
  153. package/dist/utils/graphify-knowledge.d.ts +0 -22
  154. package/dist/utils/graphify-knowledge.d.ts.map +0 -1
  155. package/dist/utils/graphify-knowledge.js +0 -47
  156. package/dist/utils/graphify-knowledge.js.map +0 -1
  157. package/dist/utils/graphify.d.ts +0 -104
  158. package/dist/utils/graphify.d.ts.map +0 -1
  159. package/dist/utils/graphify.js +0 -439
  160. package/dist/utils/graphify.js.map +0 -1
  161. package/dist/utils/hook-contract.d.ts +0 -36
  162. package/dist/utils/hook-contract.d.ts.map +0 -1
  163. package/dist/utils/hook-contract.js +0 -35
  164. package/dist/utils/hook-contract.js.map +0 -1
  165. package/dist/utils/hook-token-store.d.ts +0 -63
  166. package/dist/utils/hook-token-store.d.ts.map +0 -1
  167. package/dist/utils/hook-token-store.js +0 -88
  168. package/dist/utils/hook-token-store.js.map +0 -1
  169. package/dist/web-client/assets/architecture-TIHT7OUA-CoHvhex9.js +0 -1
  170. package/dist/web-client/assets/channel-D8xMXC5_.js +0 -1
  171. package/dist/web-client/assets/classDiagram-OUVF2IWQ-Doj1_hvZ.js +0 -1
  172. package/dist/web-client/assets/classDiagram-v2-EOCWNBFH-Doj1_hvZ.js +0 -1
  173. package/dist/web-client/assets/eventmodeling-45OFAUF4-ESVuFkJJ.js +0 -1
  174. package/dist/web-client/assets/flowDiagram-23GEKE2U-DN9SdR9f.js +0 -1
  175. package/dist/web-client/assets/index-wSzUPvml.css +0 -2
  176. package/dist/web-client/assets/railroad-abnf-AHOZXSZD-BvbCHrlR.js +0 -1
  177. package/dist/web-client/assets/railroad-ebnf-EBAXGLYW-D869lbCL.js +0 -1
  178. package/dist/web-client/assets/railroad-peg-LSFZ7HO6-r4TXaJPI.js +0 -1
  179. package/dist/web-client/assets/stateDiagram-v2-6OUMAXLB-Bl-1K1zV.js +0 -1
  180. package/dist/web-client/assets/swimlanesDiagram-G3AALYLV-DHU7bsfA.js +0 -8
  181. package/dist/web-server/hook-auth.d.ts +0 -12
  182. package/dist/web-server/hook-auth.d.ts.map +0 -1
  183. package/dist/web-server/hook-auth.js +0 -36
  184. package/dist/web-server/hook-auth.js.map +0 -1
  185. package/dist/web-server/opencode-client.d.ts +0 -123
  186. package/dist/web-server/opencode-client.d.ts.map +0 -1
  187. package/dist/web-server/opencode-client.js +0 -514
  188. package/dist/web-server/opencode-client.js.map +0 -1
  189. package/dist/web-server/routes/hook-events.d.ts +0 -43
  190. package/dist/web-server/routes/hook-events.d.ts.map +0 -1
  191. package/dist/web-server/routes/hook-events.js +0 -316
  192. package/dist/web-server/routes/hook-events.js.map +0 -1
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Worktree registry storage for ARCS projects.
3
+ *
4
+ * Maps plans to their dedicated git worktrees (one plan = one tree).
5
+ * The registry is a plain JSON file (`worktrees.json`) in the project
6
+ * data directory; git state itself is never consulted here — callers
7
+ * cross-check registry rows against `git worktree list`.
8
+ */
9
+ import { basename, join, resolve } from "node:path";
10
+ import { invalidateGraphCache } from "../retrieval/graph-invalidate.js";
11
+ import { withLock } from "./file-lock.js";
12
+ import { readJsonSafe } from "./json.js";
13
+ import { normalizeIdentifier } from "./slug.js";
14
+ import { ensureDir, nowISO, writeJson } from "./storage-utils.js";
15
+ // ---------------------------------------------------------------------------
16
+ // Constants
17
+ // ---------------------------------------------------------------------------
18
+ export const WORKTREES_FILE = "worktrees.json";
19
+ // ---------------------------------------------------------------------------
20
+ // Internal helpers
21
+ // ---------------------------------------------------------------------------
22
+ function registryPath(projectDir) {
23
+ return join(projectDir, WORKTREES_FILE);
24
+ }
25
+ /**
26
+ * A registry row is usable only when its core fields are strings. Malformed
27
+ * rows are dropped rather than failing the whole read — a hand-edited or
28
+ * partially-written file degrades to "fewer worktrees registered", which
29
+ * `validate` surfaces as drift instead of crashing commands.
30
+ */
31
+ function sanitizeRows(rows) {
32
+ const out = [];
33
+ for (const row of rows) {
34
+ if (!row || typeof row !== "object")
35
+ continue;
36
+ const candidate = row;
37
+ if (typeof candidate.planId === "string" &&
38
+ candidate.planId &&
39
+ typeof candidate.path === "string" &&
40
+ candidate.path &&
41
+ typeof candidate.branch === "string" &&
42
+ candidate.branch) {
43
+ out.push({
44
+ planId: candidate.planId,
45
+ path: candidate.path,
46
+ branch: candidate.branch,
47
+ ...(typeof candidate.baseCommit === "string" && { baseCommit: candidate.baseCommit }),
48
+ createdAt: typeof candidate.createdAt === "string" ? candidate.createdAt : "",
49
+ });
50
+ }
51
+ }
52
+ return out;
53
+ }
54
+ /** Normalize a registered path so collision checks compare like with like. */
55
+ function normalizeEntryPath(path) {
56
+ return resolve(path.replace(/\\/g, "/"));
57
+ }
58
+ // ---------------------------------------------------------------------------
59
+ // Public API
60
+ // ---------------------------------------------------------------------------
61
+ /**
62
+ * Read all worktree registrations for a project. Missing or corrupt file
63
+ * yields an empty registry (fail open); malformed rows are skipped.
64
+ */
65
+ export async function readWorktreeRegistry(projectDir) {
66
+ const data = await readJsonSafe(registryPath(projectDir));
67
+ if (!data || !Array.isArray(data.worktrees)) {
68
+ return [];
69
+ }
70
+ return sanitizeRows(data.worktrees);
71
+ }
72
+ /**
73
+ * Insert or update a worktree registration keyed by normalized plan id.
74
+ * Existing `createdAt` is preserved on update; path/branch/baseCommit are
75
+ * refreshed. Returns the persisted row.
76
+ */
77
+ export async function upsertWorktreeEntry(projectDir, input) {
78
+ await ensureDir(projectDir);
79
+ const planId = normalizeIdentifier(input.planId);
80
+ return withLock(registryPath(projectDir), async () => {
81
+ const existing = await readWorktreeRegistry(projectDir);
82
+ const prior = existing.find((entry) => entry.planId === planId);
83
+ const entry = {
84
+ planId,
85
+ path: input.path,
86
+ branch: input.branch,
87
+ ...(input.baseCommit !== undefined ? { baseCommit: input.baseCommit } : {}),
88
+ createdAt: prior?.createdAt || nowISO(),
89
+ };
90
+ const rows = prior
91
+ ? existing.map((row) => (row.planId === planId ? entry : row))
92
+ : [...existing, entry];
93
+ await writeJson(registryPath(projectDir), { worktrees: rows });
94
+ invalidateGraphCache(basename(projectDir));
95
+ return entry;
96
+ });
97
+ }
98
+ /**
99
+ * Remove the registration for a plan. Returns true if a row was removed,
100
+ * false when the plan had no registration.
101
+ */
102
+ export async function removeWorktreeEntry(projectDir, planId) {
103
+ await ensureDir(projectDir);
104
+ const normalizedId = normalizeIdentifier(planId);
105
+ return withLock(registryPath(projectDir), async () => {
106
+ const existing = await readWorktreeRegistry(projectDir);
107
+ const rows = existing.filter((entry) => entry.planId !== normalizedId);
108
+ if (rows.length === existing.length) {
109
+ return false;
110
+ }
111
+ await writeJson(registryPath(projectDir), { worktrees: rows });
112
+ invalidateGraphCache(basename(projectDir));
113
+ return true;
114
+ });
115
+ }
116
+ /** Find the worktree registered for a plan, if any. */
117
+ export async function findWorktreeByPlan(projectDir, planId) {
118
+ const normalizedId = normalizeIdentifier(planId);
119
+ const registry = await readWorktreeRegistry(projectDir);
120
+ return registry.find((entry) => entry.planId === normalizedId) ?? null;
121
+ }
122
+ /**
123
+ * Detect registry rows claiming the same resolved path across different
124
+ * plans (or duplicated rows for one plan). Healthy registries return [].
125
+ */
126
+ export function findPathCollisions(entries) {
127
+ const byPath = new Map();
128
+ for (const entry of entries) {
129
+ const key = normalizeEntryPath(entry.path);
130
+ const owners = byPath.get(key) ?? new Set();
131
+ owners.add(entry.planId);
132
+ byPath.set(key, owners);
133
+ }
134
+ const collisions = [];
135
+ for (const [path, owners] of byPath) {
136
+ if (owners.size > 1 || countRowsForPath(entries, path) > 1) {
137
+ collisions.push({ path, planIds: [...owners].sort() });
138
+ }
139
+ }
140
+ return collisions;
141
+ }
142
+ function countRowsForPath(entries, normalizedPath) {
143
+ let count = 0;
144
+ for (const entry of entries) {
145
+ if (normalizeEntryPath(entry.path) === normalizedPath)
146
+ count++;
147
+ }
148
+ return count;
149
+ }
150
+ //# sourceMappingURL=worktree-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-store.js","sourceRoot":"","sources":["../../src/utils/worktree-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * One entry of `git worktree list --porcelain`. `branch` is the short name
3
+ * (`arcs/plan-x`) or null for bare/detached entries; `head` is null when git
4
+ * did not report a HEAD line.
5
+ */
6
+ export interface WorktreeInfo {
7
+ path: string;
8
+ head: string | null;
9
+ branch: string | null;
10
+ bare: boolean;
11
+ detached: boolean;
12
+ }
13
+ /** Result of a successful `git worktree add`. */
14
+ export interface AddedWorktree {
15
+ path: string;
16
+ branch: string;
17
+ }
18
+ /** Branch name for a plan's worktree: `arcs/<normalized-plan-id>`. The arcs/
19
+ * namespace keeps agent branches out of the way of human branches. */
20
+ export declare function planBranchName(planId: string): string;
21
+ /** Sibling convention: `<parent-of-repo>/<repo-name>-worktrees`. Sibling (not
22
+ * inside) so worktrees never show up in the main repo's globs or watchers. */
23
+ export declare function defaultWorktreeRoot(repoPath: string): string;
24
+ /** Where a plan's worktree lives by default: `<worktree-root>/<plan-id>`. */
25
+ export declare function resolvePlanWorktreePath(repoPath: string, planId: string): string;
26
+ /**
27
+ * Parse `git worktree list --porcelain`: newline records separated by blank
28
+ * lines, each field `key value` with the value possibly containing spaces
29
+ * (paths), so split on the FIRST space only. Empty output → [].
30
+ */
31
+ export declare function listWorktrees(repoPath: string): Promise<WorktreeInfo[]>;
32
+ /**
33
+ * Create a worktree via `git worktree add`. With `createBranch` the branch is
34
+ * created first (`-b <branch> [<base-ref>]`); otherwise `<branch>` must
35
+ * already exist and is checked out. Returns null on any failure — including
36
+ * branch-already-checked-out, which callers detect up front via
37
+ * `isBranchCheckedOutInAnotherWorktree`.
38
+ */
39
+ export declare function addWorktree(repoPath: string, options: {
40
+ path: string;
41
+ branch: string;
42
+ baseRef?: string;
43
+ createBranch?: boolean;
44
+ }): Promise<AddedWorktree | null>;
45
+ /** Remove a worktree (`git worktree remove [--force]`). True on success. */
46
+ export declare function removeWorktree(repoPath: string, path: string, force?: boolean): Promise<boolean>;
47
+ /** Drop stale worktree admin entries (`git worktree prune`). True on success. */
48
+ export declare function pruneWorktrees(repoPath: string): Promise<boolean>;
49
+ /**
50
+ * True when `branch` is checked out in any non-bare worktree other than
51
+ * `excludePath` — the mutual-exclusion primitive: two orchestrators must not
52
+ * dispatch onto the same plan branch.
53
+ *
54
+ * Fails CLOSED: if the listing cannot be read, returns TRUE (treat as
55
+ * contended). A false negative here lets two writers share a branch; a false
56
+ * positive merely blocks a dispatch that `ensure` would fail anyway.
57
+ */
58
+ export declare function isBranchCheckedOutInAnotherWorktree(repoPath: string, branch: string, excludePath?: string): Promise<boolean>;
59
+ /**
60
+ * Count commits on the worktree's HEAD not reachable from its upstream, or —
61
+ * when no upstream is configured — from `main`/`master`. 0 means safe to
62
+ * prune; null means unknown (no upstream AND no base branch found, detached
63
+ * HEAD, or any git failure), which callers must treat as NOT safe.
64
+ */
65
+ export declare function countUnmergedCommits(worktreePath: string): Promise<number | null>;
66
+ /**
67
+ * Short branch name currently checked out in `worktreePath`, or null when
68
+ * detached (a detached HEAD is not a branch) or on any failure.
69
+ */
70
+ export declare function currentBranch(worktreePath: string): Promise<string | null>;
71
+ //# sourceMappingURL=worktree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../../src/utils/worktree.ts"],"names":[],"mappings":"AAgBA;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,iDAAiD;AACjD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAqCD;uEACuE;AACvE,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;+EAC+E;AAC/E,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG5D;AAED,6EAA6E;AAC7E,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEhF;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAiD7E;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,GAClF,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAc/B;AAED,4EAA4E;AAC5E,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,KAAK,UAAQ,GACZ,OAAO,CAAC,OAAO,CAAC,CAKlB;AAED,iFAAiF;AACjF,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEvE;AAED;;;;;;;;GAQG;AACH,wBAAsB,mCAAmC,CACvD,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,OAAO,CAAC,CAMlB;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYvF;AAYD;;;GAGG;AACH,wBAAsB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAIhF"}
@@ -0,0 +1,197 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Worktree — timeout-bounded git worktree plumbing (1 plan = 1 tree)
3
+ // ---------------------------------------------------------------------------
4
+ import { execFile } from "node:child_process";
5
+ import { basename, dirname, resolve } from "node:path";
6
+ import { promisify } from "node:util";
7
+ import { GIT_ASYNC_TIMEOUT_MS } from "./git.js";
8
+ import { normalizeIdentifier } from "./slug.js";
9
+ const execFileAsync = promisify(execFile);
10
+ /** Slack the raced deadline allows the child's own kill path before giving up
11
+ * on it, so a child that DOES die on signal reports its real failure. */
12
+ const GIT_DEADLINE_GRACE_MS = 100;
13
+ /**
14
+ * Async: run `git` with an argv array, never a shell, and settle to `null`
15
+ * for ANY failure — same fail-closed contract as `src/utils/git.ts`, whose
16
+ * deadline race this mirrors (duplicated rather than imported because that
17
+ * helper is module-private and this file must stay additive).
18
+ *
19
+ * The deadline is RACED, not delegated to Node's `timeout` option: a child
20
+ * that cannot act on its kill signal never settles the underlying promise,
21
+ * so racing our own unref'd timer is what actually bounds the caller —
22
+ * see `execAsync` in `src/utils/git.ts` for the full rationale.
23
+ */
24
+ async function execAsync(args, cwd) {
25
+ const ran = execFileAsync("git", args, {
26
+ encoding: "utf-8",
27
+ cwd,
28
+ timeout: GIT_ASYNC_TIMEOUT_MS,
29
+ killSignal: "SIGKILL",
30
+ windowsHide: true,
31
+ })
32
+ .then(({ stdout }) => stdout.trim())
33
+ .catch(() => null);
34
+ const expired = new Promise((resolve) => {
35
+ setTimeout(() => resolve(null), GIT_ASYNC_TIMEOUT_MS + GIT_DEADLINE_GRACE_MS).unref();
36
+ });
37
+ return Promise.race([ran, expired]);
38
+ }
39
+ /** Resolve to an absolute forward-slash path so comparisons and git argv are
40
+ * stable across platforms (Windows `resolve()` yields backslashes). */
41
+ function normalizePath(p) {
42
+ return resolve(p).replace(/\\/g, "/");
43
+ }
44
+ /** Branch name for a plan's worktree: `arcs/<normalized-plan-id>`. The arcs/
45
+ * namespace keeps agent branches out of the way of human branches. */
46
+ export function planBranchName(planId) {
47
+ return `arcs/${normalizeIdentifier(planId)}`;
48
+ }
49
+ /** Sibling convention: `<parent-of-repo>/<repo-name>-worktrees`. Sibling (not
50
+ * inside) so worktrees never show up in the main repo's globs or watchers. */
51
+ export function defaultWorktreeRoot(repoPath) {
52
+ const abs = normalizePath(repoPath);
53
+ return `${dirname(abs)}/${basename(abs)}-worktrees`;
54
+ }
55
+ /** Where a plan's worktree lives by default: `<worktree-root>/<plan-id>`. */
56
+ export function resolvePlanWorktreePath(repoPath, planId) {
57
+ return `${defaultWorktreeRoot(repoPath)}/${normalizeIdentifier(planId)}`;
58
+ }
59
+ /**
60
+ * Parse `git worktree list --porcelain`: newline records separated by blank
61
+ * lines, each field `key value` with the value possibly containing spaces
62
+ * (paths), so split on the FIRST space only. Empty output → [].
63
+ */
64
+ export async function listWorktrees(repoPath) {
65
+ const output = await execAsync(["worktree", "list", "--porcelain"], repoPath);
66
+ if (!output)
67
+ return [];
68
+ const worktrees = [];
69
+ let current = {};
70
+ const flush = () => {
71
+ if (current.path) {
72
+ worktrees.push({
73
+ path: current.path,
74
+ head: current.head ?? null,
75
+ branch: current.branch ?? null,
76
+ bare: current.bare ?? false,
77
+ detached: current.detached ?? false,
78
+ });
79
+ }
80
+ current = {};
81
+ };
82
+ for (const line of output.split("\n")) {
83
+ if (line === "") {
84
+ flush();
85
+ continue;
86
+ }
87
+ const sep = line.indexOf(" ");
88
+ const key = sep === -1 ? line : line.slice(0, sep);
89
+ const value = sep === -1 ? "" : line.slice(sep + 1);
90
+ switch (key) {
91
+ case "worktree":
92
+ current.path = normalizePath(value);
93
+ break;
94
+ case "HEAD":
95
+ current.head = value;
96
+ break;
97
+ case "branch":
98
+ current.branch = value.replace(/^refs\/heads\//, "");
99
+ break;
100
+ case "bare":
101
+ current.bare = true;
102
+ break;
103
+ case "detached":
104
+ current.detached = true;
105
+ break;
106
+ }
107
+ }
108
+ flush();
109
+ return worktrees;
110
+ }
111
+ /**
112
+ * Create a worktree via `git worktree add`. With `createBranch` the branch is
113
+ * created first (`-b <branch> [<base-ref>]`); otherwise `<branch>` must
114
+ * already exist and is checked out. Returns null on any failure — including
115
+ * branch-already-checked-out, which callers detect up front via
116
+ * `isBranchCheckedOutInAnotherWorktree`.
117
+ */
118
+ export async function addWorktree(repoPath, options) {
119
+ const wtPath = normalizePath(options.path);
120
+ const args = options.createBranch
121
+ ? ["worktree", "add", "-b", options.branch, wtPath]
122
+ : ["worktree", "add", wtPath, options.branch];
123
+ if (options.createBranch && options.baseRef) {
124
+ args.push(options.baseRef);
125
+ }
126
+ const output = await execAsync(args, repoPath);
127
+ // `add` narrates progress on stderr, so empty stdout is still success; a
128
+ // non-zero exit or an expired deadline is the only failure signal.
129
+ if (output === null)
130
+ return null;
131
+ return { path: wtPath, branch: options.branch };
132
+ }
133
+ /** Remove a worktree (`git worktree remove [--force]`). True on success. */
134
+ export async function removeWorktree(repoPath, path, force = false) {
135
+ const args = ["worktree", "remove"];
136
+ if (force)
137
+ args.push("--force");
138
+ args.push(normalizePath(path));
139
+ return (await execAsync(args, repoPath)) !== null;
140
+ }
141
+ /** Drop stale worktree admin entries (`git worktree prune`). True on success. */
142
+ export async function pruneWorktrees(repoPath) {
143
+ return (await execAsync(["worktree", "prune"], repoPath)) !== null;
144
+ }
145
+ /**
146
+ * True when `branch` is checked out in any non-bare worktree other than
147
+ * `excludePath` — the mutual-exclusion primitive: two orchestrators must not
148
+ * dispatch onto the same plan branch.
149
+ *
150
+ * Fails CLOSED: if the listing cannot be read, returns TRUE (treat as
151
+ * contended). A false negative here lets two writers share a branch; a false
152
+ * positive merely blocks a dispatch that `ensure` would fail anyway.
153
+ */
154
+ export async function isBranchCheckedOutInAnotherWorktree(repoPath, branch, excludePath) {
155
+ const worktrees = await listWorktrees(repoPath);
156
+ if (worktrees.length === 0)
157
+ return true;
158
+ const excluded = excludePath ? normalizePath(excludePath) : null;
159
+ return worktrees.some((wt) => !wt.bare && wt.branch === branch && wt.path !== excluded);
160
+ }
161
+ /**
162
+ * Count commits on the worktree's HEAD not reachable from its upstream, or —
163
+ * when no upstream is configured — from `main`/`master`. 0 means safe to
164
+ * prune; null means unknown (no upstream AND no base branch found, detached
165
+ * HEAD, or any git failure), which callers must treat as NOT safe.
166
+ */
167
+ export async function countUnmergedCommits(worktreePath) {
168
+ const upstream = await execAsync(["rev-parse", "--abbrev-ref", "--verify", "HEAD@{upstream}"], worktreePath);
169
+ const base = upstream ?? (await firstExistingRef(worktreePath, ["main", "master"]));
170
+ if (!base)
171
+ return null;
172
+ const count = await execAsync(["rev-list", "--count", `${base}..HEAD`], worktreePath);
173
+ if (count === null)
174
+ return null;
175
+ const parsed = Number.parseInt(count, 10);
176
+ return Number.isFinite(parsed) ? parsed : null;
177
+ }
178
+ /** First ref in `candidates` that resolves, else null. */
179
+ async function firstExistingRef(cwd, candidates) {
180
+ for (const ref of candidates) {
181
+ if (await execAsync(["rev-parse", "--verify", "--quiet", `refs/heads/${ref}`], cwd)) {
182
+ return ref;
183
+ }
184
+ }
185
+ return null;
186
+ }
187
+ /**
188
+ * Short branch name currently checked out in `worktreePath`, or null when
189
+ * detached (a detached HEAD is not a branch) or on any failure.
190
+ */
191
+ export async function currentBranch(worktreePath) {
192
+ const branch = await execAsync(["rev-parse", "--abbrev-ref", "HEAD"], worktreePath);
193
+ if (!branch || branch === "HEAD")
194
+ return null;
195
+ return branch;
196
+ }
197
+ //# sourceMappingURL=worktree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree.js","sourceRoot":"","sources":["../../src/utils/worktree.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{a as t,i as n,o as r}from"./index-DCBn-YrR.js";import{t as i}from"./cytoscape.esm-C3UvhD5t.js";import{t as a}from"./cytoscape-fcose-peAzqedC.js";var o=e(a(),1),s=e(r(),1),c=t();i.use(o.default);var l={knowledge:`#22d3ee`,task:`#60a5fa`,plan:`#e879f9`,file:`#8f8f8f`,project:`#2dd4bf`},u=new Set([`task_belongs_to_plan`,`plan_contains_task`,`knowledge_touches_file`,`project_depends_on`]),d=new Set([`task_blocks_task`,`shares_source_file`,`shares_keywords`]);function f(e){if(d.has(e.relation)){let[t,n]=[e.source,e.target].sort();return`${t}|${n}|${e.relation}`}return`${e.source}|${e.target}|${e.relation}`}function p({nodes:e,edges:t,filter:r,focusId:a,onSelect:o,onOpen:d}){let p=(0,s.useRef)(null),m=(0,s.useRef)(null),h=(0,s.useRef)(new Map),g=(0,s.useRef)(o),_=(0,s.useRef)(d);(0,s.useEffect)(()=>{g.current=o,_.current=d},[o,d]);let v=(0,s.useMemo)(()=>{let i=r?.types,a=r?.minWeight??0,o=e.filter(e=>!i||i.has(e.type)),s=new Set(o.map(e=>e.id));h.current=new Map(o.map(e=>[e.id,e]));let c=new Set,d=[];for(let e of o)d.push({group:`nodes`,data:{id:e.id,label:n(e.title??e.id,34),color:l[e.type]??`#8f8f8f`,nodeType:e.type}});for(let e of t){if(!s.has(e.source)||!s.has(e.target)||e.weight<a)continue;let t=f(e);c.has(t)||(c.add(t),d.push({group:`edges`,data:{id:`e:${t}`,source:e.source,target:e.target,directed:+!!u.has(e.relation),weight:e.weight}}))}return d},[e,t,r]);return(0,s.useEffect)(()=>{if(!p.current)return;let e=i({container:p.current,elements:v,wheelSensitivity:.2,style:[{selector:`node`,style:{"background-color":`data(color)`,label:`data(label)`,color:`#8f8f8f`,"font-family":`JetBrains Mono Variable, monospace`,"font-size":9,"text-valign":`bottom`,"text-margin-y":3,"text-outline-color":`#050505`,"text-outline-width":2,width:13,height:13,"border-width":1,"border-color":`#2c2c2c`}},{selector:`node[nodeType = 'project']`,style:{width:22,height:22,"font-size":11,color:`#f2f2f2`}},{selector:`node:selected`,style:{"border-color":`#f2f2f2`,"border-width":2,color:`#f2f2f2`}},{selector:`edge`,style:{width:`mapData(weight, 0, 1, 0.5, 2)`,"line-color":`#474747`,"curve-style":`bezier`,"target-arrow-shape":`none`,opacity:.75}},{selector:`edge[directed = 1]`,style:{"target-arrow-shape":`triangle`,"target-arrow-color":`#8f8f8f`,"arrow-scale":.7}},{selector:`.faded`,style:{opacity:.12}}],layout:{name:`fcose`,animate:!1,randomize:!0,nodeRepulsion:6500,idealEdgeLength:55,gravity:.3,numIter:1500}});return e.on(`mouseover`,`node`,t=>{let n=t.target.neighborhood().add(t.target);e.elements().not(n).addClass(`faded`)}),e.on(`mouseout`,`node`,()=>e.elements().removeClass(`faded`)),e.on(`tap`,t=>{if(t.target===e){g.current?.(null);return}if(t.target.isNode()){let e=h.current.get(t.target.id())??null;g.current?.(e)}}),e.on(`dbltap`,`node`,e=>{let t=h.current.get(e.target.id());t&&_.current?.(t)}),m.current=e,()=>{e.destroy(),m.current=null}},[v]),(0,s.useEffect)(()=>{if(!a||!m.current)return;let e=m.current.getElementById(a);e.nonempty()&&(m.current.center(e),m.current.elements().unselect(),e.select())},[a]),(0,c.jsxs)(`div`,{className:`h-full w-full`,children:[(0,c.jsx)(`div`,{ref:p,className:`h-full w-full bg-term-inset`,role:`img`,"aria-label":`Relationship graph with ${e.length} nodes and ${t.length} edges. A text node list is available alongside the graph.`}),(0,c.jsx)(`ul`,{className:`sr-only`,"aria-label":`Graph node summary`,children:e.map(e=>(0,c.jsxs)(`li`,{children:[e.type,`: `,e.title??e.id]},e.id))})]})}export{p as GraphCanvas};
1
+ import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{a as t,i as n,o as r}from"./index-BWd2fBNL.js";import{t as i}from"./cytoscape.esm-C3UvhD5t.js";import{t as a}from"./cytoscape-fcose-peAzqedC.js";var o=e(a(),1),s=e(r(),1),c=t();i.use(o.default);var l={knowledge:`#22d3ee`,task:`#60a5fa`,plan:`#e879f9`,file:`#8f8f8f`,project:`#2dd4bf`},u=new Set([`task_belongs_to_plan`,`plan_contains_task`,`knowledge_touches_file`,`project_depends_on`]),d=new Set([`task_blocks_task`,`shares_source_file`,`shares_keywords`]);function f(e){if(d.has(e.relation)){let[t,n]=[e.source,e.target].sort();return`${t}|${n}|${e.relation}`}return`${e.source}|${e.target}|${e.relation}`}function p({nodes:e,edges:t,filter:r,focusId:a,onSelect:o,onOpen:d}){let p=(0,s.useRef)(null),m=(0,s.useRef)(null),h=(0,s.useRef)(new Map),g=(0,s.useRef)(o),_=(0,s.useRef)(d);(0,s.useEffect)(()=>{g.current=o,_.current=d},[o,d]);let v=(0,s.useMemo)(()=>{let i=r?.types,a=r?.minWeight??0,o=e.filter(e=>!i||i.has(e.type)),s=new Set(o.map(e=>e.id));h.current=new Map(o.map(e=>[e.id,e]));let c=new Set,d=[];for(let e of o)d.push({group:`nodes`,data:{id:e.id,label:n(e.title??e.id,34),color:l[e.type]??`#8f8f8f`,nodeType:e.type}});for(let e of t){if(!s.has(e.source)||!s.has(e.target)||e.weight<a)continue;let t=f(e);c.has(t)||(c.add(t),d.push({group:`edges`,data:{id:`e:${t}`,source:e.source,target:e.target,directed:+!!u.has(e.relation),weight:e.weight}}))}return d},[e,t,r]);return(0,s.useEffect)(()=>{if(!p.current)return;let e=i({container:p.current,elements:v,wheelSensitivity:.2,style:[{selector:`node`,style:{"background-color":`data(color)`,label:`data(label)`,color:`#8f8f8f`,"font-family":`JetBrains Mono Variable, monospace`,"font-size":9,"text-valign":`bottom`,"text-margin-y":3,"text-outline-color":`#050505`,"text-outline-width":2,width:13,height:13,"border-width":1,"border-color":`#2c2c2c`}},{selector:`node[nodeType = 'project']`,style:{width:22,height:22,"font-size":11,color:`#f2f2f2`}},{selector:`node:selected`,style:{"border-color":`#f2f2f2`,"border-width":2,color:`#f2f2f2`}},{selector:`edge`,style:{width:`mapData(weight, 0, 1, 0.5, 2)`,"line-color":`#474747`,"curve-style":`bezier`,"target-arrow-shape":`none`,opacity:.75}},{selector:`edge[directed = 1]`,style:{"target-arrow-shape":`triangle`,"target-arrow-color":`#8f8f8f`,"arrow-scale":.7}},{selector:`.faded`,style:{opacity:.12}}],layout:{name:`fcose`,animate:!1,randomize:!0,nodeRepulsion:6500,idealEdgeLength:55,gravity:.3,numIter:1500}});return e.on(`mouseover`,`node`,t=>{let n=t.target.neighborhood().add(t.target);e.elements().not(n).addClass(`faded`)}),e.on(`mouseout`,`node`,()=>e.elements().removeClass(`faded`)),e.on(`tap`,t=>{if(t.target===e){g.current?.(null);return}if(t.target.isNode()){let e=h.current.get(t.target.id())??null;g.current?.(e)}}),e.on(`dbltap`,`node`,e=>{let t=h.current.get(e.target.id());t&&_.current?.(t)}),m.current=e,()=>{e.destroy(),m.current=null}},[v]),(0,s.useEffect)(()=>{if(!a||!m.current)return;let e=m.current.getElementById(a);e.nonempty()&&(m.current.center(e),m.current.elements().unselect(),e.select())},[a]),(0,c.jsxs)(`div`,{className:`h-full w-full`,children:[(0,c.jsx)(`div`,{ref:p,className:`h-full w-full bg-term-inset`,role:`img`,"aria-label":`Relationship graph with ${e.length} nodes and ${t.length} edges. A text node list is available alongside the graph.`}),(0,c.jsx)(`ul`,{className:`sr-only`,"aria-label":`Graph node summary`,children:e.map(e=>(0,c.jsxs)(`li`,{children:[e.type,`: `,e.title??e.id]},e.id))})]})}export{p as GraphCanvas};
@@ -1,4 +1,4 @@
1
- import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{a as t,o as n,r}from"./index-DCBn-YrR.js";var i=[],a=[];(()=>{let e=`lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o`.split(`,`).map(e=>e?parseInt(e,36):1);for(let t=0,n=0;t<e.length;t++)(t%2?a:i).push(n+=e[t])})();function o(e){if(e<768)return!1;for(let t=0,n=i.length;;){let r=t+n>>1;if(e<i[r])n=r;else if(e>=a[r])t=r+1;else return!0;if(t==n)return!1}}function s(e){return e>=127462&&e<=127487}var c=8205;function l(e,t,n=!0,r=!0){return(n?u:d)(e,t,r)}function u(e,t,n){if(t==e.length)return t;t&&p(e.charCodeAt(t))&&m(e.charCodeAt(t-1))&&t--;let r=f(e,t);for(t+=h(r);t<e.length;){let i=f(e,t);if(r==c||i==c||n&&o(i))t+=h(i),r=i;else if(s(i)){let n=0,r=t-2;for(;r>=0&&s(f(e,r));)n++,r-=2;if(n%2==0)break;t+=2}else break}return t}function d(e,t,n){for(;t>1;){let r=u(e,t-2,n);if(r<t)return r;t--}return 0}function f(e,t){let n=e.charCodeAt(t);if(!m(n)||t+1==e.length)return n;let r=e.charCodeAt(t+1);return p(r)?(n-55296<<10)+(r-56320)+65536:n}function p(e){return e>=56320&&e<57344}function m(e){return e>=55296&&e<56320}function h(e){return e<65536?1:2}var g=class e{lineAt(e){if(e<0||e>this.length)throw RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,t,n){[e,t]=E(this,e,t);let r=[];return this.decompose(0,e,r,2),n.length&&n.decompose(0,n.length,r,3),this.decompose(t,this.length,r,1),v.from(r,this.length-(t-e)+n.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,t=this.length){[e,t]=E(this,e,t);let n=[];return this.decompose(e,t,n,0),v.from(n,t-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let t=this.scanIdentical(e,1),n=this.length-this.scanIdentical(e,-1),r=new S(this),i=new S(e);for(let e=t,a=t;;){if(r.next(e),i.next(e),e=0,r.lineBreak!=i.lineBreak||r.done!=i.done||r.value!=i.value)return!1;if(a+=r.value.length,r.done||a>=n)return!0}}iter(e=1){return new S(this,e)}iterRange(e,t=this.length){return new C(this,e,t)}iterLines(e,t){let n;if(e==null)n=this.iter();else{t??=this.lines+1;let r=this.line(e).from;n=this.iterRange(r,Math.max(r,t==this.lines+1?this.length:t<=1?0:this.line(t-1).to))}return new w(n)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(t){if(t.length==0)throw RangeError(`A document must have at least one line`);return t.length==1&&!t[0]?e.empty:t.length<=32?new _(t):v.from(_.split(t,[]))}},_=class e extends g{constructor(e,t=y(e)){super(),this.text=e,this.length=t}get lines(){return this.text.length}get children(){return null}lineInner(e,t,n,r){for(let i=0;;i++){let a=this.text[i],o=r+a.length;if((t?n:o)>=e)return new T(r,o,n,a);r=o+1,n++}}decompose(t,n,r,i){let a=t<=0&&n>=this.length?this:new e(x(this.text,t,n),Math.min(n,this.length)-Math.max(0,t));if(i&1){let t=r.pop(),n=b(a.text,t.text.slice(),0,a.length);if(n.length<=32)r.push(new e(n,t.length+a.length));else{let t=n.length>>1;r.push(new e(n.slice(0,t)),new e(n.slice(t)))}}else r.push(a)}replace(t,n,r){if(!(r instanceof e))return super.replace(t,n,r);[t,n]=E(this,t,n);let i=b(this.text,b(r.text,x(this.text,0,t)),n),a=this.length+r.length-(n-t);return i.length<=32?new e(i,a):v.from(e.split(i,[]),a)}sliceString(e,t=this.length,n=`
1
+ import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{a as t,o as n,r}from"./index-BWd2fBNL.js";var i=[],a=[];(()=>{let e=`lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o`.split(`,`).map(e=>e?parseInt(e,36):1);for(let t=0,n=0;t<e.length;t++)(t%2?a:i).push(n+=e[t])})();function o(e){if(e<768)return!1;for(let t=0,n=i.length;;){let r=t+n>>1;if(e<i[r])n=r;else if(e>=a[r])t=r+1;else return!0;if(t==n)return!1}}function s(e){return e>=127462&&e<=127487}var c=8205;function l(e,t,n=!0,r=!0){return(n?u:d)(e,t,r)}function u(e,t,n){if(t==e.length)return t;t&&p(e.charCodeAt(t))&&m(e.charCodeAt(t-1))&&t--;let r=f(e,t);for(t+=h(r);t<e.length;){let i=f(e,t);if(r==c||i==c||n&&o(i))t+=h(i),r=i;else if(s(i)){let n=0,r=t-2;for(;r>=0&&s(f(e,r));)n++,r-=2;if(n%2==0)break;t+=2}else break}return t}function d(e,t,n){for(;t>1;){let r=u(e,t-2,n);if(r<t)return r;t--}return 0}function f(e,t){let n=e.charCodeAt(t);if(!m(n)||t+1==e.length)return n;let r=e.charCodeAt(t+1);return p(r)?(n-55296<<10)+(r-56320)+65536:n}function p(e){return e>=56320&&e<57344}function m(e){return e>=55296&&e<56320}function h(e){return e<65536?1:2}var g=class e{lineAt(e){if(e<0||e>this.length)throw RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,t,n){[e,t]=E(this,e,t);let r=[];return this.decompose(0,e,r,2),n.length&&n.decompose(0,n.length,r,3),this.decompose(t,this.length,r,1),v.from(r,this.length-(t-e)+n.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,t=this.length){[e,t]=E(this,e,t);let n=[];return this.decompose(e,t,n,0),v.from(n,t-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let t=this.scanIdentical(e,1),n=this.length-this.scanIdentical(e,-1),r=new S(this),i=new S(e);for(let e=t,a=t;;){if(r.next(e),i.next(e),e=0,r.lineBreak!=i.lineBreak||r.done!=i.done||r.value!=i.value)return!1;if(a+=r.value.length,r.done||a>=n)return!0}}iter(e=1){return new S(this,e)}iterRange(e,t=this.length){return new C(this,e,t)}iterLines(e,t){let n;if(e==null)n=this.iter();else{t??=this.lines+1;let r=this.line(e).from;n=this.iterRange(r,Math.max(r,t==this.lines+1?this.length:t<=1?0:this.line(t-1).to))}return new w(n)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(t){if(t.length==0)throw RangeError(`A document must have at least one line`);return t.length==1&&!t[0]?e.empty:t.length<=32?new _(t):v.from(_.split(t,[]))}},_=class e extends g{constructor(e,t=y(e)){super(),this.text=e,this.length=t}get lines(){return this.text.length}get children(){return null}lineInner(e,t,n,r){for(let i=0;;i++){let a=this.text[i],o=r+a.length;if((t?n:o)>=e)return new T(r,o,n,a);r=o+1,n++}}decompose(t,n,r,i){let a=t<=0&&n>=this.length?this:new e(x(this.text,t,n),Math.min(n,this.length)-Math.max(0,t));if(i&1){let t=r.pop(),n=b(a.text,t.text.slice(),0,a.length);if(n.length<=32)r.push(new e(n,t.length+a.length));else{let t=n.length>>1;r.push(new e(n.slice(0,t)),new e(n.slice(t)))}}else r.push(a)}replace(t,n,r){if(!(r instanceof e))return super.replace(t,n,r);[t,n]=E(this,t,n);let i=b(this.text,b(r.text,x(this.text,0,t)),n),a=this.length+r.length-(n-t);return i.length<=32?new e(i,a):v.from(e.split(i,[]),a)}sliceString(e,t=this.length,n=`
2
2
  `){[e,t]=E(this,e,t);let r=``;for(let i=0,a=0;i<=t&&a<this.text.length;a++){let o=this.text[a],s=i+o.length;i>e&&a&&(r+=n),e<s&&t>i&&(r+=o.slice(Math.max(0,e-i),t-i)),i=s+1}return r}flatten(e){for(let t of this.text)e.push(t)}scanIdentical(){return 0}static split(t,n){let r=[],i=-1;for(let a of t)r.push(a),i+=a.length+1,r.length==32&&(n.push(new e(r,i)),r=[],i=-1);return i>-1&&n.push(new e(r,i)),n}},v=class e extends g{constructor(e,t){super(),this.children=e,this.length=t,this.lines=0;for(let t of e)this.lines+=t.lines}lineInner(e,t,n,r){for(let i=0;;i++){let a=this.children[i],o=r+a.length,s=n+a.lines-1;if((t?s:o)>=e)return a.lineInner(e,t,n,r);r=o+1,n=s+1}}decompose(e,t,n,r){for(let i=0,a=0;a<=t&&i<this.children.length;i++){let o=this.children[i],s=a+o.length;if(e<=s&&t>=a){let i=r&(a<=e|(s>=t?2:0));a>=e&&s<=t&&!i?n.push(o):o.decompose(e-a,t-a,n,i)}a=s+1}}replace(t,n,r){if([t,n]=E(this,t,n),r.lines<this.lines)for(let i=0,a=0;i<this.children.length;i++){let o=this.children[i],s=a+o.length;if(t>=a&&n<=s){let c=o.replace(t-a,n-a,r),l=this.lines-o.lines+c.lines;if(c.lines<l>>4&&c.lines>l>>6){let a=this.children.slice();return a[i]=c,new e(a,this.length-(n-t)+r.length)}return super.replace(a,s,c)}a=s+1}return super.replace(t,n,r)}sliceString(e,t=this.length,n=`
3
3
  `){[e,t]=E(this,e,t);let r=``;for(let i=0,a=0;i<this.children.length&&a<=t;i++){let o=this.children[i],s=a+o.length;a>e&&i&&(r+=n),e<s&&t>a&&(r+=o.sliceString(e-a,t-a,n)),a=s+1}return r}flatten(e){for(let t of this.children)t.flatten(e)}scanIdentical(t,n){if(!(t instanceof e))return 0;let r=0,[i,a,o,s]=n>0?[0,0,this.children.length,t.children.length]:[this.children.length-1,t.children.length-1,-1,-1];for(;;i+=n,a+=n){if(i==o||a==s)return r;let e=this.children[i],c=t.children[a];if(e!=c)return r+e.scanIdentical(c,n);r+=e.length+1}}static from(t,n=t.reduce((e,t)=>e+t.length+1,-1)){let r=0;for(let e of t)r+=e.lines;if(r<32){let e=[];for(let n of t)n.flatten(e);return new _(e,n)}let i=Math.max(32,r>>5),a=i<<1,o=i>>1,s=[],c=0,l=-1,u=[];function d(t){let n;if(t.lines>a&&t instanceof e)for(let e of t.children)d(e);else t.lines>o&&(c>o||!c)?(f(),s.push(t)):t instanceof _&&c&&(n=u[u.length-1])instanceof _&&t.lines+n.lines<=32?(c+=t.lines,l+=t.length+1,u[u.length-1]=new _(n.text.concat(t.text),n.length+1+t.length)):(c+t.lines>i&&f(),c+=t.lines,l+=t.length+1,u.push(t))}function f(){c!=0&&(s.push(u.length==1?u[0]:e.from(u,l)),l=-1,c=u.length=0)}for(let e of t)d(e);return f(),s.length==1?s[0]:new e(s,n)}};g.empty=new _([``],0);function y(e){let t=-1;for(let n of e)t+=n.length+1;return t}function b(e,t,n=0,r=1e9){for(let i=0,a=0,o=!0;a<e.length&&i<=r;a++){let s=e[a],c=i+s.length;c>=n&&(c>r&&(s=s.slice(0,r-i)),i<n&&(s=s.slice(n-i)),o?(t[t.length-1]+=s,o=!1):t.push(s)),i=c+1}return t}function x(e,t,n){return b(e,[``],t,n)}var S=class{constructor(e,t=1){this.dir=t,this.done=!1,this.lineBreak=!1,this.value=``,this.nodes=[e],this.offsets=[t>0?1:(e instanceof _?e.text.length:e.children.length)<<1]}nextInner(e,t){for(this.done=this.lineBreak=!1;;){let n=this.nodes.length-1,r=this.nodes[n],i=this.offsets[n],a=i>>1,o=r instanceof _?r.text.length:r.children.length;if(a==(t>0?o:0)){if(n==0)return this.done=!0,this.value=``,this;t>0&&this.offsets[n-1]++,this.nodes.pop(),this.offsets.pop()}else if((i&1)==(t>0?0:1)){if(this.offsets[n]+=t,e==0)return this.lineBreak=!0,this.value=`
4
4
  `,this;e--}else if(r instanceof _){let i=r.text[a+(t<0?-1:0)];if(this.offsets[n]+=t,i.length>Math.max(0,e))return this.value=e==0?i:t>0?i.slice(e):i.slice(0,i.length-e),this;e-=i.length}else{let i=r.children[a+(t<0?-1:0)];e>i.length?(e-=i.length,this.offsets[n]+=t):(t<0&&this.offsets[n]--,this.nodes.push(i),this.offsets.push(t>0?1:(i instanceof _?i.text.length:i.children.length)<<1))}}}next(e=0){return e<0&&(this.nextInner(-e,-this.dir),e=this.value.length),this.nextInner(e,this.dir)}},C=class{constructor(e,t,n){this.value=``,this.done=!1,this.cursor=new S(e,t>n?-1:1),this.pos=t>n?e.length:0,this.from=Math.min(t,n),this.to=Math.max(t,n)}nextInner(e,t){if(t<0?this.pos<=this.from:this.pos>=this.to)return this.value=``,this.done=!0,this;e+=Math.max(0,t<0?this.pos-this.to:this.from-this.pos);let n=t<0?this.pos-this.from:this.to-this.pos;e>n&&(e=n),n-=e;let{value:r}=this.cursor.next(e);return this.pos+=(r.length+e)*t,this.value=r.length<=n?r:t<0?r.slice(r.length-n):r.slice(0,n),this.done=!this.value,this}next(e=0){return e<0?e=Math.max(e,this.from-this.pos):e>0&&(e=Math.min(e,this.to-this.pos)),this.nextInner(e,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=``}},w=class{constructor(e){this.inner=e,this.afterBreak=!0,this.value=``,this.done=!1}next(e=0){let{done:t,lineBreak:n,value:r}=this.inner.next(e);return t&&this.afterBreak?(this.value=``,this.afterBreak=!1):t?(this.done=!0,this.value=``):n?this.afterBreak?this.value=``:(this.afterBreak=!0,this.next()):(this.value=r,this.afterBreak=!1),this}get lineBreak(){return!1}};typeof Symbol<`u`&&(g.prototype[Symbol.iterator]=function(){return this.iter()},S.prototype[Symbol.iterator]=C.prototype[Symbol.iterator]=w.prototype[Symbol.iterator]=function(){return this});var T=class{constructor(e,t,n,r){this.from=e,this.to=t,this.number=n,this.text=r}get length(){return this.to-this.from}};function E(e,t,n){return t=Math.max(0,Math.min(e.length,t)),[t,Math.max(t,Math.min(e.length,n))]}function D(e,t,n=!0,r=!0){return l(e,t,n,r)}function ee(e){return e>=56320&&e<57344}function O(e){return e>=55296&&e<56320}function k(e,t){let n=e.charCodeAt(t);if(!O(n)||t+1==e.length)return n;let r=e.charCodeAt(t+1);return ee(r)?(n-55296<<10)+(r-56320)+65536:n}function te(e){return e<=65535?String.fromCharCode(e):(e-=65536,String.fromCharCode((e>>10)+55296,(e&1023)+56320))}function ne(e){return e<65536?1:2}var re=/\r\n?|\n/,A=(function(e){return e[e.Simple=0]=`Simple`,e[e.TrackDel=1]=`TrackDel`,e[e.TrackBefore=2]=`TrackBefore`,e[e.TrackAfter=3]=`TrackAfter`,e})(A||={}),ie=class e{constructor(e){this.sections=e}get length(){let e=0;for(let t=0;t<this.sections.length;t+=2)e+=this.sections[t];return e}get newLength(){let e=0;for(let t=0;t<this.sections.length;t+=2){let n=this.sections[t+1];e+=n<0?this.sections[t]:n}return e}get empty(){return this.sections.length==0||this.sections.length==2&&this.sections[1]<0}iterGaps(e){for(let t=0,n=0,r=0;t<this.sections.length;){let i=this.sections[t++],a=this.sections[t++];a<0?(e(n,r,i),r+=i):r+=a,n+=i}}iterChangedRanges(e,t=!1){ce(this,e,t)}get invertedDesc(){let t=[];for(let e=0;e<this.sections.length;){let n=this.sections[e++],r=this.sections[e++];r<0?t.push(n,r):t.push(r,n)}return new e(t)}composeDesc(e){return this.empty?e:e.empty?this:j(this,e)}mapDesc(e,t=!1){return e.empty?this:le(this,e,t)}mapPos(e,t=-1,n=A.Simple){let r=0,i=0;for(let a=0;a<this.sections.length;){let o=this.sections[a++],s=this.sections[a++],c=r+o;if(s<0){if(c>e)return i+(e-r);i+=o}else{if(n!=A.Simple&&c>=e&&(n==A.TrackDel&&r<e&&c>e||n==A.TrackBefore&&r<e||n==A.TrackAfter&&c>e))return null;if(c>e||c==e&&t<0&&!o)return e==r||t<0?i:i+s;i+=s}r=c}if(e>r)throw RangeError(`Position ${e} is out of range for changeset of length ${r}`);return i}touchesRange(e,t=e){for(let n=0,r=0;n<this.sections.length&&r<=t;){let i=this.sections[n++],a=this.sections[n++],o=r+i;if(a>=0&&r<=t&&o>=e)return r<e&&o>t?`cover`:!0;r=o}return!1}toString(){let e=``;for(let t=0;t<this.sections.length;){let n=this.sections[t++],r=this.sections[t++];e+=(e?` `:``)+n+(r>=0?`:`+r:``)}return e}toJSON(){return this.sections}static fromJSON(t){if(!Array.isArray(t)||t.length%2||t.some(e=>typeof e!=`number`))throw RangeError(`Invalid JSON representation of ChangeDesc`);return new e(t)}static create(t){return new e(t)}},ae=class e extends ie{constructor(e,t){super(e),this.inserted=t}apply(e){if(this.length!=e.length)throw RangeError(`Applying change set to a document with the wrong length`);return ce(this,(t,n,r,i,a)=>e=e.replace(r,r+(n-t),a),!1),e}mapDesc(e,t=!1){return le(this,e,t,!0)}invert(t){let n=this.sections.slice(),r=[];for(let e=0,i=0;e<n.length;e+=2){let a=n[e],o=n[e+1];if(o>=0){n[e]=o,n[e+1]=a;let s=e>>1;for(;r.length<s;)r.push(g.empty);r.push(a?t.slice(i,i+a):g.empty)}i+=a}return new e(n,r)}compose(e){return this.empty?e:e.empty?this:j(this,e,!0)}map(e,t=!1){return e.empty?this:le(this,e,t,!0)}iterChanges(e,t=!1){ce(this,e,t)}get desc(){return ie.create(this.sections)}filter(t){let n=[],r=[],i=[],a=new ue(this);done:for(let e=0,o=0;;){let s=e==t.length?1e9:t[e++];for(;o<s||o==s&&a.len==0;){if(a.done)break done;let e=Math.min(a.len,s-o);oe(i,e,-1);let t=a.ins==-1?-1:a.off==0?a.ins:0;oe(n,e,t),t>0&&se(r,n,a.text),a.forward(e),o+=e}let c=t[e++];for(;o<c;){if(a.done)break done;let e=Math.min(a.len,c-o);oe(n,e,-1),oe(i,e,a.ins==-1?-1:a.off==0?a.ins:0),a.forward(e),o+=e}}return{changes:new e(n,r),filtered:ie.create(i)}}toJSON(){let e=[];for(let t=0;t<this.sections.length;t+=2){let n=this.sections[t],r=this.sections[t+1];r<0?e.push(n):r==0?e.push([n]):e.push([n].concat(this.inserted[t>>1].toJSON()))}return e}static of(t,n,r){let i=[],a=[],o=0,s=null;function c(t=!1){if(!t&&!i.length)return;o<n&&oe(i,n-o,-1);let r=new e(i,a);s=s?s.compose(r.map(s)):r,i=[],a=[],o=0}function l(t){if(Array.isArray(t))for(let e of t)l(e);else if(t instanceof e){if(t.length!=n)throw RangeError(`Mismatched change set length (got ${t.length}, expected ${n})`);c(),s=s?s.compose(t.map(s)):t}else{let{from:e,to:s=e,insert:l}=t;if(e>s||e<0||s>n)throw RangeError(`Invalid change range ${e} to ${s} (in doc of length ${n})`);let u=l?typeof l==`string`?g.of(l.split(r||re)):l:g.empty,d=u.length;if(e==s&&d==0)return;e<o&&c(),e>o&&oe(i,e-o,-1),oe(i,s-e,d),se(a,i,u),o=s}}return l(t),c(!s),s}static empty(t){return new e(t?[t,-1]:[],[])}static fromJSON(t){if(!Array.isArray(t))throw RangeError(`Invalid JSON representation of ChangeSet`);let n=[],r=[];for(let e=0;e<t.length;e++){let i=t[e];if(typeof i==`number`)n.push(i,-1);else if(!Array.isArray(i)||typeof i[0]!=`number`||i.some((e,t)=>t&&typeof e!=`string`))throw RangeError(`Invalid JSON representation of ChangeSet`);else if(i.length==1)n.push(i[0],0);else{for(;r.length<e;)r.push(g.empty);r[e]=g.of(i.slice(1)),n.push(i[0],r[e].length)}}return new e(n,r)}static createSet(t,n){return new e(t,n)}};function oe(e,t,n,r=!1){if(t==0&&n<=0)return;let i=e.length-2;i>=0&&n<=0&&n==e[i+1]?e[i]+=t:i>=0&&t==0&&e[i]==0?e[i+1]+=n:r?(e[i]+=t,e[i+1]+=n):e.push(t,n)}function se(e,t,n){if(n.length==0)return;let r=t.length-2>>1;if(r<e.length)e[e.length-1]=e[e.length-1].append(n);else{for(;e.length<r;)e.push(g.empty);e.push(n)}}function ce(e,t,n){let r=e.inserted;for(let i=0,a=0,o=0;o<e.sections.length;){let s=e.sections[o++],c=e.sections[o++];if(c<0)i+=s,a+=s;else{let l=i,u=a,d=g.empty;for(;l+=s,u+=c,c&&r&&(d=d.append(r[o-2>>1])),!(n||o==e.sections.length||e.sections[o+1]<0);)s=e.sections[o++],c=e.sections[o++];t(i,l,a,u,d),i=l,a=u}}}function le(e,t,n,r=!1){let i=[],a=r?[]:null,o=new ue(e),s=new ue(t);for(let e=-1;;)if(o.done&&s.len||s.done&&o.len)throw Error(`Mismatched change set lengths`);else if(o.ins==-1&&s.ins==-1){let e=Math.min(o.len,s.len);oe(i,e,-1),o.forward(e),s.forward(e)}else if(s.ins>=0&&(o.ins<0||e==o.i||o.off==0&&(s.len<o.len||s.len==o.len&&!n))){let t=s.len;for(oe(i,s.ins,-1);t;){let n=Math.min(o.len,t);o.ins>=0&&e<o.i&&o.len<=n&&(oe(i,0,o.ins),a&&se(a,i,o.text),e=o.i),o.forward(n),t-=n}s.next()}else if(o.ins>=0){let t=0,n=o.len;for(;n;)if(s.ins==-1){let e=Math.min(n,s.len);t+=e,n-=e,s.forward(e)}else if(s.ins==0&&s.len<n)n-=s.len,s.next();else break;oe(i,t,e<o.i?o.ins:0),a&&e<o.i&&se(a,i,o.text),e=o.i,o.forward(o.len-n)}else if(o.done&&s.done)return a?ae.createSet(i,a):ie.create(i);else throw Error(`Mismatched change set lengths`)}function j(e,t,n=!1){let r=[],i=n?[]:null,a=new ue(e),o=new ue(t);for(let e=!1;;)if(a.done&&o.done)return i?ae.createSet(r,i):ie.create(r);else if(a.ins==0)oe(r,a.len,0,e),a.next();else if(o.len==0&&!o.done)oe(r,0,o.ins,e),i&&se(i,r,o.text),o.next();else if(a.done||o.done)throw Error(`Mismatched change set lengths`);else{let t=Math.min(a.len2,o.len),n=r.length;if(a.ins==-1){let n=o.ins==-1?-1:o.off?0:o.ins;oe(r,t,n,e),i&&n&&se(i,r,o.text)}else o.ins==-1?(oe(r,a.off?0:a.len,t,e),i&&se(i,r,a.textBit(t))):(oe(r,a.off?0:a.len,o.off?0:o.ins,e),i&&!o.off&&se(i,r,o.text));e=(a.ins>t||o.ins>=0&&o.len>t)&&(e||r.length>n),a.forward2(t),o.forward(t)}}var ue=class{constructor(e){this.set=e,this.i=0,this.next()}next(){let{sections:e}=this.set;this.i<e.length?(this.len=e[this.i++],this.ins=e[this.i++]):(this.len=0,this.ins=-2),this.off=0}get done(){return this.ins==-2}get len2(){return this.ins<0?this.len:this.ins}get text(){let{inserted:e}=this.set,t=this.i-2>>1;return t>=e.length?g.empty:e[t]}textBit(e){let{inserted:t}=this.set,n=this.i-2>>1;return n>=t.length&&!e?g.empty:t[n].slice(this.off,e==null?void 0:this.off+e)}forward(e){e==this.len?this.next():(this.len-=e,this.off+=e)}forward2(e){this.ins==-1?this.forward(e):e==this.ins?this.next():(this.ins-=e,this.off+=e)}},de=class e{constructor(e,t,n,r){this.from=e,this.to=t,this.flags=n,this.goalColumn=r}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get undirectional(){return(this.flags&64)>0}get bidiLevel(){let e=this.flags&7;return e==7?null:e}map(t,n=-1){let r,i;return this.empty?r=i=t.mapPos(this.from,n):(r=t.mapPos(this.from,1),i=t.mapPos(this.to,-1)),r==this.from&&i==this.to?this:new e(r,i,this.flags,this.goalColumn)}extend(e,t=e,n=0){if(e<=this.anchor&&t>=this.anchor)return M.range(e,t,void 0,void 0,n);let r=Math.abs(e-this.anchor)>Math.abs(t-this.anchor)?e:t;return M.range(this.anchor,r,void 0,void 0,n)}eq(e,t=!1){return this.anchor==e.anchor&&this.head==e.head&&this.goalColumn==e.goalColumn&&(!t||!this.empty||this.assoc==e.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(e){if(!e||typeof e.anchor!=`number`||typeof e.head!=`number`)throw RangeError(`Invalid JSON representation for SelectionRange`);return M.range(e.anchor,e.head)}static create(t,n,r,i){return new e(t,n,r,i)}},M=class e{constructor(e,t){this.ranges=e,this.mainIndex=t}map(t,n=-1){return t.empty?this:e.create(this.ranges.map(e=>e.map(t,n)),this.mainIndex)}eq(e,t=!1){if(this.ranges.length!=e.ranges.length||this.mainIndex!=e.mainIndex)return!1;for(let n=0;n<this.ranges.length;n++)if(!this.ranges[n].eq(e.ranges[n],t))return!1;return!0}get main(){return this.ranges[this.mainIndex]}asSingle(){return this.ranges.length==1?this:new e([this.main],0)}addRange(t,n=!0){return e.create([t].concat(this.ranges),n?0:this.mainIndex+1)}replaceRange(t,n=this.mainIndex){let r=this.ranges.slice();return r[n]=t,e.create(r,this.mainIndex)}toJSON(){return{ranges:this.ranges.map(e=>e.toJSON()),main:this.mainIndex}}static fromJSON(t){if(!t||!Array.isArray(t.ranges)||typeof t.main!=`number`||t.main>=t.ranges.length)throw RangeError(`Invalid JSON representation for EditorSelection`);return new e(t.ranges.map(e=>de.fromJSON(e)),t.main)}static single(t,n=t){return new e([e.range(t,n)],0)}static create(t,n=0){if(t.length==0)throw RangeError(`A selection needs at least one range`);for(let r=0,i=0;i<t.length;i++){let a=t[i];if(a.empty?a.from<=r:a.from<r)return e.normalized(t.slice(),n);r=a.to}return new e(t,n)}static cursor(e,t=0,n,r){return de.create(e,e,(t==0?0:t<0?8:16)|(n==null?7:Math.min(6,n)),r)}static range(e,t,n,r,i){let a=r==null?7:Math.min(6,r);return!i&&e!=t&&(i=t<e?1:-1),i&&(a|=i<0?8:16),t<e?de.create(t,e,a|32,n):de.create(e,t,a,n)}static undirectionalRange(e,t){return de.create(e,t,64,void 0)}static normalized(t,n=0){let r=t[n];t.sort((e,t)=>e.from-t.from),n=t.indexOf(r);for(let r=1;r<t.length;r++){let i=t[r],a=t[r-1];if(i.empty?i.from<=a.to:i.from<a.to){let o=a.from,s=Math.max(i.to,a.to);r<=n&&n--,t.splice(--r,2,i.anchor>i.head?e.range(s,o):e.range(o,s))}}return new e(t,n)}};function fe(e,t){for(let n of e.ranges)if(n.to>t)throw RangeError(`Selection points outside of document`)}var pe=0,N=class e{constructor(e,t,n,r,i){this.combine=e,this.compareInput=t,this.compare=n,this.isStatic=r,this.id=pe++,this.default=e([]),this.extensions=typeof i==`function`?i(this):i}get reader(){return this}static define(t={}){return new e(t.combine||(e=>e),t.compareInput||((e,t)=>e===t),t.compare||(t.combine?(e,t)=>e===t:me),!!t.static,t.enables)}of(e){return new he([],this,0,e)}compute(e,t){if(this.isStatic)throw Error(`Can't compute a static facet`);return new he(e,this,1,t)}computeN(e,t){if(this.isStatic)throw Error(`Can't compute a static facet`);return new he(e,this,2,t)}from(e,t){return t||=e=>e,this.compute([e],n=>t(n.field(e)))}};function me(e,t){return e==t||e.length==t.length&&e.every((e,n)=>e===t[n])}var he=class{constructor(e,t,n,r){this.dependencies=e,this.facet=t,this.type=n,this.value=r,this.id=pe++}dynamicSlot(e){let t=this.value,n=this.facet.compareInput,r=this.id,i=e[r]>>1,a=this.type==2,o=!1,s=!1,c=[];for(let t of this.dependencies)t==`doc`?o=!0:t==`selection`?s=!0:(e[t.id]??1)&1||c.push(e[t.id]);return{create(e){return e.values[i]=t(e),1},update(e,r){if(o&&r.docChanged||s&&(r.docChanged||r.selection)||_e(e,c)){let r=t(e);if(a?!ge(r,e.values[i],n):!n(r,e.values[i]))return e.values[i]=r,1}return 0},reconfigure:(e,o)=>{let s,c=o.config.address[r];if(c!=null){let r=Ae(o,c);if(this.dependencies.every(t=>t instanceof N?o.facet(t)===e.facet(t):t instanceof be?o.field(t,!1)==e.field(t,!1):!0)||(a?ge(s=t(e),r,n):n(s=t(e),r)))return e.values[i]=r,0}else s=t(e);return e.values[i]=s,1}}}get extension(){return this}};function ge(e,t,n){if(e.length!=t.length)return!1;for(let r=0;r<e.length;r++)if(!n(e[r],t[r]))return!1;return!0}function _e(e,t){let n=!1;for(let r of t)ke(e,r)&1&&(n=!0);return n}function ve(e,t,n){let r=n.map(t=>e[t.id]),i=n.map(e=>e.type),a=r.filter(e=>!(e&1)),o=e[t.id]>>1;function s(e){let n=[];for(let t=0;t<r.length;t++){let a=Ae(e,r[t]);if(i[t]==2)for(let e of a)n.push(e);else n.push(a)}return t.combine(n)}return{create(e){for(let t of r)ke(e,t);return e.values[o]=s(e),1},update(e,n){if(!_e(e,a))return 0;let r=s(e);return t.compare(r,e.values[o])?0:(e.values[o]=r,1)},reconfigure(e,i){let a=_e(e,r),c=i.config.facets[t.id],l=i.facet(t);if(c&&!a&&me(n,c))return e.values[o]=l,0;let u=s(e);return t.compare(u,l)?(e.values[o]=l,0):(e.values[o]=u,1)}}}var ye=N.define({static:!0}),be=class e{constructor(e,t,n,r,i){this.id=e,this.createF=t,this.updateF=n,this.compareF=r,this.spec=i,this.provides=void 0}static define(t){let n=new e(pe++,t.create,t.update,t.compare||((e,t)=>e===t),t);return t.provide&&(n.provides=t.provide(n)),n}create(e){return(e.facet(ye).find(e=>e.field==this)?.create||this.createF)(e)}slot(e){let t=e[this.id]>>1;return{create:e=>(e.values[t]=this.create(e),1),update:(e,n)=>{let r=e.values[t],i=this.updateF(r,n);return this.compareF(r,i)?0:(e.values[t]=i,1)},reconfigure:(e,n)=>{let r=e.facet(ye),i=n.facet(ye),a;return(a=r.find(e=>e.field==this))&&a!=i.find(e=>e.field==this)?(e.values[t]=a.create(e),1):n.config.address[this.id]==null?(e.values[t]=this.create(e),1):(e.values[t]=n.field(this),0)}}}init(e){return[this,ye.of({field:this,create:e})]}get extension(){return this}},xe={lowest:4,low:3,default:2,high:1,highest:0};function Se(e){return t=>new we(t,e)}var Ce={highest:Se(xe.highest),high:Se(xe.high),default:Se(xe.default),low:Se(xe.low),lowest:Se(xe.lowest)},we=class{constructor(e,t){this.inner=e,this.prec=t}get extension(){return this}},Te=class e{of(e){return new Ee(this,e)}reconfigure(t){return e.reconfigure.of({compartment:this,extension:t})}get(e){return e.config.compartments.get(this)}},Ee=class{constructor(e,t){this.compartment=e,this.inner=t}get extension(){return this}},De=class e{constructor(e,t,n,r,i,a){for(this.base=e,this.compartments=t,this.dynamicSlots=n,this.address=r,this.staticValues=i,this.facets=a,this.statusTemplate=[];this.statusTemplate.length<n.length;)this.statusTemplate.push(0)}staticFacet(e){let t=this.address[e.id];return t==null?e.default:this.staticValues[t>>1]}static resolve(t,n,r){let i=[],a=Object.create(null),o=new Map;for(let e of Oe(t,n,o))e instanceof be?i.push(e):(a[e.facet.id]||(a[e.facet.id]=[])).push(e);let s=Object.create(null),c=[],l=[];for(let e of i)s[e.id]=l.length<<1,l.push(t=>e.slot(t));let u=r?.config.facets;for(let e in a){let t=a[e],n=t[0].facet,i=u&&u[e]||[];if(t.every(e=>e.type==0))if(s[n.id]=c.length<<1|1,me(i,t))c.push(r.facet(n));else{let e=n.combine(t.map(e=>e.value));c.push(r&&n.compare(e,r.facet(n))?r.facet(n):e)}else{for(let e of t)e.type==0?(s[e.id]=c.length<<1|1,c.push(e.value)):(s[e.id]=l.length<<1,l.push(t=>e.dynamicSlot(t)));s[n.id]=l.length<<1,l.push(e=>ve(e,n,t))}}let d=l.map(e=>e(s));return new e(t,o,d,s,c,a)}};function Oe(e,t,n){let r=[[],[],[],[],[]],i=new Map;function a(e,o){let s=i.get(e);if(s!=null){if(s<=o)return;let t=r[s].indexOf(e);t>-1&&r[s].splice(t,1),e instanceof Ee&&n.delete(e.compartment)}if(i.set(e,o),Array.isArray(e))for(let t of e)a(t,o);else if(e instanceof Ee){if(n.has(e.compartment))throw RangeError(`Duplicate use of compartment in extensions`);let r=t.get(e.compartment)||e.inner;n.set(e.compartment,r),a(r,o)}else if(e instanceof we)a(e.inner,e.prec);else if(e instanceof be)r[o].push(e),e.provides&&a(e.provides,o);else if(e instanceof he)r[o].push(e),e.facet.extensions&&a(e.facet.extensions,xe.default);else{let t=e.extension;if(!t)throw Error(`Unrecognized extension value in extension set (${e}).`);if(t==e)throw Error(`Unrecognized extension value in extension set (${e}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);a(t,o)}}return a(e,xe.default),r.reduce((e,t)=>e.concat(t))}function ke(e,t){if(t&1)return 2;let n=t>>1,r=e.status[n];if(r==4)throw Error(`Cyclic dependency between fields and/or facets`);if(r&2)return r;e.status[n]=4;let i=e.computeSlot(e,e.config.dynamicSlots[n]);return e.status[n]=2|i}function Ae(e,t){return t&1?e.config.staticValues[t>>1]:e.values[t>>1]}var je=N.define(),Me=N.define({combine:e=>e.some(e=>e),static:!0}),Ne=N.define({combine:e=>e.length?e[0]:void 0,static:!0}),Pe=N.define(),Fe=N.define(),Ie=N.define(),Le=N.define({combine:e=>e.length?e[0]:!1}),P=class{constructor(e,t){this.type=e,this.value=t}static define(){return new Re}},Re=class{of(e){return new P(this,e)}},ze=class{constructor(e){this.map=e}of(e){return new F(this,e)}},F=class e{constructor(e,t){this.type=e,this.value=t}map(t){let n=this.type.map(this.value,t);return n===void 0?void 0:n==this.value?this:new e(this.type,n)}is(e){return this.type==e}static define(e={}){return new ze(e.map||(e=>e))}static mapEffects(e,t){if(!e.length)return e;let n=[];for(let r of e){let e=r.map(t);e&&n.push(e)}return n}};F.reconfigure=F.define(),F.appendConfig=F.define();var Be=class e{constructor(t,n,r,i,a,o){this.startState=t,this.changes=n,this.selection=r,this.effects=i,this.annotations=a,this.scrollIntoView=o,this._doc=null,this._state=null,r&&fe(r,n.newLength),a.some(t=>t.type==e.time)||(this.annotations=a.concat(e.time.of(Date.now())))}static create(t,n,r,i,a,o){return new e(t,n,r,i,a,o)}get newDoc(){return this._doc||=this.changes.apply(this.startState.doc)}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(e){for(let t of this.annotations)if(t.type==e)return t.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(t){let n=this.annotation(e.userEvent);return!!(n&&(n==t||n.length>t.length&&n.slice(0,t.length)==t&&n[t.length]==`.`))}};Be.time=P.define(),Be.userEvent=P.define(),Be.addToHistory=P.define(),Be.remote=P.define();function Ve(e,t){let n=[];for(let r=0,i=0;;){let a,o;if(r<e.length&&(i==t.length||t[i]>=e[r]))a=e[r++],o=e[r++];else if(i<t.length)a=t[i++],o=t[i++];else return n;!n.length||n[n.length-1]<a?n.push(a,o):n[n.length-1]<o&&(n[n.length-1]=o)}}function He(e,t,n){let r,i,a;return n?(r=t.changes,i=ae.empty(t.changes.length),a=e.changes.compose(t.changes)):(r=t.changes.map(e.changes),i=e.changes.mapDesc(t.changes,!0),a=e.changes.compose(r)),{changes:a,selection:t.selection?t.selection.map(i):e.selection?.map(r),effects:F.mapEffects(e.effects,r).concat(F.mapEffects(t.effects,i)),annotations:e.annotations.length?e.annotations.concat(t.annotations):t.annotations,scrollIntoView:e.scrollIntoView||t.scrollIntoView}}function Ue(e,t,n){let r=t.selection,i=Je(t.annotations);return t.userEvent&&(i=i.concat(Be.userEvent.of(t.userEvent))),{changes:t.changes instanceof ae?t.changes:ae.of(t.changes||[],n,e.facet(Ne)),selection:r&&(r instanceof M?r:M.single(r.anchor,r.head)),effects:Je(t.effects),annotations:i,scrollIntoView:!!t.scrollIntoView}}function We(e,t,n){let r=Ue(e,t.length?t[0]:{},e.doc.length);t.length&&t[0].filter===!1&&(n=!1);for(let i=1;i<t.length;i++){t[i].filter===!1&&(n=!1);let a=!!t[i].sequential;r=He(r,Ue(e,t[i],a?r.changes.newLength:e.doc.length),a)}let i=Be.create(e,r.changes,r.selection,r.effects,r.annotations,r.scrollIntoView);return Ke(n?Ge(i):i)}function Ge(e){let t=e.startState,n=!0;for(let r of t.facet(Pe)){let t=r(e);if(t===!1){n=!1;break}Array.isArray(t)&&(n=n===!0?t:Ve(n,t))}if(n!==!0){let r,i;if(n===!1)i=e.changes.invertedDesc,r=ae.empty(t.doc.length);else{let t=e.changes.filter(n);r=t.changes,i=t.filtered.mapDesc(t.changes).invertedDesc}e=Be.create(t,r,e.selection&&e.selection.map(i),F.mapEffects(e.effects,i),e.annotations,e.scrollIntoView)}let r=t.facet(Fe);for(let n=r.length-1;n>=0;n--){let i=r[n](e);e=i instanceof Be?i:Array.isArray(i)&&i.length==1&&i[0]instanceof Be?i[0]:We(t,Je(i),!1)}return e}function Ke(e){let t=e.startState,n=t.facet(Ie),r=e;for(let i=n.length-1;i>=0;i--){let a=n[i](e);a&&Object.keys(a).length&&(r=He(r,Ue(t,a,e.changes.newLength),!0))}return r==e?e:Be.create(t,e.changes,e.selection,r.effects,r.annotations,r.scrollIntoView)}var qe=[];function Je(e){return e==null?qe:Array.isArray(e)?e:[e]}var Ye=(function(e){return e[e.Word=0]=`Word`,e[e.Space=1]=`Space`,e[e.Other=2]=`Other`,e})(Ye||={}),Xe=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,Ze;try{Ze=RegExp(`[\\p{Alphabetic}\\p{Number}_]`,`u`)}catch{}function Qe(e){if(Ze)return Ze.test(e);for(let t=0;t<e.length;t++){let n=e[t];if(/\w/.test(n)||n>`€`&&(n.toUpperCase()!=n.toLowerCase()||Xe.test(n)))return!0}return!1}function $e(e){return t=>{if(!/\S/.test(t))return Ye.Space;if(Qe(t))return Ye.Word;for(let n=0;n<e.length;n++)if(t.indexOf(e[n])>-1)return Ye.Word;return Ye.Other}}var et=class e{constructor(e,t,n,r,i,a){this.config=e,this.doc=t,this.selection=n,this.values=r,this.status=e.statusTemplate.slice(),this.computeSlot=i,a&&(a._state=this);for(let e=0;e<this.config.dynamicSlots.length;e++)ke(this,e<<1);this.computeSlot=null}field(e,t=!0){let n=this.config.address[e.id];if(n==null){if(t)throw RangeError(`Field is not present in this state`);return}return ke(this,n),Ae(this,n)}update(...e){return We(this,e,!0)}applyTransaction(t){let n=this.config,{base:r,compartments:i}=n;for(let e of t.effects)e.is(Te.reconfigure)?(n&&=(i=new Map,n.compartments.forEach((e,t)=>i.set(t,e)),null),i.set(e.value.compartment,e.value.extension)):e.is(F.reconfigure)?(n=null,r=e.value):e.is(F.appendConfig)&&(n=null,r=Je(r).concat(e.value));let a;n?a=t.startState.values.slice():(n=De.resolve(r,i,this),a=new e(n,this.doc,this.selection,n.dynamicSlots.map(()=>null),(e,t)=>t.reconfigure(e,this),null).values);let o=t.startState.facet(Me)?t.newSelection:t.newSelection.asSingle();new e(n,t.newDoc,o,a,(e,n)=>n.update(e,t),t)}replaceSelection(e){return typeof e==`string`&&(e=this.toText(e)),this.changeByRange(t=>({changes:{from:t.from,to:t.to,insert:e},range:M.cursor(t.from+e.length)}))}changeByRange(e){let t=this.selection,n=e(t.ranges[0]),r=this.changes(n.changes),i=[n.range],a=Je(n.effects);for(let n=1;n<t.ranges.length;n++){let o=e(t.ranges[n]),s=this.changes(o.changes),c=s.map(r);for(let e=0;e<n;e++)i[e]=i[e].map(c);let l=r.mapDesc(s,!0);i.push(o.range.map(l)),r=r.compose(c),a=F.mapEffects(a,c).concat(F.mapEffects(Je(o.effects),l))}return{changes:r,selection:M.create(i,t.mainIndex),effects:a}}changes(t=[]){return t instanceof ae?t:ae.of(t,this.doc.length,this.facet(e.lineSeparator))}toText(t){return g.of(t.split(this.facet(e.lineSeparator)||re))}sliceDoc(e=0,t=this.doc.length){return this.doc.sliceString(e,t,this.lineBreak)}facet(e){let t=this.config.address[e.id];return t==null?e.default:(ke(this,t),Ae(this,t))}toJSON(e){let t={doc:this.sliceDoc(),selection:this.selection.toJSON()};if(e)for(let n in e){let r=e[n];r instanceof be&&this.config.address[r.id]!=null&&(t[n]=r.spec.toJSON(this.field(e[n]),this))}return t}static fromJSON(t,n={},r){if(!t||typeof t.doc!=`string`)throw RangeError(`Invalid JSON representation for EditorState`);let i=[];if(r){for(let e in r)if(Object.prototype.hasOwnProperty.call(t,e)){let n=r[e],a=t[e];i.push(n.init(e=>n.spec.fromJSON(a,e)))}}return e.create({doc:t.doc,selection:M.fromJSON(t.selection),extensions:n.extensions?i.concat([n.extensions]):i})}static create(t={}){let n=De.resolve(t.extensions||[],new Map),r=t.doc instanceof g?t.doc:g.of((t.doc||``).split(n.staticFacet(e.lineSeparator)||re)),i=t.selection?t.selection instanceof M?t.selection:M.single(t.selection.anchor,t.selection.head):M.single(0);return fe(i,r.length),n.staticFacet(Me)||(i=i.asSingle()),new e(n,r,i,n.dynamicSlots.map(()=>null),(e,t)=>t.create(e),null)}get tabSize(){return this.facet(e.tabSize)}get lineBreak(){return this.facet(e.lineSeparator)||`
@@ -1 +1 @@
1
- import{m as e,t}from"./mermaid-parser.core-Dw18Fjbq.js";import{n}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import{m as r}from"./src-oBChb5qS.js";import"./chunk-WYO6CB5R-zVyUwJq3.js";import"./chunk-VAUOI2AC-WofZ-2M0.js";import{n as i,r as a,t as o}from"./chunk-MOJQB5TN-DKrK867P.js";import{t as s}from"./chunk-JWPE2WC7-DVXcaiue.js";var c=e().RailroadAbnf.parser.LangiumParser,l=n(e=>{let t=e.alternatives.map(u);return t.length===1?t[0]:{type:`choice`,alternatives:t}},`transformAlternation`),u=n(e=>{let t=e.elements.map(f);return t.length===1?t[0]:{type:`sequence`,elements:t}},`transformConcatenation`),d=n(e=>{if(e.includes(`*`)){let[t,n]=e.split(`*`);return{min:t?parseInt(t,10):0,max:n?parseInt(n,10):1/0}}let t=parseInt(e,10);return{min:t,max:t}},`parseRepeat`),f=n(e=>{let t=p(e.primary);if(!e.repeat)return t;let{min:n,max:r}=d(e.repeat);return n===0&&r===1?{type:`optional`,element:t}:{type:`repetition`,element:t,min:n,max:r}},`transformElement`),p=n(e=>{switch(e.$type){case`AbnfStringLiteral`:return{type:`terminal`,value:e.value};case`AbnfNumVal`:return{type:`terminal`,value:e.value};case`AbnfRuleName`:return{type:`nonterminal`,name:e.name};case`AbnfGroup`:return l(e.element);case`AbnfOptionalGroup`:return{type:`optional`,element:l(e.element)};default:throw Error(`Unsupported ABNF primary node: ${e.$type}`)}},`transformPrimary`),m=n(e=>({name:e.name,definition:l(e.definition)}),`transformRule`),h=n(e=>{s(e,o),e.title&&o.setTitle(e.title),e.rules.map(e=>o.addRule(m(e)))},`populateDb`),g={parser:{parse:n(e=>{o.clear(),r.debug(`[ABNF Parser] Starting Langium parse`);let n=c.parse(e);if(n.lexerErrors.length>0||n.parserErrors.length>0)throw new t(n);let i=n.value;r.debug(`[ABNF Parser] Parsed rules:`,i.rules.length),h(i),r.debug(`[ABNF Parser] Parse complete`)},`parse`),parser:{yy:o}},db:o,renderer:a,styles:i};export{g as diagram};
1
+ import{m as e,t}from"./mermaid-parser.core-BW47khiS.js";import{n}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import{m as r}from"./src-oBChb5qS.js";import"./chunk-WYO6CB5R-By1K0guW.js";import"./chunk-VAUOI2AC-BhfSWJZI.js";import{n as i,r as a,t as o}from"./chunk-MOJQB5TN-BrEI4GGn.js";import{t as s}from"./chunk-JWPE2WC7-DVXcaiue.js";var c=e().RailroadAbnf.parser.LangiumParser,l=n(e=>{let t=e.alternatives.map(u);return t.length===1?t[0]:{type:`choice`,alternatives:t}},`transformAlternation`),u=n(e=>{let t=e.elements.map(f);return t.length===1?t[0]:{type:`sequence`,elements:t}},`transformConcatenation`),d=n(e=>{if(e.includes(`*`)){let[t,n]=e.split(`*`);return{min:t?parseInt(t,10):0,max:n?parseInt(n,10):1/0}}let t=parseInt(e,10);return{min:t,max:t}},`parseRepeat`),f=n(e=>{let t=p(e.primary);if(!e.repeat)return t;let{min:n,max:r}=d(e.repeat);return n===0&&r===1?{type:`optional`,element:t}:{type:`repetition`,element:t,min:n,max:r}},`transformElement`),p=n(e=>{switch(e.$type){case`AbnfStringLiteral`:return{type:`terminal`,value:e.value};case`AbnfNumVal`:return{type:`terminal`,value:e.value};case`AbnfRuleName`:return{type:`nonterminal`,name:e.name};case`AbnfGroup`:return l(e.element);case`AbnfOptionalGroup`:return{type:`optional`,element:l(e.element)};default:throw Error(`Unsupported ABNF primary node: ${e.$type}`)}},`transformPrimary`),m=n(e=>({name:e.name,definition:l(e.definition)}),`transformRule`),h=n(e=>{s(e,o),e.title&&o.setTitle(e.title),e.rules.map(e=>o.addRule(m(e)))},`populateDb`),g={parser:{parse:n(e=>{o.clear(),r.debug(`[ABNF Parser] Starting Langium parse`);let n=c.parse(e);if(n.lexerErrors.length>0||n.parserErrors.length>0)throw new t(n);let i=n.value;r.debug(`[ABNF Parser] Parsed rules:`,i.rules.length),h(i),r.debug(`[ABNF Parser] Parse complete`)},`parse`),parser:{yy:o}},db:o,renderer:a,styles:i};export{g as diagram};
@@ -0,0 +1 @@
1
+ import"./chunk-KEIR6QF5-DEvma7oi.js";import{M as e}from"./mermaid-parser.core-BW47khiS.js";export{e as createArchitectureServices};
@@ -1,4 +1,4 @@
1
- import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{n as t}from"./mermaid-parser.core-Dw18Fjbq.js";import{n}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import{m as r,p as i}from"./src-oBChb5qS.js";import{H as a,J as o,K as s,U as c,a as l,b as u,f as d,v as f,w as p,x as m,y as h,z as g}from"./chunk-WYO6CB5R-zVyUwJq3.js";import{c as _,i as v}from"./chunk-ICXQ74PX-Ar8kfXfa.js";import{t as y}from"./chunk-VAUOI2AC-WofZ-2M0.js";import{t as b}from"./chunk-JWPE2WC7-DVXcaiue.js";import{i as x,r as S,t as C}from"./chunk-HOUHSVGY-BlHO2iQ3.js";import{n as w}from"./chunk-Q4XR5HBZ-g15qvFAN.js";import{t as T}from"./cytoscape.esm-C3UvhD5t.js";import{t as E}from"./cytoscape-fcose-peAzqedC.js";var ee=e(E(),1),D={L:`left`,R:`right`,T:`top`,B:`bottom`},O={L:n(e=>`${e},${e/2} 0,${e} 0,0`,`L`),R:n(e=>`0,${e/2} ${e},0 ${e},${e}`,`R`),T:n(e=>`0,0 ${e},0 ${e/2},${e}`,`T`),B:n(e=>`${e/2},0 ${e},${e} 0,${e}`,`B`)},k={L:n((e,t)=>e-t+2,`L`),R:n((e,t)=>e-2,`R`),T:n((e,t)=>e-t+2,`T`),B:n((e,t)=>e-2,`B`)},te=n(function(e){return j(e)?e===`L`?`R`:`L`:e===`T`?`B`:`T`},`getOppositeArchitectureDirection`),A=n(function(e){let t=e;return t===`L`||t===`R`||t===`T`||t===`B`},`isArchitectureDirection`),j=n(function(e){let t=e;return t===`L`||t===`R`},`isArchitectureDirectionX`),M=n(function(e){let t=e;return t===`T`||t===`B`},`isArchitectureDirectionY`),N=n(function(e,t){let n=j(e)&&M(t),r=M(e)&&j(t);return n||r},`isArchitectureDirectionXY`),P=n(function(e){let t=e[0],n=e[1],r=j(t)&&M(n),i=M(t)&&j(n);return r||i},`isArchitecturePairXY`),F=n(function(e){return e!==`LL`&&e!==`RR`&&e!==`TT`&&e!==`BB`},`isValidArchitectureDirectionPair`),I=n(function(e,t){let n=`${e}${t}`;return F(n)?n:void 0},`getArchitectureDirectionPair`),L=n(function([e,t],n){let r=n[0],i=n[1];return j(r)?M(i)?[e+(r===`L`?-1:1),t+(i===`T`?1:-1)]:[e+(r===`L`?-1:1),t]:j(i)?[e+(i===`L`?1:-1),t+(r===`T`?1:-1)]:[e,t+(r===`T`?1:-1)]},`shiftPositionByArchitectureDirectionPair`),R=n(function(e){return e===`LT`||e===`TL`?[1,1]:e===`BL`||e===`LB`?[1,-1]:e===`BR`||e===`RB`?[-1,-1]:[-1,1]},`getArchitectureDirectionXYFactors`),ne=n(function(e,t){return N(e,t)?`bend`:j(e)?`horizontal`:`vertical`},`getArchitectureDirectionAlignment`),re=n(function(e){return e.type===`service`},`isArchitectureService`),ie=n(function(e){return e.type===`junction`},`isArchitectureJunction`),z=n(e=>e.data(),`edgeData`),B=n(e=>e.data(),`nodeData`),ae=d.architecture,V=class{constructor(){this.nodes={},this.groups={},this.edges=[],this.layoutHints=[],this.registeredIds={},this.elements={},this.diagramId=``,this.setAccTitle=c,this.getAccTitle=h,this.setDiagramTitle=s,this.getDiagramTitle=p,this.getAccDescription=f,this.setAccDescription=a,this.clear()}static{n(this,`ArchitectureDB`)}setDiagramId(e){this.diagramId=e}getDiagramId(){return this.diagramId}clear(){this.nodes={},this.groups={},this.edges=[],this.layoutHints=[],this.registeredIds={},this.dataStructures=void 0,this.elements={},this.diagramId=``,l()}addService({id:e,icon:t,in:n,title:r,iconText:i}){if(this.registeredIds[e]!==void 0)throw Error(`The service id [${e}] is already in use by another ${this.registeredIds[e]}`);if(n!==void 0){if(e===n)throw Error(`The service [${e}] cannot be placed within itself`);if(this.registeredIds[n]===void 0)throw Error(`The service [${e}]'s parent does not exist. Please make sure the parent is created before this service`);if(this.registeredIds[n]===`node`)throw Error(`The service [${e}]'s parent is not a group`)}this.registeredIds[e]=`node`,this.nodes[e]={id:e,type:`service`,icon:t,iconText:i,title:r,edges:[],in:n}}getServices(){return Object.values(this.nodes).filter(re)}addJunction({id:e,in:t}){if(this.registeredIds[e]!==void 0)throw Error(`The junction id [${e}] is already in use by another ${this.registeredIds[e]}`);if(t!==void 0){if(e===t)throw Error(`The junction [${e}] cannot be placed within itself`);if(this.registeredIds[t]===void 0)throw Error(`The junction [${e}]'s parent does not exist. Please make sure the parent is created before this junction`);if(this.registeredIds[t]===`node`)throw Error(`The junction [${e}]'s parent is not a group`)}this.registeredIds[e]=`node`,this.nodes[e]={id:e,type:`junction`,edges:[],in:t}}getJunctions(){return Object.values(this.nodes).filter(ie)}getNodes(){return Object.values(this.nodes)}getNode(e){return this.nodes[e]??null}addGroup({id:e,icon:t,in:n,title:r}){if(this.registeredIds?.[e]!==void 0)throw Error(`The group id [${e}] is already in use by another ${this.registeredIds[e]}`);if(n!==void 0){if(e===n)throw Error(`The group [${e}] cannot be placed within itself`);if(this.registeredIds?.[n]===void 0)throw Error(`The group [${e}]'s parent does not exist. Please make sure the parent is created before this group`);if(this.registeredIds?.[n]===`node`)throw Error(`The group [${e}]'s parent is not a group`)}this.registeredIds[e]=`group`,this.groups[e]={id:e,icon:t,title:r,in:n}}getGroups(){return Object.values(this.groups)}addEdge({lhsId:e,rhsId:t,lhsDir:n,rhsDir:r,lhsInto:i,rhsInto:a,lhsGroup:o,rhsGroup:s,title:c}){if(!A(n))throw Error(`Invalid direction given for left hand side of edge ${e}--${t}. Expected (L,R,T,B) got ${String(n)}`);if(!A(r))throw Error(`Invalid direction given for right hand side of edge ${e}--${t}. Expected (L,R,T,B) got ${String(r)}`);if(this.nodes[e]===void 0&&this.groups[e]===void 0)throw Error(`The left-hand id [${e}] does not yet exist. Please create the service/group before declaring an edge to it.`);if(this.nodes[t]===void 0&&this.groups[t]===void 0)throw Error(`The right-hand id [${t}] does not yet exist. Please create the service/group before declaring an edge to it.`);let l=this.nodes[e].in,u=this.nodes[t].in;if(o&&l&&u&&l==u)throw Error(`The left-hand id [${e}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);if(s&&l&&u&&l==u)throw Error(`The right-hand id [${t}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);let d={lhsId:e,lhsDir:n,lhsInto:i,lhsGroup:o,rhsId:t,rhsDir:r,rhsInto:a,rhsGroup:s,title:c};this.edges.push(d),this.nodes[e]&&this.nodes[t]&&(this.nodes[e].edges.push(this.edges[this.edges.length-1]),this.nodes[t].edges.push(this.edges[this.edges.length-1]))}getEdges(){return this.edges}addLayoutHint(e){if(e.members.length<2)throw Error(`An align directive requires at least two members; got ${e.members.length}`);let t=new Set;e.members.forEach(n=>{if(this.registeredIds[n]!==`node`)throw Error(`align ${e.direction} references [${n}], which is not a service or junction`);if(t.has(n))throw Error(`align ${e.direction} lists [${n}] more than once`);t.add(n)}),this.layoutHints.push(e)}getLayoutHints(){return this.layoutHints}getDataStructures(){if(this.dataStructures===void 0){let e={},t=Object.entries(this.nodes).reduce((t,[n,r])=>(t[n]=r.edges.reduce((t,r)=>{let i=this.getNode(r.lhsId)?.in,a=this.getNode(r.rhsId)?.in;if(i&&a&&i!==a){let t=ne(r.lhsDir,r.rhsDir);t!==`bend`&&(e[i]??={},e[i][a]=t,e[a]??={},e[a][i]=t)}if(r.lhsId===n){let e=I(r.lhsDir,r.rhsDir);e&&(t[e]=r.rhsId)}else{let e=I(r.rhsDir,r.lhsDir);e&&(t[e]=r.lhsId)}return t},{}),t),{}),r=Object.keys(t)[0],i={[r]:1},a=Object.keys(t).reduce((e,t)=>t===r?e:{...e,[t]:1},{}),o=n(e=>{let n={[e]:[0,0]},r=[e];for(;r.length>0;){let e=r.shift();if(e){i[e]=1,delete a[e];let o=t[e],[s,c]=n[e];Object.entries(o).forEach(([e,t])=>{i[t]||(n[t]=L([s,c],e),r.push(t))})}}return n},`BFS`),s=[o(r)];for(;Object.keys(a).length>0;)s.push(o(Object.keys(a)[0]));this.dataStructures={adjList:t,spatialMaps:s,groupAlignments:e}}return this.dataStructures}setElementForId(e,t){this.elements[e]=t}getElementById(e){return this.elements[e]}getConfig(){return v({...ae,...u().architecture})}getConfigField(e){return this.getConfig()[e]}},oe=n((e,t)=>{b(e,t),e.groups.map(e=>t.addGroup(e)),e.services.map(e=>t.addService({...e,type:`service`})),e.junctions.map(e=>t.addJunction({...e,type:`junction`})),e.edges.map(e=>t.addEdge(e)),e.alignments?.map(e=>t.addLayoutHint({direction:e.direction,members:[...e.members]}))},`populateDb`),H={parser:{yy:void 0},parse:n(async e=>{let n=await t(`architecture`,e);r.debug(n);let i=H.parser?.yy;if(!(i instanceof V))throw Error(`parser.parser?.yy was not a ArchitectureDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.`);oe(n,i)},`parse`)},se=n(e=>`
1
+ import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{n as t}from"./mermaid-parser.core-BW47khiS.js";import{n}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import{m as r,p as i}from"./src-oBChb5qS.js";import{H as a,J as o,K as s,U as c,a as l,b as u,f as d,v as f,w as p,x as m,y as h,z as g}from"./chunk-WYO6CB5R-By1K0guW.js";import{c as _,i as v}from"./chunk-ICXQ74PX-BmJSQqOH.js";import{t as y}from"./chunk-VAUOI2AC-BhfSWJZI.js";import{t as b}from"./chunk-JWPE2WC7-DVXcaiue.js";import{i as x,r as S,t as C}from"./chunk-HOUHSVGY-B0mX_yjc.js";import{n as w}from"./chunk-Q4XR5HBZ-ekATI9aV.js";import{t as T}from"./cytoscape.esm-C3UvhD5t.js";import{t as E}from"./cytoscape-fcose-peAzqedC.js";var ee=e(E(),1),D={L:`left`,R:`right`,T:`top`,B:`bottom`},O={L:n(e=>`${e},${e/2} 0,${e} 0,0`,`L`),R:n(e=>`0,${e/2} ${e},0 ${e},${e}`,`R`),T:n(e=>`0,0 ${e},0 ${e/2},${e}`,`T`),B:n(e=>`${e/2},0 ${e},${e} 0,${e}`,`B`)},k={L:n((e,t)=>e-t+2,`L`),R:n((e,t)=>e-2,`R`),T:n((e,t)=>e-t+2,`T`),B:n((e,t)=>e-2,`B`)},te=n(function(e){return j(e)?e===`L`?`R`:`L`:e===`T`?`B`:`T`},`getOppositeArchitectureDirection`),A=n(function(e){let t=e;return t===`L`||t===`R`||t===`T`||t===`B`},`isArchitectureDirection`),j=n(function(e){let t=e;return t===`L`||t===`R`},`isArchitectureDirectionX`),M=n(function(e){let t=e;return t===`T`||t===`B`},`isArchitectureDirectionY`),N=n(function(e,t){let n=j(e)&&M(t),r=M(e)&&j(t);return n||r},`isArchitectureDirectionXY`),P=n(function(e){let t=e[0],n=e[1],r=j(t)&&M(n),i=M(t)&&j(n);return r||i},`isArchitecturePairXY`),F=n(function(e){return e!==`LL`&&e!==`RR`&&e!==`TT`&&e!==`BB`},`isValidArchitectureDirectionPair`),I=n(function(e,t){let n=`${e}${t}`;return F(n)?n:void 0},`getArchitectureDirectionPair`),L=n(function([e,t],n){let r=n[0],i=n[1];return j(r)?M(i)?[e+(r===`L`?-1:1),t+(i===`T`?1:-1)]:[e+(r===`L`?-1:1),t]:j(i)?[e+(i===`L`?1:-1),t+(r===`T`?1:-1)]:[e,t+(r===`T`?1:-1)]},`shiftPositionByArchitectureDirectionPair`),R=n(function(e){return e===`LT`||e===`TL`?[1,1]:e===`BL`||e===`LB`?[1,-1]:e===`BR`||e===`RB`?[-1,-1]:[-1,1]},`getArchitectureDirectionXYFactors`),ne=n(function(e,t){return N(e,t)?`bend`:j(e)?`horizontal`:`vertical`},`getArchitectureDirectionAlignment`),re=n(function(e){return e.type===`service`},`isArchitectureService`),ie=n(function(e){return e.type===`junction`},`isArchitectureJunction`),z=n(e=>e.data(),`edgeData`),B=n(e=>e.data(),`nodeData`),ae=d.architecture,V=class{constructor(){this.nodes={},this.groups={},this.edges=[],this.layoutHints=[],this.registeredIds={},this.elements={},this.diagramId=``,this.setAccTitle=c,this.getAccTitle=h,this.setDiagramTitle=s,this.getDiagramTitle=p,this.getAccDescription=f,this.setAccDescription=a,this.clear()}static{n(this,`ArchitectureDB`)}setDiagramId(e){this.diagramId=e}getDiagramId(){return this.diagramId}clear(){this.nodes={},this.groups={},this.edges=[],this.layoutHints=[],this.registeredIds={},this.dataStructures=void 0,this.elements={},this.diagramId=``,l()}addService({id:e,icon:t,in:n,title:r,iconText:i}){if(this.registeredIds[e]!==void 0)throw Error(`The service id [${e}] is already in use by another ${this.registeredIds[e]}`);if(n!==void 0){if(e===n)throw Error(`The service [${e}] cannot be placed within itself`);if(this.registeredIds[n]===void 0)throw Error(`The service [${e}]'s parent does not exist. Please make sure the parent is created before this service`);if(this.registeredIds[n]===`node`)throw Error(`The service [${e}]'s parent is not a group`)}this.registeredIds[e]=`node`,this.nodes[e]={id:e,type:`service`,icon:t,iconText:i,title:r,edges:[],in:n}}getServices(){return Object.values(this.nodes).filter(re)}addJunction({id:e,in:t}){if(this.registeredIds[e]!==void 0)throw Error(`The junction id [${e}] is already in use by another ${this.registeredIds[e]}`);if(t!==void 0){if(e===t)throw Error(`The junction [${e}] cannot be placed within itself`);if(this.registeredIds[t]===void 0)throw Error(`The junction [${e}]'s parent does not exist. Please make sure the parent is created before this junction`);if(this.registeredIds[t]===`node`)throw Error(`The junction [${e}]'s parent is not a group`)}this.registeredIds[e]=`node`,this.nodes[e]={id:e,type:`junction`,edges:[],in:t}}getJunctions(){return Object.values(this.nodes).filter(ie)}getNodes(){return Object.values(this.nodes)}getNode(e){return this.nodes[e]??null}addGroup({id:e,icon:t,in:n,title:r}){if(this.registeredIds?.[e]!==void 0)throw Error(`The group id [${e}] is already in use by another ${this.registeredIds[e]}`);if(n!==void 0){if(e===n)throw Error(`The group [${e}] cannot be placed within itself`);if(this.registeredIds?.[n]===void 0)throw Error(`The group [${e}]'s parent does not exist. Please make sure the parent is created before this group`);if(this.registeredIds?.[n]===`node`)throw Error(`The group [${e}]'s parent is not a group`)}this.registeredIds[e]=`group`,this.groups[e]={id:e,icon:t,title:r,in:n}}getGroups(){return Object.values(this.groups)}addEdge({lhsId:e,rhsId:t,lhsDir:n,rhsDir:r,lhsInto:i,rhsInto:a,lhsGroup:o,rhsGroup:s,title:c}){if(!A(n))throw Error(`Invalid direction given for left hand side of edge ${e}--${t}. Expected (L,R,T,B) got ${String(n)}`);if(!A(r))throw Error(`Invalid direction given for right hand side of edge ${e}--${t}. Expected (L,R,T,B) got ${String(r)}`);if(this.nodes[e]===void 0&&this.groups[e]===void 0)throw Error(`The left-hand id [${e}] does not yet exist. Please create the service/group before declaring an edge to it.`);if(this.nodes[t]===void 0&&this.groups[t]===void 0)throw Error(`The right-hand id [${t}] does not yet exist. Please create the service/group before declaring an edge to it.`);let l=this.nodes[e].in,u=this.nodes[t].in;if(o&&l&&u&&l==u)throw Error(`The left-hand id [${e}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);if(s&&l&&u&&l==u)throw Error(`The right-hand id [${t}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);let d={lhsId:e,lhsDir:n,lhsInto:i,lhsGroup:o,rhsId:t,rhsDir:r,rhsInto:a,rhsGroup:s,title:c};this.edges.push(d),this.nodes[e]&&this.nodes[t]&&(this.nodes[e].edges.push(this.edges[this.edges.length-1]),this.nodes[t].edges.push(this.edges[this.edges.length-1]))}getEdges(){return this.edges}addLayoutHint(e){if(e.members.length<2)throw Error(`An align directive requires at least two members; got ${e.members.length}`);let t=new Set;e.members.forEach(n=>{if(this.registeredIds[n]!==`node`)throw Error(`align ${e.direction} references [${n}], which is not a service or junction`);if(t.has(n))throw Error(`align ${e.direction} lists [${n}] more than once`);t.add(n)}),this.layoutHints.push(e)}getLayoutHints(){return this.layoutHints}getDataStructures(){if(this.dataStructures===void 0){let e={},t=Object.entries(this.nodes).reduce((t,[n,r])=>(t[n]=r.edges.reduce((t,r)=>{let i=this.getNode(r.lhsId)?.in,a=this.getNode(r.rhsId)?.in;if(i&&a&&i!==a){let t=ne(r.lhsDir,r.rhsDir);t!==`bend`&&(e[i]??={},e[i][a]=t,e[a]??={},e[a][i]=t)}if(r.lhsId===n){let e=I(r.lhsDir,r.rhsDir);e&&(t[e]=r.rhsId)}else{let e=I(r.rhsDir,r.lhsDir);e&&(t[e]=r.lhsId)}return t},{}),t),{}),r=Object.keys(t)[0],i={[r]:1},a=Object.keys(t).reduce((e,t)=>t===r?e:{...e,[t]:1},{}),o=n(e=>{let n={[e]:[0,0]},r=[e];for(;r.length>0;){let e=r.shift();if(e){i[e]=1,delete a[e];let o=t[e],[s,c]=n[e];Object.entries(o).forEach(([e,t])=>{i[t]||(n[t]=L([s,c],e),r.push(t))})}}return n},`BFS`),s=[o(r)];for(;Object.keys(a).length>0;)s.push(o(Object.keys(a)[0]));this.dataStructures={adjList:t,spatialMaps:s,groupAlignments:e}}return this.dataStructures}setElementForId(e,t){this.elements[e]=t}getElementById(e){return this.elements[e]}getConfig(){return v({...ae,...u().architecture})}getConfigField(e){return this.getConfig()[e]}},oe=n((e,t)=>{b(e,t),e.groups.map(e=>t.addGroup(e)),e.services.map(e=>t.addService({...e,type:`service`})),e.junctions.map(e=>t.addJunction({...e,type:`junction`})),e.edges.map(e=>t.addEdge(e)),e.alignments?.map(e=>t.addLayoutHint({direction:e.direction,members:[...e.members]}))},`populateDb`),H={parser:{yy:void 0},parse:n(async e=>{let n=await t(`architecture`,e);r.debug(n);let i=H.parser?.yy;if(!(i instanceof V))throw Error(`parser.parser?.yy was not a ArchitectureDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.`);oe(n,i)},`parse`)},se=n(e=>`
2
2
  .edge {
3
3
  stroke-width: ${e.archEdgeWidth};
4
4
  stroke: ${e.archEdgeColor};