mulmoterminal 1.7.2 → 1.9.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 +9 -4
  2. package/common/terminalSubmit.ts +70 -0
  3. package/dist/assets/{abnfDiagram-VRR7QNED-RjiYivmv-CCLjG9E9.js → abnfDiagram-VRR7QNED-RjiYivmv-DU_K6qFi.js} +1 -1
  4. package/dist/assets/architecture-TIHT7OUA-0NsD2xW1-4wf6mIEw.js +1 -0
  5. package/dist/assets/{architectureDiagram-ZJ3FMSHR-3nWA91tG-BcngES-G.js → architectureDiagram-ZJ3FMSHR-3nWA91tG-DVrZTqSk.js} +1 -1
  6. package/dist/assets/{blockDiagram-677ZJIJ3-BPuAJQRW-K8X4YdbW.js → blockDiagram-677ZJIJ3-BPuAJQRW-BLiRRQm5.js} +1 -1
  7. package/dist/assets/{c4Diagram-LMCZKHZV-C0LAqQso-DPvBKT_o.js → c4Diagram-LMCZKHZV-C0LAqQso-D5QwCU_o.js} +1 -1
  8. package/dist/assets/channel-7wUqSdoX-2AjOgRSk.js +1 -0
  9. package/dist/assets/{chunk-32BRIVSS-BRrYpgtb-Sgw4YiwO.js → chunk-32BRIVSS-BRrYpgtb-i-fzlhhz.js} +1 -1
  10. package/dist/assets/{chunk-52WLFC77-BJ-ss3Xr-DXTsqQmw.js → chunk-52WLFC77-BJ-ss3Xr-nyRqJju1.js} +1 -1
  11. package/dist/assets/{chunk-C7G6YPKG-BZEucKEL-CzDWUuQD.js → chunk-C7G6YPKG-BZEucKEL-D9LEX7f2.js} +1 -1
  12. package/dist/assets/{chunk-EX3LRPZG-DLS6FBN1-BZ8245YL.js → chunk-EX3LRPZG-DLS6FBN1-BytXeE9i.js} +1 -1
  13. package/dist/assets/{chunk-FWX5IMBZ-DHLSFw1H-rWT4wsYF.js → chunk-FWX5IMBZ-DHLSFw1H-m71SvFru.js} +2 -2
  14. package/dist/assets/{chunk-HOUHSVGY-Bhlt8hXJ-DHHJ39yY.js → chunk-HOUHSVGY-Bhlt8hXJ-DvXTfr5J.js} +1 -1
  15. package/dist/assets/{chunk-ICXQ74PX-DwgHBX_g-CVO4XUCO.js → chunk-ICXQ74PX-DwgHBX_g-DtZbnneJ.js} +1 -1
  16. package/dist/assets/{chunk-MOJQB5TN-CMZRaeqt-CfjRj6ge.js → chunk-MOJQB5TN-CMZRaeqt-D-0XUMWR.js} +1 -1
  17. package/dist/assets/{chunk-OGEWGWER-8Qy4a8b5-Cs1ErBxS.js → chunk-OGEWGWER-8Qy4a8b5-CtzH4qtc.js} +1 -1
  18. package/dist/assets/{chunk-PUDLZKDR-DcrWQRYh-DDlhQIXq.js → chunk-PUDLZKDR-DcrWQRYh-CPg1Gu6Y.js} +1 -1
  19. package/dist/assets/{chunk-Q4XR5HBZ-ZXVGkG8Z-DtPCWcx0.js → chunk-Q4XR5HBZ-ZXVGkG8Z-CcjIHpgU.js} +1 -1
  20. package/dist/assets/{chunk-V7JOEXUC-DmGdheTX-FwuThvxD.js → chunk-V7JOEXUC-DmGdheTX-CWaw5IcP.js} +1 -1
  21. package/dist/assets/{chunk-VAUOI2AC-CS9QJ4yz-rBHFym4n.js → chunk-VAUOI2AC-CS9QJ4yz-DtSCvKnv.js} +1 -1
  22. package/dist/assets/{chunk-VR4S4FIN-C6a91eNY-6Y9hr75K.js → chunk-VR4S4FIN-C6a91eNY-Bh2VFmJ3.js} +1 -1
  23. package/dist/assets/{chunk-WYO6CB5R-BlzOfotS-Cg8JP_k-.js → chunk-WYO6CB5R-BlzOfotS-BthT9wbR.js} +1 -1
  24. package/dist/assets/{chunk-ZGVPDNZ5-BYwxNFTK-BvTVX4I4.js → chunk-ZGVPDNZ5-BYwxNFTK-C-bwbGzR.js} +1 -1
  25. package/dist/assets/classDiagram-OUVF2IWQ-BYlRi6YQ-DMDbKuRe.js +1 -0
  26. package/dist/assets/classDiagram-v2-EOCWNBFH-BCHaYHxj-DMDbKuRe.js +1 -0
  27. package/dist/assets/cynefin-VYW2F7L2-CGYr2F6h-D1spgDYy.js +1 -0
  28. package/dist/assets/{cynefinDiagram-TSTJHNR4-DHA9iPo--Coj5CuZV.js → cynefinDiagram-TSTJHNR4-DHA9iPo--ZyHDWT82.js} +1 -1
  29. package/dist/assets/{dagre-VKFMJZFB--oJKqXBZ-iQ8NhR-E.js → dagre-VKFMJZFB--oJKqXBZ-DKioff7t.js} +1 -1
  30. package/dist/assets/{diagram-FQU43EPY-CcJCB9bG-CZBlndUC.js → diagram-FQU43EPY-CcJCB9bG-BCfSF8Es.js} +1 -1
  31. package/dist/assets/{diagram-G47NLZAW-C_o-WGG1-CezpEy0i.js → diagram-G47NLZAW-C_o-WGG1-B1_gM-30.js} +1 -1
  32. package/dist/assets/{diagram-NH7WQ7WH-CXJCYvY--DmwB4xPU.js → diagram-NH7WQ7WH-CXJCYvY--BiJXpAVX.js} +1 -1
  33. package/dist/assets/{diagram-OA4YK3LP-BMzeJ87A-KO3buG9g.js → diagram-OA4YK3LP-BMzeJ87A-BfNHK-ax.js} +1 -1
  34. package/dist/assets/{diagram-WEI45ONY-D_93NKqo-epWpVF6L.js → diagram-WEI45ONY-D_93NKqo-Brhn23jG.js} +1 -1
  35. package/dist/assets/{ebnfDiagram-CCIWWBDH-CVai1Ii9-CluKhaw-.js → ebnfDiagram-CCIWWBDH-CVai1Ii9-Dg_4zQv-.js} +1 -1
  36. package/dist/assets/{erDiagram-Q63AITRT-CiABnA0s-DuCAxim-.js → erDiagram-Q63AITRT-CiABnA0s-BIolFGl5.js} +1 -1
  37. package/dist/assets/eventmodeling-45OFAUF4-CWmqhm3a-CHNl0Ktk.js +1 -0
  38. package/dist/assets/flowDiagram-23GEKE2U-DKSB5AiY-B56BCBpK.js +1 -0
  39. package/dist/assets/{ganttDiagram-NO4QXBWP-DQZvdFo1-9pklplap.js → ganttDiagram-NO4QXBWP-DQZvdFo1-DkRXerl4.js} +1 -1
  40. package/dist/assets/gitGraph-TEB2WS4Q-BR9qPwdN-fabW-ens.js +1 -0
  41. package/dist/assets/{gitGraphDiagram-IHSO6WYX-C2ovBouh-CWEyMeWe.js → gitGraphDiagram-IHSO6WYX-C2ovBouh-DDvPOoLH.js} +1 -1
  42. package/dist/assets/index-BjVjO5_a.js +617 -0
  43. package/dist/assets/index-Bx7iPSaX.css +1 -0
  44. package/dist/assets/info-DKCQHKI2-Dplx5kMp-9qLOO9db.js +1 -0
  45. package/dist/assets/{infoDiagram-FWYZ7A6U-7UnoB5AP-MGxGOrtx.js → infoDiagram-FWYZ7A6U-7UnoB5AP-KZr_ldtc.js} +1 -1
  46. package/dist/assets/{ishikawaDiagram-FXEZZL3T-ByUDM_N2-Bx_aHmxj.js → ishikawaDiagram-FXEZZL3T-ByUDM_N2-BPRySiwW.js} +1 -1
  47. package/dist/assets/{journeyDiagram-5HDEW3XC-c5xIah9o-DoZ1k7c2.js → journeyDiagram-5HDEW3XC-c5xIah9o-BL6hTC-O.js} +1 -1
  48. package/dist/assets/{kanban-definition-HUTT4EX6-Cnt6loYD-D_jZUsQX.js → kanban-definition-HUTT4EX6-Cnt6loYD-BhnENx2k.js} +1 -1
  49. package/dist/assets/{lib-BuOUsCeD.js → lib-DaMiMJQ3.js} +1 -1
  50. package/dist/assets/{line-D7ziSjKi-BHXiLBOo.js → line-D7ziSjKi-DE4ocbIf.js} +1 -1
  51. package/dist/assets/{marp-gvb94kjy.js → marp-DV5eTK1B.js} +1 -1
  52. package/dist/assets/{mermaid-parser.core-DxEa8E3F-kLn0LOBf.js → mermaid-parser.core-DxEa8E3F-kNPP09h0.js} +2 -2
  53. package/dist/assets/{mermaid.core-V0OYwIz3-C-sR2rUO.js → mermaid.core-V0OYwIz3-BaCKmHzi.js} +3 -3
  54. package/dist/assets/{mindmap-definition-LN4V7U3C-CexN3O6L-C2mzLUhV.js → mindmap-definition-LN4V7U3C-CexN3O6L-B-ReFUSl.js} +1 -1
  55. package/dist/assets/packet-7NZHBO7P-CQI3flND-BnZnDtgV.js +1 -0
  56. package/dist/assets/{pegDiagram-2B236MQR-BiM4G0cW-ilTx6ElC.js → pegDiagram-2B236MQR-BiM4G0cW-CnV811h5.js} +1 -1
  57. package/dist/assets/pie-RZYD4A2V-CnmKE2Wa-DPdL-2LK.js +1 -0
  58. package/dist/assets/{pieDiagram-ENE6RG2P-B_fBBS-2-WTDOFCHf.js → pieDiagram-ENE6RG2P-B_fBBS-2-DXiwKFGc.js} +1 -1
  59. package/dist/assets/{quadrantDiagram-ABIIQ3AL-BigGVxCR-2XE8FR0c.js → quadrantDiagram-ABIIQ3AL-BigGVxCR-YALzgMHe.js} +1 -1
  60. package/dist/assets/radar-I7S5WNFK-us6x-Z9R-1CtI6gYg.js +1 -0
  61. package/dist/assets/railroad-3IZDKUUU-BKdz6pdN-DSFm44dq.js +1 -0
  62. package/dist/assets/railroad-abnf-AHOZXSZD-m_CSSIfd-dWlrjNfQ.js +1 -0
  63. package/dist/assets/railroad-ebnf-EBAXGLYW-Nu3nAG7C-PTXIDoql.js +1 -0
  64. package/dist/assets/railroad-peg-LSFZ7HO6--Y3mD4R_-C4QylQNV.js +1 -0
  65. package/dist/assets/{railroadDiagram-RFXS5EU6--lNIlG64-BUzUIavz.js → railroadDiagram-RFXS5EU6--lNIlG64-DUHKKTb7.js} +1 -1
  66. package/dist/assets/{requirementDiagram-TGXJPOKE-D-B0Y5Wu-rbwe3PPS.js → requirementDiagram-TGXJPOKE-D-B0Y5Wu-DTsjzvCL.js} +1 -1
  67. package/dist/assets/{sankeyDiagram-HTMAVEWB-DlutaXDv-DygoObNU.js → sankeyDiagram-HTMAVEWB-DlutaXDv-TGgoWZD-.js} +1 -1
  68. package/dist/assets/{sequenceDiagram-DBY2YBRQ-BOLgtggH-B0ncAj6o.js → sequenceDiagram-DBY2YBRQ-BOLgtggH-BytE_plg.js} +1 -1
  69. package/dist/assets/{stateDiagram-2N3HPSRC-jf_dXUEU-RKHr1CUK.js → stateDiagram-2N3HPSRC-jf_dXUEU-BfwezKvR.js} +1 -1
  70. package/dist/assets/stateDiagram-v2-6OUMAXLB-CuzgCL2v-C1D8uBqi.js +1 -0
  71. package/dist/assets/{swimlanes-5IMT3BWC-CYjtALQH-xIOTAMQY.js → swimlanes-5IMT3BWC-CYjtALQH-BbcKSkd3.js} +1 -1
  72. package/dist/assets/swimlanesDiagram-G3AALYLV-3bmSBtKs-BAAqICVR.js +8 -0
  73. package/dist/assets/{timeline-definition-FHXFAJF6-DYJ4oUm8-CGt2mnFM.js → timeline-definition-FHXFAJF6-DYJ4oUm8-DZWue9K0.js} +1 -1
  74. package/dist/assets/treeView-QDETBFTQ-D27HWG6Q-QTdMpBG6.js +1 -0
  75. package/dist/assets/treemap-6X3UGDF4-CmGIU3H5-Dyi9V8wK.js +1 -0
  76. package/dist/assets/{vennDiagram-L72KCM5P-CdKAHoek-DbQdfDPm.js → vennDiagram-L72KCM5P-CdKAHoek-CJ7cJ6KS.js} +1 -1
  77. package/dist/assets/wardley-OPB4EBWU-CbHWsb2k-Da9tZ4Bs.js +1 -0
  78. package/dist/assets/{wardleyDiagram-EHGQE667-BF6c4_CW-CE26h6BQ.js → wardleyDiagram-EHGQE667-BF6c4_CW-8dSrLEaZ.js} +1 -1
  79. package/dist/assets/{xychartDiagram-FW5EYKEG-CGiKngj7-DqMbN7gq.js → xychartDiagram-FW5EYKEG-CGiKngj7-DtUjdbBs.js} +1 -1
  80. package/dist/index.html +2 -2
  81. package/package.json +3 -3
  82. package/server/backends/files.ts +28 -14
  83. package/server/backends/remoteHost/getFeed.spec.ts +1 -0
  84. package/server/backends/remoteHost/handlers.spec.ts +37 -0
  85. package/server/backends/remoteHost/handlers.ts +18 -6
  86. package/server/backends/remoteHost/index.ts +1 -0
  87. package/server/backends/remoteHost/terminalInput.spec.ts +41 -0
  88. package/server/backends/remoteHost/terminalInput.ts +7 -1
  89. package/server/backends/remoteHost/terminalScreen.ts +44 -5
  90. package/server/backends/thumbnailStore.ts +1 -1
  91. package/server/backends/worklog.ts +2 -2
  92. package/server/config/app-config.ts +15 -0
  93. package/server/config/config-routes.ts +7 -0
  94. package/server/config/header-config.ts +11 -4
  95. package/server/files/files-browse.ts +1 -49
  96. package/server/files/pathContainment.ts +79 -0
  97. package/server/git/git-status.ts +3 -2
  98. package/server/index.ts +37 -5
  99. package/server/routes/app-routes.ts +5 -3
  100. package/dist/assets/architecture-TIHT7OUA-0NsD2xW1-Dc62_ljl.js +0 -1
  101. package/dist/assets/channel-7wUqSdoX-NCtPilPL.js +0 -1
  102. package/dist/assets/classDiagram-OUVF2IWQ-BYlRi6YQ-D1ky24Ds.js +0 -1
  103. package/dist/assets/classDiagram-v2-EOCWNBFH-BCHaYHxj-D1ky24Ds.js +0 -1
  104. package/dist/assets/cynefin-VYW2F7L2-CGYr2F6h-ORm6k8ze.js +0 -1
  105. package/dist/assets/eventmodeling-45OFAUF4-CWmqhm3a--puF0Mfa.js +0 -1
  106. package/dist/assets/flowDiagram-23GEKE2U-DKSB5AiY-Cr4R3boa.js +0 -1
  107. package/dist/assets/gitGraph-TEB2WS4Q-BR9qPwdN-Catx3rAM.js +0 -1
  108. package/dist/assets/index-CxXEEdyv.css +0 -1
  109. package/dist/assets/index-Dh4imzyE.js +0 -617
  110. package/dist/assets/info-DKCQHKI2-Dplx5kMp-C6Q2N8lR.js +0 -1
  111. package/dist/assets/packet-7NZHBO7P-CQI3flND-C5aIMsHg.js +0 -1
  112. package/dist/assets/pie-RZYD4A2V-CnmKE2Wa-DLGaOWQD.js +0 -1
  113. package/dist/assets/radar-I7S5WNFK-us6x-Z9R-XEiHFJv1.js +0 -1
  114. package/dist/assets/railroad-3IZDKUUU-BKdz6pdN-CHJoHZk-.js +0 -1
  115. package/dist/assets/railroad-abnf-AHOZXSZD-m_CSSIfd-93zoonP0.js +0 -1
  116. package/dist/assets/railroad-ebnf-EBAXGLYW-Nu3nAG7C-Op85BMOm.js +0 -1
  117. package/dist/assets/railroad-peg-LSFZ7HO6--Y3mD4R_-CX7O2hYb.js +0 -1
  118. package/dist/assets/stateDiagram-v2-6OUMAXLB-CuzgCL2v-CvRqyCfT.js +0 -1
  119. package/dist/assets/swimlanesDiagram-G3AALYLV-3bmSBtKs-JHgNIgBl.js +0 -8
  120. package/dist/assets/treeView-QDETBFTQ-D27HWG6Q-8FYcTJ8G.js +0 -1
  121. package/dist/assets/treemap-6X3UGDF4-CmGIU3H5-DLUudxda.js +0 -1
  122. package/dist/assets/wardley-OPB4EBWU-CbHWsb2k-BnWGyxAv.js +0 -1
package/README.md CHANGED
@@ -410,13 +410,16 @@ The Settings modal (⚙) persists per-user UI choices to `~/.mulmoterminal/confi
410
410
  | `pushEnabled` | `true` to send a **Web Push** to your registered devices when a background task finishes. Off by default; only sends while the **RemoteHost** channel is connected (see below). |
411
411
  | `worklogEnabled` | `true` to run the built-in **dev worklog** batch (see below). Off by default (each run spawns an LLM session, so it costs tokens). |
412
412
  | `worklogIntervalHours` | Worklog cadence in hours (default `6`, clamped to `1`–`168`). |
413
+ | `terminalSubmit` | Which bytes Claude reads as **submit** vs **newline**: `"cr"` (default — Enter submits, Shift+Enter makes a newline) or `"esc-cr"` (for a Claude Code rebound the other way). Applies to the keyboard **and** the phone remote-view submit, for **Claude sessions only** (shell/codex keep plain Enter). See the [Configuration guide](https://receptron.github.io/mulmoterminal/guide/en/config.html#terminal-submit). |
413
414
 
414
415
  #### Header buttons
415
416
 
416
417
  Each terminal header shows configurable **action buttons**. Omitting `buttons` (globally or per-dir)
417
- keeps the built-in defaults a **file-path picker** (📎) and an **OS file-manager reveal** (📂).
418
- Setting `buttons` (at either level) **replaces** the defaults with your list, so you can drop, reorder,
419
- or swap them e.g. add the in-app **📁 file explorer** with `"open": { "files": "${dir}" }`.
418
+ keeps the built-in **starter set**: a file-path picker (📎), an OS file-manager reveal (📂), an in-app
419
+ file explorer (📁), a new terminal here (🖥), this branch's PR (🔗, git repos, only when a PR exists),
420
+ and open-on-GitHub (🌐, git repos). Setting `buttons` (at either level) **replaces the whole default
421
+ set** with your list (it is not merged on top), so listing your own — even a **shorter** one — is how
422
+ you drop, reorder, or swap them.
420
423
  A button has an `id`, `label`, and a `run` of `"shell"` (run a command), `"input"` (send text to the
421
424
  agent), or `"open"`. An `open` button targets one of `url` / `reveal` (OS file manager) / `files`
422
425
  (in-app explorer) / `view` (a built-in overlay) / `terminal` (a dir → a new cell running `$SHELL`,
@@ -793,7 +796,9 @@ Favorited collections get their own toolbar buttons.
793
796
  - **Themes** — four terminal palettes (midnight / nord / daylight / solarized), your pick
794
797
  remembered; a project's `.mulmoterminal.json` can override per directory.
795
798
  - **Editing niceties** — **Shift+Enter** inserts a newline in the prompt, and on macOS
796
- **Option** is treated as Meta so Claude's Alt-key bindings work.
799
+ **Option** is treated as Meta so Claude's Alt-key bindings work. If your Claude Code is
800
+ rebound so Enter and Shift+Enter behave backwards, flip them with
801
+ [`terminalSubmit`](https://receptron.github.io/mulmoterminal/guide/en/config.html#terminal-submit).
797
802
 
798
803
  ---
799
804
 
@@ -0,0 +1,70 @@
1
+ // How the host's Claude Code / TUI maps received bytes to "submit this prompt" vs
2
+ // "insert a newline". The TUI decides from the bytes, and that mapping is environment-
3
+ // dependent (Claude Code lets a user rebind it), so the SAME fact has to reach two
4
+ // unrelated places: the browser's xterm key handler and the phone remote-view's submit.
5
+ // One value, consumed by both, keeps them from drifting apart.
6
+ //
7
+ // "cr" — the standard binding: CR (\r) submits, ESC+CR (\x1b\r, = Alt/Meta+Enter)
8
+ // makes a newline. This is MulmoTerminal's default and unchanged behaviour.
9
+ // "esc-cr" — the reversed binding some users configure: ESC+CR submits, CR makes a
10
+ // newline.
11
+ export const TERMINAL_SUBMIT_MODES = ["cr", "esc-cr"] as const;
12
+ export type TerminalSubmitMode = (typeof TERMINAL_SUBMIT_MODES)[number];
13
+ export const DEFAULT_TERMINAL_SUBMIT_MODE: TerminalSubmitMode = "cr";
14
+
15
+ export const isTerminalSubmitMode = (value: unknown): value is TerminalSubmitMode =>
16
+ typeof value === "string" && (TERMINAL_SUBMIT_MODES as readonly string[]).includes(value);
17
+
18
+ // CR on its own. ESC+CR is what a terminal emits for Alt/Meta+Enter.
19
+ const CR = "\r";
20
+ const ESC_CR = "\x1b\r";
21
+
22
+ // The byte(s) the host reads as "submit this prompt" in the given mode.
23
+ export const submitSequence = (mode: TerminalSubmitMode): string => (mode === "esc-cr" ? ESC_CR : CR);
24
+ // The byte(s) it reads as "insert a newline" — the other one.
25
+ export const newlineSequence = (mode: TerminalSubmitMode): string => (mode === "esc-cr" ? CR : ESC_CR);
26
+
27
+ // The submit byte(s) for a specific session. `terminalSubmit` describes the user's CLAUDE
28
+ // binding, so it applies ONLY to Claude sessions; every other agent (shell, codex, a
29
+ // one-shot command) keeps plain CR — a reversed setting must never rewrite a shell's Enter,
30
+ // where ESC+CR is Alt+Enter, not submit.
31
+ export const submitSequenceForAgent = (agent: string | undefined, mode: TerminalSubmitMode): string => (agent === "claude" ? submitSequence(mode) : CR);
32
+
33
+ // The structural shape of a keydown the override needs. A real DOM KeyboardEvent satisfies
34
+ // it, and so does a plain test object — no DOM dependency, so this stays testable and shared.
35
+ export interface EnterKeyEvent {
36
+ type: string;
37
+ key: string;
38
+ shiftKey: boolean;
39
+ altKey: boolean;
40
+ ctrlKey: boolean;
41
+ metaKey: boolean;
42
+ isComposing?: boolean;
43
+ }
44
+
45
+ // The bytes to emit for an Enter-family keydown (the caller then suppresses xterm's own
46
+ // \r and sends these instead), or null to let xterm handle the key natively.
47
+ //
48
+ // The SEMANTICS are the same in both modes — a bare Enter SUBMITS, Shift/Alt(Option)+Enter
49
+ // make a NEWLINE — only which bytes carry each meaning differs, because that is the
50
+ // environment fact `mode` encodes.
51
+ //
52
+ // In "cr" mode only Shift+Enter is overridden, exactly as before the setting existed: a
53
+ // bare Enter falls through to xterm's native \r (submit) and Option+Enter to
54
+ // macOptionIsMeta's ESC+CR (newline). Leaving the bare-Enter path native keeps IME
55
+ // candidate-confirm and the hottest key untouched in the default configuration.
56
+ export const enterKeyOverride = (mode: TerminalSubmitMode, e: EnterKeyEvent): string | null => {
57
+ if (e.type !== "keydown" || e.key !== "Enter") return null;
58
+ // IME composition (Japanese and other CJK input): this Enter confirms a candidate — it
59
+ // is never the user's submit/newline, so never intercept it.
60
+ if (e.isComposing) return null;
61
+ const bare = !e.shiftKey && !e.altKey && !e.ctrlKey && !e.metaKey;
62
+ const shiftOnly = e.shiftKey && !e.altKey && !e.ctrlKey && !e.metaKey;
63
+ const altHeld = e.altKey && !e.ctrlKey && !e.metaKey; // Option/Alt (with or without Shift)
64
+ if (mode === "cr") return shiftOnly ? newlineSequence(mode) : null;
65
+ // "esc-cr": a bare Enter must emit the ESC+CR that submits here; Shift/Alt+Enter must
66
+ // emit the CR that makes a newline (the Alt case also overrides macOptionIsMeta's ESC+CR).
67
+ if (bare) return submitSequence(mode);
68
+ if (shiftOnly || altHeld) return newlineSequence(mode);
69
+ return null;
70
+ };
@@ -1 +1 @@
1
- import{n as e}from"./chunk-Y2CYZVJY-Bdt8pFDJ-DsF7k-Jl.js";import{f as t}from"./src-Brzfja-q-ch1VcTiG.js";import{_ as n,g as r}from"./mermaid-parser.core-DxEa8E3F-kLn0LOBf.js";import"./chunk-WYO6CB5R-BlzOfotS-Cg8JP_k-.js";import"./chunk-VAUOI2AC-CS9QJ4yz-rBHFym4n.js";import{n as i,r as a,t as o}from"./chunk-MOJQB5TN-CMZRaeqt-CfjRj6ge.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-Brzfja-q-ch1VcTiG.js";import{_ as n,g as r}from"./mermaid-parser.core-DxEa8E3F-kNPP09h0.js";import"./chunk-WYO6CB5R-BlzOfotS-BthT9wbR.js";import"./chunk-VAUOI2AC-CS9QJ4yz-DtSCvKnv.js";import{n as i,r as a,t as o}from"./chunk-MOJQB5TN-CMZRaeqt-D-0XUMWR.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-DxEa8E3F-kNPP09h0.js";export{e as createArchitectureServices};