mulmoterminal 1.0.0 → 1.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 (201) hide show
  1. package/README.md +137 -39
  2. package/bin/mulmoterminal.js +94 -9
  3. package/dist/assets/{abnfDiagram-VRR7QNED-6nNByj6v-DheBdjws.js → abnfDiagram-VRR7QNED-6nNByj6v-CK1tLzZi.js} +1 -1
  4. package/dist/assets/architecture-TIHT7OUA-CYMWc3UT-H5BlYssV.js +1 -0
  5. package/dist/assets/{architectureDiagram-ZJ3FMSHR-Bgnyaj_i-DeqjBmXv.js → architectureDiagram-ZJ3FMSHR-Bgnyaj_i-DYKRXxkz.js} +1 -1
  6. package/dist/assets/{blockDiagram-677ZJIJ3-DQ35o5E4-C8GJRlOG.js → blockDiagram-677ZJIJ3-DQ35o5E4-DkXlAnEd.js} +1 -1
  7. package/dist/assets/{c4Diagram-LMCZKHZV-ClWZeiWo-DCF_O6wa.js → c4Diagram-LMCZKHZV-ClWZeiWo-DXZ6SmWu.js} +1 -1
  8. package/dist/assets/channel-Di5rtkx0-B0y8mvDO.js +1 -0
  9. package/dist/assets/{chunk-32BRIVSS-CCt9wtYd-aqSIoPX4.js → chunk-32BRIVSS-CCt9wtYd-CzMB8O8i.js} +1 -1
  10. package/dist/assets/{chunk-52WLFC77-FbBbR4uI-o7EFRk-Z.js → chunk-52WLFC77-FbBbR4uI-hzUvoH_V.js} +1 -1
  11. package/dist/assets/{chunk-C7G6YPKG-C87hlS9c-DYk1rPGy.js → chunk-C7G6YPKG-C87hlS9c-CrQXTywZ.js} +1 -1
  12. package/dist/assets/{chunk-EX3LRPZG-BqGqMXLN-CFsO6w_h.js → chunk-EX3LRPZG-BqGqMXLN-BSo1BpSI.js} +1 -1
  13. package/dist/assets/{chunk-FWX5IMBZ-BkbSAAuW-DM_MfscO.js → chunk-FWX5IMBZ-BkbSAAuW-BN9xwFlf.js} +2 -2
  14. package/dist/assets/{chunk-HOUHSVGY-Cxu0eDlh-BjDbxOps.js → chunk-HOUHSVGY-Cxu0eDlh-DilYgrtR.js} +1 -1
  15. package/dist/assets/{chunk-ICXQ74PX-hiraF_Xj-iUcDh2Ds.js → chunk-ICXQ74PX-hiraF_Xj-Ck8cH9BW.js} +1 -1
  16. package/dist/assets/{chunk-MOJQB5TN-CqxshQHA-ozqXE506.js → chunk-MOJQB5TN-CqxshQHA-hb8sT9ul.js} +1 -1
  17. package/dist/assets/{chunk-OGEWGWER-CjCr7ceX-CVnG09pj.js → chunk-OGEWGWER-CjCr7ceX-FCREpp2S.js} +1 -1
  18. package/dist/assets/{chunk-PUDLZKDR-Dx6M-vz1-B421SWPj.js → chunk-PUDLZKDR-Dx6M-vz1-EOkNGOKy.js} +1 -1
  19. package/dist/assets/{chunk-Q4XR5HBZ-CZd-9lTB-CAiDWUlL.js → chunk-Q4XR5HBZ-CZd-9lTB-BHk1rWmk.js} +1 -1
  20. package/dist/assets/{chunk-V7JOEXUC-rI0xlC_O-CtYufueO.js → chunk-V7JOEXUC-rI0xlC_O-CIs_bL1j.js} +1 -1
  21. package/dist/assets/{chunk-VAUOI2AC-DrcykVNK-jGzw5YJX.js → chunk-VAUOI2AC-DrcykVNK-Cm1y1eF0.js} +1 -1
  22. package/dist/assets/{chunk-VR4S4FIN-O6iF8Yvf-BQZXqb5d.js → chunk-VR4S4FIN-O6iF8Yvf-XaMLfxHT.js} +1 -1
  23. package/dist/assets/{chunk-WYO6CB5R-B83L_z6I-CTQn5U85.js → chunk-WYO6CB5R-B83L_z6I-C1WGAsfM.js} +1 -1
  24. package/dist/assets/{chunk-ZGVPDNZ5-BpFv9JSP-B_NX0SUE.js → chunk-ZGVPDNZ5-BpFv9JSP-BKMdOjwd.js} +1 -1
  25. package/dist/assets/classDiagram-OUVF2IWQ-BgAZMSbT-DaE02I1I.js +1 -0
  26. package/dist/assets/classDiagram-v2-EOCWNBFH-DxHTyui1-DaE02I1I.js +1 -0
  27. package/dist/assets/cynefin-VYW2F7L2-DqA3n9nY-937NWG5-.js +1 -0
  28. package/dist/assets/{cynefinDiagram-TSTJHNR4-x0-0sQ15-CkdgUGoD.js → cynefinDiagram-TSTJHNR4-x0-0sQ15-vmlemYgO.js} +1 -1
  29. package/dist/assets/{dagre-VKFMJZFB-CQdfl-bx-FSrXzQxB.js → dagre-VKFMJZFB-CQdfl-bx-D3bMpoFr.js} +1 -1
  30. package/dist/assets/{diagram-FQU43EPY-BOSB6VUb-yZdPA2Rw.js → diagram-FQU43EPY-BOSB6VUb-Cb76gTiK.js} +1 -1
  31. package/dist/assets/{diagram-G47NLZAW-DLXrcXsN-aq_xTmel.js → diagram-G47NLZAW-DLXrcXsN-C3GKnaLY.js} +1 -1
  32. package/dist/assets/{diagram-NH7WQ7WH-BMQp1rkF-BkL1fZyU.js → diagram-NH7WQ7WH-BMQp1rkF-CM69Zadf.js} +1 -1
  33. package/dist/assets/{diagram-OA4YK3LP-D1wQ0vUj-D2NsP5qB.js → diagram-OA4YK3LP-D1wQ0vUj-C_m2O-pS.js} +1 -1
  34. package/dist/assets/{diagram-WEI45ONY-RR0DpF8R-v-IWOK6D.js → diagram-WEI45ONY-RR0DpF8R-CsLaijnw.js} +1 -1
  35. package/dist/assets/{ebnfDiagram-CCIWWBDH-M123uVJ8-CPXV_s7Q.js → ebnfDiagram-CCIWWBDH-M123uVJ8-vqN4J8aH.js} +1 -1
  36. package/dist/assets/{erDiagram-Q63AITRT-BWx_-PXG-DvFDPrMO.js → erDiagram-Q63AITRT-BWx_-PXG-BC2_Ti6R.js} +1 -1
  37. package/dist/assets/eventmodeling-45OFAUF4-_BVSjAXf-Dr1OLGHI.js +1 -0
  38. package/dist/assets/flowDiagram-23GEKE2U-BeOc_anm-CCLlPnCf.js +1 -0
  39. package/dist/assets/{ganttDiagram-NO4QXBWP-BOoJ1eTw-C8hbgKqC.js → ganttDiagram-NO4QXBWP-BOoJ1eTw-BJ8RzW36.js} +1 -1
  40. package/dist/assets/gitGraph-TEB2WS4Q-CH12KLTN-BGZXN91M.js +1 -0
  41. package/dist/assets/{gitGraphDiagram-IHSO6WYX-B2CJhk_G-B5mO0MM2.js → gitGraphDiagram-IHSO6WYX-B2CJhk_G-j7ZfRBi7.js} +1 -1
  42. package/dist/assets/{index-DnpR_CJG.js → index-CrPHIo_O.js} +126 -126
  43. package/dist/assets/index-DhfRF3g0.css +1 -0
  44. package/dist/assets/info-DKCQHKI2-Cbw3mbiK-U7eFrQdg.js +1 -0
  45. package/dist/assets/{infoDiagram-FWYZ7A6U-Mp1X3pBP-D4u3DGcy.js → infoDiagram-FWYZ7A6U-Mp1X3pBP-BcxHFEoP.js} +1 -1
  46. package/dist/assets/{ishikawaDiagram-FXEZZL3T-BNG7tkJu-DX6cRWKX.js → ishikawaDiagram-FXEZZL3T-BNG7tkJu-D4NHNB73.js} +1 -1
  47. package/dist/assets/{journeyDiagram-5HDEW3XC-Dbp_hY9X-lR-zk1P5.js → journeyDiagram-5HDEW3XC-Dbp_hY9X-C5wWotnc.js} +1 -1
  48. package/dist/assets/{kanban-definition-HUTT4EX6-DSTc5u3q-B8BsOJR_.js → kanban-definition-HUTT4EX6-DSTc5u3q-DaM6ePy2.js} +1 -1
  49. package/dist/assets/{line-B1wBwzrY-CsBjF7T-.js → line-B1wBwzrY-v5xPQ3Tb.js} +1 -1
  50. package/dist/assets/{marp-DZRmgRY9.js → marp-C5wXHEN-.js} +1 -1
  51. package/dist/assets/material-symbols-outlined-BmmV8Mzf.woff2 +0 -0
  52. package/dist/assets/{mermaid-parser.core-DC7NPJ_M-CcAjWs6c.js → mermaid-parser.core-DC7NPJ_M-CdLorTPK.js} +2 -2
  53. package/dist/assets/{mermaid.core-DZM3Ha-E-CFYYZVad.js → mermaid.core-DZM3Ha-E-H2ucOstP.js} +3 -3
  54. package/dist/assets/{mindmap-definition-LN4V7U3C-DYtgcMsY-BRIJMUm0.js → mindmap-definition-LN4V7U3C-DYtgcMsY-BnSgJ097.js} +1 -1
  55. package/dist/assets/packet-7NZHBO7P-lwb58iYx-bUMa-SyO.js +1 -0
  56. package/dist/assets/{pegDiagram-2B236MQR-C43eIpKM-BTRDK2Rn.js → pegDiagram-2B236MQR-C43eIpKM-mXxeIrN3.js} +1 -1
  57. package/dist/assets/pie-RZYD4A2V-B1UWb4Gu-BmvZFSbc.js +1 -0
  58. package/dist/assets/{pieDiagram-ENE6RG2P-BkTqgJyR-C0wYkdhk.js → pieDiagram-ENE6RG2P-BkTqgJyR-BHLyQX_P.js} +1 -1
  59. package/dist/assets/{quadrantDiagram-ABIIQ3AL-Bm1Zjm45-HKnKnEKU.js → quadrantDiagram-ABIIQ3AL-Bm1Zjm45-CwECxXwc.js} +1 -1
  60. package/dist/assets/radar-I7S5WNFK-7CKcb_l--D2naYxey.js +1 -0
  61. package/dist/assets/railroad-3IZDKUUU-gCySKdnW-BB52Xytk.js +1 -0
  62. package/dist/assets/railroad-abnf-AHOZXSZD-BophH4r--pKzcYmzb.js +1 -0
  63. package/dist/assets/railroad-ebnf-EBAXGLYW-AZNjl_Zu-BXf-VL0l.js +1 -0
  64. package/dist/assets/railroad-peg-LSFZ7HO6-BSiEEyeb-BtIZNBUj.js +1 -0
  65. package/dist/assets/{railroadDiagram-RFXS5EU6-BkfbdeAs-BxYC_fFp.js → railroadDiagram-RFXS5EU6-BkfbdeAs-RtIkhujC.js} +1 -1
  66. package/dist/assets/{requirementDiagram-TGXJPOKE-CrGTTjYg-B3HYTfaW.js → requirementDiagram-TGXJPOKE-CrGTTjYg-Cn_wM9GJ.js} +1 -1
  67. package/dist/assets/{sankeyDiagram-HTMAVEWB-rWXPf03Z-BSzqUsBJ.js → sankeyDiagram-HTMAVEWB-rWXPf03Z-B4NBlZda.js} +1 -1
  68. package/dist/assets/{sequenceDiagram-DBY2YBRQ-nkJYWO2m-C911Onke.js → sequenceDiagram-DBY2YBRQ-nkJYWO2m-CMIBxvlT.js} +1 -1
  69. package/dist/assets/{stateDiagram-2N3HPSRC-T4-clK8b-B-giNW0K.js → stateDiagram-2N3HPSRC-T4-clK8b-BAjJG2OJ.js} +1 -1
  70. package/dist/assets/stateDiagram-v2-6OUMAXLB-DIp7nhRd-CLL8JGdr.js +1 -0
  71. package/dist/assets/{swimlanes-5IMT3BWC-HmQNEntu-CSiN22-5.js → swimlanes-5IMT3BWC-HmQNEntu-B75jvy7P.js} +1 -1
  72. package/dist/assets/swimlanesDiagram-G3AALYLV-BeoZhwg7-5UMpA0Gl.js +8 -0
  73. package/dist/assets/{timeline-definition-FHXFAJF6-CNc9jSTP-CIyjGbiA.js → timeline-definition-FHXFAJF6-CNc9jSTP-B1AaTzX1.js} +1 -1
  74. package/dist/assets/treeView-QDETBFTQ-nIQcG1h9-DRcIJuj7.js +1 -0
  75. package/dist/assets/treemap-6X3UGDF4-BnsvC8yL-RxH8JYse.js +1 -0
  76. package/dist/assets/{vennDiagram-L72KCM5P-Dr3pTJ_0-D-WU2GoG.js → vennDiagram-L72KCM5P-Dr3pTJ_0-C4GAKsik.js} +1 -1
  77. package/dist/assets/wardley-OPB4EBWU-8Odxkx6V-BMFgaEV7.js +1 -0
  78. package/dist/assets/{wardleyDiagram-EHGQE667-DSFc7ZZa-BRv4D8qc.js → wardleyDiagram-EHGQE667-DSFc7ZZa-DUTWbway.js} +1 -1
  79. package/dist/assets/{xychartDiagram-FW5EYKEG-BP0Nn4Pp-ByYvhjoR.js → xychartDiagram-FW5EYKEG-BP0Nn4Pp-DQTMNwv_.js} +1 -1
  80. package/dist/index.html +2 -2
  81. package/package.json +17 -17
  82. package/server/{codex-skills.ts → agents/codex-skills.ts} +4 -1
  83. package/server/backends/fileChange.ts +1 -1
  84. package/server/backends/notifier.ts +1 -1
  85. package/server/backends/remoteHost/skills.spec.ts +80 -1
  86. package/server/backends/remoteHost/skills.ts +78 -25
  87. package/server/backends/thumbnailStore.ts +1 -1
  88. package/server/backends/workspaceSetup.ts +1 -1
  89. package/server/cli-init.ts +101 -0
  90. package/server/{config-schema.spec.ts → config/config-schema.spec.ts} +9 -1
  91. package/server/{config-schema.ts → config/config-schema.ts} +15 -0
  92. package/server/{cwd-presets.spec.ts → config/cwd-presets.spec.ts} +43 -1
  93. package/server/config/cwd-presets.ts +78 -0
  94. package/server/{dir-config.spec.ts → config/dir-config.spec.ts} +15 -0
  95. package/server/{dir-config.ts → config/dir-config.ts} +15 -1
  96. package/server/{header-context.ts → config/header-context.ts} +3 -3
  97. package/server/{header-title.spec.ts → config/header-title.spec.ts} +2 -2
  98. package/server/{header-title.ts → config/header-title.ts} +3 -3
  99. package/server/{open-dir.ts → files/open-dir.ts} +1 -1
  100. package/server/{git-status.spec.ts → git/git-status.spec.ts} +5 -10
  101. package/server/index.ts +136 -51
  102. package/server/{install-config-skill.spec.ts → infra/install-config-skill.spec.ts} +1 -1
  103. package/server/{install-config-skill.ts → infra/install-config-skill.ts} +4 -3
  104. package/server/{plugins-registry.ts → infra/plugins-registry.ts} +5 -4
  105. package/server/{sandbox.ts → infra/sandbox.ts} +2 -1
  106. package/server/infra/tmux-routes.spec.ts +120 -0
  107. package/server/infra/tmux-routes.ts +46 -0
  108. package/server/{tmux.spec.ts → infra/tmux.spec.ts} +17 -1
  109. package/server/{tmux.ts → infra/tmux.ts} +13 -0
  110. package/server/{web-push.ts → infra/web-push.ts} +1 -1
  111. package/server/mcp/broker.ts +1 -1
  112. package/server/{command-summary.ts → session/command-summary.ts} +1 -1
  113. package/server/session/file-cache.spec.ts +48 -0
  114. package/server/session/file-cache.ts +44 -0
  115. package/server/{transcript.spec.ts → session/transcript.spec.ts} +45 -0
  116. package/server/{transcript.ts → session/transcript.ts} +30 -19
  117. package/server/skills/mulmoterminal-config/SKILL.md +12 -0
  118. package/dist/assets/architecture-TIHT7OUA-CYMWc3UT-DKr4hbNv.js +0 -1
  119. package/dist/assets/channel-Di5rtkx0-ENMPwr9m.js +0 -1
  120. package/dist/assets/classDiagram-OUVF2IWQ-BgAZMSbT-C4hmeWEb.js +0 -1
  121. package/dist/assets/classDiagram-v2-EOCWNBFH-DxHTyui1-C4hmeWEb.js +0 -1
  122. package/dist/assets/cynefin-VYW2F7L2-DqA3n9nY-GgLCM_nw.js +0 -1
  123. package/dist/assets/eventmodeling-45OFAUF4-_BVSjAXf-ZNaf3uDd.js +0 -1
  124. package/dist/assets/flowDiagram-23GEKE2U-BeOc_anm-GSALmqQ3.js +0 -1
  125. package/dist/assets/gitGraph-TEB2WS4Q-CH12KLTN-BGOUxFnc.js +0 -1
  126. package/dist/assets/index-DsRhtnU0.css +0 -1
  127. package/dist/assets/info-DKCQHKI2-Cbw3mbiK-HXxrjjRx.js +0 -1
  128. package/dist/assets/material-symbols-outlined-DKJDg2oJ.woff2 +0 -0
  129. package/dist/assets/packet-7NZHBO7P-lwb58iYx-DB-Dy5kn.js +0 -1
  130. package/dist/assets/pie-RZYD4A2V-B1UWb4Gu-DGylsaHj.js +0 -1
  131. package/dist/assets/radar-I7S5WNFK-7CKcb_l--DjWDNt3M.js +0 -1
  132. package/dist/assets/railroad-3IZDKUUU-gCySKdnW-CYIDYmq5.js +0 -1
  133. package/dist/assets/railroad-abnf-AHOZXSZD-BophH4r--BcibSZfl.js +0 -1
  134. package/dist/assets/railroad-ebnf-EBAXGLYW-AZNjl_Zu-ChODKeRY.js +0 -1
  135. package/dist/assets/railroad-peg-LSFZ7HO6-BSiEEyeb-5nqohbXV.js +0 -1
  136. package/dist/assets/stateDiagram-v2-6OUMAXLB-DIp7nhRd-DuCOmOmY.js +0 -1
  137. package/dist/assets/swimlanesDiagram-G3AALYLV-BeoZhwg7-DG3vt7aV.js +0 -8
  138. package/dist/assets/treeView-QDETBFTQ-nIQcG1h9-DbwA95vD.js +0 -1
  139. package/dist/assets/treemap-6X3UGDF4-BnsvC8yL-DEq41o1Y.js +0 -1
  140. package/dist/assets/wardley-OPB4EBWU-8Odxkx6V-B-jvjF9O.js +0 -1
  141. package/server/cwd-presets.ts +0 -40
  142. /package/server/{claude-args.spec.ts → agents/claude-args.spec.ts} +0 -0
  143. /package/server/{claude-args.ts → agents/claude-args.ts} +0 -0
  144. /package/server/{codex-args.spec.ts → agents/codex-args.spec.ts} +0 -0
  145. /package/server/{codex-args.ts → agents/codex-args.ts} +0 -0
  146. /package/server/{codex-session.spec.ts → agents/codex-session.spec.ts} +0 -0
  147. /package/server/{codex-session.ts → agents/codex-session.ts} +0 -0
  148. /package/server/{codex-sessions.spec.ts → agents/codex-sessions.spec.ts} +0 -0
  149. /package/server/{codex-sessions.ts → agents/codex-sessions.ts} +0 -0
  150. /package/server/{codex-skills.spec.ts → agents/codex-skills.spec.ts} +0 -0
  151. /package/server/{app-config.spec.ts → config/app-config.spec.ts} +0 -0
  152. /package/server/{app-config.ts → config/app-config.ts} +0 -0
  153. /package/server/{config-routes.ts → config/config-routes.ts} +0 -0
  154. /package/server/{header-config.spec.ts → config/header-config.spec.ts} +0 -0
  155. /package/server/{header-config.ts → config/header-config.ts} +0 -0
  156. /package/server/{header-context.spec.ts → config/header-context.spec.ts} +0 -0
  157. /package/server/{header-resolve.spec.ts → config/header-resolve.spec.ts} +0 -0
  158. /package/server/{header-resolve.ts → config/header-resolve.ts} +0 -0
  159. /package/server/{files-browse.spec.ts → files/files-browse.spec.ts} +0 -0
  160. /package/server/{files-browse.ts → files/files-browse.ts} +0 -0
  161. /package/server/{open-dir.spec.ts → files/open-dir.spec.ts} +0 -0
  162. /package/server/{pick-file.spec.ts → files/pick-file.spec.ts} +0 -0
  163. /package/server/{pick-file.ts → files/pick-file.ts} +0 -0
  164. /package/server/{scripts.spec.ts → files/scripts.spec.ts} +0 -0
  165. /package/server/{scripts.ts → files/scripts.ts} +0 -0
  166. /package/server/{gh.ts → git/gh.ts} +0 -0
  167. /package/server/{git-status.ts → git/git-status.ts} +0 -0
  168. /package/server/{gitRemote.spec.ts → git/gitRemote.spec.ts} +0 -0
  169. /package/server/{gitRemote.ts → git/gitRemote.ts} +0 -0
  170. /package/server/{issues.spec.ts → git/issues.spec.ts} +0 -0
  171. /package/server/{issues.ts → git/issues.ts} +0 -0
  172. /package/server/{pr-for-branch.spec.ts → git/pr-for-branch.spec.ts} +0 -0
  173. /package/server/{pr-for-branch.ts → git/pr-for-branch.ts} +0 -0
  174. /package/server/{prs.spec.ts → git/prs.spec.ts} +0 -0
  175. /package/server/{prs.ts → git/prs.ts} +0 -0
  176. /package/server/{worktree-diff.spec.ts → git/worktree-diff.spec.ts} +0 -0
  177. /package/server/{worktree-diff.ts → git/worktree-diff.ts} +0 -0
  178. /package/server/{worktree-pr.spec.ts → git/worktree-pr.spec.ts} +0 -0
  179. /package/server/{worktree-pr.ts → git/worktree-pr.ts} +0 -0
  180. /package/server/{worktree-routes.spec.ts → git/worktree-routes.spec.ts} +0 -0
  181. /package/server/{worktree-routes.ts → git/worktree-routes.ts} +0 -0
  182. /package/server/{worktrees.spec.ts → git/worktrees.spec.ts} +0 -0
  183. /package/server/{worktrees.ts → git/worktrees.ts} +0 -0
  184. /package/server/{accounting-tool.ts → infra/accounting-tool.ts} +0 -0
  185. /package/server/{host-tools.ts → infra/host-tools.ts} +0 -0
  186. /package/server/{pubsub.ts → infra/pubsub.ts} +0 -0
  187. /package/server/{sandbox.spec.ts → infra/sandbox.spec.ts} +0 -0
  188. /package/server/{spa-fallback.spec.ts → infra/spa-fallback.spec.ts} +0 -0
  189. /package/server/{spa-fallback.ts → infra/spa-fallback.ts} +0 -0
  190. /package/server/{web-push.spec.ts → infra/web-push.spec.ts} +0 -0
  191. /package/server/{activity-hook.spec.ts → session/activity-hook.spec.ts} +0 -0
  192. /package/server/{activity-hook.ts → session/activity-hook.ts} +0 -0
  193. /package/server/{activity-state.spec.ts → session/activity-state.spec.ts} +0 -0
  194. /package/server/{activity-state.ts → session/activity-state.ts} +0 -0
  195. /package/server/{command-summary.spec.ts → session/command-summary.spec.ts} +0 -0
  196. /package/server/{cost.spec.ts → session/cost.spec.ts} +0 -0
  197. /package/server/{cost.ts → session/cost.ts} +0 -0
  198. /package/server/{session-resolve.spec.ts → session/session-resolve.spec.ts} +0 -0
  199. /package/server/{session-resolve.ts → session/session-resolve.ts} +0 -0
  200. /package/server/{terminal-replay.spec.ts → session/terminal-replay.spec.ts} +0 -0
  201. /package/server/{terminal-replay.ts → session/terminal-replay.ts} +0 -0
package/README.md CHANGED
@@ -1,28 +1,57 @@
1
1
  # mulmoterminal
2
2
 
3
- A browser-based terminal + GUI workspace for coding agents — [Claude Code](https://claude.com/claude-code)
4
- and OpenAI's **Codex** — with a sidebar that lists the current project's chat sessions
5
- and shows live, hook-driven activity for each one.
6
-
7
- Each session runs as a real PTY on the server (the agent CLI in a pseudo-terminal) and
8
- is streamed to an [xterm.js](https://xtermjs.org/) terminal in the browser over a
9
- WebSocket. A sidebar lists every session for the project and reflects, in real time,
10
- which sessions are **working** (the agent is thinking) and which **need attention**
11
- (waiting for input, or finished with output you haven't seen).
12
-
13
- Around the terminal sit the things a coding session needs: a **grid** of parallel
14
- sessions, an optional **GUI panel** for rich tool output (documents, forms, images,
15
- charts), **git worktree** isolation with one-click **push / open PR**, a full-screen
16
- **file browser + editor**, per-session **cost & token** readouts, a cross-repo **PRs &
17
- Issues** view, and read-only **Wiki** and **Collections** browsers over the shared
18
- workspace.
19
-
20
- **Inserting a file path** like a native terminal, you can put a file's absolute
21
- path into the prompt: **drag a file** onto the terminal (works where the browser
22
- exposes the path via `file://`Firefox/Safari), or click the **📎 file button**
23
- in the terminal header, which asks the local server to open the OS file dialog and
24
- inserts the chosen path (works in every browser, including Chrome). The path is
25
- inserted at the cursor it is not submitted, so you can review it first.
3
+ **Run a whole team of coding agents from your browser and actually keep up with them.**
4
+
5
+ MulmoTerminal turns [Claude Code](https://claude.com/claude-code) (and OpenAI's **Codex**)
6
+ into a parallel, observable workspace: many agent sessions at once in a grid, each one
7
+ color-coded so you see at a glance which are **working**, which **need you**, and which are
8
+ **done** plus rich GUI output, git worktrees with one-click PRs, cost readouts, and a
9
+ ping to your phone when a task finishes. One `npx` command, no Electron, no config.
10
+
11
+ ```bash
12
+ npx mulmoterminal # starts on http://localhost:34567 and opens your browser
13
+ ```
14
+
15
+ ## Why you'll want it
16
+
17
+ - **See every agent at once.** A grid of live sessions, each cell color-coded by state —
18
+ **working** (blue), **blocked / needs a permission** (amber), **done, unreviewed** (blue),
19
+ **idle** — with an attention chime and a toolbar tally, so an off-screen agent that's stuck
20
+ never slips past you. Stop babysitting one terminal; supervise ten.
21
+ - **A GUI for your agents, not just a terminal.** Beside the terminal, a **Canvas** panel
22
+ renders what an agent produces over MCP **documents, forms, charts, generated images,
23
+ HTML, collection cards** each drawn by its own plugin. The agent doesn't just print
24
+ text; it hands you an interface.
25
+ - **Get pulled back from anywhere.** A finished background task sends a **Web Push to your
26
+ phone**, and the **RemoteHost** companion lets you watch and start sessions from the phone
27
+ itself — walk away, get pinged, jump back in.
28
+ - **Nothing is lost on a restart.** With `tmux`, every session survives a server crash,
29
+ restart, or `node --watch` reload — a mid-turn agent, a long build, a dev server all keep
30
+ running and reattach when you come back.
31
+ - **Ship without leaving the grid.** Each repo cell shows a **git branch chip**, isolates
32
+ work in a one-click **git worktree**, opens a **diff** panel, and does **commit / push /
33
+ open PR** — so several agents can work the same repo without colliding.
34
+ - **Know what it's costing.** Per-session **context %**, **token**, and **estimated $**
35
+ readouts, an **activity timeline** of tool calls, and **AI-summarized** cell titles and
36
+ command-output explanations — so a wall of parallel agents stays legible.
37
+ - **Make it yours.** Per-directory **themes, colors, and name badges** (`prod` in red,
38
+ `staging` in amber), a configurable header (buttons + info chips), custom attention sounds,
39
+ and Run / Skill menus to launch a project's scripts and `.claude/skills` right inside a cell.
40
+
41
+ ### What it is, under the hood
42
+
43
+ Each session runs as a real PTY on the server (the agent CLI in a pseudo-terminal) and is
44
+ streamed to an [xterm.js](https://xtermjs.org/) terminal in the browser over a WebSocket. A
45
+ sidebar lists every session for the project and reflects, in real time, which are **working**
46
+ (the agent is thinking) and which **need attention** (waiting for input, or finished with
47
+ output you haven't seen) — driven by Claude/Codex activity hooks the server injects per spawn.
48
+
49
+ **Inserting a file path** — like a native terminal, you can put a file's absolute path into
50
+ the prompt: **drag a file** onto the terminal (works where the browser exposes the path via
51
+ `file://` — Firefox/Safari), or click the **📎 file button** in the terminal header, which
52
+ asks the local server to open the OS file dialog and inserts the chosen path (works in every
53
+ browser, including Chrome). The path is inserted at the cursor — it is not submitted, so you
54
+ can review it first.
26
55
 
27
56
  ---
28
57
 
@@ -41,6 +70,13 @@ npm install -g mulmoterminal
41
70
  mulmoterminal
42
71
  ```
43
72
 
73
+ **First-run setup (optional).** `npx mulmoterminal init` checks your environment (Node ≥ 22.9,
74
+ the `claude` CLI, plus optional `tmux` / `gh` / `codex`), seeds the launcher's **directory
75
+ presets** from the projects in your Claude Code history, and writes `~/.mulmoterminal/config.json`.
76
+ It's **idempotent** — re-run it any time to refresh the presets; it overwrites the managed parts
77
+ and keeps your other settings. When `claude` is installed it can hand off to the
78
+ `/mulmoterminal-config` skill for interactive tweaks.
79
+
44
80
  A global install isn't auto-updated, so on startup MulmoTerminal checks npm and
45
81
  prints a one-line notice when a newer version is available (`npm i -g mulmoterminal`
46
82
  to update). Disable with `MULMOTERMINAL_NO_UPDATE_CHECK=1` (or `NO_UPDATE_NOTIFIER=1`).
@@ -71,6 +107,7 @@ server, and opens the browser. For local development from a clone, see
71
107
  - [Configuration](#configuration)
72
108
  - [Running](#running)
73
109
  - [Scripts (Run menu)](#scripts-run-menu)
110
+ - [Skills (Skill menu)](#skills-skill-menu)
74
111
  - [Files view (browse & edit)](#files-view-browse--edit)
75
112
  - [Git worktrees & pull requests](#git-worktrees--pull-requests)
76
113
  - [Cost & token usage](#cost--token-usage)
@@ -495,6 +532,39 @@ the last 32 KB of output. See
495
532
 
496
533
  ---
497
534
 
535
+ ## Skills (Skill menu)
536
+
537
+ Next to the **▶ Run ▾** dropdown, every running terminal's header has a **⚡ Skill ▾**
538
+ dropdown — in both the single view and each grid cell, and **only when the open
539
+ project has skills** (nothing discovered, no button). It lists the
540
+ [Claude skills](https://docs.claude.com/en/docs/claude-code/skills) discoverable for
541
+ that terminal's directory — both **project scope** (`<dir>/.claude/skills`) and **user
542
+ scope** (`~/.claude/skills`), the same skills Claude sees — and, on pick, **runs the
543
+ skill in that session**: it types the skill's invocation into the terminal and submits
544
+ it (for Claude, its `/<slug>` command; for Codex, which has no slash command, a plain
545
+ `Use the "<slug>" skill.` instruction). Unlike **▶ Run** — which launches a
546
+ `script.json` shell command in a spare cell — a skill runs **in the session you
547
+ picked it from**, continuing that conversation.
548
+
549
+ **Ordering:** working-dir (project) skills come **first**, then user-scope ones,
550
+ alphabetical within each group; a project skill of the same slug shadows the user one.
551
+
552
+ **Filtering:** add a `skills` array to the directory's
553
+ [`.mulmoterminal.json`](#per-directory-settings-projectmulmoterminaljson) to narrow the menu —
554
+ an allowlist of slugs that also sets the order (only those show, in that order). Omit
555
+ it to show everything.
556
+
557
+ ```jsonc
558
+ // <dir>/.mulmoterminal.json
559
+ { "skills": ["review-diff", "commit-msg"] }
560
+ ```
561
+
562
+ Each menu item shows the skill's id, with its `SKILL.md` `description` as the hover
563
+ tooltip. A directory (or workspace) without any `.claude/skills` simply shows no
564
+ button. Skills are discovered read-only; the menu never creates or edits them.
565
+
566
+ ---
567
+
498
568
  ## Files view (browse & edit)
499
569
 
500
570
  A terminal header can carry a **📁 Files** button — add it as a [header button](#header-buttons)
@@ -683,6 +753,30 @@ position the client sends back to `/ws/run`).
683
753
  A missing or invalid `script.json` is **not** an error — it yields an empty
684
754
  `scripts` array.
685
755
 
756
+ ### HTTP: `GET /api/skills`
757
+
758
+ The Claude skills discoverable for a terminal's chosen directory (`?cwd=<dir>`,
759
+ falling back to `CLAUDE_CWD`) — project scope (`<cwd>/.claude/skills`) plus user scope
760
+ (`~/.claude/skills`), deduped by slug (project shadows user), **working-dir skills
761
+ first**; see [Skills (Skill menu)](#skills-skill-menu). A `skills` allowlist in that
762
+ directory's `.mulmoterminal.json` narrows and reorders the result; absent → all. The
763
+ resolved `cwd` is echoed back. Each entry carries its `slug` (the skill invoked as
764
+ `/<slug>`) and the `SKILL.md` `description` (the menu tooltip).
765
+
766
+ ```jsonc
767
+ // GET /api/skills?cwd=/Users/me/proj
768
+ {
769
+ "cwd": "/Users/me/proj",
770
+ "skills": [
771
+ { "slug": "commit", "description": "Write a commit message" },
772
+ { "slug": "review", "description": "Review the current diff" }
773
+ ]
774
+ }
775
+ ```
776
+
777
+ A directory without any discoverable skills is **not** an error — it yields an empty
778
+ `skills` array.
779
+
686
780
  ### HTTP: `POST /api/command/summarize`
687
781
 
688
782
  Runs `claude -p` **headless** over a command cell's captured terminal output and
@@ -1025,22 +1119,26 @@ resumed session falls back to any on-disk `ai-title`.
1025
1119
  server/
1026
1120
  index.ts Express app, /api routes, upgrade routing, PTY lifecycle,
1027
1121
  session state, hook injection, session discovery, GUI-MCP mount
1028
- agents/ AgentAdapter seam claude.ts, codex.ts, registry.ts
1029
- codex-*.ts Codex sessions, args, rollout discovery, skill mirroring
1030
- tmux.ts tmux-backed session persistence (own -L mulmoterminal server)
1031
- sandbox.ts Docker sandbox spawn for the single-view Claude session
1032
- worktrees.ts, worktree-*.ts git worktree create/list/diff/push/PR + routes
1033
- git-status.ts, gitRemote.ts, gh.ts, prs.ts, issues.ts git & GitHub (via gh)
1034
- cost.ts, transcript.ts cost estimate; usage/context from transcripts
1035
- files-browse.ts file tree + read/write (contained to project root)
1036
- scripts.ts Run-menu script.json loader
1037
- command-summary.ts POST /api/command/summarize (claude -p headless)
1038
- header-title.ts cheap-model AI title for the cell header (recent turns)
1039
- app-config.ts, config-routes.ts, dir-config.ts user + per-directory config
1040
- plugins-registry.ts, mcp/ GUI plugin registry + per-session MCP broker
1041
- backends/ wiki, collections, feeds, accounting, notifier,
1042
- translation, whisper, remote-host, html, files
1043
- pubsub.ts socket.io pub/sub at /ws/pubsub
1122
+ agents/ AgentAdapter seam + per-agent args/sessions: claude.ts,
1123
+ codex.ts, registry.ts, claude-args.ts, codex-args.ts,
1124
+ codex-session(s).ts, codex-skills.ts
1125
+ config/ user + per-directory + header config: app-config.ts,
1126
+ config-routes.ts, config-schema.ts, dir-config.ts,
1127
+ cwd-presets.ts, header-*.ts
1128
+ session/ per-session transcript/activity/cost: transcript.ts,
1129
+ session-resolve.ts, activity-*.ts, cost.ts,
1130
+ command-summary.ts, terminal-replay.ts, file-cache.ts
1131
+ git/ git & GitHub (via gh) + worktrees: git-status.ts, gitRemote.ts,
1132
+ gh.ts, prs.ts, issues.ts, pr-for-branch.ts, worktrees.ts, worktree-*.ts
1133
+ files/ files-browse.ts (contained tree read/write), pick-file.ts,
1134
+ open-dir.ts, scripts.ts (Run-menu script.json loader)
1135
+ infra/ process/transport/misc: tmux.ts, tmux-routes.ts, sandbox.ts,
1136
+ pubsub.ts (socket.io /ws/pubsub), spa-fallback.ts, host-tools.ts,
1137
+ plugins-registry.ts, web-push.ts, install-config-skill.ts, accounting-tool.ts
1138
+ mcp/ per-session MCP broker
1139
+ backends/ wiki, collections, feeds, accounting, notifier,
1140
+ translation, whisper, remote-host, html, files
1141
+ skills/ bundled mulmoterminal-config skill assets
1044
1142
  fix-pty-perms.js postinstall: fixes node-pty binary permissions
1045
1143
  src/
1046
1144
  App.vue Layout; owns the active session + single/grid view
@@ -11,6 +11,7 @@ import { get as httpGet } from "node:http";
11
11
  import { createRequire } from "node:module";
12
12
  import { createServer } from "node:net";
13
13
  import { dirname, join, resolve } from "node:path";
14
+ import { createInterface } from "node:readline";
14
15
  import { fileURLToPath } from "node:url";
15
16
  import { fetchLatestVersion, isNewerVersion } from "./update-check.js";
16
17
 
@@ -46,18 +47,87 @@ function checkForUpdate() {
46
47
  });
47
48
  }
48
49
 
49
- function claudeInstalled() {
50
+ // Detect a CLI on the user's PATH by asking for its version. Intentionally resolves from
51
+ // PATH — detecting the user's installed tools is the whole point of the pre-flight /
52
+ // `init` checks.
53
+ function hasCommand(cmd, versionArg = "--version") {
50
54
  try {
51
- // Intentionally resolves `claude` from the user's PATH — detecting their
52
- // Claude Code CLI install is the whole point of this pre-flight check.
53
55
  // eslint-disable-next-line sonarjs/no-os-command-from-path
54
- execSync("claude --version", { stdio: "pipe" });
56
+ execSync(`${cmd} ${versionArg}`, { stdio: "pipe" });
55
57
  return true;
56
58
  } catch {
57
59
  return false;
58
60
  }
59
61
  }
60
62
 
63
+ function claudeInstalled() {
64
+ return hasCommand("claude");
65
+ }
66
+
67
+ function promptYesNo(question) {
68
+ return new Promise((res) => {
69
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
70
+ rl.question(question, (answer) => {
71
+ rl.close();
72
+ res(/^y(es)?$/i.test(answer.trim()));
73
+ });
74
+ });
75
+ }
76
+
77
+ // `npx mulmoterminal init` — idempotent first-run setup. Environment/CLI checks + the
78
+ // optional interactive-config launch live here (PATH-command detection); the config
79
+ // derivation + write is the tsx-run server/cli-init.ts.
80
+ async function runInit(initArgs) {
81
+ log("Setting up MulmoTerminal…\n");
82
+
83
+ const [maj, min] = process.versions.node.split(".").map((n) => Number.parseInt(n, 10));
84
+ const nodeOk = maj > 22 || (maj === 22 && min >= 9);
85
+ console.log(nodeOk ? ` ✓ Node ${process.versions.node}` : ` ✗ Node ${process.versions.node} — MulmoTerminal needs ≥ 22.9`);
86
+
87
+ const hasClaude = claudeInstalled();
88
+ if (hasClaude) {
89
+ console.log(" ✓ Claude Code CLI");
90
+ } else {
91
+ console.log(" ✗ Claude Code CLI — not found");
92
+ console.log(" → npm install -g @anthropic-ai/claude-code (then run `claude` and log in)");
93
+ }
94
+
95
+ for (const [cmd, versionArg, why, hint] of [
96
+ ["tmux", "-V", "sessions survive a restart", "brew install tmux · apt install tmux"],
97
+ ["gh", "--version", "PRs & Issues view + one-click PRs", "https://cli.github.com (then: gh auth login)"],
98
+ ["codex", "--version", "run OpenAI Codex as an agent", "npm install -g @openai/codex"],
99
+ ]) {
100
+ console.log(hasCommand(cmd, versionArg) ? ` ✓ ${cmd} — ${why}` : ` ○ ${cmd} — optional (${why})\n → ${hint}`);
101
+ }
102
+
103
+ // Config half: derive working-dir presets from Claude history + write config.json.
104
+ console.log("");
105
+ const initExit = await new Promise((res) => {
106
+ const child = spawn(process.execPath, ["--import", "tsx", join(PKG_DIR, "server", "cli-init.ts"), ...initArgs], {
107
+ cwd: PKG_DIR,
108
+ env: { ...process.env },
109
+ stdio: "inherit",
110
+ });
111
+ child.on("exit", (code) => res(code ?? 0));
112
+ });
113
+ if (initExit) {
114
+ process.exitCode = initExit;
115
+ error("Setup did not complete — see the error above.");
116
+ return;
117
+ }
118
+
119
+ // Offer the interactive skill only in a real terminal; a non-TTY run (CI / piped input)
120
+ // must never block waiting on stdin.
121
+ if (hasClaude && process.stdin.isTTY && (await promptYesNo("\nConfigure interactively now with the /mulmoterminal-config skill? [y/N] "))) {
122
+ log("Launching Claude — use /mulmoterminal-config (or just ask it to configure MulmoTerminal).");
123
+ // eslint-disable-next-line sonarjs/no-os-command-from-path
124
+ spawn("claude", ["Use the mulmoterminal-config skill to configure MulmoTerminal."], { stdio: "inherit" });
125
+ return;
126
+ }
127
+ if (hasClaude) log("Later: run `claude` in any project and use /mulmoterminal-config");
128
+ log("Setup done. Start MulmoTerminal: npx mulmoterminal");
129
+ }
130
+
61
131
  function pickOpenCommand() {
62
132
  if (process.platform === "darwin") return "open";
63
133
  if (process.platform === "win32") return "start";
@@ -225,12 +295,15 @@ function runServer(port, noOpen, cwd, onChild) {
225
295
  });
226
296
  }
227
297
 
228
- async function main() {
229
- const args = process.argv.slice(2);
298
+ function printHelp() {
299
+ console.log(`
300
+ Usage: npx mulmoterminal [command] [options]
230
301
 
231
- if (args.includes("--help") || args.includes("-h")) {
232
- console.log(`
233
- Usage: npx mulmoterminal [options]
302
+ Commands:
303
+ (none) Start the server (default)
304
+ init First-run setup: check your environment, seed working-directory
305
+ presets from your Claude Code history, and write
306
+ ~/.mulmoterminal/config.json (idempotent — safe to re-run)
234
307
 
235
308
  Options:
236
309
  --cwd <dir> Working directory claude runs in (default: current directory; relative paths allowed)
@@ -239,6 +312,18 @@ Options:
239
312
  --version Show version
240
313
  --help Show this help
241
314
  `);
315
+ }
316
+
317
+ async function main() {
318
+ const args = process.argv.slice(2);
319
+
320
+ if (args[0] === "init") {
321
+ await runInit(args.slice(1));
322
+ return;
323
+ }
324
+
325
+ if (args.includes("--help") || args.includes("-h")) {
326
+ printHelp();
242
327
  return;
243
328
  }
244
329
  if (args.includes("--version")) {
@@ -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-DC7NPJ_M-CcAjWs6c.js";import"./chunk-WYO6CB5R-B83L_z6I-CTQn5U85.js";import"./chunk-VAUOI2AC-DrcykVNK-jGzw5YJX.js";import{n as i,r as a,t as o}from"./chunk-MOJQB5TN-CqxshQHA-ozqXE506.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-DC7NPJ_M-CdLorTPK.js";import"./chunk-WYO6CB5R-B83L_z6I-C1WGAsfM.js";import"./chunk-VAUOI2AC-DrcykVNK-Cm1y1eF0.js";import{n as i,r as a,t as o}from"./chunk-MOJQB5TN-CqxshQHA-hb8sT9ul.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-DC7NPJ_M-CdLorTPK.js";export{e as createArchitectureServices};