mulmoterminal 4.1.0 → 4.1.1

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 (142) hide show
  1. package/README.md +12 -6
  2. package/bin/mulmoterminal.js +9 -0
  3. package/common/prPhase.ts +18 -1
  4. package/common/themeVars.ts +4 -2
  5. package/dist/assets/{abnfDiagram-VRR7QNED-RjiYivmv-BCXxUk19.js → abnfDiagram-VRR7QNED-RjiYivmv-CuUAI5MR.js} +1 -1
  6. package/dist/assets/architecture-TIHT7OUA-0NsD2xW1-B89nYL-T.js +1 -0
  7. package/dist/assets/{architectureDiagram-ZJ3FMSHR-3nWA91tG-Bs3iPPHw.js → architectureDiagram-ZJ3FMSHR-3nWA91tG-rRDT09Vx.js} +1 -1
  8. package/dist/assets/{blockDiagram-677ZJIJ3-BPuAJQRW-CxIHRfjJ.js → blockDiagram-677ZJIJ3-BPuAJQRW-By0PkzIO.js} +1 -1
  9. package/dist/assets/{c4Diagram-LMCZKHZV-C0LAqQso-D1Zp3ZLf.js → c4Diagram-LMCZKHZV-C0LAqQso-GgOhwf63.js} +1 -1
  10. package/dist/assets/channel-7wUqSdoX-DLHsiYx_.js +1 -0
  11. package/dist/assets/{chunk-32BRIVSS-BRrYpgtb-iqbVrSxA.js → chunk-32BRIVSS-BRrYpgtb-C_AxGcxt.js} +1 -1
  12. package/dist/assets/{chunk-52WLFC77-BJ-ss3Xr-DsGxy9sK.js → chunk-52WLFC77-BJ-ss3Xr-DNopp04b.js} +1 -1
  13. package/dist/assets/{chunk-C7G6YPKG-BZEucKEL-FHV3qMNI.js → chunk-C7G6YPKG-BZEucKEL---6fNwPJ.js} +1 -1
  14. package/dist/assets/{chunk-EX3LRPZG-DLS6FBN1-D3JiHJ-E.js → chunk-EX3LRPZG-DLS6FBN1-D5lN82UI.js} +1 -1
  15. package/dist/assets/{chunk-FWX5IMBZ-DHLSFw1H-BLB-Jc4x.js → chunk-FWX5IMBZ-DHLSFw1H-DKxptXUj.js} +2 -2
  16. package/dist/assets/{chunk-HOUHSVGY-Bhlt8hXJ-B9Sp5Rm4.js → chunk-HOUHSVGY-Bhlt8hXJ-CAh9s_YU.js} +1 -1
  17. package/dist/assets/{chunk-ICXQ74PX-DwgHBX_g-Couvoogt.js → chunk-ICXQ74PX-DwgHBX_g-jwQc10EC.js} +1 -1
  18. package/dist/assets/{chunk-MOJQB5TN-CMZRaeqt-pTxGJtb7.js → chunk-MOJQB5TN-CMZRaeqt-DcPt_trW.js} +1 -1
  19. package/dist/assets/{chunk-OGEWGWER-8Qy4a8b5-Bjam2Bd1.js → chunk-OGEWGWER-8Qy4a8b5-BuRF4rGR.js} +1 -1
  20. package/dist/assets/{chunk-PUDLZKDR-DcrWQRYh-z_O9UUQX.js → chunk-PUDLZKDR-DcrWQRYh-BYgad2gt.js} +1 -1
  21. package/dist/assets/{chunk-Q4XR5HBZ-ZXVGkG8Z-yi9fnIVw.js → chunk-Q4XR5HBZ-ZXVGkG8Z-DhnrB6RT.js} +1 -1
  22. package/dist/assets/{chunk-V7JOEXUC-DmGdheTX-DTtWrQx1.js → chunk-V7JOEXUC-DmGdheTX-Ur1KzthC.js} +1 -1
  23. package/dist/assets/{chunk-VAUOI2AC-CS9QJ4yz-DW0Tgecw.js → chunk-VAUOI2AC-CS9QJ4yz-BZe0Q9XX.js} +1 -1
  24. package/dist/assets/{chunk-VR4S4FIN-C6a91eNY-BSK94OLt.js → chunk-VR4S4FIN-C6a91eNY-2iUlb5mQ.js} +1 -1
  25. package/dist/assets/{chunk-WYO6CB5R-BlzOfotS-D5Vl4QYq.js → chunk-WYO6CB5R-BlzOfotS-CeZxJxL0.js} +1 -1
  26. package/dist/assets/{chunk-ZGVPDNZ5-BYwxNFTK-BnFKS269.js → chunk-ZGVPDNZ5-BYwxNFTK-Ct0mEJmO.js} +1 -1
  27. package/dist/assets/classDiagram-OUVF2IWQ-BYlRi6YQ-vnBEnnpL.js +1 -0
  28. package/dist/assets/classDiagram-v2-EOCWNBFH-BCHaYHxj-vnBEnnpL.js +1 -0
  29. package/dist/assets/cynefin-VYW2F7L2-CGYr2F6h-U6pbCywv.js +1 -0
  30. package/dist/assets/{cynefinDiagram-TSTJHNR4-DHA9iPo--CaO8WZ9J.js → cynefinDiagram-TSTJHNR4-DHA9iPo--BISNJm8X.js} +1 -1
  31. package/dist/assets/{dagre-VKFMJZFB--oJKqXBZ-i_xOpR1t.js → dagre-VKFMJZFB--oJKqXBZ-B459NNxB.js} +1 -1
  32. package/dist/assets/{diagram-FQU43EPY-CcJCB9bG-Dawy0bUD.js → diagram-FQU43EPY-CcJCB9bG-DVyaiIsO.js} +1 -1
  33. package/dist/assets/{diagram-G47NLZAW-C_o-WGG1-DQMAjcpJ.js → diagram-G47NLZAW-C_o-WGG1-BhuGPhW4.js} +1 -1
  34. package/dist/assets/{diagram-NH7WQ7WH-CXJCYvY--BdH6UDVY.js → diagram-NH7WQ7WH-CXJCYvY--DzbRZHC1.js} +1 -1
  35. package/dist/assets/{diagram-OA4YK3LP-BMzeJ87A-DdlsuPDl.js → diagram-OA4YK3LP-BMzeJ87A-D8t4UJW_.js} +1 -1
  36. package/dist/assets/{diagram-WEI45ONY-D_93NKqo-BYxqHeiT.js → diagram-WEI45ONY-D_93NKqo-Bbl2-CHc.js} +1 -1
  37. package/dist/assets/{dist-SjIG9fJN.js → dist-ClO6UEBJ.js} +1 -1
  38. package/dist/assets/{dist-Cl-hw6ph.js → dist-D8AEcEHx.js} +1 -1
  39. package/dist/assets/{dist-CCytdxgu.js → dist-Daghl_nN.js} +1 -1
  40. package/dist/assets/{dist-D9fZbRmf.js → dist-epQ42VP2.js} +1 -1
  41. package/dist/assets/{ebnfDiagram-CCIWWBDH-CVai1Ii9-CqbaCkfN.js → ebnfDiagram-CCIWWBDH-CVai1Ii9-Bbg4X-2o.js} +1 -1
  42. package/dist/assets/{erDiagram-Q63AITRT-CiABnA0s-CFRhcxJL.js → erDiagram-Q63AITRT-CiABnA0s-CKq_tipK.js} +1 -1
  43. package/dist/assets/eventmodeling-45OFAUF4-CWmqhm3a-Dz8P7VVP.js +1 -0
  44. package/dist/assets/flowDiagram-23GEKE2U-DKSB5AiY-Bqi3MvHN.js +1 -0
  45. package/dist/assets/{ganttDiagram-NO4QXBWP-DQZvdFo1-D_cPrHuB.js → ganttDiagram-NO4QXBWP-DQZvdFo1-jmx958Wo.js} +1 -1
  46. package/dist/assets/gitGraph-TEB2WS4Q-BR9qPwdN-C_bvrqXL.js +1 -0
  47. package/dist/assets/{gitGraphDiagram-IHSO6WYX-C2ovBouh-CmpMFHzx.js → gitGraphDiagram-IHSO6WYX-C2ovBouh-DuZaMN46.js} +1 -1
  48. package/dist/assets/index-CXYjAh9r.css +1 -0
  49. package/dist/assets/{index-CNOunTbV.js → index-D9sJGCR9.js} +191 -191
  50. package/dist/assets/info-DKCQHKI2-Dplx5kMp-aO_hAsb7.js +1 -0
  51. package/dist/assets/{infoDiagram-FWYZ7A6U-7UnoB5AP-1qH_6MSO.js → infoDiagram-FWYZ7A6U-7UnoB5AP-C8ikfN1o.js} +1 -1
  52. package/dist/assets/{ishikawaDiagram-FXEZZL3T-ByUDM_N2-C4Y9h3Kc.js → ishikawaDiagram-FXEZZL3T-ByUDM_N2-ChrD-r9s.js} +1 -1
  53. package/dist/assets/{journeyDiagram-5HDEW3XC-c5xIah9o-2CHdMO52.js → journeyDiagram-5HDEW3XC-c5xIah9o-uY7L1btR.js} +1 -1
  54. package/dist/assets/{kanban-definition-HUTT4EX6-Cnt6loYD-C3tvejl6.js → kanban-definition-HUTT4EX6-Cnt6loYD-CNv5ziZo.js} +1 -1
  55. package/dist/assets/{lib-l0WFljNN.js → lib-dCbEkBG7.js} +1 -1
  56. package/dist/assets/{line-D7ziSjKi-BgJrHM2o.js → line-D7ziSjKi-BEYdEqj_.js} +1 -1
  57. package/dist/assets/{marp-DXxN_4Os.js → marp-CU_bIZEZ.js} +1 -1
  58. package/dist/assets/{mermaid-parser.core-DxEa8E3F-XDB5rg1G.js → mermaid-parser.core-DxEa8E3F-akMN_vOP.js} +2 -2
  59. package/dist/assets/{mermaid.core-V0OYwIz3-BE18ndG4.js → mermaid.core-V0OYwIz3-BMPzsgXF.js} +3 -3
  60. package/dist/assets/{mindmap-definition-LN4V7U3C-CexN3O6L-B_Z8XGvs.js → mindmap-definition-LN4V7U3C-CexN3O6L-Bed_YDhf.js} +1 -1
  61. package/dist/assets/packet-7NZHBO7P-CQI3flND-jjlc375I.js +1 -0
  62. package/dist/assets/{pegDiagram-2B236MQR-BiM4G0cW-CoS_Je3G.js → pegDiagram-2B236MQR-BiM4G0cW-CBrM86uu.js} +1 -1
  63. package/dist/assets/pie-RZYD4A2V-CnmKE2Wa-BGKp68D7.js +1 -0
  64. package/dist/assets/{pieDiagram-ENE6RG2P-B_fBBS-2-q0d7psft.js → pieDiagram-ENE6RG2P-B_fBBS-2-D-tRTGSr.js} +1 -1
  65. package/dist/assets/{quadrantDiagram-ABIIQ3AL-BigGVxCR-DX-o6YRc.js → quadrantDiagram-ABIIQ3AL-BigGVxCR-CH-H4qGn.js} +1 -1
  66. package/dist/assets/radar-I7S5WNFK-us6x-Z9R-ChTyqNRH.js +1 -0
  67. package/dist/assets/railroad-3IZDKUUU-BKdz6pdN-BRepafjd.js +1 -0
  68. package/dist/assets/railroad-abnf-AHOZXSZD-m_CSSIfd-B2E_hGfU.js +1 -0
  69. package/dist/assets/railroad-ebnf-EBAXGLYW-Nu3nAG7C-C2k_5LtZ.js +1 -0
  70. package/dist/assets/railroad-peg-LSFZ7HO6--Y3mD4R_-DSwMdPCz.js +1 -0
  71. package/dist/assets/{railroadDiagram-RFXS5EU6--lNIlG64-wRRd9wDB.js → railroadDiagram-RFXS5EU6--lNIlG64-jEmJgaFj.js} +1 -1
  72. package/dist/assets/{requirementDiagram-TGXJPOKE-D-B0Y5Wu-C29F0qnM.js → requirementDiagram-TGXJPOKE-D-B0Y5Wu-DurumWyC.js} +1 -1
  73. package/dist/assets/{sankeyDiagram-HTMAVEWB-DlutaXDv-BPq3vrC9.js → sankeyDiagram-HTMAVEWB-DlutaXDv-Doed1fks.js} +1 -1
  74. package/dist/assets/{sequenceDiagram-DBY2YBRQ-BOLgtggH-Cq_jo_ss.js → sequenceDiagram-DBY2YBRQ-BOLgtggH-CmkZuV9D.js} +1 -1
  75. package/dist/assets/{stateDiagram-2N3HPSRC-jf_dXUEU-DKYpGC0n.js → stateDiagram-2N3HPSRC-jf_dXUEU-BFXZmQ_i.js} +1 -1
  76. package/dist/assets/stateDiagram-v2-6OUMAXLB-CuzgCL2v-CZroC0CQ.js +1 -0
  77. package/dist/assets/{swimlanes-5IMT3BWC-CYjtALQH-jmF9axmm.js → swimlanes-5IMT3BWC-CYjtALQH-e_82UQvE.js} +1 -1
  78. package/dist/assets/swimlanesDiagram-G3AALYLV-3bmSBtKs-C2aatMMX.js +8 -0
  79. package/dist/assets/{timeline-definition-FHXFAJF6-DYJ4oUm8-B8bL7wcx.js → timeline-definition-FHXFAJF6-DYJ4oUm8-CO0rLezO.js} +1 -1
  80. package/dist/assets/treeView-QDETBFTQ-D27HWG6Q-DhW5sK_F.js +1 -0
  81. package/dist/assets/treemap-6X3UGDF4-CmGIU3H5-oZY-xCg-.js +1 -0
  82. package/dist/assets/{vennDiagram-L72KCM5P-CdKAHoek-D9FWFG6j.js → vennDiagram-L72KCM5P-CdKAHoek-BO9jvKIz.js} +1 -1
  83. package/dist/assets/wardley-OPB4EBWU-CbHWsb2k-BCWqjXDb.js +1 -0
  84. package/dist/assets/{wardleyDiagram-EHGQE667-BF6c4_CW-BffT3P-h.js → wardleyDiagram-EHGQE667-BF6c4_CW-eXxyipXb.js} +1 -1
  85. package/dist/assets/{xychartDiagram-FW5EYKEG-CGiKngj7-vPRabLJJ.js → xychartDiagram-FW5EYKEG-CGiKngj7-CMZLvO1e.js} +1 -1
  86. package/dist/index.html +2 -2
  87. package/package.json +4 -4
  88. package/server/agents/probe-stall.spec.ts +103 -0
  89. package/server/agents/probe-stall.ts +70 -0
  90. package/server/agents/rate-limit-probe.spec.ts +90 -50
  91. package/server/agents/rate-limit-probe.ts +55 -33
  92. package/server/agents/rate-limit-routes.ts +13 -4
  93. package/server/agents/rate-limit-store.spec.ts +58 -4
  94. package/server/agents/rate-limit-store.ts +42 -5
  95. package/server/backends/html.ts +9 -2
  96. package/server/backends/mulmoscript.ts +10 -1
  97. package/server/backends/remoteHost/collectionPage.ts +8 -9
  98. package/server/backends/remoteHost/handlers/getRemoteViewItems.ts +5 -6
  99. package/server/backends/remoteHost/handlers/mutateRemoteView.ts +3 -2
  100. package/server/backends/remoteHost/handlers/terminalSession.ts +3 -2
  101. package/server/backends/remoteHost/jsonPayload.ts +55 -0
  102. package/server/backends/remoteHost/terminalScreen.ts +46 -2
  103. package/server/config/keymap-check.ts +2 -1
  104. package/server/git/glab-items.ts +104 -0
  105. package/server/git/glab.ts +59 -0
  106. package/server/git/prPhase.ts +61 -5
  107. package/server/git/work-comment.ts +61 -18
  108. package/server/git/worktree-pr.ts +99 -19
  109. package/server/index.ts +19 -8
  110. package/server/infra/collection-tool.ts +5 -1
  111. package/server/infra/plugins-registry.ts +5 -4
  112. package/server/infra/server-tool-load.ts +7 -2
  113. package/server/infra/spawnCapture.ts +7 -3
  114. package/server/infra/tmux.ts +10 -6
  115. package/server/routes/ws-routes.ts +57 -34
  116. package/server/session/draft-injection.ts +7 -30
  117. package/server/session/early-frames.ts +12 -8
  118. package/server/session/headlessScreen.ts +12 -6
  119. package/server/session/pty-scan.ts +37 -2
  120. package/server/session/transcript.ts +4 -1
  121. package/dist/assets/architecture-TIHT7OUA-0NsD2xW1-vpkNSsXO.js +0 -1
  122. package/dist/assets/channel-7wUqSdoX-BmaXSumw.js +0 -1
  123. package/dist/assets/classDiagram-OUVF2IWQ-BYlRi6YQ-jw8dvfs2.js +0 -1
  124. package/dist/assets/classDiagram-v2-EOCWNBFH-BCHaYHxj-jw8dvfs2.js +0 -1
  125. package/dist/assets/cynefin-VYW2F7L2-CGYr2F6h-Bb2l8CKT.js +0 -1
  126. package/dist/assets/eventmodeling-45OFAUF4-CWmqhm3a-CV0AXWMH.js +0 -1
  127. package/dist/assets/flowDiagram-23GEKE2U-DKSB5AiY-BzXDVc32.js +0 -1
  128. package/dist/assets/gitGraph-TEB2WS4Q-BR9qPwdN-DePJCG9u.js +0 -1
  129. package/dist/assets/index-Cdf9kaYt.css +0 -1
  130. package/dist/assets/info-DKCQHKI2-Dplx5kMp-CmgoBoly.js +0 -1
  131. package/dist/assets/packet-7NZHBO7P-CQI3flND-Ckhq3qGx.js +0 -1
  132. package/dist/assets/pie-RZYD4A2V-CnmKE2Wa-COGnIXXn.js +0 -1
  133. package/dist/assets/radar-I7S5WNFK-us6x-Z9R-DYVN7hVv.js +0 -1
  134. package/dist/assets/railroad-3IZDKUUU-BKdz6pdN-Ccr316bA.js +0 -1
  135. package/dist/assets/railroad-abnf-AHOZXSZD-m_CSSIfd-1lHKiwjs.js +0 -1
  136. package/dist/assets/railroad-ebnf-EBAXGLYW-Nu3nAG7C-CDsiITOB.js +0 -1
  137. package/dist/assets/railroad-peg-LSFZ7HO6--Y3mD4R_-BVRC2yH2.js +0 -1
  138. package/dist/assets/stateDiagram-v2-6OUMAXLB-CuzgCL2v-CC7z1AQz.js +0 -1
  139. package/dist/assets/swimlanesDiagram-G3AALYLV-3bmSBtKs-i5S7soVG.js +0 -8
  140. package/dist/assets/treeView-QDETBFTQ-D27HWG6Q-DnDVKvX3.js +0 -1
  141. package/dist/assets/treemap-6X3UGDF4-CmGIU3H5-Dkb6cQ10.js +0 -1
  142. package/dist/assets/wardley-OPB4EBWU-CbHWsb2k-Za38PV_G.js +0 -1
package/README.md CHANGED
@@ -88,9 +88,9 @@ question — an amber dot; nothing proceeds until you answer) and which are **fi
88
88
  you haven't seen** (a green dot) — driven by Claude/Codex activity hooks the server injects per
89
89
  spawn. The horizontal tab bar carries the same two dots.
90
90
 
91
- ![One agent enlarged, with the cockpit roster beside it](https://raw.githubusercontent.com/receptron/mulmoterminal/main/docs/guide/images/cockpit-roster.png)
91
+ ![One agent zoomed, with the GUI panel beside it](https://raw.githubusercontent.com/receptron/mulmoterminal/main/docs/guide/images/zoom-canvas.png)
92
92
 
93
- *To focus on one agent, **zoom its cell**: it takes the window, and a pane opens beside it — the **cockpit roster** above, or the **GUI panel** ("Canvas"), where that agent's tool calls render as documents, forms, charts, images, and HTML rather than printed text. **The app opens on the grid** (`/`, settling on `/terminals`), which is the only view; 3.x had a separate single view at `/chat` and 4.0.0 removed it, so that URL now lands on the grid like any other.*
93
+ *To focus on one agent, **zoom its cell**: it takes the window, and the **GUI panel** ("Canvas") opens beside it, where that agent's tool calls render as documents, forms, charts, images, and HTML rather than printed text. **The app opens on the grid** (`/`, settling on `/terminals`), which is the only view; 3.x had a separate single view at `/chat` and 4.0.0 removed it, so that URL now lands on the grid like any other.*
94
94
 
95
95
  **Inserting a file path** — like a native terminal, you can put a file's absolute path into
96
96
  the prompt: **drag a file** onto the terminal, or click the **file button** in the terminal
@@ -204,11 +204,17 @@ more.
204
204
 
205
205
  Needs **Node ≥ 22.9**, plus these CLIs on your `PATH`:
206
206
 
207
+ > **Never installed any of this before?** The guide walks it end to end, macOS and Windows,
208
+ > assuming no command-line experience:
209
+ > [Getting started](https://receptron.github.io/mulmoterminal/guide/en/getting-started.html) ·
210
+ > [はじめに — 起動するまで](https://receptron.github.io/mulmoterminal/guide/ja/getting-started.html)
211
+
207
212
  | | Tool | What it gives you | Install |
208
213
  | --- | --- | --- | --- |
209
214
  | **Required** | [`claude`](https://claude.com/claude-code) | every Claude session — this app is a cockpit for it | `npm i -g @anthropic-ai/claude-code`, then run `claude` once to log in |
210
215
  | **Required** | `git` | [worktree isolation](#git-worktrees--pull-requests), each cell's branch / unsaved-dot / diff readout, the PR footer | `brew install git` · `sudo apt install git` · `sudo dnf install git` · Windows: [git-scm.com](https://git-scm.com/download/win) |
211
216
  | **Required** | `gh` | the cross-repo **PRs & Issues** view and one-click PR creation — it uses your `gh` login, so no token is stored | [cli.github.com](https://cli.github.com), then `gh auth login` |
217
+ | Optional | `glab` | the same for **gitlab.com** projects (#981). Same arrangement: the CLI holds the credentials, this app stores no token | `brew install glab`, then `glab auth login` |
212
218
  | Recommended | `tmux` | [session persistence](#session-persistence-tmux) — terminals survive a server restart | `brew install tmux` · `sudo apt install tmux` · `sudo dnf install tmux` · no native Windows build (falls back to plain PTYs) |
213
219
  | Optional | `codex` | [Codex sessions](#agents-claude--codex) in a cell, alongside Claude | `npm i -g @openai/codex` |
214
220
  | Optional | `ffmpeg` | video rendering from the [mulmo-script panel](#wiki-collections--the-gui-panel) (its plugin ships enabled) | `brew install ffmpeg` · `sudo apt install ffmpeg` · `sudo dnf install ffmpeg` |
@@ -536,7 +542,7 @@ The Settings modal (⚙) persists per-user UI choices to `~/.mulmoterminal/confi
536
542
  | `soundFile` | Absolute path to a custom **attention sound**, the fallback for every kind. Empty/unset uses the built-in synthesized chime. |
537
543
  | `soundKinds` | Which moments beep — see [Notification sounds](#notification-sounds). Defaults to `["finished","waiting"]`; the other kinds are opt-in. |
538
544
  | `sounds` | Per-kind sound: `{ "waiting": "preset:coin" }`. A `preset:<id>` reference or an absolute path; a kind with no entry falls back to `soundFile`. |
539
- | `prRepos` | `owner/repo` entries whose open PRs/issues the cross-repo **PRs & Issues** view aggregates (via your `gh` login). An entry may name its host (`gitlab.com/group/project`); only github.com is read today, and other hosts show a row saying so. |
545
+ | `prRepos` | `owner/repo` entries whose open PRs/issues the cross-repo **PRs & Issues** view aggregates, using whichever CLI the host needs — your own `gh` or `glab` login, so no token is stored here. An entry may name its host — `gitlab.com/group/project` is read with `glab`, and work can be started on it, commented on and turned into a merge request. A host that is neither shows a row saying so. |
540
546
  | `repoDirs` | `{ "owner/repo": "/abs/path" }` — which local clone work on a repo starts in, when you keep several side by side. Only the *choice* is stored; which clones exist is re-derived from `cwdPresets` on every read, and an entry that no longer names a clone of that repo is ignored. |
541
547
  | `launchers` | `{ label, command }` entries offered in a grid cell's launcher besides the agents — any interactive command. A plain shell needs no entry: the launch form's **Shell** toggle opens `$SHELL` unconfigured. |
542
548
  | `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` (`"claude"` / `"codex"` / `"shell"`) scopes a chip to session kinds — omit it to offer the chip everywhere. Empty by default. |
@@ -962,7 +968,7 @@ Closing a worktree cell asks whether to **keep** the worktree or **discard & rem
962
968
 
963
969
  **PRs & Issues (cross-repo).** The toolbar's **Pull requests** button opens a full-screen
964
970
  view that aggregates open PRs **and** issues across the repos listed in Settings →
965
- **Pull request repos** (`prRepos`, `owner/repo` entries) via your server-side `gh` login.
971
+ **Pull request repos** (`prRepos`, `owner/repo` entries, or `gitlab.com/group/project`) via your server-side `gh` / `glab` login.
966
972
  PRs show a CI-rollup / review-decision / draft badge; each repo lists its latest open
967
973
  issues. Rows are real links, per-repo errors don't sink the view, and the two lists load
968
974
  independently. Backed by `GET /api/prs` and `GET /api/issues`.
@@ -1303,7 +1309,7 @@ same-origin-guarded.
1303
1309
  | `POST /api/git-remote` | The dir's GitHub repo URL (for the header GitHub menu). |
1304
1310
  | `GET /api/worktrees?cwd=` · `GET /api/worktrees/diff?cwd=` | List managed worktrees / diff one vs its base. |
1305
1311
  | `POST /api/worktrees/create` · `/remove` · `/push` · `/pr` | Create on `agent/<slug>` — or, with `issue: <N>`, on `issue/<N>-<slug>` forked from a freshly fetched `origin/<base>`; remove (managed root only), push, open a PR (`gh`, else compare URL). |
1306
- | `GET /api/prs` · `GET /api/issues` | Open PRs / issues across the configured `prRepos` (via `gh`). |
1312
+ | `GET /api/prs` · `GET /api/issues` | Open PRs / issues across the configured `prRepos` — `gh` for github.com entries, `glab` for `gitlab.com/...` ones. |
1307
1313
  | `GET /api/repo-dirs` | Which saved directories clone which GitHub repo, ordered, with the recorded choice per repo. |
1308
1314
  | `POST /api/issues/start` | Cut an issue's worktree in one of that repo's known clones and spawn a session there, seeded with the issue as a draft. |
1309
1315
  | `GET /api/github/star` · `POST /api/github/star` | Whether you have starred MulmoTerminal, and star it (via `gh`). `starred: null` means `gh` could not answer, and hides the button. |
@@ -1652,7 +1658,7 @@ server/
1652
1658
  session/ per-session transcript/activity/cost: transcript.ts,
1653
1659
  session-resolve.ts, activity-*.ts, cost.ts,
1654
1660
  command-summary.ts, terminal-replay.ts, file-cache.ts
1655
- git/ git & GitHub (via gh) + worktrees: git-status.ts, gitRemote.ts,
1661
+ git/ git, GitHub (gh) and GitLab (glab) + worktrees: git-status.ts, gitRemote.ts,
1656
1662
  gh.ts, prs.ts, issues.ts, pr-for-branch.ts, worktrees.ts, worktree-*.ts
1657
1663
  files/ files-browse.ts (contained tree read/write), pick-file.ts,
1658
1664
  open-dir.ts, scripts.ts (Run-menu script.json loader)
@@ -85,6 +85,15 @@ function claudeInstalled() {
85
85
  const PATH_TOOLS = [
86
86
  { cmd: "git", versionArg: "--version", required: true, why: "worktrees, per-cell branch/diff, PR footer", hint: "brew install git · apt install git" },
87
87
  { cmd: "gh", versionArg: "--version", required: true, why: "PRs & Issues view + one-click PRs", hint: "https://cli.github.com (then: gh auth login)" },
88
+ // Optional rather than a second required tool: github.com is what the app is built around, and a
89
+ // user with no GitLab project should not be told they are missing something (#981).
90
+ {
91
+ cmd: "glab",
92
+ versionArg: "--version",
93
+ required: false,
94
+ why: "the PRs & Issues view for gitlab.com projects",
95
+ hint: "brew install glab (then: glab auth login)",
96
+ },
88
97
  { cmd: "tmux", versionArg: "-V", required: false, why: "sessions survive a restart", hint: "brew install tmux · apt install tmux" },
89
98
  { cmd: "codex", versionArg: "--version", required: false, why: "run OpenAI Codex as an agent", hint: "npm install -g @openai/codex" },
90
99
  {
package/common/prPhase.ts CHANGED
@@ -24,9 +24,26 @@ export interface WorkItem {
24
24
  // list above all, where "#987" alone says nothing about which request is running (#1014).
25
25
  prTitle: string | null;
26
26
  issueTitle: string | null;
27
+ // WHY a request that is open and not obviously failing still cannot merge. GitLab collapses into
28
+ // one `detailed_merge_status` what GitHub splits across `isDraft`, `reviewDecision` and the check
29
+ // rollup, and three of its values — approvals outstanding, unresolved discussions, blocked by
30
+ // another request — have no home in `PrPhase`. Forcing them into `ready` would call something
31
+ // unmergeable ready, and into `changes-requested` would invent a review nobody left.
32
+ //
33
+ // Always null on GitHub, whose phases say everything there is to say (#981).
34
+ blockedReason: string | null;
27
35
  }
28
36
 
29
- export const EMPTY_WORK_ITEM: Readonly<WorkItem> = { phase: "none", pr: null, prUrl: null, issue: null, issueUrl: null, prTitle: null, issueTitle: null };
37
+ export const EMPTY_WORK_ITEM: Readonly<WorkItem> = {
38
+ phase: "none",
39
+ pr: null,
40
+ prUrl: null,
41
+ issue: null,
42
+ issueUrl: null,
43
+ prTitle: null,
44
+ issueTitle: null,
45
+ blockedReason: null,
46
+ };
30
47
 
31
48
  // One line for a surface with room for one: what the work is FOR beats what was done about it, so
32
49
  // the issue's title wins when there is one. Null when neither side has a title to show.
@@ -69,7 +69,9 @@ export interface CustomThemeInput {
69
69
 
70
70
  /** The full variable set for a theme: the base it extends, with its own colours on top.
71
71
  * `builtins` supplies the base sets so this stays pure — the client reads them from the
72
- * stylesheet's source of truth, the specs from a fixture. */
72
+ * stylesheet's source of truth, the specs from a fixture. PARTIAL because a base can genuinely be
73
+ * missing (a stylesheet read that found no block for that id), and the `?? {}` below has always
74
+ * handled that — the map only ever needed one key, never all of them. */
73
75
  // Every variable present, which is what separates a set we can paint with from one we cannot.
74
76
  // A guard rather than a length check on the missing keys: both ask the same question, but only
75
77
  // this one hands the answer to the compiler.
@@ -77,7 +79,7 @@ function isCompleteThemeVars(vars: Partial<ThemeVars>): vars is ThemeVars {
77
79
  return THEME_VAR_KEYS.every((key) => !!vars[key]);
78
80
  }
79
81
 
80
- export function resolveThemeVars(theme: CustomThemeInput, builtins: Record<ThemeId, ThemeVars>): ThemeVars | null {
82
+ export function resolveThemeVars(theme: CustomThemeInput, builtins: Partial<Record<ThemeId, ThemeVars>>): ThemeVars | null {
81
83
  const base = theme.extends ? builtins[theme.extends] : null;
82
84
  const merged: Partial<ThemeVars> = { ...(base ?? {}), ...theme.colors };
83
85
  // No base and an incomplete list is the one case we cannot paint: report it rather than
@@ -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-XDB5rg1G.js";import"./chunk-WYO6CB5R-BlzOfotS-D5Vl4QYq.js";import"./chunk-VAUOI2AC-CS9QJ4yz-DW0Tgecw.js";import{n as i,r as a,t as o}from"./chunk-MOJQB5TN-CMZRaeqt-pTxGJtb7.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-akMN_vOP.js";import"./chunk-WYO6CB5R-BlzOfotS-CeZxJxL0.js";import"./chunk-VAUOI2AC-CS9QJ4yz-BZe0Q9XX.js";import{n as i,r as a,t as o}from"./chunk-MOJQB5TN-CMZRaeqt-DcPt_trW.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-akMN_vOP.js";export{e as createArchitectureServices};