mulmoterminal 4.8.0 → 4.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/README.md +1 -1
  2. package/common/chromeFromColor.ts +33 -2
  3. package/common/pathSegments.ts +23 -0
  4. package/dist/assets/{abnfDiagram-N423BO3Z-D0pzqjdS-C_1F9Lr9.js → abnfDiagram-N423BO3Z-D0pzqjdS-CTSEh1uL.js} +1 -1
  5. package/dist/assets/architecture-TIHT7OUA-Cqhmai3f-DYURJf3a.js +1 -0
  6. package/dist/assets/{architectureDiagram-T3A2C74G-CX-Yoe5G-sXll0esn.js → architectureDiagram-T3A2C74G-CX-Yoe5G-D1TCsmEW.js} +1 -1
  7. package/dist/assets/{blockDiagram-VBNYF7ZC-B1eQZQ68-CPVP1vk2.js → blockDiagram-VBNYF7ZC-B1eQZQ68-0ZOTzgbN.js} +1 -1
  8. package/dist/assets/{c4Diagram-5PPSVZJV-SBrN9MrU-CaDR6PZ5.js → c4Diagram-5PPSVZJV-SBrN9MrU-Dj-EgTgq.js} +1 -1
  9. package/dist/assets/channel-DKMa7Sn5-BaH4NZYv.js +1 -0
  10. package/dist/assets/{chunk-2GRJ4B5K-DdkAx9o--BTDRS1ny.js → chunk-2GRJ4B5K-DdkAx9o--DjDCETVM.js} +1 -1
  11. package/dist/assets/{chunk-3NCLNEKW-CBztX243-CRh6N7eI.js → chunk-3NCLNEKW-CBztX243-DK2bYr2d.js} +1 -1
  12. package/dist/assets/{chunk-4I5QYGJK-CmBJaHzs-BQuag-U2.js → chunk-4I5QYGJK-CmBJaHzs-BdhY8OlN.js} +1 -1
  13. package/dist/assets/{chunk-5RXB4S5H-iaipMW_h-Difto-1B.js → chunk-5RXB4S5H-iaipMW_h-Dc9HCjZr.js} +1 -1
  14. package/dist/assets/{chunk-6Q2QTUOP-Cx8nz5_t-DoqT-qjo.js → chunk-6Q2QTUOP-Cx8nz5_t-BmPIYTTz.js} +1 -1
  15. package/dist/assets/{chunk-7Z6QIM7H-CZs6l8Md-DWy67U5n.js → chunk-7Z6QIM7H-CZs6l8Md-DEA_98nb.js} +1 -1
  16. package/dist/assets/{chunk-GF5L2VYU-9OEKHEe4-CAQrDdMW.js → chunk-GF5L2VYU-9OEKHEe4-DQnl6g7D.js} +1 -1
  17. package/dist/assets/{chunk-I66GZJ75-DSPCVCny-BJLh4409.js → chunk-I66GZJ75-DSPCVCny-DxpV96_X.js} +1 -1
  18. package/dist/assets/{chunk-J7OUQ5F2-CQoryswr-Bgq_Mv29.js → chunk-J7OUQ5F2-CQoryswr-BthKg0zB.js} +2 -2
  19. package/dist/assets/{chunk-JQJVKLGR-6F2ui09L-kUfNk1cv.js → chunk-JQJVKLGR-6F2ui09L-QjpkYHh7.js} +1 -1
  20. package/dist/assets/{chunk-KBJHAD2P-DXXCSVOS-DsVXnKcy.js → chunk-KBJHAD2P-DXXCSVOS-CEssdQjr.js} +1 -1
  21. package/dist/assets/{chunk-NSK5VX7P-DQgMj0Kn-DuA4A2m-.js → chunk-NSK5VX7P-DQgMj0Kn-CdfyTnLD.js} +1 -1
  22. package/dist/assets/{chunk-QR6OTTB3-BQl8P7pD-BZ3iKOMU.js → chunk-QR6OTTB3-BQl8P7pD-DnkT63LY.js} +1 -1
  23. package/dist/assets/{chunk-UBXNYLIW-BbdYEvTI-BKFsRG54.js → chunk-UBXNYLIW-BbdYEvTI-V5OTlgR8.js} +1 -1
  24. package/dist/assets/{chunk-W5SLKNZC-DSJLk1SI-7ayO5NUV.js → chunk-W5SLKNZC-DSJLk1SI-B3X0CacL.js} +1 -1
  25. package/dist/assets/{chunk-WRU74C26-DOE_TBL8-CVh6hcjM.js → chunk-WRU74C26-DOE_TBL8-Ktu8fy3t.js} +1 -1
  26. package/dist/assets/classDiagram-JCYQIIEL-C1ePmEG1-BW-s5osU.js +1 -0
  27. package/dist/assets/classDiagram-v2-OCEON4UE-C_O3VNBf-BW-s5osU.js +1 -0
  28. package/dist/assets/cynefin-VYW2F7L2-DvSvuXnG-AwH2T8qv.js +1 -0
  29. package/dist/assets/{cynefinDiagram-MW4NZA55-DuBeESb6-DDsWCfbP.js → cynefinDiagram-MW4NZA55-DuBeESb6-D1mkKqHb.js} +1 -1
  30. package/dist/assets/{dagre-VZM6K2ZE-W5cB3U70-D1rl2X4i.js → dagre-VZM6K2ZE-W5cB3U70-CmGRjn5N.js} +1 -1
  31. package/dist/assets/{diagram-7IWD3JNH-Fk1aWqfX-DzWbtGft.js → diagram-7IWD3JNH-Fk1aWqfX-5ZttPYaC.js} +1 -1
  32. package/dist/assets/{diagram-B4RE2ZJO-q-8xygfU-CxcTRuKd.js → diagram-B4RE2ZJO-q-8xygfU-Jaes9Saf.js} +1 -1
  33. package/dist/assets/{diagram-LBJQPF4R-1SKCcOis-V2GRaCiN.js → diagram-LBJQPF4R-1SKCcOis-DOnKMUhx.js} +1 -1
  34. package/dist/assets/{diagram-Q27KOJAE-CtW4StAQ-BarTqC2z.js → diagram-Q27KOJAE-CtW4StAQ-CK--yh3Q.js} +1 -1
  35. package/dist/assets/{diagram-UB23O5K3-r5fK-tbF-pkQL3-5o.js → diagram-UB23O5K3-r5fK-tbF-CDEwYerq.js} +1 -1
  36. package/dist/assets/{dist-WJs7N_4F.js → dist-BVPKfO9h.js} +1 -1
  37. package/dist/assets/{dist-SVfKHNOC.js → dist-CSWHG2cH.js} +1 -1
  38. package/dist/assets/{dist-CND5Ye3G.js → dist-Cf1PlkcF.js} +1 -1
  39. package/dist/assets/{dist-s_wb33nB.js → dist-Di66sOMV.js} +1 -1
  40. package/dist/assets/{ebnfDiagram-BXEA7PRR-BZoIqTyx-C-hVWblz.js → ebnfDiagram-BXEA7PRR-BZoIqTyx-Bd0ceZ6T.js} +1 -1
  41. package/dist/assets/{erDiagram-JOGREHBK-CM8pI2JI-ClKuaaQP.js → erDiagram-JOGREHBK-CM8pI2JI-B5EFrDqh.js} +1 -1
  42. package/dist/assets/eventmodeling-45OFAUF4-jdctDg0T-_-vzwCaU.js +1 -0
  43. package/dist/assets/flowDiagram-UKHOOZJN-CR3dcoRl-CTSDZ3kq.js +1 -0
  44. package/dist/assets/{ganttDiagram-PKOTCBZU-DYTkxDIh-Dbb3I1Ky.js → ganttDiagram-PKOTCBZU-DYTkxDIh-CdH3rbwy.js} +1 -1
  45. package/dist/assets/gitGraph-TEB2WS4Q-C4cKwl5j-DJFY2Jhk.js +1 -0
  46. package/dist/assets/{gitGraphDiagram-DS77QQ5N-DafidN4D-BzvH6u2p.js → gitGraphDiagram-DS77QQ5N-DafidN4D-dgab4OC4.js} +1 -1
  47. package/dist/assets/index-jaLr_Prz.js +623 -0
  48. package/dist/assets/info-DKCQHKI2-DPUCBYWS-3rgS_gc8.js +1 -0
  49. package/dist/assets/{infoDiagram-6WML65LV-DxSxsg1o-VRdS-8-g.js → infoDiagram-6WML65LV-DxSxsg1o-D4YGxu1g.js} +1 -1
  50. package/dist/assets/{ishikawaDiagram-WSZJBQD7-kAIMMFB5-sIxBX_tW.js → ishikawaDiagram-WSZJBQD7-kAIMMFB5-wsr5xc5H.js} +1 -1
  51. package/dist/assets/{journeyDiagram-NVQOT4AX-ClybI8XI-BFleK1p8.js → journeyDiagram-NVQOT4AX-ClybI8XI-DPUOB6uo.js} +1 -1
  52. package/dist/assets/{kanban-definition-27J2QSJJ-DDYHyW1q-BRL0Ieho.js → kanban-definition-27J2QSJJ-DDYHyW1q-CZgSIoc2.js} +1 -1
  53. package/dist/assets/{lib-CFJSYJpW.js → lib-C4gx-pAc.js} +1 -1
  54. package/dist/assets/{line-CtRAsVKI-Weybbnym.js → line-CtRAsVKI-BhCm0031.js} +1 -1
  55. package/dist/assets/{marp-BEDBCLJs.js → marp-CeXrcVjr.js} +1 -1
  56. package/dist/assets/{mermaid-parser.core-C1baW7NG-B9TNqufx.js → mermaid-parser.core-C1baW7NG-m5_U2vyD.js} +2 -2
  57. package/dist/assets/{mermaid.core-CGR3z-ay-c1_TNZXz.js → mermaid.core-CGR3z-ay-DvwBCqCs.js} +3 -3
  58. package/dist/assets/{mindmap-definition-FAOFIHXS-DU-wbYKK-CgPoe1x1.js → mindmap-definition-FAOFIHXS-DU-wbYKK-kWq_dek4.js} +1 -1
  59. package/dist/assets/packet-7NZHBO7P-CC7His0F-BdxXKgeT.js +1 -0
  60. package/dist/assets/{pegDiagram-VL7TDLO6-CZuV1UUk-B5vzA-xE.js → pegDiagram-VL7TDLO6-CZuV1UUk-4WS0bS_y.js} +1 -1
  61. package/dist/assets/pie-RZYD4A2V-CCrcq2sL-CP-ev46m.js +1 -0
  62. package/dist/assets/{pieDiagram-7S7Q4E2Y-B6cd1CWd-CUDS4Sno.js → pieDiagram-7S7Q4E2Y-B6cd1CWd-D6qNs4Iu.js} +1 -1
  63. package/dist/assets/{quadrantDiagram-CIZ2JOQS-BvGHVjRA-B8lvO4Zk.js → quadrantDiagram-CIZ2JOQS-BvGHVjRA-CXWlp-3-.js} +1 -1
  64. package/dist/assets/radar-I7S5WNFK-C5TUrpHf-DWVX-MsP.js +1 -0
  65. package/dist/assets/railroad-3IZDKUUU-CGuuFEd8-DKlMYwIS.js +1 -0
  66. package/dist/assets/railroad-abnf-AHOZXSZD-DuoCSFZY-CoCu9q79.js +1 -0
  67. package/dist/assets/railroad-ebnf-EBAXGLYW-ig-DG9e_-xwwvt-Nh.js +1 -0
  68. package/dist/assets/railroad-peg-LSFZ7HO6-BkBgpyvu-DKXIsmZD.js +1 -0
  69. package/dist/assets/{railroadDiagram-AXF67PYL-DDtBla5s-DHWm1Ox2.js → railroadDiagram-AXF67PYL-DDtBla5s-C5dmRUSB.js} +1 -1
  70. package/dist/assets/{requirementDiagram-LRYGKXZP-DEh2MJlW-DsCt-Uni.js → requirementDiagram-LRYGKXZP-DEh2MJlW-Dx5xtPm0.js} +1 -1
  71. package/dist/assets/{sankeyDiagram-W5VNT64P-CHkaBx7U-Bkx-TT6H.js → sankeyDiagram-W5VNT64P-CHkaBx7U-DfX5prrR.js} +1 -1
  72. package/dist/assets/{sequenceDiagram-SI44F4Z6-D8tHDhWP-C_n-BVwe.js → sequenceDiagram-SI44F4Z6-D8tHDhWP-BWGOYuS_.js} +1 -1
  73. package/dist/assets/{stateDiagram-OKZ733FA-KNjKsfsT-DTO4blEz.js → stateDiagram-OKZ733FA-KNjKsfsT-Dxoi_j8b.js} +1 -1
  74. package/dist/assets/stateDiagram-v2-UEYNNEHI-B88w7Ous-RHLLKJ5Z.js +1 -0
  75. package/dist/assets/{swimlanes-SLNWSIFB-D_yJNxBK-DZn7TQsl.js → swimlanes-SLNWSIFB-D_yJNxBK-BuG8H1q8.js} +1 -1
  76. package/dist/assets/swimlanesDiagram-ULZ7WXOC-DNcZzqTp-7gQf7HNa.js +8 -0
  77. package/dist/assets/{timeline-definition-Z64GVDOM-BcEcbSq1-MGNwTSwZ.js → timeline-definition-Z64GVDOM-BcEcbSq1-D4hjgInK.js} +1 -1
  78. package/dist/assets/treeView-QDETBFTQ-CqfT0I1z-D-gX-9lw.js +1 -0
  79. package/dist/assets/treemap-6X3UGDF4-CiJkiGWo-C90mQNBy.js +1 -0
  80. package/dist/assets/{vennDiagram-T6HMQDX7-CxS3fcVg-Bbm73E7e.js → vennDiagram-T6HMQDX7-CxS3fcVg-DkIZ05uL.js} +1 -1
  81. package/dist/assets/wardley-OPB4EBWU-D1tuVHAV-DdIlimET.js +1 -0
  82. package/dist/assets/{wardleyDiagram-T6FBY63Y-D_XCiR14-BNNg221Y.js → wardleyDiagram-T6FBY63Y-D_XCiR14-DiKk_43E.js} +1 -1
  83. package/dist/assets/{xychartDiagram-ELKLHX3M-BU4yBDeE-BLHL_8rx.js → xychartDiagram-ELKLHX3M-BU4yBDeE-4brN3p2i.js} +1 -1
  84. package/dist/index.html +1 -1
  85. package/package.json +4 -4
  86. package/server/backends/collectionSelfContainment.ts +13 -3
  87. package/server/backends/feed-worker-options.ts +22 -0
  88. package/server/backends/remoteHost/handlers/index.ts +4 -0
  89. package/server/backends/remoteHost/handlers/listCollectionProjects.ts +111 -0
  90. package/server/backends/system-tasks.ts +28 -1
  91. package/server/config/app-config.ts +1 -1
  92. package/server/config/config-lock.ts +207 -0
  93. package/server/config/config-routes.ts +161 -3
  94. package/server/index.ts +19 -2
  95. package/server/infra/collection-tool.ts +22 -15
  96. package/server/infra/collectionToolPortability.ts +63 -0
  97. package/server/infra/project-root.ts +20 -1
  98. package/server/routes/app-routes.ts +8 -1
  99. package/server/routes/stampCardScope.ts +84 -0
  100. package/server/routes/tool-routes.ts +16 -2
  101. package/dist/assets/architecture-TIHT7OUA-Cqhmai3f-EoewX0t1.js +0 -1
  102. package/dist/assets/channel-DKMa7Sn5-D7uFiXWj.js +0 -1
  103. package/dist/assets/classDiagram-JCYQIIEL-C1ePmEG1-DQsrDAnO.js +0 -1
  104. package/dist/assets/classDiagram-v2-OCEON4UE-C_O3VNBf-DQsrDAnO.js +0 -1
  105. package/dist/assets/cynefin-VYW2F7L2-DvSvuXnG-CbMnaMb8.js +0 -1
  106. package/dist/assets/eventmodeling-45OFAUF4-jdctDg0T-DYxhdsxL.js +0 -1
  107. package/dist/assets/flowDiagram-UKHOOZJN-CR3dcoRl-Bg2gsj-G.js +0 -1
  108. package/dist/assets/gitGraph-TEB2WS4Q-C4cKwl5j-B3gI81ub.js +0 -1
  109. package/dist/assets/index-0JPMgZUO.js +0 -623
  110. package/dist/assets/info-DKCQHKI2-DPUCBYWS-B4cQvlC-.js +0 -1
  111. package/dist/assets/packet-7NZHBO7P-CC7His0F-DGLBqmMP.js +0 -1
  112. package/dist/assets/pie-RZYD4A2V-CCrcq2sL-ggnddn1X.js +0 -1
  113. package/dist/assets/radar-I7S5WNFK-C5TUrpHf-Biu2ZB_3.js +0 -1
  114. package/dist/assets/railroad-3IZDKUUU-CGuuFEd8-CWbXRRgb.js +0 -1
  115. package/dist/assets/railroad-abnf-AHOZXSZD-DuoCSFZY-D31d1XeY.js +0 -1
  116. package/dist/assets/railroad-ebnf-EBAXGLYW-ig-DG9e_-yjfgHrSG.js +0 -1
  117. package/dist/assets/railroad-peg-LSFZ7HO6-BkBgpyvu-BJplGLDh.js +0 -1
  118. package/dist/assets/stateDiagram-v2-UEYNNEHI-B88w7Ous-BMTM7EXJ.js +0 -1
  119. package/dist/assets/swimlanesDiagram-ULZ7WXOC-DNcZzqTp-DdIK7YaL.js +0 -8
  120. package/dist/assets/treeView-QDETBFTQ-CqfT0I1z-B8T-RCe5.js +0 -1
  121. package/dist/assets/treemap-6X3UGDF4-CiJkiGWo-DT1sAEri.js +0 -1
  122. package/dist/assets/wardley-OPB4EBWU-D1tuVHAV-tVLCXwET.js +0 -1
package/README.md CHANGED
@@ -786,7 +786,7 @@ Settings → Directory settings names both files and lists which keys the local
786
786
  | `icon` | An **image** marking this directory — shown in the cell header, the cockpit roster, the filmstrip thumbnails, the launcher's directory chips, and the phone's terminal list and terminal screen. Either a path **relative to this directory** (an absolute path, or a `../` that escapes it, is rejected), an `http(s)://` URL, or a `data:image/…` URI. PNG / JPEG / **GIF (animated plays)** / WebP / AVIF / SVG / ICO / BMP. Not to be confused with a header **button's** `icon`, which is a Material Symbols name. **Omit it and the repository's own favicon is used** (`public/favicon.svg`, `apple-touch-icon.png`, a web manifest — see `autoDirIcon`); `false` means no icon here and stops that search. |
787
787
  | `badgeColor` | Badge background color (`#rrggbb`); text auto-contrasts. |
788
788
  | `headerColor` | Header **background** color (`#rrggbb`) — the grid cell's header row and the terminal's own header row (grid row 2). While a terminal is working/blocked the status tint still shows; the custom color applies when idle. |
789
- | `headerTextColor` | Header **text** color (`#rrggbb`) — the dir path, title, and prompt. |
789
+ | `headerTextColor` | Header **text** color (`#rrggbb`) — everything written on the header: the dir path, title and prompt, plus the model/context badge, the token counts and any custom chip. **Omit it and a readable colour is derived from `headerColor`**, while that colour is what shows (a working/blocked cell paints its own header tint, so its text returns to the theme's). |
790
790
  | `cellColor` | Cell **body background** color (`#rrggbb`) — the frame around the terminal. |
791
791
  | `cellBorderColor` | Cell **border** color (`#rrggbb`). The status frame (working/blocked) still overrides it while active. |
792
792
  | `dotColor` | **Idle** status-dot color (`#rrggbb`). The working/waiting colors are unchanged so the activity signal stays intact. |
@@ -15,7 +15,7 @@
15
15
  // Snapping every role to absolute values drifts by ΔE 20 at the dark end of the hue wheel; making
16
16
  // every role a relative offset drifts by ΔE 15 at the pale end. Both were tried; this is the mix
17
17
  // that fits. Anyone retuning these numbers should re-measure rather than reason about them.
18
- import { readableTextColor } from "./contrast.js";
18
+ import { contrastRatio, readableTextColor, relativeLuminance } from "./contrast.js";
19
19
 
20
20
  export interface ChromeColors {
21
21
  badgeColor: string;
@@ -36,6 +36,37 @@ const BUTTON = { s: 0.67, l: 0.89 };
36
36
 
37
37
  const clamp01 = (n: number): number => Math.min(1, Math.max(0, n));
38
38
 
39
+ // The inks a header background can be written in. Black is softened to a near-black so a pale
40
+ // header does not read as a printed page; white is left pure, since anything softer loses contrast
41
+ // on the dark end where it is chosen.
42
+ const DARK_INK = "#1b2430";
43
+ const PURE_DARK_INK = "#000000";
44
+ const LIGHT_INK = "#ffffff";
45
+
46
+ // WCAG AA for normal text. These chips run to 10px, so the large-text 3:1 bar does not apply.
47
+ const AA_CONTRAST = 4.5;
48
+ const DARK_INK_LUMINANCE = relativeLuminance(0x1b, 0x24, 0x30);
49
+
50
+ // The softening is a PREFERENCE, and it costs contrast: on a mid-tone background that cost is what
51
+ // drops the text below AA — `#e8341c` measures 3.68:1 against the softened ink and 4.94:1 against
52
+ // pure black (Codex on #1592, which is right and was worth measuring). So it is applied only while
53
+ // it is free. Falling back always works: at the worst background — the luminance where black and
54
+ // white are equally readable — the pure ink still reaches 4.58:1.
55
+ function inkFor(rgb: [number, number, number]): string {
56
+ if (readableTextColor(rgb[0], rgb[1], rgb[2]) === "#fff") return LIGHT_INK;
57
+ const background = relativeLuminance(rgb[0], rgb[1], rgb[2]);
58
+ return contrastRatio(background, DARK_INK_LUMINANCE) >= AA_CONTRAST ? DARK_INK : PURE_DARK_INK;
59
+ }
60
+
61
+ /** Which ink a header background wants, or null when it isn't a colour we can read. Exported so a
62
+ * directory that declares only `headerColor` derives the SAME text colour this file gives a
63
+ * repo.json brand colour (src/components/cellHeaderStyle.ts) — two answers to one question is how
64
+ * one directory ends up written in two different colours. */
65
+ export function headerTextColorFor(background: string): string | null {
66
+ const rgb = parseHex(background);
67
+ return rgb ? inkFor(rgb) : null;
68
+ }
69
+
39
70
  /** The seven colours for a brand colour, or null when it isn't a colour we can read. */
40
71
  export function chromeFromColor(primary: string, background?: string | null): ChromeColors | null {
41
72
  const rgb = parseHex(primary);
@@ -50,7 +81,7 @@ export function chromeFromColor(primary: string, background?: string | null): Ch
50
81
  headerColor: normalizeHex(primary),
51
82
  // Never taken from the file — see the spec's "text colour is never declared". Deriving it is
52
83
  // also what makes two conforming tools agree.
53
- headerTextColor: readableTextColor(rgb[0], rgb[1], rgb[2]) === "#000" ? "#1b2430" : "#ffffff",
84
+ headerTextColor: inkFor(rgb),
54
85
  // `background` is the surface the brand colour sits on, which is exactly what a cell body is.
55
86
  // Gated on it PARSING, not on it being present: an unusable value here used to win the branch,
56
87
  // survive as a non-colour, and then be dropped downstream — leaving no surface at all, neither
@@ -0,0 +1,23 @@
1
+ // Splitting a filesystem path into its parts, on EITHER separator.
2
+ //
3
+ // `path.sep` is not the answer here: these paths come from a config file and from a saved
4
+ // directory list, so a Windows path can be read on a mac (a synced config, a bug report, a test
5
+ // fixture) and a POSIX one on Windows. Code that splits on "/" alone does not fail loudly on
6
+ // `C:\Users\me\project` — it returns the WHOLE STRING as one segment, which is how a "label"
7
+ // becomes an absolute path.
8
+ //
9
+ // That is a privacy contract in one place: the phone's project listing sends a label and never a
10
+ // path, precisely so a command or an artifact cannot publish the user's home directory. A
11
+ // one-separator split turns that guarantee off on Windows without changing a line of the code
12
+ // that states it.
13
+
14
+ /** The non-empty parts of a path, splitting on `/` and `\` alike. A drive letter (`C:`) stays a
15
+ * segment of its own — it is not a directory name, and nothing here wants it as one. */
16
+ export function pathSegments(value: string): string[] {
17
+ return value.split(/[/\\]+/).filter((segment) => segment.length > 0);
18
+ }
19
+
20
+ /** The last part of a path — its directory or file name — or the input when it has none. */
21
+ export function lastSegment(value: string): string {
22
+ return pathSegments(value).at(-1) ?? value;
23
+ }
@@ -1 +1 @@
1
- import{n as e}from"./chunk-Y2CYZVJY-Bdt8pFDJ-DsF7k-Jl.js";import{f as t}from"./src-CvsWqFln-Tc7ZSrRz.js";import{_ as n,g as r}from"./mermaid-parser.core-C1baW7NG-B9TNqufx.js";import"./chunk-I66GZJ75-DSPCVCny-BJLh4409.js";import"./chunk-3NCLNEKW-CBztX243-CRh6N7eI.js";import{n as i,r as a,t as o}from"./chunk-6Q2QTUOP-Cx8nz5_t-DoqT-qjo.js";import{t as s}from"./chunk-JWPE2WC7-BQ3zXr2k-DSd3Ct95.js";var c=r().RailroadAbnf.parser.LangiumParser,l=e(e=>{let t=e.alternatives.map(u);return t.length===1?t[0]:{type:`choice`,alternatives:t}},`transformAlternation`),u=e(e=>{let t=e.elements.map(f);return t.length===1?t[0]:{type:`sequence`,elements:t}},`transformConcatenation`),d=e(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=e(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=e(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=e(e=>({name:e.name,definition:l(e.definition)}),`transformRule`),h=e(e=>{s(e,a),e.title&&a.setTitle(e.title),e.rules.map(e=>a.addRule(m(e)))},`populateDb`),g={parser:{parse:e(e=>{a.clear(),t.debug(`[ABNF Parser] Starting Langium parse`);let r=c.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new n(r);let i=r.value;t.debug(`[ABNF Parser] Parsed rules:`,i.rules.length),h(i),t.debug(`[ABNF Parser] Parse complete`)},`parse`),parser:{yy:a}},db:a,renderer:o,styles:i};export{g as diagram};
1
+ import{n as e}from"./chunk-Y2CYZVJY-Bdt8pFDJ-DsF7k-Jl.js";import{f as t}from"./src-CvsWqFln-Tc7ZSrRz.js";import{_ as n,g as r}from"./mermaid-parser.core-C1baW7NG-m5_U2vyD.js";import"./chunk-I66GZJ75-DSPCVCny-DxpV96_X.js";import"./chunk-3NCLNEKW-CBztX243-DK2bYr2d.js";import{n as i,r as a,t as o}from"./chunk-6Q2QTUOP-Cx8nz5_t-BmPIYTTz.js";import{t as s}from"./chunk-JWPE2WC7-BQ3zXr2k-DSd3Ct95.js";var c=r().RailroadAbnf.parser.LangiumParser,l=e(e=>{let t=e.alternatives.map(u);return t.length===1?t[0]:{type:`choice`,alternatives:t}},`transformAlternation`),u=e(e=>{let t=e.elements.map(f);return t.length===1?t[0]:{type:`sequence`,elements:t}},`transformConcatenation`),d=e(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=e(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=e(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=e(e=>({name:e.name,definition:l(e.definition)}),`transformRule`),h=e(e=>{s(e,a),e.title&&a.setTitle(e.title),e.rules.map(e=>a.addRule(m(e)))},`populateDb`),g={parser:{parse:e(e=>{a.clear(),t.debug(`[ABNF Parser] Starting Langium parse`);let r=c.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new n(r);let i=r.value;t.debug(`[ABNF Parser] Parsed rules:`,i.rules.length),h(i),t.debug(`[ABNF Parser] Parse complete`)},`parse`),parser:{yy:a}},db:a,renderer:o,styles:i};export{g as diagram};
@@ -0,0 +1 @@
1
+ import{f as e}from"./mermaid-parser.core-C1baW7NG-m5_U2vyD.js";export{e as createArchitectureServices};