mulmoterminal 4.26.0 → 4.27.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.
- package/README.md +12 -0
- package/common/collectionRefresh.ts +34 -0
- package/common/keymap.ts +12 -1
- package/common/themeColors.ts +17 -0
- package/common/themeVars.ts +20 -2
- package/dist/assets/{AllPackages-B1YCJRYB-kggoNw6z.js → AllPackages-B1YCJRYB-D1H--dDi.js} +1 -1
- package/dist/assets/{BaseConfiguration-B6s_tKOW-RQzsRUNx.js → BaseConfiguration-B6s_tKOW-NM1em0z-.js} +1 -1
- package/dist/assets/{Element-BMI7Nj5w-BP5E_zl7.js → Element-BMI7Nj5w-D60lwUcy.js} +1 -1
- package/dist/assets/{Entities-C8p_0jCn-C-_0T6vJ.js → Entities-C8p_0jCn-CRrh9My2.js} +1 -1
- package/dist/assets/{FunctionList-YWk54TCy-DyxSzbCI.js → FunctionList-YWk54TCy-DxlXvxS1.js} +1 -1
- package/dist/assets/{InputJax-C5dj-ntL-BtwdMizb.js → InputJax-C5dj-ntL-DMM7A5J_.js} +1 -1
- package/dist/assets/{MathItem-YJvQL-XJ-CeeATAwp.js → MathItem-YJvQL-XJ-DjZ8sLcx.js} +1 -1
- package/dist/assets/{MmlFactory-DSoKkE7s-CYu-aCTG.js → MmlFactory-DSoKkE7s-BVH8BvMO.js} +1 -1
- package/dist/assets/{Options-oARQeeuT-TJSj2iQR.js → Options-oARQeeuT-CeIzK2vQ.js} +1 -1
- package/dist/assets/{OutputJax-DfUZNNCu-oLxtQ_g0.js → OutputJax-DfUZNNCu-BipoI_Vx.js} +1 -1
- package/dist/assets/{PrioritizedList-6lun1Xqd-D4eZQDMF.js → PrioritizedList-6lun1Xqd-CkxjdTLH.js} +1 -1
- package/dist/assets/{Styles-5NmwS-3M-B9XVBSSq.js → Styles-5NmwS-3M-CuS-cAHH.js} +1 -1
- package/dist/assets/{TeXAtom-B5ni9myz-B3RMDIY5.js → TeXAtom-B5ni9myz-jvVqbY5R.js} +1 -1
- package/dist/assets/{abnfDiagram-VCTEODGH-BGhi-oVb-DQZhwQSy.js → abnfDiagram-VCTEODGH-BGhi-oVb-DdAoBuDS.js} +1 -1
- package/dist/assets/{arc-CK5ru50N-CnsmPLzy.js → arc-CK5ru50N-ByhquzQA.js} +1 -1
- package/dist/assets/architecture-7GRP2DOG-otSkCkT5-Zckz-s0E.js +1 -0
- package/dist/assets/{architectureDiagram-5GKGNRK7-ELuPYMlf-Ci2fG9OM.js → architectureDiagram-5GKGNRK7-ELuPYMlf-BMar3__r.js} +1 -1
- package/dist/assets/{assistive-mml-CdU3rUpx-PFS2LrE8.js → assistive-mml-CdU3rUpx-CvEGUtQr.js} +1 -1
- package/dist/assets/{blockDiagram-I7D4REHJ-BZ7-OGWQ-iSiAD4OV.js → blockDiagram-I7D4REHJ-BZ7-OGWQ-CzYqZh-X.js} +1 -1
- package/dist/assets/{c4Diagram-7LVT6UL2-DCovPZ_4-DLrbYW62.js → c4Diagram-7LVT6UL2-DCovPZ_4-DVY6zyiz.js} +1 -1
- package/dist/assets/channel-Bmu_OOc6-Dl37yKXs.js +1 -0
- package/dist/assets/{chunk-4HAMMTFA-DqpzLmar-Begag6kK.js → chunk-4HAMMTFA-DqpzLmar-7_4tQ0bg.js} +1 -1
- package/dist/assets/{chunk-75Z2AOVW-CT5TYzp5-Che06AJn.js → chunk-75Z2AOVW-CT5TYzp5-CXC4AdVC.js} +1 -1
- package/dist/assets/{chunk-DU6HZSFF-BVf-rtdf-BY6ORnqO.js → chunk-DU6HZSFF-BVf-rtdf-B3kg-yCL.js} +1 -1
- package/dist/assets/{chunk-F27PBJKO-rP8pUsk3-DnQrEHyt.js → chunk-F27PBJKO-rP8pUsk3-BfNwyFPK.js} +1 -1
- package/dist/assets/{chunk-IMKFNOWR-D_IT0r3G-CZbWs1tw.js → chunk-IMKFNOWR-D_IT0r3G-C9_8s332.js} +1 -1
- package/dist/assets/{chunk-POPQ4Y6H-C5YURnHe-Pr-7cHNE.js → chunk-POPQ4Y6H-C5YURnHe-eTW1aY6b.js} +1 -1
- package/dist/assets/{chunk-SHT3W25Y-CfF0J8Qh-BjabP1RZ.js → chunk-SHT3W25Y-CfF0J8Qh-v6mzVzMd.js} +1 -1
- package/dist/assets/{chunk-SVP7TREG-CTZbRIbX-B_MoCNpo.js → chunk-SVP7TREG-CTZbRIbX-RW-t42ub.js} +1 -1
- package/dist/assets/{chunk-TICWLB2K-DP1lYmZm-DBUczLZh.js → chunk-TICWLB2K-DP1lYmZm-7dMJ2TPj.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-vg0kfC73-D9SGVKJn.js → chunk-XXDRQBXY-vg0kfC73-DuFfjK1v.js} +1 -1
- package/dist/assets/classDiagram-ZZMXUADV-BDQOAOBf-DSv4U5yn.js +1 -0
- package/dist/assets/classDiagram-v2-VYDZK3BY-CwPXtzoF-DSv4U5yn.js +1 -0
- package/dist/assets/{cose-bilkent-JH36ORCC-qIiD3RGD-BUItDgWJ.js → cose-bilkent-JH36ORCC-qIiD3RGD-DrmynCpE.js} +1 -1
- package/dist/assets/cynefin-OW5HDTMX-Xr6IPdZG-BOI4Ydck.js +1 -0
- package/dist/assets/{cynefinDiagram-5FMLGOSQ-BZrUCS-v-Vi8fZx7J.js → cynefinDiagram-5FMLGOSQ-BZrUCS-v-CKIcLifI.js} +1 -1
- package/dist/assets/{dagre-C2SZ8h4o-BotF2A9M.js → dagre-C2SZ8h4o-DcuFxdj9.js} +1 -1
- package/dist/assets/{dagre-GXQ25YYZ-CQcLM4na-DqruNADY.js → dagre-GXQ25YYZ-CQcLM4na-DHXn50pv.js} +1 -1
- package/dist/assets/{diagram-S7CK7UJ4-BdmcmUQh-BpurSv4a.js → diagram-S7CK7UJ4-BdmcmUQh-CPCAAKMD.js} +1 -1
- package/dist/assets/{diagram-UQ7AKVKN-BtvmEiYl-XHbHkO0x.js → diagram-UQ7AKVKN-BtvmEiYl-aA6cOCqA.js} +1 -1
- package/dist/assets/{diagram-VSXAHHWV-qEG6N0bV-Cr5ut8_j.js → diagram-VSXAHHWV-qEG6N0bV-DCHB2hTq.js} +1 -1
- package/dist/assets/{diagram-VX7I27RA-BA8is49N-Bq5gY7-i.js → diagram-VX7I27RA-BA8is49N-DOwC18Z0.js} +1 -1
- package/dist/assets/{diagram-Z3DM3KII-XPcU7IOQ-C0yHj4hB.js → diagram-Z3DM3KII-XPcU7IOQ-C9RPVYC4.js} +1 -1
- package/dist/assets/{dist-BIvNvTDO.js → dist-Bi70Jy-b.js} +1 -1
- package/dist/assets/{dist-OM0ZTf3D.js → dist-CXGYSqlO.js} +1 -1
- package/dist/assets/{dist-DgKptpvT.js → dist-CZghBWKw.js} +1 -1
- package/dist/assets/{dist-BwEUG-6y.js → dist-Cb59cZDS.js} +1 -1
- package/dist/assets/{dist-wMJX53du.js → dist-D2QMLIZp.js} +1 -1
- package/dist/assets/{dist-BP4I4Ek8.js → dist-D3PmXl_m.js} +1 -1
- package/dist/assets/{dist-DeiyD9Ki-CG6FY-Fn.js → dist-DeiyD9Ki-CJ4cIe6S.js} +1 -1
- package/dist/assets/{dist-CBAuHlC8.js → dist-Gt7_-BLP.js} +1 -1
- package/dist/assets/{dist-CoNrzCGM.js → dist-fO6jnnrd.js} +1 -1
- package/dist/assets/{dist-BNoLRzs-.js → dist-v-Rpnm_y.js} +1 -1
- package/dist/assets/{dist-Fs7Cl-b9.js → dist-wvHglY68.js} +1 -1
- package/dist/assets/{ebnfDiagram-PWID7BFC-CTHIHdBS-BJwIOuLO.js → ebnfDiagram-PWID7BFC-CTHIHdBS-DHkqIR3N.js} +1 -1
- package/dist/assets/{erDiagram-RLTQ6QDP-DVpWTNZj-D8m4MgiI.js → erDiagram-RLTQ6QDP-DVpWTNZj-C3lwqnXe.js} +1 -1
- package/dist/assets/eventmodeling-NTZA5JFV-B7bRrpt_-aX72rk9t.js +1 -0
- package/dist/assets/flowDiagram-HODETNUW-r-3T5g30-BJR3huwZ.js +1 -0
- package/dist/assets/{ganttDiagram-EL5Y4UJY-BfAgk15F-0jMcI0Yj.js → ganttDiagram-EL5Y4UJY-BfAgk15F-2NYwYOby.js} +1 -1
- package/dist/assets/gitGraph-4MIJSDKK-BhzSx5wq-D7vu6KLb.js +1 -0
- package/dist/assets/{gitGraphDiagram-WWUBYQGX-DEVVZ6wt-CawiFyGd.js → gitGraphDiagram-WWUBYQGX-DEVVZ6wt-k0BkI3nD.js} +1 -1
- package/dist/assets/{graphlib-BYLhHyYO-CEk4IQ-f.js → graphlib-BYLhHyYO-Bdiyyely.js} +1 -1
- package/dist/assets/{html-Z7dGbczU-BwxpBy6_.js → html-Z7dGbczU-BTiRsVw0.js} +1 -1
- package/dist/assets/{index-D7Oh_lqc.js → index-6GNSSCav.js} +325 -379
- package/dist/assets/index-C4KnFBMJ.css +1 -0
- package/dist/assets/info-A6RAGUB7-fR2SUJmJ-CeXI1IP4.js +1 -0
- package/dist/assets/{infoDiagram-27XIBGKW-CvHUhAHd-Y8J_Kc2X.js → infoDiagram-27XIBGKW-CvHUhAHd-CrTJpCqo.js} +1 -1
- package/dist/assets/{ishikawaDiagram-5VMMS53U-CeqyKdwk-q6ZNkcwN.js → ishikawaDiagram-5VMMS53U-CeqyKdwk-eDLXPEBD.js} +1 -1
- package/dist/assets/{journeyDiagram-3NMN7TZE-Jfi7MPDi-Bv6pv8wY.js → journeyDiagram-3NMN7TZE-Jfi7MPDi-CvhaSk4y.js} +1 -1
- package/dist/assets/{kanban-definition-UXKFOSKX-yOrlojns-B2y6NbLe.js → kanban-definition-UXKFOSKX-yOrlojns-C2SZht6T.js} +1 -1
- package/dist/assets/{lengths-CvmPfBid-CBfhrPT6.js → lengths-CvmPfBid-DqArahpv.js} +1 -1
- package/dist/assets/{linear-jdmEy-qs-oCunWRsH.js → linear-jdmEy-qs-Cv8NGHBd.js} +1 -1
- package/dist/assets/{liteAdaptor-pH5MXTG0-BY38m-jj.js → liteAdaptor-pH5MXTG0-B1LIDixs.js} +1 -1
- package/dist/assets/material-symbols-outlined-DhPLOrnb.woff2 +0 -0
- package/dist/assets/{mathjax-DVEo4UYj-C7BTzxwK.js → mathjax-DVEo4UYj-CTQSsbqK.js} +1 -1
- package/dist/assets/{mermaid-parser.core-CzBW8Fof-CixE9zmB.js → mermaid-parser.core-CzBW8Fof-BTOBTXVI.js} +2 -2
- package/dist/assets/{mermaid.core-Dv4uylek-Djmx6tFE.js → mermaid.core-Dv4uylek-CwMi65mG.js} +4 -4
- package/dist/assets/{mindmap-definition-YA3MSWOX-DP_2R9Ga-kTAulFVa.js → mindmap-definition-YA3MSWOX-DP_2R9Ga-BJ9md154.js} +1 -1
- package/dist/assets/{mo-Xv_6CC7A-CcvkyIE0.js → mo-Xv_6CC7A-YT1Ep9ep.js} +1 -1
- package/dist/assets/packet-AYTQ26CC-B_oKR9KZ-BTHvzsvA.js +1 -0
- package/dist/assets/{pegDiagram-XKGWAZYB-BsBWryhi-BiG1mp1T.js → pegDiagram-XKGWAZYB-BsBWryhi-DcmWmYCC.js} +1 -1
- package/dist/assets/pie-WAS4IAKB-D1ZXrN1W-D2lL43qt.js +1 -0
- package/dist/assets/{pieDiagram-E7YTZNPT-OugkS2pU-C5WoCQDp.js → pieDiagram-E7YTZNPT-OugkS2pU-cVOrSsmv.js} +1 -1
- package/dist/assets/{quadrantDiagram-AXDQQJYC-DXEAAaUE-U0asGLtC.js → quadrantDiagram-AXDQQJYC-DXEAAaUE-CJ7E8xF3.js} +1 -1
- package/dist/assets/radar-RG4KPBEZ-BmUgDkiH-C-pMUxsI.js +1 -0
- package/dist/assets/railroad-74A4TZTK-6lEXVJo8-D0K7WIF_.js +1 -0
- package/dist/assets/railroad-abnf-HS5TGJTU-BG28Qiz1-BwwZFdLC.js +1 -0
- package/dist/assets/railroad-ebnf-LZEXJU2U-DzpHhtTH-DEXLsLfR.js +1 -0
- package/dist/assets/railroad-peg-WCYAUIDC-B2CHCTyG-CIIHCbpi.js +1 -0
- package/dist/assets/{railroadDiagram-O6MQD6OU-BJys8O96-Dcm_CJA0.js → railroadDiagram-O6MQD6OU-BJys8O96-0MKi1nlY.js} +1 -1
- package/dist/assets/{requirementDiagram-BXWQKSXE-BaDgCtM5-BFyzmV4B.js → requirementDiagram-BXWQKSXE-BaDgCtM5-Dh9naf1P.js} +1 -1
- package/dist/assets/{sankeyDiagram-P5KCCOFB-puZsr_vK-CTerarXU.js → sankeyDiagram-P5KCCOFB-puZsr_vK-DnFp1pF-.js} +1 -1
- package/dist/assets/{sequenceDiagram-WJ2MYXX4-D1ziEryC-Dk_Vh7EW.js → sequenceDiagram-WJ2MYXX4-D1ziEryC-QyuuTtv6.js} +1 -1
- package/dist/assets/{src-CLC0ddSd-dG3DpXd2.js → src-CLC0ddSd-DaM5Q5tg.js} +1 -1
- package/dist/assets/{stateDiagram-D77RDMKH-HSEurT6h-CpOTqfOS.js → stateDiagram-D77RDMKH-HSEurT6h-CqWtYwN6.js} +1 -1
- package/dist/assets/stateDiagram-v2-MP3YSRHH-DnOa-Otc-DqMPmDPL.js +1 -0
- package/dist/assets/{svg-D_RYJvQC-C4pZWbZ-.js → svg-D_RYJvQC-T-beFXEZ.js} +1 -1
- package/dist/assets/{swimlanes-42K2YHIH-umBsuvsI-C-uZTY-8.js → swimlanes-42K2YHIH-umBsuvsI-CBrrgPel.js} +1 -1
- package/dist/assets/swimlanesDiagram-VR7AAH4N-ZLUyNmnU-Bew5AEPR.js +8 -0
- package/dist/assets/{tex-Dx2UJ3VU-Ch7WPvt4.js → tex-Dx2UJ3VU-tBwETaM2.js} +1 -1
- package/dist/assets/{timeline-definition-24CTP7MA-D9plt22Y-BgXy-Pja.js → timeline-definition-24CTP7MA-D9plt22Y-XpXWZKjL.js} +1 -1
- package/dist/assets/treeView-Q6P3EWNA-BdvZ0_C5-BheZ-W3N.js +1 -0
- package/dist/assets/treemap-WGGIJYW6-CIJLPQlC-Cjamu2ad.js +1 -0
- package/dist/assets/{vennDiagram-4TSXK5OY-DZe7wY85-HHFNkULb.js → vennDiagram-4TSXK5OY-DZe7wY85-BX7eqUQe.js} +1 -1
- package/dist/assets/wardley-WFR3VGLG-CKqtFD8V-BhmuAvdu.js +1 -0
- package/dist/assets/{wardleyDiagram-VM6X3IG4-DK9yytWx-qeOMmNlR.js → wardleyDiagram-VM6X3IG4-DK9yytWx-Dwg2gU8u.js} +1 -1
- package/dist/assets/{xychartDiagram-S5SC5T6Z-CLSO4Pc9-DLpk6ryk.js → xychartDiagram-S5SC5T6Z-CLSO4Pc9-D0s7XGBw.js} +1 -1
- package/dist/index.html +3 -3
- package/package.json +9 -9
- package/server/backends/calendarRefresh.ts +37 -0
- package/server/backends/calendarRefreshResult.ts +40 -0
- package/server/backends/feeds.ts +40 -9
- package/server/backends/sharedApp/headlessPreview.ts +46 -4
- package/server/config/config-schema.ts +6 -3
- package/server/files/files-browse.ts +14 -0
- package/server/files/project-files.ts +222 -0
- package/server/skills/mulmoterminal-dirs/SKILL.md +3 -1
- package/server/skills/mulmoterminal-keys/SKILL.md +6 -0
- package/server/skills/mulmoterminal-theme/SKILL.md +49 -7
- package/dist/assets/architecture-7GRP2DOG-otSkCkT5-CFnWjMcA.js +0 -1
- package/dist/assets/channel-Bmu_OOc6-CLX7xRxl.js +0 -1
- package/dist/assets/classDiagram-ZZMXUADV-BDQOAOBf-CH44RAkG.js +0 -1
- package/dist/assets/classDiagram-v2-VYDZK3BY-CwPXtzoF-CH44RAkG.js +0 -1
- package/dist/assets/cynefin-OW5HDTMX-Xr6IPdZG-Ce8mYJyA.js +0 -1
- package/dist/assets/eventmodeling-NTZA5JFV-B7bRrpt_-DnpJhuuA.js +0 -1
- package/dist/assets/flowDiagram-HODETNUW-r-3T5g30-BWizd0qT.js +0 -1
- package/dist/assets/gitGraph-4MIJSDKK-BhzSx5wq-BmNB3hui.js +0 -1
- package/dist/assets/index-BJzCebxZ.css +0 -1
- package/dist/assets/info-A6RAGUB7-fR2SUJmJ-DJ6qtBt_.js +0 -1
- package/dist/assets/material-symbols-outlined-Dp0GkOHZ.woff2 +0 -0
- package/dist/assets/packet-AYTQ26CC-B_oKR9KZ-Pi3e-tAz.js +0 -1
- package/dist/assets/pie-WAS4IAKB-D1ZXrN1W-BOglNRvk.js +0 -1
- package/dist/assets/radar-RG4KPBEZ-BmUgDkiH-zXnWiLPM.js +0 -1
- package/dist/assets/railroad-74A4TZTK-6lEXVJo8-CAtjJocL.js +0 -1
- package/dist/assets/railroad-abnf-HS5TGJTU-BG28Qiz1-BzFi41zD.js +0 -1
- package/dist/assets/railroad-ebnf-LZEXJU2U-DzpHhtTH-CFTlT-st.js +0 -1
- package/dist/assets/railroad-peg-WCYAUIDC-B2CHCTyG-uG4QNP6w.js +0 -1
- package/dist/assets/stateDiagram-v2-MP3YSRHH-DnOa-Otc-DgkDdTbh.js +0 -1
- package/dist/assets/swimlanesDiagram-VR7AAH4N-ZLUyNmnU-CxUAVNvR.js +0 -8
- package/dist/assets/treeView-Q6P3EWNA-BdvZ0_C5-VCyiiE1t.js +0 -1
- package/dist/assets/treemap-WGGIJYW6-CIJLPQlC-jg24gWZX.js +0 -1
- package/dist/assets/wardley-WFR3VGLG-CKqtFD8V-hF5yPxTk.js +0 -1
package/README.md
CHANGED
|
@@ -1232,6 +1232,18 @@ The toggle is not the only way in: while a cell is enlarged, **clicking a file p
|
|
|
1232
1232
|
printed** opens it here too, rather than in a new tab or full-screen — see
|
|
1233
1233
|
[Clicking a file path](#clicking-a-file-path).
|
|
1234
1234
|
|
|
1235
|
+
**Open a file by name instead of walking the tree.** The pane's header has a **search** button
|
|
1236
|
+
that opens a finder over it: type part of a file's name or path and it narrows a list of every
|
|
1237
|
+
file in the project — fuzzily, so `fpane` finds `src/components/FilesPane.vue`. Arrow keys and
|
|
1238
|
+
Enter pick one; it opens in the editor **with the tree expanded down to it**, so the files
|
|
1239
|
+
around it are one click away. In a git repository the candidates come from `git ls-files`, so
|
|
1240
|
+
everything your `.gitignore` excludes — `node_modules` and the rest — is never offered; outside
|
|
1241
|
+
one the tree is walked instead: no ignore file is read, and only a short list of directories
|
|
1242
|
+
nobody authors by hand (`node_modules`, virtualenvs, caches) is skipped. The panel says so rather
|
|
1243
|
+
than letting you believe an ignore file was applied. There is also a
|
|
1244
|
+
[`files-find` shortcut](https://receptron.github.io/mulmoterminal/guide/en/config.html#keymap)
|
|
1245
|
+
with no default binding, which opens the pane first if it is closed.
|
|
1246
|
+
|
|
1235
1247
|
All reads and writes go through `GET/PUT /api/files/browse/*?cwd=&path=`, and every
|
|
1236
1248
|
`path` is **contained within the project root** (server-side) — `..`/absolute escapes
|
|
1237
1249
|
are rejected for reads and writes alike, so editing can't reach outside the directory
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// The `POST /api/collections/:slug/refresh` response. One shape for BOTH arms of that
|
|
2
|
+
// route — a declarative/agent feed's `ingest` re-run and a `googleCalendar` sync — because
|
|
3
|
+
// the collection view reads one result whichever arm answered, and two host-side shapes for
|
|
4
|
+
// one button is how a field ends up set by one arm and never read from the other.
|
|
5
|
+
//
|
|
6
|
+
// It mirrors MulmoClaude's `CollectionRefreshBody` (server/api/routes/collectionCalendarRefresh.ts)
|
|
7
|
+
// so the two hosts over the shared workspace answer the same plugin identically. Re-stated
|
|
8
|
+
// rather than imported, for `collectionPush.ts`'s reason: the plugin ships its
|
|
9
|
+
// `CollectionRefreshResult` from `@mulmoclaude/collection-plugin/vue`, and the server has no
|
|
10
|
+
// business pulling a Vue package in to describe its own response.
|
|
11
|
+
//
|
|
12
|
+
// An absent field is an ABSENT KEY, never an explicit `undefined`. That is what the wire carries
|
|
13
|
+
// either way (JSON.stringify drops an undefined value), and under `exactOptionalPropertyTypes` it
|
|
14
|
+
// is also what makes this assignable to the plugin's own `CollectionRefreshResult` — so the
|
|
15
|
+
// binding in `collectionUi.ts` type-checks the server's shape against the view's expectation
|
|
16
|
+
// instead of both sides describing it separately.
|
|
17
|
+
|
|
18
|
+
export interface CollectionRefreshResult {
|
|
19
|
+
/** Always true — "the refresh ran", not "records changed". A refusal is told through
|
|
20
|
+
* `errors`, the way the push's `pushed` works. */
|
|
21
|
+
refreshed: true;
|
|
22
|
+
written: number;
|
|
23
|
+
/** Why the refresh did not do what was asked. Read beside the button, so an empty list is
|
|
24
|
+
* the only thing that means "it worked". */
|
|
25
|
+
errors: string[];
|
|
26
|
+
/** Records a `googleCalendar` sync deleted (the event was cancelled in Google). Sent by the
|
|
27
|
+
* calendar arm only: the feed engine counts its own `maxItems` evictions, but the feed arm
|
|
28
|
+
* has never reported them and MulmoClaude's does not either. */
|
|
29
|
+
removed?: number;
|
|
30
|
+
/** An agent-ingest feed dispatched a worker session instead of writing records itself. */
|
|
31
|
+
dispatched?: boolean;
|
|
32
|
+
/** The dispatched session, for the view to navigate to. */
|
|
33
|
+
chatId?: string;
|
|
34
|
+
}
|
package/common/keymap.ts
CHANGED
|
@@ -22,6 +22,7 @@ export const KEYMAP_ACTIONS = [
|
|
|
22
22
|
"terminal-new-adjacent",
|
|
23
23
|
"terminal-close",
|
|
24
24
|
"terminal-restart",
|
|
25
|
+
"files-find",
|
|
25
26
|
"copy",
|
|
26
27
|
"paste",
|
|
27
28
|
] as const;
|
|
@@ -49,7 +50,17 @@ export const TERMINAL_SCOPED_ACTIONS: readonly KeymapAction[] = ["copy", "paste"
|
|
|
49
50
|
// Here rather than beside gridShortcutFor because BOTH sides decide from it: the grid dispatches on
|
|
50
51
|
// it, and validateKeymap has to know that these decline the key — the handler returns WITHOUT
|
|
51
52
|
// stopping the event, so a `send` on the same keystroke fires instead (codex on #1906).
|
|
52
|
-
|
|
53
|
+
// `files-find` is here because the pane it opens exists only in the ENLARGED row (see
|
|
54
|
+
// docs/grid-view-modes.md) — a tiled grid has nowhere to put it, so the key declines rather than
|
|
55
|
+
// guessing which of nine terminals was meant.
|
|
56
|
+
export const NEEDS_A_CURRENT_TERMINAL: readonly KeymapAction[] = [
|
|
57
|
+
"zoom-next",
|
|
58
|
+
"zoom-prev",
|
|
59
|
+
"terminal-new-adjacent",
|
|
60
|
+
"terminal-close",
|
|
61
|
+
"terminal-restart",
|
|
62
|
+
"files-find",
|
|
63
|
+
];
|
|
53
64
|
|
|
54
65
|
// A key that puts BYTES into the focused terminal instead of running an app action (#1005) —
|
|
55
66
|
// Cmd+Right as Ctrl+E for end-of-line, say, or Alt+B for word-back.
|
package/common/themeColors.ts
CHANGED
|
@@ -28,3 +28,20 @@ export const THEME_COLOR_KEYS = [
|
|
|
28
28
|
"brightCyan",
|
|
29
29
|
"brightWhite",
|
|
30
30
|
] as const;
|
|
31
|
+
|
|
32
|
+
export type ThemeColorKey = (typeof THEME_COLOR_KEYS)[number];
|
|
33
|
+
|
|
34
|
+
/** What a palette colour may look like: xterm accepts `#rgb` / `#rgba` / `#rrggbb` / `#rrggbbaa`.
|
|
35
|
+
* Here rather than in the server schema because BOTH sides check it — the server rejects a config
|
|
36
|
+
* on it, and the client re-checks the response before the value reaches a canvas. Two copies of
|
|
37
|
+
* this pattern is how one side ends up accepting what the other drops. */
|
|
38
|
+
export const PALETTE_COLOR_RE = /^#([0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;
|
|
39
|
+
|
|
40
|
+
/** STRICT — surrounding whitespace is a reject, not something to trim away. The server's
|
|
41
|
+
* `paletteColor` trims before it matches and hands back the trimmed value, so everything this
|
|
42
|
+
* predicate legitimately sees has already been normalised; accepting `" #fff "` here would mean
|
|
43
|
+
* forwarding that exact string to xterm, which does not trim and cannot parse it. Validate the
|
|
44
|
+
* value you are about to pass on, not a cleaned-up version of it. */
|
|
45
|
+
export function isPaletteColor(value: unknown): value is string {
|
|
46
|
+
return typeof value === "string" && PALETTE_COLOR_RE.test(value);
|
|
47
|
+
}
|
package/common/themeVars.ts
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
// it, so a key known to one side and not the other would be accepted and then silently ignored.
|
|
5
5
|
|
|
6
6
|
import { THEME_IDS, type ThemeId } from "./themeIds.js";
|
|
7
|
+
import type { ThemeColorKey } from "./themeColors.js";
|
|
7
8
|
|
|
8
9
|
// The CSS custom properties one theme sets, mirroring the `:root[data-theme=...]` blocks in
|
|
9
10
|
// src/style.css. A theme with no `extends` has to supply every one of them — a half-painted
|
|
@@ -65,6 +66,10 @@ export interface CustomThemeInput {
|
|
|
65
66
|
/** A built-in theme to start from. Omitted means `colors` must be complete. */
|
|
66
67
|
extends?: ThemeId;
|
|
67
68
|
colors: Partial<ThemeVars>;
|
|
69
|
+
/** xterm palette entries set outright, for the canvas colours `colors` cannot reach: the
|
|
70
|
+
* cursor pair, the selection foreground, the 16 ANSI colours. Wins over what `colors`
|
|
71
|
+
* implies (#2097). */
|
|
72
|
+
term?: Partial<Record<ThemeColorKey, string>>;
|
|
68
73
|
}
|
|
69
74
|
|
|
70
75
|
/** The full variable set for a theme: the base it extends, with its own colours on top.
|
|
@@ -132,11 +137,24 @@ export function isLightTheme(vars: ThemeVars): boolean {
|
|
|
132
137
|
/** The xterm palette a theme's variables imply. xterm draws on a canvas and cannot read CSS
|
|
133
138
|
* variables, so the same colours have to reach it as values — derived here rather than asked
|
|
134
139
|
* for twice, since two copies of one colour is two chances to change only one. The 16 ANSI
|
|
135
|
-
* colours are NOT derived: they come from the base theme, which is what `extends` is for.
|
|
136
|
-
|
|
140
|
+
* colours are NOT derived: they come from the base theme, which is what `extends` is for.
|
|
141
|
+
*
|
|
142
|
+
* The cursor pair is derived from the SAME two variables the cell it sits on uses, which makes
|
|
143
|
+
* the cursor an inverted cell — so the character under it stays as readable as the characters
|
|
144
|
+
* beside it. Inheriting the cursor from the base instead is what made a light theme extending a
|
|
145
|
+
* dark one draw a dark block with xterm's default black glyph on top (#2097). */
|
|
146
|
+
export function termThemeFromVars(vars: ThemeVars): {
|
|
147
|
+
background: string;
|
|
148
|
+
foreground: string;
|
|
149
|
+
selectionBackground: string;
|
|
150
|
+
cursor: string;
|
|
151
|
+
cursorAccent: string;
|
|
152
|
+
} {
|
|
137
153
|
return {
|
|
138
154
|
background: vars["--bg-base"],
|
|
139
155
|
foreground: vars["--term-fg"],
|
|
140
156
|
selectionBackground: vars["--term-selection"],
|
|
157
|
+
cursor: vars["--term-fg"],
|
|
158
|
+
cursorAccent: vars["--bg-base"],
|
|
141
159
|
};
|
|
142
160
|
}
|