mulmoterminal 1.4.0 → 1.5.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 (184) hide show
  1. package/README.md +17 -2
  2. package/bin/update-check.d.ts +2 -0
  3. package/common/dirChrome.ts +20 -0
  4. package/common/themeIds.ts +6 -0
  5. package/dist/assets/{abnfDiagram-VRR7QNED-6nNByj6v-Ca_1xL9E.js → abnfDiagram-VRR7QNED-6nNByj6v-BmTAK_lf.js} +1 -1
  6. package/dist/assets/architecture-TIHT7OUA-CYMWc3UT-ChEc_7wP.js +1 -0
  7. package/dist/assets/{architectureDiagram-ZJ3FMSHR-Bgnyaj_i-DeqNwmGo.js → architectureDiagram-ZJ3FMSHR-Bgnyaj_i-Rm4oPVV8.js} +1 -1
  8. package/dist/assets/{blockDiagram-677ZJIJ3-DQ35o5E4-BMHxAWeR.js → blockDiagram-677ZJIJ3-DQ35o5E4-CpSusKj_.js} +1 -1
  9. package/dist/assets/{c4Diagram-LMCZKHZV-ClWZeiWo-SZJrYJpa.js → c4Diagram-LMCZKHZV-ClWZeiWo-CDPWcIZ7.js} +1 -1
  10. package/dist/assets/channel-Di5rtkx0-CW5bKrWi.js +1 -0
  11. package/dist/assets/{chunk-32BRIVSS-CCt9wtYd-Pb9wd8dr.js → chunk-32BRIVSS-CCt9wtYd-BNsLemkR.js} +1 -1
  12. package/dist/assets/{chunk-52WLFC77-FbBbR4uI-BRpr0cAc.js → chunk-52WLFC77-FbBbR4uI-hDAV5e1Z.js} +1 -1
  13. package/dist/assets/{chunk-C7G6YPKG-C87hlS9c-Bp5UQi3A.js → chunk-C7G6YPKG-C87hlS9c-DfzZj0PL.js} +1 -1
  14. package/dist/assets/{chunk-EX3LRPZG-BqGqMXLN-CNBYB1hW.js → chunk-EX3LRPZG-BqGqMXLN-uoc2Ztzj.js} +1 -1
  15. package/dist/assets/{chunk-FWX5IMBZ-BkbSAAuW-C8pwvYr9.js → chunk-FWX5IMBZ-BkbSAAuW-B397K7iE.js} +2 -2
  16. package/dist/assets/{chunk-HOUHSVGY-Cxu0eDlh-qXR3o3_Q.js → chunk-HOUHSVGY-Cxu0eDlh-BgHFcMoQ.js} +1 -1
  17. package/dist/assets/{chunk-ICXQ74PX-hiraF_Xj-D6RChm8S.js → chunk-ICXQ74PX-hiraF_Xj-BJT-y8zi.js} +1 -1
  18. package/dist/assets/{chunk-MOJQB5TN-CqxshQHA-DzpdT-_-.js → chunk-MOJQB5TN-CqxshQHA-rfYFgPHl.js} +1 -1
  19. package/dist/assets/{chunk-OGEWGWER-CjCr7ceX-CHwPg6wN.js → chunk-OGEWGWER-CjCr7ceX-DuZ8UI47.js} +1 -1
  20. package/dist/assets/{chunk-PUDLZKDR-Dx6M-vz1-1LjvELJl.js → chunk-PUDLZKDR-Dx6M-vz1-C20tVRvs.js} +1 -1
  21. package/dist/assets/{chunk-Q4XR5HBZ-CZd-9lTB-H2jDDOca.js → chunk-Q4XR5HBZ-CZd-9lTB-BFkl1myD.js} +1 -1
  22. package/dist/assets/{chunk-V7JOEXUC-rI0xlC_O-DsYxdI8K.js → chunk-V7JOEXUC-rI0xlC_O-C2QrFL3o.js} +1 -1
  23. package/dist/assets/{chunk-VAUOI2AC-DrcykVNK-BG02s6nm.js → chunk-VAUOI2AC-DrcykVNK-BSJoRdEM.js} +1 -1
  24. package/dist/assets/{chunk-VR4S4FIN-O6iF8Yvf-BkxcJW6l.js → chunk-VR4S4FIN-O6iF8Yvf-CL4V93u8.js} +1 -1
  25. package/dist/assets/{chunk-WYO6CB5R-B83L_z6I-BLR3Im7t.js → chunk-WYO6CB5R-B83L_z6I-ybwRHaqV.js} +1 -1
  26. package/dist/assets/{chunk-ZGVPDNZ5-BpFv9JSP-DreP7ALc.js → chunk-ZGVPDNZ5-BpFv9JSP-DQGEhX3k.js} +1 -1
  27. package/dist/assets/classDiagram-OUVF2IWQ-BgAZMSbT-BJBeI7ut.js +1 -0
  28. package/dist/assets/classDiagram-v2-EOCWNBFH-DxHTyui1-BJBeI7ut.js +1 -0
  29. package/dist/assets/cynefin-VYW2F7L2-DqA3n9nY-CHrZLRBv.js +1 -0
  30. package/dist/assets/{cynefinDiagram-TSTJHNR4-x0-0sQ15-CG2HDCNn.js → cynefinDiagram-TSTJHNR4-x0-0sQ15-B3DfOJaL.js} +1 -1
  31. package/dist/assets/{dagre-VKFMJZFB-CQdfl-bx-C_u-VAtp.js → dagre-VKFMJZFB-CQdfl-bx-Bf4AA431.js} +1 -1
  32. package/dist/assets/{diagram-FQU43EPY-BOSB6VUb-Co4MItV_.js → diagram-FQU43EPY-BOSB6VUb-BO7S37GV.js} +1 -1
  33. package/dist/assets/{diagram-G47NLZAW-DLXrcXsN-CpQs0brV.js → diagram-G47NLZAW-DLXrcXsN-Cw4lBqWi.js} +1 -1
  34. package/dist/assets/{diagram-NH7WQ7WH-BMQp1rkF-d3plBnN8.js → diagram-NH7WQ7WH-BMQp1rkF-B4OObXRC.js} +1 -1
  35. package/dist/assets/{diagram-OA4YK3LP-D1wQ0vUj-CrBfGx8L.js → diagram-OA4YK3LP-D1wQ0vUj-CbSsGWhY.js} +1 -1
  36. package/dist/assets/{diagram-WEI45ONY-RR0DpF8R-CS-M3Ra0.js → diagram-WEI45ONY-RR0DpF8R-CkVYiUn6.js} +1 -1
  37. package/dist/assets/{ebnfDiagram-CCIWWBDH-M123uVJ8-OUbCegYV.js → ebnfDiagram-CCIWWBDH-M123uVJ8-BIFkvee9.js} +1 -1
  38. package/dist/assets/{erDiagram-Q63AITRT-BWx_-PXG-CEyrlpra.js → erDiagram-Q63AITRT-BWx_-PXG-DhFy59tl.js} +1 -1
  39. package/dist/assets/eventmodeling-45OFAUF4-_BVSjAXf-Dows47_h.js +1 -0
  40. package/dist/assets/flowDiagram-23GEKE2U-BeOc_anm-D8EOvOHn.js +1 -0
  41. package/dist/assets/{ganttDiagram-NO4QXBWP-BOoJ1eTw-BjxqJeU6.js → ganttDiagram-NO4QXBWP-BOoJ1eTw-Cy64oRyD.js} +1 -1
  42. package/dist/assets/gitGraph-TEB2WS4Q-CH12KLTN-D0iLvwj3.js +1 -0
  43. package/dist/assets/{gitGraphDiagram-IHSO6WYX-B2CJhk_G-CsW7_CEO.js → gitGraphDiagram-IHSO6WYX-B2CJhk_G-Do02StAh.js} +1 -1
  44. package/dist/assets/index-CkheN-4M.css +1 -0
  45. package/dist/assets/index-D7iecJBA.js +607 -0
  46. package/dist/assets/info-DKCQHKI2-Cbw3mbiK-BnqrlbY_.js +1 -0
  47. package/dist/assets/{infoDiagram-FWYZ7A6U-Mp1X3pBP-B1W9eCMy.js → infoDiagram-FWYZ7A6U-Mp1X3pBP-CTODYevC.js} +1 -1
  48. package/dist/assets/{ishikawaDiagram-FXEZZL3T-BNG7tkJu-Q8Yh-Oes.js → ishikawaDiagram-FXEZZL3T-BNG7tkJu-DWG68Fod.js} +1 -1
  49. package/dist/assets/{journeyDiagram-5HDEW3XC-Dbp_hY9X-maN4pjfe.js → journeyDiagram-5HDEW3XC-Dbp_hY9X-C21LZ7jk.js} +1 -1
  50. package/dist/assets/{kanban-definition-HUTT4EX6-DSTc5u3q-DSlStVjd.js → kanban-definition-HUTT4EX6-DSTc5u3q-ahPtq3pf.js} +1 -1
  51. package/dist/assets/{lib-BgqM-YBP.js → lib-Df1jlz1Q.js} +1 -1
  52. package/dist/assets/{line-B1wBwzrY-DiyABYDp.js → line-B1wBwzrY-DAl65sYb.js} +1 -1
  53. package/dist/assets/{marp-BjuRL9gF.js → marp-D5H57UyA.js} +1 -1
  54. package/dist/assets/{mermaid-parser.core-DC7NPJ_M-C2yu1mqW.js → mermaid-parser.core-DC7NPJ_M-QXgmJCuN.js} +2 -2
  55. package/dist/assets/{mermaid.core-DZM3Ha-E-BmNFXjNa.js → mermaid.core-DZM3Ha-E-B1G-85N2.js} +3 -3
  56. package/dist/assets/{mindmap-definition-LN4V7U3C-DYtgcMsY-Hz0ORILX.js → mindmap-definition-LN4V7U3C-DYtgcMsY-CBnOdPk8.js} +1 -1
  57. package/dist/assets/packet-7NZHBO7P-lwb58iYx-vktMe7EJ.js +1 -0
  58. package/dist/assets/{pegDiagram-2B236MQR-C43eIpKM-Pqw-eDjm.js → pegDiagram-2B236MQR-C43eIpKM-hEGXt4rK.js} +1 -1
  59. package/dist/assets/pie-RZYD4A2V-B1UWb4Gu-DQdd8O0g.js +1 -0
  60. package/dist/assets/{pieDiagram-ENE6RG2P-BkTqgJyR-DDYDtXLw.js → pieDiagram-ENE6RG2P-BkTqgJyR-D84c_7gF.js} +1 -1
  61. package/dist/assets/{quadrantDiagram-ABIIQ3AL-Bm1Zjm45-BWk3t4WO.js → quadrantDiagram-ABIIQ3AL-Bm1Zjm45-m6ws2UZn.js} +1 -1
  62. package/dist/assets/radar-I7S5WNFK-7CKcb_l--C24Fc6mu.js +1 -0
  63. package/dist/assets/railroad-3IZDKUUU-gCySKdnW-CZSGevii.js +1 -0
  64. package/dist/assets/railroad-abnf-AHOZXSZD-BophH4r--CUsXkbxZ.js +1 -0
  65. package/dist/assets/railroad-ebnf-EBAXGLYW-AZNjl_Zu-CvkVfCff.js +1 -0
  66. package/dist/assets/railroad-peg-LSFZ7HO6-BSiEEyeb-DVG8HAZ0.js +1 -0
  67. package/dist/assets/{railroadDiagram-RFXS5EU6-BkfbdeAs-B6bHQo3P.js → railroadDiagram-RFXS5EU6-BkfbdeAs-BN3y7GqL.js} +1 -1
  68. package/dist/assets/{requirementDiagram-TGXJPOKE-CrGTTjYg-CNJlZb8l.js → requirementDiagram-TGXJPOKE-CrGTTjYg-B0zoTBgF.js} +1 -1
  69. package/dist/assets/{sankeyDiagram-HTMAVEWB-rWXPf03Z-D0W5vOfI.js → sankeyDiagram-HTMAVEWB-rWXPf03Z-XgG2MUCe.js} +1 -1
  70. package/dist/assets/{sequenceDiagram-DBY2YBRQ-nkJYWO2m-CMxA7B3A.js → sequenceDiagram-DBY2YBRQ-nkJYWO2m-BxK5UjRj.js} +1 -1
  71. package/dist/assets/{stateDiagram-2N3HPSRC-T4-clK8b-B9saurhU.js → stateDiagram-2N3HPSRC-T4-clK8b-Y_DtKuon.js} +1 -1
  72. package/dist/assets/stateDiagram-v2-6OUMAXLB-DIp7nhRd-Cehiuymv.js +1 -0
  73. package/dist/assets/{swimlanes-5IMT3BWC-HmQNEntu-BODdb8qy.js → swimlanes-5IMT3BWC-HmQNEntu-D5dAJGJF.js} +1 -1
  74. package/dist/assets/swimlanesDiagram-G3AALYLV-BeoZhwg7-CoSHy1jT.js +8 -0
  75. package/dist/assets/{timeline-definition-FHXFAJF6-CNc9jSTP-CJf7rTMs.js → timeline-definition-FHXFAJF6-CNc9jSTP-CRCAKMND.js} +1 -1
  76. package/dist/assets/treeView-QDETBFTQ-nIQcG1h9-CWUjubva.js +1 -0
  77. package/dist/assets/treemap-6X3UGDF4-BnsvC8yL-BKgXJcXq.js +1 -0
  78. package/dist/assets/{vennDiagram-L72KCM5P-Dr3pTJ_0-DyKxIhWC.js → vennDiagram-L72KCM5P-Dr3pTJ_0-DIFYkt_z.js} +1 -1
  79. package/dist/assets/wardley-OPB4EBWU-8Odxkx6V-BJhsIgOJ.js +1 -0
  80. package/dist/assets/{wardleyDiagram-EHGQE667-DSFc7ZZa-CelZHvd2.js → wardleyDiagram-EHGQE667-DSFc7ZZa-BL_kqA2P.js} +1 -1
  81. package/dist/assets/{xychartDiagram-FW5EYKEG-BP0Nn4Pp-BoBAD26H.js → xychartDiagram-FW5EYKEG-BP0Nn4Pp-q75mTWUr.js} +1 -1
  82. package/dist/index.html +2 -2
  83. package/package.json +11 -12
  84. package/server/agents/codex-sessions.ts +14 -8
  85. package/server/backends/collections.ts +289 -377
  86. package/server/backends/feeds.ts +1 -13
  87. package/server/backends/files.ts +3 -12
  88. package/server/backends/html.ts +3 -12
  89. package/server/backends/remoteHost/getFeed.spec.ts +9 -1
  90. package/server/backends/remoteHost/handlers.spec.ts +9 -1
  91. package/server/backends/remoteHost/handlers.ts +41 -14
  92. package/server/backends/remoteHost/index.ts +11 -3
  93. package/server/backends/remoteHost/sessionActivity.ts +93 -0
  94. package/server/backends/remoteHost/skills.spec.ts +14 -3
  95. package/server/backends/remoteHost/terminalInput.spec.ts +264 -0
  96. package/server/backends/remoteHost/terminalInput.ts +120 -0
  97. package/server/backends/remoteHost/terminalScreen.ts +42 -5
  98. package/server/backends/remoteView.ts +21 -11
  99. package/server/backends/shortcuts.ts +20 -1
  100. package/server/backends/statFileOr404.ts +20 -0
  101. package/server/config/app-config.ts +19 -13
  102. package/server/config/config-routes.ts +2 -14
  103. package/server/config/config-schema.ts +1 -1
  104. package/server/config/dir-config.ts +7 -23
  105. package/server/config/env.ts +21 -0
  106. package/server/config/header-resolve.ts +7 -0
  107. package/server/config/workspace.ts +23 -0
  108. package/server/errors.ts +6 -0
  109. package/server/files/atomic-write.ts +50 -0
  110. package/server/files/dirRequest.ts +30 -0
  111. package/server/files/open-dir.ts +3 -13
  112. package/server/git/dirty-count.ts +8 -0
  113. package/server/git/gh.ts +2 -17
  114. package/server/git/git-status.ts +1 -5
  115. package/server/git/gitRemote.ts +3 -16
  116. package/server/git/pr-for-branch.ts +5 -8
  117. package/server/git/prPhase.ts +5 -8
  118. package/server/git/spawn-collect.ts +23 -0
  119. package/server/git/ttl-cache.ts +24 -0
  120. package/server/git/worktree-diff.ts +1 -5
  121. package/server/git/worktree-pr.ts +5 -19
  122. package/server/git/worktrees.ts +14 -5
  123. package/server/index.ts +249 -1871
  124. package/server/infra/pty-env.ts +73 -0
  125. package/server/infra/sandbox.ts +117 -12
  126. package/server/infra/spawnCapture.ts +6 -0
  127. package/server/infra/tmux.ts +102 -14
  128. package/server/infra/web-push.ts +5 -1
  129. package/server/routes/dir-routes.ts +104 -0
  130. package/server/routes/repo-routes.ts +27 -0
  131. package/server/routes/session-routes.ts +198 -0
  132. package/server/routes/tool-routes.ts +83 -0
  133. package/server/routes/ws-routes.ts +372 -0
  134. package/server/session/activity-hook.ts +84 -7
  135. package/server/session/cost.ts +1 -8
  136. package/server/session/draft-injection.ts +113 -0
  137. package/server/session/handoff-text.ts +49 -0
  138. package/server/session/headlessScreen.ts +18 -5
  139. package/server/session/last-turn.ts +84 -0
  140. package/server/session/project-dir.ts +37 -0
  141. package/server/session/pty-connection.ts +127 -0
  142. package/server/session/pty-spawn.ts +63 -0
  143. package/server/session/pty-text.ts +34 -0
  144. package/server/session/reap-policy.ts +27 -0
  145. package/server/session/registry.ts +163 -0
  146. package/server/session/scheduled-sessions.ts +187 -0
  147. package/server/session/screen-rows.ts +123 -0
  148. package/server/session/session-list.ts +42 -0
  149. package/server/session/session-reads.ts +250 -0
  150. package/server/session/session-resolve.ts +24 -0
  151. package/server/session/shell-command.ts +28 -0
  152. package/server/session/spawn-claude.ts +111 -0
  153. package/server/session/spawn-codex.ts +78 -0
  154. package/server/session/spawn-deps.ts +19 -0
  155. package/server/session/spawn-shell.ts +69 -0
  156. package/server/session/tool-store.ts +169 -0
  157. package/server/session/transcript.ts +5 -2
  158. package/server/session/translation-prompt.ts +28 -0
  159. package/server/session/translation-worker.ts +122 -0
  160. package/server/session/types.ts +88 -0
  161. package/server/session/ws-frames.ts +51 -0
  162. package/dist/assets/architecture-TIHT7OUA-CYMWc3UT-ClOiEDNl.js +0 -1
  163. package/dist/assets/channel-Di5rtkx0-GApNIfgs.js +0 -1
  164. package/dist/assets/classDiagram-OUVF2IWQ-BgAZMSbT-Xtn_iE77.js +0 -1
  165. package/dist/assets/classDiagram-v2-EOCWNBFH-DxHTyui1-Xtn_iE77.js +0 -1
  166. package/dist/assets/cynefin-VYW2F7L2-DqA3n9nY-Dn_RgKdZ.js +0 -1
  167. package/dist/assets/eventmodeling-45OFAUF4-_BVSjAXf-fhNS4V9y.js +0 -1
  168. package/dist/assets/flowDiagram-23GEKE2U-BeOc_anm-eY7_48Lq.js +0 -1
  169. package/dist/assets/gitGraph-TEB2WS4Q-CH12KLTN-9yyiQB6a.js +0 -1
  170. package/dist/assets/index-9sOccSQD.css +0 -1
  171. package/dist/assets/index-D4zpPW-X.js +0 -607
  172. package/dist/assets/info-DKCQHKI2-Cbw3mbiK-BaoU6qkE.js +0 -1
  173. package/dist/assets/packet-7NZHBO7P-lwb58iYx-C643WJOR.js +0 -1
  174. package/dist/assets/pie-RZYD4A2V-B1UWb4Gu-C6kv_lLQ.js +0 -1
  175. package/dist/assets/radar-I7S5WNFK-7CKcb_l--D2gGTcyW.js +0 -1
  176. package/dist/assets/railroad-3IZDKUUU-gCySKdnW-BrODqkjM.js +0 -1
  177. package/dist/assets/railroad-abnf-AHOZXSZD-BophH4r--CiadAS_w.js +0 -1
  178. package/dist/assets/railroad-ebnf-EBAXGLYW-AZNjl_Zu-B1kY_BCV.js +0 -1
  179. package/dist/assets/railroad-peg-LSFZ7HO6-BSiEEyeb-fJ5cY9QP.js +0 -1
  180. package/dist/assets/stateDiagram-v2-6OUMAXLB-DIp7nhRd-C4fOci9j.js +0 -1
  181. package/dist/assets/swimlanesDiagram-G3AALYLV-BeoZhwg7-BQN1H2ff.js +0 -8
  182. package/dist/assets/treeView-QDETBFTQ-nIQcG1h9-BUWbtLMe.js +0 -1
  183. package/dist/assets/treemap-6X3UGDF4-BnsvC8yL-D-ymqmfg.js +0 -1
  184. package/dist/assets/wardley-OPB4EBWU-8Odxkx6V-DgDcbSyj.js +0 -1
package/README.md CHANGED
@@ -12,9 +12,9 @@ ping to your phone when a task finishes. One `npx` command, no Electron, no conf
12
12
  npx mulmoterminal # starts on http://localhost:34567 and opens your browser
13
13
  ```
14
14
 
15
- ![MulmoTerminal's grid view — several coding agents running side by side](https://raw.githubusercontent.com/receptron/mulmoterminal/main/docs/guide/images/grid-2x2.png)
15
+ ![MulmoTerminal's grid view — four live Claude sessions running side by side, each in its own color-coded project](https://raw.githubusercontent.com/receptron/mulmoterminal/main/docs/guide/images/grid-2x2-live.png)
16
16
 
17
- *The grid is a **cockpit for parallel agents** — each cell is one agent (Claude or Codex). A cell's **border color signals its state** — working (blue), needs-you (amber — a permission or answer), idle — and an attention chime pulls you back to a stuck cell off-screen, so you can supervise many and only step in where you're called. (See the [Cost & token usage](#cost--token-usage) shot below for a single cell's live header.)*
17
+ *The grid is a **cockpit for parallel agents** — here, four live Claude sessions, each in its own color-coded project. Every cell's header carries what you need to triage at a glance: **model · context %**, **token counts** (`⇡in ⇣out`), the **git branch / changes** chip, and an AI summary of what the agent is doing. A cell's **border color signals state** — working / done (blue), needs-you (amber — e.g. waiting on a permission), idle — with an attention chime so a stuck cell off-screen still pulls you back. Supervise many; only step in where you're called.*
18
18
 
19
19
  ## Why you'll want it
20
20
 
@@ -483,6 +483,7 @@ yarn dev:client # Vite dev server only
483
483
 
484
484
  yarn build # type-check (vue-tsc) + vite build -> dist/
485
485
  yarn typecheck:server # type-check the server (tsconfig.server.json)
486
+ yarn typecheck:test # type-check the specs (tsconfig.test*.json)
486
487
  yarn server # run backend; serves dist/ + the APIs on :34567
487
488
  yarn test # vitest run
488
489
  ```
@@ -491,6 +492,12 @@ The backend is TypeScript run directly via `tsx` (no build step); `server/` is
491
492
  type-checked separately through `tsconfig.server.json` (`strict`), kept out of
492
493
  the main `build` so the two type-check independently.
493
494
 
495
+ Specs sit outside both of those projects, and vitest strips types rather than
496
+ checking them — so `yarn typecheck:test` is what keeps them honest. It mirrors
497
+ the same split: `tsconfig.test.json` (client specs, DOM + `.vue`) and
498
+ `tsconfig.test-server.json` (server specs, node). CI runs it alongside the
499
+ other two.
500
+
494
501
  In dev, open the Vite URL; its proxy forwards `/ws`, `/ws/pubsub`, and `/api` to
495
502
  `:34567`. In production, run `yarn build` then `yarn server` and open
496
503
  `http://localhost:34567`.
@@ -724,6 +731,13 @@ Favorited collections get their own toolbar buttons.
724
731
 
725
732
  - **Timeline** (🕘) — a read-only per-session activity timeline (tools run, newest first),
726
733
  from `GET /api/transcript/timeline`.
734
+ - **Bring another cell's turn here** (💬) — pick another terminal in the grid and its
735
+ **last completed turn** is pasted into *this* cell's input box, so you can have Claude
736
+ and Codex look at each other's work (or pull in a session running in a different repo).
737
+ The excerpt comes from the agent's own log, not the screen buffer, so it carries no
738
+ ANSI debris and nothing lost to scrollback. It is **pasted, never sent** — you read
739
+ what arrived and press Enter, in the cell you were already in. A turn still running
740
+ isn't available yet (Codex writes its rollout only once the turn ends).
727
741
  - **Tools pane** — the available GUI tools plus a live tool-call history for the active
728
742
  session.
729
743
  - **Notifications** (🔔) — a toolbar bell with an unread badge and a dropdown of active
@@ -889,6 +903,7 @@ same-origin-guarded.
889
903
  | `GET /api/codex/sessions?cwd=` | Codex sessions for the project (from `~/.codex` rollouts), newest first. |
890
904
  | `GET /api/cost?cwd=&session=` | Estimated $ cost — session / today / month. |
891
905
  | `GET /api/transcript/timeline?session=&cwd=` | Per-session activity timeline (tools run). |
906
+ | `GET /api/transcript/last-turn?session=&cwd=&agent=` | A session's last completed exchange (`prompt`, `reply`) plus the `text` to paste into another terminal. `agent=codex` reads the codex rollout instead of the Claude transcript. |
892
907
 
893
908
  **Git & worktrees**
894
909
 
@@ -0,0 +1,2 @@
1
+ export declare function fetchLatestVersion(pkg?: string): Promise<string | null>;
2
+ export declare function isNewerVersion(latest: string, current: string): boolean;
@@ -0,0 +1,20 @@
1
+ // The name + fixed-color fields a `.mulmoterminal.json` may set. Shared across the
2
+ // build boundary: the server's DirConfig/PublicDirConfig and the client's DirConfig
3
+ // all extend this, so a field added on one side can't go missing on the other.
4
+ // `theme` and `colors` stay out of it — each side declares them with its own type
5
+ // (the server keeps the validated strings, the client narrows them to xterm's ITheme).
6
+ export interface DirChrome {
7
+ name: string | null;
8
+ badgeColor: string | null;
9
+ // The cell header's own background / text color (grid cell + single view). Hex
10
+ // #rrggbb, or null to keep the theme default. Distinct from `colors` (the xterm
11
+ // palette) — these tint the chrome around the terminal, not the terminal itself.
12
+ headerColor: string | null;
13
+ headerTextColor: string | null;
14
+ // The cell frame + accents (grid cell): body background, border, the idle status
15
+ // dot, and the header's icon buttons. Hex #rrggbb or null for the theme default.
16
+ cellColor: string | null;
17
+ cellBorderColor: string | null;
18
+ dotColor: string | null;
19
+ buttonColor: string | null;
20
+ }
@@ -0,0 +1,6 @@
1
+ // The app's theme ids, shared across the build boundary: the server's zod schema
2
+ // (config-schema.ts) enumerates them and the client (useTheme.ts) types + validates
3
+ // against them. Kept in common/ so adding a theme is one edit, not two that can
4
+ // drift — same reason THEME_COLOR_KEYS lives here (see themeColors.ts).
5
+ export const THEME_IDS = ["midnight", "nord", "daylight", "solarized"] as const;
6
+ export type ThemeId = (typeof THEME_IDS)[number];
@@ -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-C2yu1mqW.js";import"./chunk-WYO6CB5R-B83L_z6I-BLR3Im7t.js";import"./chunk-VAUOI2AC-DrcykVNK-BG02s6nm.js";import{n as i,r as a,t as o}from"./chunk-MOJQB5TN-CqxshQHA-DzpdT-_-.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-QXgmJCuN.js";import"./chunk-WYO6CB5R-B83L_z6I-ybwRHaqV.js";import"./chunk-VAUOI2AC-DrcykVNK-BSJoRdEM.js";import{n as i,r as a,t as o}from"./chunk-MOJQB5TN-CqxshQHA-rfYFgPHl.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-QXgmJCuN.js";export{e as createArchitectureServices};