mulmoterminal 6.0.0 → 6.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 (108) hide show
  1. package/README.md +1 -0
  2. package/common/dirBackground.ts +38 -0
  3. package/common/dirConfigSource.ts +1 -0
  4. package/common/playfulEffects.ts +49 -0
  5. package/dist/assets/{abnfDiagram-O67JEVCF-CoSnTBWR.js → abnfDiagram-O67JEVCF-B2CGO9GH.js} +1 -1
  6. package/dist/assets/architecture-7GRP2DOG-DjYJsj77.js +1 -0
  7. package/dist/assets/{architectureDiagram-NJMV4G6O-Bt6Nw3pO.js → architectureDiagram-NJMV4G6O-CFVO-Elm.js} +1 -1
  8. package/dist/assets/{blockDiagram-BEXU5L5S-COJ36x6B.js → blockDiagram-BEXU5L5S-CfHjBUj9.js} +1 -1
  9. package/dist/assets/{c4Diagram-YGBWAQC7-Bh0ZF-tH.js → c4Diagram-YGBWAQC7-p2kmwNaU.js} +1 -1
  10. package/dist/assets/channel-CIqAspOa.js +1 -0
  11. package/dist/assets/{chunk-3FUC2YCW-Bl7PxdLf.js → chunk-3FUC2YCW-CmLAFkS3.js} +1 -1
  12. package/dist/assets/{chunk-5DYCD2WN-CkfZZJgK.js → chunk-5DYCD2WN-4TEKrOeL.js} +1 -1
  13. package/dist/assets/{chunk-742MDFTN-Dzr7wG-3.js → chunk-742MDFTN-tcrBOxsz.js} +1 -1
  14. package/dist/assets/{chunk-7INBJB4K-BOjsFkzf.js → chunk-7INBJB4K-BECfMkLa.js} +1 -1
  15. package/dist/assets/{chunk-7M6MHVWA-dDHa23Ze.js → chunk-7M6MHVWA-DFhpMmNW.js} +1 -1
  16. package/dist/assets/{chunk-7PRAP22T-DVXORVEz.js → chunk-7PRAP22T-BI6PmvA-.js} +1 -1
  17. package/dist/assets/{chunk-GTNCS2PH-BegFnGEj.js → chunk-GTNCS2PH-3pmrTmQI.js} +1 -1
  18. package/dist/assets/{chunk-GWA4HPMP-DlbpJSfw.js → chunk-GWA4HPMP-Dtr-x5JM.js} +1 -1
  19. package/dist/assets/{chunk-MBY4JIJT-CgqMtEIi.js → chunk-MBY4JIJT-BxSZnqY0.js} +1 -1
  20. package/dist/assets/{chunk-NETBCI7D-oMdCwy3E.js → chunk-NETBCI7D-Djd8C60k.js} +1 -1
  21. package/dist/assets/{chunk-O7XYJQB3-ChS0oDzH.js → chunk-O7XYJQB3-B7efnPsN.js} +1 -1
  22. package/dist/assets/{chunk-UA2S7LBM-QBF7AE-R.js → chunk-UA2S7LBM-C6R7m_9O.js} +1 -1
  23. package/dist/assets/{chunk-WEXAMYUT-DN3PXi8d.js → chunk-WEXAMYUT-C577GKnB.js} +1 -1
  24. package/dist/assets/{chunk-Z7XXMR3K-Df8Br6A7.js → chunk-Z7XXMR3K-D4Eie38R.js} +1 -1
  25. package/dist/assets/{chunk-ZIGJFQKS-BJJclNbp.js → chunk-ZIGJFQKS-ybyDHyio.js} +1 -1
  26. package/dist/assets/{classDiagram-v2-NBCMYWYE-CUUTVNxy.js → classDiagram-v2-NBCMYWYE-0z8cmFMo.js} +1 -1
  27. package/dist/assets/{cynefin-OW5HDTMX-CNfsT-kV.js → cynefin-OW5HDTMX-DGHbZD4C.js} +1 -1
  28. package/dist/assets/{cynefinDiagram-VND7K2PF-B05wCGaJ.js → cynefinDiagram-VND7K2PF-DNvq-nUs.js} +1 -1
  29. package/dist/assets/{dagre-6A5THRUB-DdU65xLG.js → dagre-6A5THRUB-Ww6CPNvJ.js} +1 -1
  30. package/dist/assets/{diagram-22UHCM2B-DIyQ8xGi.js → diagram-22UHCM2B-BrIwqgGV.js} +1 -1
  31. package/dist/assets/{diagram-3UASUU5V-DEpCO0kf.js → diagram-3UASUU5V-5J16b0LV.js} +1 -1
  32. package/dist/assets/{diagram-ATOU4E4O-C7VTdLXm.js → diagram-ATOU4E4O-lBrdQRe5.js} +1 -1
  33. package/dist/assets/{diagram-CDSNMT55-wPRR11B8.js → diagram-CDSNMT55-2QlMKR8W.js} +1 -1
  34. package/dist/assets/{diagram-MLGK6HIB-DEBXKPB8.js → diagram-MLGK6HIB-DxQqjtDb.js} +1 -1
  35. package/dist/assets/{diagram-MPIPVDR6-CW1C6pqO.js → diagram-MPIPVDR6-DUEkxaMs.js} +1 -1
  36. package/dist/assets/{dist-BpCWEZws.js → dist-AeOoWFEf.js} +1 -1
  37. package/dist/assets/{dist-HD1f8RSL.js → dist-BOktV8Za.js} +1 -1
  38. package/dist/assets/{dist-B3orrqCx.js → dist-BtLFTaPd.js} +1 -1
  39. package/dist/assets/{dist-DYyDxCOr.js → dist-F3CjZiq-.js} +1 -1
  40. package/dist/assets/{ebnfDiagram-ZINNZB2B-k6QPJDV2.js → ebnfDiagram-ZINNZB2B-WMDGrcCV.js} +1 -1
  41. package/dist/assets/{elk-276RUBZZ-NpAkDjXI.js → elk-276RUBZZ-QJiugXJo.js} +1 -1
  42. package/dist/assets/{erDiagram-OPXOYQCR-Cp6mrAxy.js → erDiagram-OPXOYQCR-DL-zHJt5.js} +1 -1
  43. package/dist/assets/eventmodeling-NTZA5JFV-1oSLwiYU.js +1 -0
  44. package/dist/assets/flowDiagram-KWPJA3E3-CcnsDb3c.js +1 -0
  45. package/dist/assets/{ganttDiagram-FUAMR5RP-cWSJfNa3.js → ganttDiagram-FUAMR5RP-DeiRiGN8.js} +1 -1
  46. package/dist/assets/{gitGraph-4MIJSDKK-7BfJZOtX.js → gitGraph-4MIJSDKK-BzjnI9RH.js} +1 -1
  47. package/dist/assets/{gitGraphDiagram-X574FWY7-CZv9xqrR.js → gitGraphDiagram-X574FWY7-DW4UxYUp.js} +1 -1
  48. package/dist/assets/{index-fQh_vKyp.js → index-B7hJt4us.js} +345 -345
  49. package/dist/assets/index-C34PsKMj.css +1 -0
  50. package/dist/assets/{info-A6RAGUB7--jdzPDEX.js → info-A6RAGUB7-NevYNku_.js} +1 -1
  51. package/dist/assets/{infoDiagram-VRGFBTTK-BKKo0H2Y.js → infoDiagram-VRGFBTTK-DKyDj28N.js} +1 -1
  52. package/dist/assets/{ishikawaDiagram-OU5B5YK6-TvwClXNO.js → ishikawaDiagram-OU5B5YK6-CufGnFZd.js} +1 -1
  53. package/dist/assets/{journeyDiagram-ZHPQQLJL-C8C3CwsI.js → journeyDiagram-ZHPQQLJL-BO54CrPJ.js} +1 -1
  54. package/dist/assets/{kanban-definition-PNTS6WVX-DSTH21Y5.js → kanban-definition-PNTS6WVX-C-art1Tq.js} +1 -1
  55. package/dist/assets/{line-D_0D224s.js → line-BU3Tru0I.js} +1 -1
  56. package/dist/assets/{mermaid-parser.core-S4mGErbM.js → mermaid-parser.core-9dyqX5Cv.js} +3 -3
  57. package/dist/assets/{mermaid.core-DcTpiPIz.js → mermaid.core-Cpfr3G3I.js} +4 -4
  58. package/dist/assets/{mindmap-definition-NLK3R4M7-DomnW_CK.js → mindmap-definition-NLK3R4M7-D5xmGFtv.js} +1 -1
  59. package/dist/assets/{packet-AYTQ26CC-CJ7-57k6.js → packet-AYTQ26CC-EGCi-zxW.js} +1 -1
  60. package/dist/assets/{pegDiagram-GJSIUBJH-DRAXzWhG.js → pegDiagram-GJSIUBJH-B1G6pjui.js} +1 -1
  61. package/dist/assets/{pie-WAS4IAKB-DqBkQFLt.js → pie-WAS4IAKB-CgYEYgTl.js} +1 -1
  62. package/dist/assets/{pieDiagram-5QR66LMP-D-V-Wojr.js → pieDiagram-5QR66LMP-SN5op267.js} +1 -1
  63. package/dist/assets/{quadrantDiagram-O4NWA36T-Cy8Hp1RS.js → quadrantDiagram-O4NWA36T-BZ-uKeYb.js} +1 -1
  64. package/dist/assets/{radar-RG4KPBEZ-BOcNJD_p.js → radar-RG4KPBEZ-CSD_ZhCt.js} +1 -1
  65. package/dist/assets/{railroad-74A4TZTK-DKXbksCU.js → railroad-74A4TZTK-SOhY6qLd.js} +1 -1
  66. package/dist/assets/railroad-abnf-HS5TGJTU-_rl1TGTt.js +1 -0
  67. package/dist/assets/railroad-ebnf-LZEXJU2U-BpuW-TO5.js +1 -0
  68. package/dist/assets/railroad-peg-WCYAUIDC-CP5AOVAu.js +1 -0
  69. package/dist/assets/{railroadDiagram-XR7U4H2S-Byim1tkl.js → railroadDiagram-XR7U4H2S-3V6NpZKB.js} +1 -1
  70. package/dist/assets/{requirementDiagram-PLB6GJNP-BC3-Ru99.js → requirementDiagram-PLB6GJNP-FtYfFIaQ.js} +1 -1
  71. package/dist/assets/{sankeyDiagram-IPEJSGJF-BQWOWWlF.js → sankeyDiagram-IPEJSGJF-CmskXBMm.js} +1 -1
  72. package/dist/assets/{sequenceDiagram-PO4LG4MO-DXcWUtnD.js → sequenceDiagram-PO4LG4MO-Dk9n0VEr.js} +1 -1
  73. package/dist/assets/{stateDiagram-v2-GCMORJYK-anOIgvhJ.js → stateDiagram-v2-GCMORJYK-748CMc7d.js} +1 -1
  74. package/dist/assets/{swimlanes-2SLR337P-Y2UQZQr1.js → swimlanes-2SLR337P-CfOd_699.js} +1 -1
  75. package/dist/assets/swimlanesDiagram-TC7HE7FX-C0ba4m2X.js +8 -0
  76. package/dist/assets/{timeline-definition-EJHVYXUP-nNM2eUKd.js → timeline-definition-EJHVYXUP-ByIfUayS.js} +1 -1
  77. package/dist/assets/{treeView-Q6P3EWNA-BvVfvtqV.js → treeView-Q6P3EWNA-C19EuMUW.js} +1 -1
  78. package/dist/assets/{treemap-WGGIJYW6-CZUdIsht.js → treemap-WGGIJYW6-CmQfGleH.js} +1 -1
  79. package/dist/assets/{usecaseDiagram-POWQR4AR-yhkigrSD.js → usecaseDiagram-POWQR4AR-D-4LMFwI.js} +1 -1
  80. package/dist/assets/{vennDiagram-UO4OBE2U-mXXC9wWv.js → vennDiagram-UO4OBE2U-DBGckQph.js} +1 -1
  81. package/dist/assets/{wardley-WFR3VGLG-BOkD7P9B.js → wardley-WFR3VGLG-xJS57-r4.js} +1 -1
  82. package/dist/assets/{wardleyDiagram-VNRHLVJA-D2UmX0NY.js → wardleyDiagram-VNRHLVJA-c_Qcwbvh.js} +1 -1
  83. package/dist/assets/{xychartDiagram-PMCCYNJV-oCh3o8W3.js → xychartDiagram-PMCCYNJV-DUgKf74T.js} +1 -1
  84. package/dist/index.html +2 -2
  85. package/package.json +1 -1
  86. package/server/config/app-config.ts +7 -0
  87. package/server/config/config-routes.ts +5 -0
  88. package/server/config/dir-background.ts +46 -0
  89. package/server/config/dir-config.ts +18 -1
  90. package/server/config/worktree-dir-config.ts +3 -0
  91. package/server/index.ts +24 -2
  92. package/server/infra/process-list.ts +47 -0
  93. package/server/infra/tmux.ts +7 -0
  94. package/server/routes/dir-routes.ts +19 -4
  95. package/server/session/heat-track.ts +75 -0
  96. package/server/session/heat-watch.ts +99 -0
  97. package/server/session/session-cpu.ts +63 -0
  98. package/server/skills/mulmoterminal-config/SKILL.md +14 -2
  99. package/server/skills/mulmoterminal-dirs/SKILL.md +17 -0
  100. package/dist/assets/architecture-7GRP2DOG-D16t1qf8.js +0 -1
  101. package/dist/assets/channel-mM7cdI8R.js +0 -1
  102. package/dist/assets/eventmodeling-NTZA5JFV-BrXeAzaP.js +0 -1
  103. package/dist/assets/flowDiagram-KWPJA3E3-BEEC3Ss2.js +0 -1
  104. package/dist/assets/index-BHy-iimh.css +0 -1
  105. package/dist/assets/railroad-abnf-HS5TGJTU-BvSOqd-N.js +0 -1
  106. package/dist/assets/railroad-ebnf-LZEXJU2U-Dc7sdqgH.js +0 -1
  107. package/dist/assets/railroad-peg-WCYAUIDC-C5b974uD.js +0 -1
  108. package/dist/assets/swimlanesDiagram-TC7HE7FX-e4wiqdwL.js +0 -8
package/README.md CHANGED
@@ -989,6 +989,7 @@ Settings → Directory settings names both files and lists which keys the local
989
989
  | ------------ | ------- |
990
990
  | `name` | Label shown as a badge in the terminal/cell header. |
991
991
  | `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, or with the small glyph a chat started from a **collection** wears beside its status dot — that one is the collection's own `icon`, and it says which collection the cell was opened for while this one says which directory it runs in. **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. |
992
+ | `backgroundImage` | A **picture shown faintly behind this directory's terminals**, blended with the text so it stays readable on either theme. A string is the image (15% opaque, fills the terminal); `{ "image", "opacity", "fit" }` sets how faint (above 0, at most 1) and whether it crops to fill (`cover`) or shows whole (`contain`). The image follows `icon`'s rules. |
992
993
  | `badgeColor` | Badge background color (`#rrggbb`); text auto-contrasts. |
993
994
  | `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. |
994
995
  | `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`.** It applies while that colour is what shows: a working/done/blocked cell paints the theme's own status tint, so its text returns to the theme's too — an ink chosen for your header colour is not readable on a tint the theme mixed. Recolour those states with `headerStatusColors` instead. |
@@ -0,0 +1,38 @@
1
+ // A directory's terminal background: a picture shown faintly behind its terminals, the way Eterm
2
+ // did. BOTH sides decide from this file — the server reads the config key and serves the file,
3
+ // the browser checks what reached it before putting it in an <img>.
4
+ //
5
+ // The image follows the directory icon's rules (common/dirIcon.ts): a file inside the project,
6
+ // streamed by this server, or an http(s) / data: URL the browser loads itself.
7
+ import { isRecord } from "./isRecord.js";
8
+ import { isRemoteDirIconUrl } from "./dirIcon.js";
9
+
10
+ export const DIR_BACKGROUND_FITS = ["cover", "contain"] as const;
11
+ export type DirBackgroundFit = (typeof DIR_BACKGROUND_FITS)[number];
12
+ export const isDirBackgroundFit = (value: unknown): value is DirBackgroundFit => DIR_BACKGROUND_FITS.some((fit) => fit === value);
13
+
14
+ /** Faint enough that a photo reads as a backdrop rather than as the content. */
15
+ export const DIR_BACKGROUND_DEFAULT_OPACITY = 0.15;
16
+ export const DIR_BACKGROUND_DEFAULT_FIT: DirBackgroundFit = "cover";
17
+
18
+ /** Above 0 (0 is "no background", which omitting the key already says) and at most 1. */
19
+ export const isDirBackgroundOpacity = (value: unknown): value is number => typeof value === "number" && Number.isFinite(value) && value > 0 && value <= 1;
20
+
21
+ export const DIR_BACKGROUND_ROUTE = "/api/dir-background";
22
+
23
+ /** What the browser receives: a src ready for an <img>, never a file path. */
24
+ export interface PublicDirBackground {
25
+ url: string;
26
+ opacity: number;
27
+ fit: DirBackgroundFit;
28
+ }
29
+
30
+ const isUsableBackgroundSrc = (raw: unknown): raw is string =>
31
+ typeof raw === "string" && !!raw && (raw.startsWith(`${DIR_BACKGROUND_ROUTE}?`) || isRemoteDirIconUrl(raw));
32
+
33
+ /** The client's own boundary check on the wire shape, so a widened response cannot put an
34
+ * unexpected scheme into the DOM. Null for anything that is not a usable background. */
35
+ export function parsePublicDirBackground(raw: unknown): PublicDirBackground | null {
36
+ if (!isRecord(raw) || !isUsableBackgroundSrc(raw.url) || !isDirBackgroundOpacity(raw.opacity) || !isDirBackgroundFit(raw.fit)) return null;
37
+ return { url: raw.url, opacity: raw.opacity, fit: raw.fit };
38
+ }
@@ -11,6 +11,7 @@
11
11
  export const DIR_CONFIG_KEYS = [
12
12
  "name",
13
13
  "icon",
14
+ "backgroundImage",
14
15
  "badgeColor",
15
16
  "headerColor",
16
17
  "headerTextColor",
@@ -0,0 +1,49 @@
1
+ // The `playfulEffects` setting and the heat a session reports to the browser. Both sides decide
2
+ // from it: the server skips measuring when it is "off" and sends the heat frame, the browser picks
3
+ // the picture and draws the level.
4
+ import { isRecord } from "./isRecord.js";
5
+
6
+ export const HEAT_PATTERNS = ["bomb", "volcano", "kettle", "rocket", "dynamite", "balloon", "skull"] as const;
7
+ export type HeatPattern = (typeof HEAT_PATTERNS)[number];
8
+ export const isHeatPattern = (value: unknown): value is HeatPattern => HEAT_PATTERNS.some((pattern) => pattern === value);
9
+
10
+ export type PlayfulEffects = HeatPattern | "random" | "off";
11
+ export const PLAYFUL_EFFECTS_DEFAULT: PlayfulEffects = "random";
12
+
13
+ /** Anything unrecognised is "unconfigured", which is what every config file written before this
14
+ * existed contains. `false` is honoured as "off" because it is what a person switching it off
15
+ * writes first. */
16
+ export function sanitizePlayfulEffects(input: unknown): PlayfulEffects {
17
+ if (input === false || input === "off") return "off";
18
+ if (input === "random" || isHeatPattern(input)) return input;
19
+ return PLAYFUL_EFFECTS_DEFAULT;
20
+ }
21
+
22
+ /** 0 nothing, 1 appears, 2 lit, 3 hot, 4 critical. The finale is an event, not a level. */
23
+ export const HEAT_LEVELS = [0, 1, 2, 3, 4] as const;
24
+ export type HeatLevel = (typeof HEAT_LEVELS)[number];
25
+ export const isHeatLevel = (value: unknown): value is HeatLevel => HEAT_LEVELS.some((level) => level === value);
26
+
27
+ /** The `heat` frame: the session's level now, and whether it has just cooled off from a hot run. */
28
+ export interface HeatFrame {
29
+ type: "heat";
30
+ level: HeatLevel;
31
+ finale: boolean;
32
+ }
33
+
34
+ export const heatFrameOf = (msg: unknown): { level: HeatLevel; finale: boolean } | null =>
35
+ isRecord(msg) && msg.type === "heat" && isHeatLevel(msg.level) && typeof msg.finale === "boolean" ? { level: msg.level, finale: msg.finale } : null;
36
+
37
+ const FNV_OFFSET = 0x811c9dc5;
38
+ const FNV_PRIME = 0x01000193;
39
+
40
+ // FNV-1a: stable across reloads and browsers, so "random" gives each session its own picture that
41
+ // stays put, rather than one that changes on every re-render.
42
+ const hashOf = (text: string): number => [...text].reduce((hash, char) => Math.imul(hash ^ char.charCodeAt(0), FNV_PRIME) >>> 0, FNV_OFFSET);
43
+
44
+ /** The picture for a session, or null when the setting is off. */
45
+ export function patternFor(sessionId: string, setting: PlayfulEffects): HeatPattern | null {
46
+ if (setting === "off") return null;
47
+ if (setting !== "random") return setting;
48
+ return HEAT_PATTERNS[hashOf(sessionId) % HEAT_PATTERNS.length] ?? "bomb";
49
+ }
@@ -1 +1 @@
1
- import{m as e,t}from"./mermaid-parser.core-S4mGErbM.js";import{n}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import{m as r}from"./src-CllyRBe0.js";import"./chunk-O7XYJQB3-ChS0oDzH.js";import{n as i,r as a,t as o}from"./chunk-GTNCS2PH-BegFnGEj.js";import{t as s}from"./chunk-JWPE2WC7-DVXcaiue.js";import"./mermaid.core-DcTpiPIz.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-9dyqX5Cv.js";import{n}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import{m as r}from"./src-CllyRBe0.js";import"./chunk-O7XYJQB3-B7efnPsN.js";import{n as i,r as a,t as o}from"./chunk-GTNCS2PH-3pmrTmQI.js";import{t as s}from"./chunk-JWPE2WC7-DVXcaiue.js";import"./mermaid.core-Cpfr3G3I.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-FOHPRMQF-DzxwRta7.js";import{M as e}from"./mermaid-parser.core-9dyqX5Cv.js";export{e as createArchitectureServices};