mulmoterminal 9.1.0 → 9.2.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 (122) hide show
  1. package/README.md +1 -0
  2. package/common/tokenRotation.ts +103 -0
  3. package/dist/assets/{abnfDiagram-O67JEVCF-Cql7eDy4.js → abnfDiagram-O67JEVCF-CgI1WW1K.js} +1 -1
  4. package/dist/assets/architecture-7GRP2DOG-DhlJuDvy.js +1 -0
  5. package/dist/assets/{architectureDiagram-NJMV4G6O-BPwX4Kdv.js → architectureDiagram-NJMV4G6O-BiqfSHQg.js} +1 -1
  6. package/dist/assets/{blockDiagram-BEXU5L5S-CfKfvGbN.js → blockDiagram-BEXU5L5S-C85RgRxX.js} +1 -1
  7. package/dist/assets/{c4Diagram-YGBWAQC7-BxkigRnJ.js → c4Diagram-YGBWAQC7-zwpfD43P.js} +1 -1
  8. package/dist/assets/channel-DMXWzx9j.js +1 -0
  9. package/dist/assets/{chunk-3FUC2YCW-HE1nZO4E.js → chunk-3FUC2YCW-BQp1NS7l.js} +1 -1
  10. package/dist/assets/{chunk-5DYCD2WN-DAiWE_L-.js → chunk-5DYCD2WN-oXShtJkD.js} +1 -1
  11. package/dist/assets/{chunk-742MDFTN-0z7Oj4QR.js → chunk-742MDFTN-Bk6NjtH1.js} +1 -1
  12. package/dist/assets/{chunk-7INBJB4K-Cbz_RcWe.js → chunk-7INBJB4K-DiAzK5PS.js} +1 -1
  13. package/dist/assets/{chunk-7M6MHVWA-D0fHotJI.js → chunk-7M6MHVWA-B6utT-Zc.js} +1 -1
  14. package/dist/assets/{chunk-7PRAP22T-C14mAIqt.js → chunk-7PRAP22T-Bx2XCqg1.js} +1 -1
  15. package/dist/assets/{chunk-GTNCS2PH-C-P8WS3W.js → chunk-GTNCS2PH-4KojMJEX.js} +1 -1
  16. package/dist/assets/{chunk-GWA4HPMP-CB4GBCTJ.js → chunk-GWA4HPMP-yanFQ1nr.js} +1 -1
  17. package/dist/assets/{chunk-MBY4JIJT-IceNmBgh.js → chunk-MBY4JIJT-DUxMzuaK.js} +1 -1
  18. package/dist/assets/{chunk-NETBCI7D-BSYUBzfP.js → chunk-NETBCI7D-DXWi_iQj.js} +1 -1
  19. package/dist/assets/{chunk-O7XYJQB3-BWsd-NGX.js → chunk-O7XYJQB3-t0bazVQy.js} +1 -1
  20. package/dist/assets/{chunk-UA2S7LBM-CefRaTtZ.js → chunk-UA2S7LBM-DTCGDQab.js} +1 -1
  21. package/dist/assets/{chunk-WEXAMYUT-DWwNhWea.js → chunk-WEXAMYUT-aTWhW_z5.js} +1 -1
  22. package/dist/assets/{chunk-Z7XXMR3K-AxGELBoY.js → chunk-Z7XXMR3K-MS8d4aOw.js} +1 -1
  23. package/dist/assets/{chunk-ZIGJFQKS-BjGm6Q_-.js → chunk-ZIGJFQKS-DptxH_L8.js} +1 -1
  24. package/dist/assets/{classDiagram-v2-NBCMYWYE-DvblB8tx.js → classDiagram-v2-NBCMYWYE-CMkVvr2h.js} +1 -1
  25. package/dist/assets/{cynefin-OW5HDTMX-DtUMK6KD.js → cynefin-OW5HDTMX-BaizLEpA.js} +1 -1
  26. package/dist/assets/{cynefinDiagram-VND7K2PF-CAwbB6dF.js → cynefinDiagram-VND7K2PF-C_3c5MJG.js} +1 -1
  27. package/dist/assets/{dagre-6A5THRUB-D5XInuQL.js → dagre-6A5THRUB-BGIP-9su.js} +1 -1
  28. package/dist/assets/{diagram-22UHCM2B-CBr8zyf2.js → diagram-22UHCM2B-DKbKy6lK.js} +1 -1
  29. package/dist/assets/{diagram-3UASUU5V-CPh2LwGn.js → diagram-3UASUU5V-4Gzm0x2x.js} +1 -1
  30. package/dist/assets/{diagram-ATOU4E4O-CZtXRSJ1.js → diagram-ATOU4E4O-BYP3MI1w.js} +1 -1
  31. package/dist/assets/{diagram-CDSNMT55-9xay63d0.js → diagram-CDSNMT55-B1ocJFEo.js} +1 -1
  32. package/dist/assets/{diagram-MLGK6HIB-B1gXSuka.js → diagram-MLGK6HIB-DD23Gsmy.js} +1 -1
  33. package/dist/assets/{diagram-MPIPVDR6-D2cdkgqI.js → diagram-MPIPVDR6-C0D4yd40.js} +1 -1
  34. package/dist/assets/{dist-BvxNDT5q.js → dist-0JSyQRpW.js} +1 -1
  35. package/dist/assets/{dist-DiGRwfdQ.js → dist-A_kJh8wT.js} +1 -1
  36. package/dist/assets/{dist-CRU2Hx9e.js → dist-Bpv8UmRl.js} +1 -1
  37. package/dist/assets/{dist-COSExo-X.js → dist-Caswjbvr.js} +1 -1
  38. package/dist/assets/{dist-B6NNAnlb.js → dist-D7w6l0hq.js} +1 -1
  39. package/dist/assets/{ebnfDiagram-ZINNZB2B-zw7fYT4W.js → ebnfDiagram-ZINNZB2B-BLwb1Bjg.js} +1 -1
  40. package/dist/assets/{elk-276RUBZZ-BnbzbO70.js → elk-276RUBZZ-DqsaX90b.js} +1 -1
  41. package/dist/assets/{erDiagram-OPXOYQCR-D3ybTKMV.js → erDiagram-OPXOYQCR-DB_8EZw1.js} +1 -1
  42. package/dist/assets/eventmodeling-NTZA5JFV-D9-lEkyT.js +1 -0
  43. package/dist/assets/flowDiagram-KWPJA3E3-Cc4AVXST.js +1 -0
  44. package/dist/assets/{ganttDiagram-FUAMR5RP-B9IuJaJ7.js → ganttDiagram-FUAMR5RP-Bs3jK_dS.js} +1 -1
  45. package/dist/assets/{gitGraph-4MIJSDKK-CACnw5Rn.js → gitGraph-4MIJSDKK-DkximLaH.js} +1 -1
  46. package/dist/assets/{gitGraphDiagram-X574FWY7-mJeRIXgv.js → gitGraphDiagram-X574FWY7-lISByUdq.js} +1 -1
  47. package/dist/assets/{index-ywZ0KgS0.js → index-BJWYg9o0.js} +379 -379
  48. package/dist/assets/index-BeW1ckhh.css +1 -0
  49. package/dist/assets/{info-A6RAGUB7-B_99gUG6.js → info-A6RAGUB7-DaP4M4pr.js} +1 -1
  50. package/dist/assets/{infoDiagram-VRGFBTTK-CIahd7m7.js → infoDiagram-VRGFBTTK-Bp0kXoF9.js} +1 -1
  51. package/dist/assets/{ishikawaDiagram-OU5B5YK6-_pJwf5z0.js → ishikawaDiagram-OU5B5YK6-CJAtx6_z.js} +1 -1
  52. package/dist/assets/{journeyDiagram-ZHPQQLJL-DVu1r_Sp.js → journeyDiagram-ZHPQQLJL-C0eQyewJ.js} +1 -1
  53. package/dist/assets/{kanban-definition-PNTS6WVX-Bvf-1KYk.js → kanban-definition-PNTS6WVX-Bx0ss3Hw.js} +1 -1
  54. package/dist/assets/{line-B8A3a3kh.js → line-Ck7uwpnJ.js} +1 -1
  55. package/dist/assets/{manifold-B4xOJLzD.js → manifold-B3bYRcpX.js} +1 -1
  56. package/dist/assets/{mermaid-parser.core-DaS4aeEe.js → mermaid-parser.core-dGRiSpK_.js} +3 -3
  57. package/dist/assets/{mermaid.core-CnYkvp8n.js → mermaid.core-D0r1cekq.js} +4 -4
  58. package/dist/assets/{mindmap-definition-NLK3R4M7-CpbXJFTL.js → mindmap-definition-NLK3R4M7-4_koMJUc.js} +1 -1
  59. package/dist/assets/{packet-AYTQ26CC-jcWTTmks.js → packet-AYTQ26CC-6n9L9Qrc.js} +1 -1
  60. package/dist/assets/{pegDiagram-GJSIUBJH-Dbc2tsyn.js → pegDiagram-GJSIUBJH-C2hvlIZ3.js} +1 -1
  61. package/dist/assets/{pie-WAS4IAKB-CizFfv6i.js → pie-WAS4IAKB-BAT7lOO0.js} +1 -1
  62. package/dist/assets/{pieDiagram-5QR66LMP-DXX3IcV9.js → pieDiagram-5QR66LMP-BGuUJWdF.js} +1 -1
  63. package/dist/assets/{quadrantDiagram-O4NWA36T-D-DOXsw7.js → quadrantDiagram-O4NWA36T-6b3hk9ag.js} +1 -1
  64. package/dist/assets/{radar-RG4KPBEZ-DVaylYAV.js → radar-RG4KPBEZ-CtNbu0eL.js} +1 -1
  65. package/dist/assets/{railroad-74A4TZTK-DEszSi6n.js → railroad-74A4TZTK-Gskwmw9G.js} +1 -1
  66. package/dist/assets/railroad-abnf-HS5TGJTU-PCHU0QkJ.js +1 -0
  67. package/dist/assets/railroad-ebnf-LZEXJU2U-BOOJaFVP.js +1 -0
  68. package/dist/assets/railroad-peg-WCYAUIDC-BhiuDOT2.js +1 -0
  69. package/dist/assets/{railroadDiagram-XR7U4H2S-D3kqADTa.js → railroadDiagram-XR7U4H2S-Boqbx6-T.js} +1 -1
  70. package/dist/assets/{requirementDiagram-PLB6GJNP-YpGYYUq8.js → requirementDiagram-PLB6GJNP-CkYAR9nA.js} +1 -1
  71. package/dist/assets/{sankeyDiagram-IPEJSGJF-R4KL4_Zi.js → sankeyDiagram-IPEJSGJF-7lJkpQK4.js} +1 -1
  72. package/dist/assets/{sequenceDiagram-PO4LG4MO-tIIojIJD.js → sequenceDiagram-PO4LG4MO-rJVWeJWh.js} +1 -1
  73. package/dist/assets/{stateDiagram-v2-GCMORJYK-D9jE6vCT.js → stateDiagram-v2-GCMORJYK-BJ5DvE6t.js} +1 -1
  74. package/dist/assets/{swimlanes-2SLR337P-Bw9cn0PT.js → swimlanes-2SLR337P-D7583-k5.js} +1 -1
  75. package/dist/assets/swimlanesDiagram-TC7HE7FX-BJHUGFbc.js +8 -0
  76. package/dist/assets/{timeline-definition-EJHVYXUP-vzEfdjnB.js → timeline-definition-EJHVYXUP-B1NtzCrH.js} +1 -1
  77. package/dist/assets/{treeView-Q6P3EWNA-Lt-Je8zH.js → treeView-Q6P3EWNA-DzV8aZtB.js} +1 -1
  78. package/dist/assets/{treemap-WGGIJYW6-BY_7_NMi.js → treemap-WGGIJYW6-B6kgW4ZK.js} +1 -1
  79. package/dist/assets/{usecaseDiagram-POWQR4AR-Dgsia1SG.js → usecaseDiagram-POWQR4AR-CpnK-2B3.js} +1 -1
  80. package/dist/assets/{vennDiagram-UO4OBE2U-C6RtvXya.js → vennDiagram-UO4OBE2U-BhIqoQE7.js} +1 -1
  81. package/dist/assets/{wardley-WFR3VGLG-B2gP_do0.js → wardley-WFR3VGLG-D3yNRsZQ.js} +1 -1
  82. package/dist/assets/{wardleyDiagram-VNRHLVJA-DeqTsydI.js → wardleyDiagram-VNRHLVJA-Dkv29Zw1.js} +1 -1
  83. package/dist/assets/{xychartDiagram-PMCCYNJV-D2Sngf-8.js → xychartDiagram-PMCCYNJV-Dzpv7CnP.js} +1 -1
  84. package/dist/index.html +2 -2
  85. package/docs/guide/en/v9.2.0.md +113 -0
  86. package/docs/guide/ja/v9.2.0.md +106 -0
  87. package/package.json +1 -1
  88. package/server/agents/account-rate-limits.ts +57 -30
  89. package/server/agents/probe-stall.spec.ts +27 -0
  90. package/server/agents/probe-stall.ts +12 -2
  91. package/server/agents/rate-limit-probe.spec.ts +36 -0
  92. package/server/agents/rate-limit-probe.ts +5 -1
  93. package/server/agents/rate-limit-routes.ts +4 -1
  94. package/server/agents/rate-limit-service.ts +67 -20
  95. package/server/agents/token-assignment.ts +81 -0
  96. package/server/agents/token-choice.ts +90 -0
  97. package/server/agents/token-rotation-service.ts +107 -0
  98. package/server/agents/token-secret.ts +87 -0
  99. package/server/config/app-config.ts +8 -0
  100. package/server/config/config-routes.ts +6 -0
  101. package/server/index.ts +30 -4
  102. package/server/routes/app-routes.ts +6 -0
  103. package/server/routes/hook-routes.ts +17 -4
  104. package/server/session/activity-hook.ts +3 -0
  105. package/server/session/hook-settings.ts +3 -0
  106. package/server/session/limit-rotation.ts +78 -0
  107. package/server/session/rotation-notice.ts +29 -0
  108. package/server/session/session-credential.ts +35 -0
  109. package/server/session/spawn-claude.ts +64 -7
  110. package/server/session/spawn-deps.ts +6 -0
  111. package/server/session/token-session-log.ts +34 -0
  112. package/server/session/token-sessions.ts +52 -0
  113. package/server/skills/mulmoterminal-model/SKILL.md +57 -0
  114. package/dist/assets/architecture-7GRP2DOG-CZIYYJ4J.js +0 -1
  115. package/dist/assets/channel-C7PAQOe4.js +0 -1
  116. package/dist/assets/eventmodeling-NTZA5JFV-Du3-gAJl.js +0 -1
  117. package/dist/assets/flowDiagram-KWPJA3E3-DM38I9KM.js +0 -1
  118. package/dist/assets/index-B-X7-YRY.css +0 -1
  119. package/dist/assets/railroad-abnf-HS5TGJTU-BvKljvCm.js +0 -1
  120. package/dist/assets/railroad-ebnf-LZEXJU2U-C0PANGU1.js +0 -1
  121. package/dist/assets/railroad-peg-WCYAUIDC-iA0I8YHa.js +0 -1
  122. package/dist/assets/swimlanesDiagram-TC7HE7FX-BzC92HZb.js +0 -8
package/README.md CHANGED
@@ -805,6 +805,7 @@ The Settings modal (the gear button) persists per-user UI choices to `~/.mulmote
805
805
  | `launchers` | `{ label, command }` entries offered in a grid cell's launcher besides the agents — any interactive command. A plain shell needs no entry: the Agent Picker's **Shell** option opens `$SHELL` unconfigured. |
806
806
  | `customAgents` | `{ id, label, agent, command }` entries offered in the **Agent Picker** — your own way of starting Claude Code (`ollama launch claude --model … --`, a wrapper script). Unlike a launcher, Claude Code's own argv is **appended** to `command`, so the cell is a real session: resume, cost, context, GUI tools. `agent` says which agent's arguments to append and is required (`"claude"` is the only value today); `command` must stop taking arguments where Claude Code's begin — hence the trailing `--` above. Up to 8. |
807
807
  | `accounts` | **Beta** ([setup guide](docs/guide/en/accounts.md)). `{ id, label, agent, home }` entries — a second login for Claude Code (`agent: "claude"`) or Codex (`"codex"`), kept in its own config directory `home` (absolute or `~/…`). Picked per cell in the launch form's **ACCOUNT** select (the cell's header then names it); a session started on one runs with `CLAUDE_CONFIG_DIR` / `CODEX_HOME` set to it, and is bound to that account for good: resume, cost, titles and history are read from there, session lists show every account's rows, and the toolbar shows each account's 5h / 7d usage beside the default's. An account pointed at `~/.claude` / `~/.codex` itself is treated as the default login: no variable, no gauge of its own. A cell with no account gets no such variable added (whatever MulmoTerminal's own environment carries is inherited as before), so configuring none changes nothing. Up to 8. |
808
+ | `tokenRotation` | **Beta** ([setup guide](docs/guide/en/token-rotation.md)). `{ enabled, includeDefaultLogin, tokens: [{ id, label, email?, keychain \| file }] }` — several Claude subscriptions behind the one `~/.claude`. Each new plain Claude process starts on the subscription whose 7-day window has the most room per hour until its reset; a session whose subscription is at 98% moves to another at the end of its turn, and one that hits its limit moves at once — the cell reconnects and resumes the same conversation. A token is named by where it is kept (a keychain item, or a `chmod 600` file), never written here. Provider, custom-agent and account cells are never rotated. Up to 8. |
808
809
  | `quickCommands` | `{ label, text, agents? }` phrases the **phone** offers as chips on a session's terminal view. Tapping one puts `text` in the input box; it is not sent until you press send. `agents` scopes a chip to session kinds — any of `SESSION_AGENTS` (`"claude"`, `"codex"`, `"antigravity"`, `"grok"`, `"muse"`, `"copilot"`, `"cursor"`, `"shell"`); omit it to offer the chip everywhere. Empty by default. |
809
810
  | `userMcpServers` | `{ id, url }` HTTP MCP servers merged into the `--mcp-config` of the **Claude** sessions that carry the full GUI MCP (codex is handed the GUI server alone, `codexGuiMcpServers`) — a cell whose working directory is the **workspace**, and a session the server starts itself (the phone, a scheduled task) unless it asks for a grid cell's shape, as an issue's seed session does (`issueSpawnOptions`). A cell in a project directory does not get this merge; the MCP config the user wrote is read either way. Takes effect on the next session. |
810
811
  | `buttons` | Header action buttons — see [Header buttons](#header-buttons). Omit to keep the defaults; set to replace them. |
@@ -0,0 +1,103 @@
1
+ // TOKEN ROTATION: several Claude subscriptions behind ONE config home (#2919).
2
+ //
3
+ // Not an account (common/agentAccounts.ts). An account is a second home, so its conversations stay
4
+ // in it; a rotation token is only a credential, handed to a session as CLAUDE_CODE_OAUTH_TOKEN, so
5
+ // every conversation stays in the default home and can be resumed on any token. Measured: the
6
+ // token outranks the `/login` credential and its statusLine reports that subscription's own windows.
7
+ //
8
+ // The secret is never in config.json. An entry names WHERE it is — a keychain item or a file — and
9
+ // the server reads it per spawn.
10
+ import { isRecord } from "./isRecord.js";
11
+
12
+ export interface RotationToken {
13
+ /** Stable slug. It keys the per-session record and the usage meter. */
14
+ id: string;
15
+ label: string;
16
+ /** The subscription's sign-in address, written by the user and shown beside the usage — the token
17
+ * says nothing about whose it is that this server can read. */
18
+ email?: string;
19
+ /** macOS keychain item: `security find-generic-password -a <keychainAccount> -s <keychain> -w`. */
20
+ keychain?: string;
21
+ /** Defaults to KEYCHAIN_ACCOUNT_DEFAULT. */
22
+ keychainAccount?: string;
23
+ /** A file holding the token, absolute or `~/`-relative. */
24
+ file?: string;
25
+ }
26
+
27
+ export interface TokenRotation {
28
+ enabled: boolean;
29
+ /** Whether the `/login` credential takes part as one more candidate. */
30
+ includeDefaultLogin: boolean;
31
+ tokens: RotationToken[];
32
+ }
33
+
34
+ export const KEYCHAIN_ACCOUNT_DEFAULT = "mulmoterminal";
35
+
36
+ /** The id the `/login` credential is recorded under. Not a valid token id, so it cannot collide. */
37
+ export const DEFAULT_LOGIN_ID = "@default";
38
+
39
+ export const ROTATION_TOKEN_ID_RE = /^[a-z0-9][a-z0-9_-]{0,31}$/;
40
+ export const ROTATION_TOKEN_LABEL_MAX = 24;
41
+ export const ROTATION_TOKEN_REF_MAX = 500;
42
+ export const ROTATION_TOKENS_MAX = 8;
43
+ export const ROTATION_TOKEN_EMAIL_MAX = 254;
44
+
45
+ /** What a terminal line calls the `/login` credential. */
46
+ export const DEFAULT_LOGIN_LABEL = "the /login account";
47
+
48
+ /** What a terminal line calls a credential: its label and address, the `/login` one by name, and a
49
+ * token gone from the config by its id. */
50
+ export function rotationLoginLabel(rotation: TokenRotation, tokenId: string): string {
51
+ if (tokenId === DEFAULT_LOGIN_ID) return DEFAULT_LOGIN_LABEL;
52
+ const token = rotation.tokens.find((candidate) => candidate.id === tokenId);
53
+ if (!token) return tokenId;
54
+ return token.email ? `${token.label} (${token.email})` : token.label;
55
+ }
56
+
57
+ export const TOKEN_ROTATION_OFF: TokenRotation = { enabled: false, includeDefaultLogin: true, tokens: [] };
58
+
59
+ export const isRotationTokenId = (value: unknown): value is string => typeof value === "string" && ROTATION_TOKEN_ID_RE.test(value);
60
+
61
+ const isTokenFile = (value: unknown): value is string =>
62
+ typeof value === "string" && (value.startsWith("/") || value.startsWith("~/") || /^[A-Za-z]:[\\/]/.test(value));
63
+
64
+ const optionalEmail = (value: unknown): string | undefined => {
65
+ if (typeof value !== "string") return undefined;
66
+ const trimmed = value.trim();
67
+ return trimmed.length <= ROTATION_TOKEN_EMAIL_MAX && /^[^\s@]+@[^\s@]+$/.test(trimmed) ? trimmed : undefined;
68
+ };
69
+
70
+ const optionalRef = (value: unknown): string | undefined => {
71
+ if (typeof value !== "string") return undefined;
72
+ const trimmed = value.trim();
73
+ return trimmed && trimmed.length <= ROTATION_TOKEN_REF_MAX ? trimmed : undefined;
74
+ };
75
+
76
+ /** One config row as a RotationToken, or null. Exactly one of `keychain` / `file` must be set. */
77
+ export function rotationTokenFrom(row: unknown): RotationToken | null {
78
+ if (!isRecord(row) || typeof row.id !== "string" || typeof row.label !== "string") return null;
79
+ const id = row.id.trim();
80
+ const label = row.label.trim().slice(0, ROTATION_TOKEN_LABEL_MAX);
81
+ const keychain = optionalRef(row.keychain);
82
+ const file = optionalRef(row.file);
83
+ if (!isRotationTokenId(id) || !label) return null;
84
+ const email = optionalEmail(row.email);
85
+ const named = email ? { id, label, email } : { id, label };
86
+ if (keychain !== undefined && file === undefined) {
87
+ const keychainAccount = optionalRef(row.keychainAccount);
88
+ return keychainAccount ? { ...named, keychain, keychainAccount } : { ...named, keychain };
89
+ }
90
+ return file !== undefined && keychain === undefined && isTokenFile(file) ? { ...named, file } : null;
91
+ }
92
+
93
+ /** The `tokenRotation` key read back, with every malformed or duplicate row dropped. */
94
+ export function sanitizeTokenRotation(input: unknown): TokenRotation {
95
+ if (!isRecord(input)) return TOKEN_ROTATION_OFF;
96
+ const rows = Array.isArray(input.tokens) ? input.tokens : [];
97
+ const tokens = rows
98
+ .map(rotationTokenFrom)
99
+ .filter((token): token is RotationToken => token !== null)
100
+ .filter((token, index, all) => all.findIndex((other) => other.id === token.id) === index)
101
+ .slice(0, ROTATION_TOKENS_MAX);
102
+ return { enabled: input.enabled === true, includeDefaultLogin: input.includeDefaultLogin !== false, tokens };
103
+ }
@@ -1 +1 @@
1
- import{m as e,t}from"./mermaid-parser.core-DaS4aeEe.js";import{n}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import{m as r}from"./src-CllyRBe0.js";import"./chunk-O7XYJQB3-BWsd-NGX.js";import{n as i,r as a,t as o}from"./chunk-GTNCS2PH-C-P8WS3W.js";import{t as s}from"./chunk-JWPE2WC7-DVXcaiue.js";import"./mermaid.core-CnYkvp8n.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-dGRiSpK_.js";import{n}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import{m as r}from"./src-CllyRBe0.js";import"./chunk-O7XYJQB3-t0bazVQy.js";import{n as i,r as a,t as o}from"./chunk-GTNCS2PH-4KojMJEX.js";import{t as s}from"./chunk-JWPE2WC7-DVXcaiue.js";import"./mermaid.core-D0r1cekq.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-dGRiSpK_.js";export{e as createArchitectureServices};