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.
Files changed (147) hide show
  1. package/README.md +12 -0
  2. package/common/collectionRefresh.ts +34 -0
  3. package/common/keymap.ts +12 -1
  4. package/common/themeColors.ts +17 -0
  5. package/common/themeVars.ts +20 -2
  6. package/dist/assets/{AllPackages-B1YCJRYB-kggoNw6z.js → AllPackages-B1YCJRYB-D1H--dDi.js} +1 -1
  7. package/dist/assets/{BaseConfiguration-B6s_tKOW-RQzsRUNx.js → BaseConfiguration-B6s_tKOW-NM1em0z-.js} +1 -1
  8. package/dist/assets/{Element-BMI7Nj5w-BP5E_zl7.js → Element-BMI7Nj5w-D60lwUcy.js} +1 -1
  9. package/dist/assets/{Entities-C8p_0jCn-C-_0T6vJ.js → Entities-C8p_0jCn-CRrh9My2.js} +1 -1
  10. package/dist/assets/{FunctionList-YWk54TCy-DyxSzbCI.js → FunctionList-YWk54TCy-DxlXvxS1.js} +1 -1
  11. package/dist/assets/{InputJax-C5dj-ntL-BtwdMizb.js → InputJax-C5dj-ntL-DMM7A5J_.js} +1 -1
  12. package/dist/assets/{MathItem-YJvQL-XJ-CeeATAwp.js → MathItem-YJvQL-XJ-DjZ8sLcx.js} +1 -1
  13. package/dist/assets/{MmlFactory-DSoKkE7s-CYu-aCTG.js → MmlFactory-DSoKkE7s-BVH8BvMO.js} +1 -1
  14. package/dist/assets/{Options-oARQeeuT-TJSj2iQR.js → Options-oARQeeuT-CeIzK2vQ.js} +1 -1
  15. package/dist/assets/{OutputJax-DfUZNNCu-oLxtQ_g0.js → OutputJax-DfUZNNCu-BipoI_Vx.js} +1 -1
  16. package/dist/assets/{PrioritizedList-6lun1Xqd-D4eZQDMF.js → PrioritizedList-6lun1Xqd-CkxjdTLH.js} +1 -1
  17. package/dist/assets/{Styles-5NmwS-3M-B9XVBSSq.js → Styles-5NmwS-3M-CuS-cAHH.js} +1 -1
  18. package/dist/assets/{TeXAtom-B5ni9myz-B3RMDIY5.js → TeXAtom-B5ni9myz-jvVqbY5R.js} +1 -1
  19. package/dist/assets/{abnfDiagram-VCTEODGH-BGhi-oVb-DQZhwQSy.js → abnfDiagram-VCTEODGH-BGhi-oVb-DdAoBuDS.js} +1 -1
  20. package/dist/assets/{arc-CK5ru50N-CnsmPLzy.js → arc-CK5ru50N-ByhquzQA.js} +1 -1
  21. package/dist/assets/architecture-7GRP2DOG-otSkCkT5-Zckz-s0E.js +1 -0
  22. package/dist/assets/{architectureDiagram-5GKGNRK7-ELuPYMlf-Ci2fG9OM.js → architectureDiagram-5GKGNRK7-ELuPYMlf-BMar3__r.js} +1 -1
  23. package/dist/assets/{assistive-mml-CdU3rUpx-PFS2LrE8.js → assistive-mml-CdU3rUpx-CvEGUtQr.js} +1 -1
  24. package/dist/assets/{blockDiagram-I7D4REHJ-BZ7-OGWQ-iSiAD4OV.js → blockDiagram-I7D4REHJ-BZ7-OGWQ-CzYqZh-X.js} +1 -1
  25. package/dist/assets/{c4Diagram-7LVT6UL2-DCovPZ_4-DLrbYW62.js → c4Diagram-7LVT6UL2-DCovPZ_4-DVY6zyiz.js} +1 -1
  26. package/dist/assets/channel-Bmu_OOc6-Dl37yKXs.js +1 -0
  27. package/dist/assets/{chunk-4HAMMTFA-DqpzLmar-Begag6kK.js → chunk-4HAMMTFA-DqpzLmar-7_4tQ0bg.js} +1 -1
  28. package/dist/assets/{chunk-75Z2AOVW-CT5TYzp5-Che06AJn.js → chunk-75Z2AOVW-CT5TYzp5-CXC4AdVC.js} +1 -1
  29. package/dist/assets/{chunk-DU6HZSFF-BVf-rtdf-BY6ORnqO.js → chunk-DU6HZSFF-BVf-rtdf-B3kg-yCL.js} +1 -1
  30. package/dist/assets/{chunk-F27PBJKO-rP8pUsk3-DnQrEHyt.js → chunk-F27PBJKO-rP8pUsk3-BfNwyFPK.js} +1 -1
  31. package/dist/assets/{chunk-IMKFNOWR-D_IT0r3G-CZbWs1tw.js → chunk-IMKFNOWR-D_IT0r3G-C9_8s332.js} +1 -1
  32. package/dist/assets/{chunk-POPQ4Y6H-C5YURnHe-Pr-7cHNE.js → chunk-POPQ4Y6H-C5YURnHe-eTW1aY6b.js} +1 -1
  33. package/dist/assets/{chunk-SHT3W25Y-CfF0J8Qh-BjabP1RZ.js → chunk-SHT3W25Y-CfF0J8Qh-v6mzVzMd.js} +1 -1
  34. package/dist/assets/{chunk-SVP7TREG-CTZbRIbX-B_MoCNpo.js → chunk-SVP7TREG-CTZbRIbX-RW-t42ub.js} +1 -1
  35. package/dist/assets/{chunk-TICWLB2K-DP1lYmZm-DBUczLZh.js → chunk-TICWLB2K-DP1lYmZm-7dMJ2TPj.js} +1 -1
  36. package/dist/assets/{chunk-XXDRQBXY-vg0kfC73-D9SGVKJn.js → chunk-XXDRQBXY-vg0kfC73-DuFfjK1v.js} +1 -1
  37. package/dist/assets/classDiagram-ZZMXUADV-BDQOAOBf-DSv4U5yn.js +1 -0
  38. package/dist/assets/classDiagram-v2-VYDZK3BY-CwPXtzoF-DSv4U5yn.js +1 -0
  39. package/dist/assets/{cose-bilkent-JH36ORCC-qIiD3RGD-BUItDgWJ.js → cose-bilkent-JH36ORCC-qIiD3RGD-DrmynCpE.js} +1 -1
  40. package/dist/assets/cynefin-OW5HDTMX-Xr6IPdZG-BOI4Ydck.js +1 -0
  41. package/dist/assets/{cynefinDiagram-5FMLGOSQ-BZrUCS-v-Vi8fZx7J.js → cynefinDiagram-5FMLGOSQ-BZrUCS-v-CKIcLifI.js} +1 -1
  42. package/dist/assets/{dagre-C2SZ8h4o-BotF2A9M.js → dagre-C2SZ8h4o-DcuFxdj9.js} +1 -1
  43. package/dist/assets/{dagre-GXQ25YYZ-CQcLM4na-DqruNADY.js → dagre-GXQ25YYZ-CQcLM4na-DHXn50pv.js} +1 -1
  44. package/dist/assets/{diagram-S7CK7UJ4-BdmcmUQh-BpurSv4a.js → diagram-S7CK7UJ4-BdmcmUQh-CPCAAKMD.js} +1 -1
  45. package/dist/assets/{diagram-UQ7AKVKN-BtvmEiYl-XHbHkO0x.js → diagram-UQ7AKVKN-BtvmEiYl-aA6cOCqA.js} +1 -1
  46. package/dist/assets/{diagram-VSXAHHWV-qEG6N0bV-Cr5ut8_j.js → diagram-VSXAHHWV-qEG6N0bV-DCHB2hTq.js} +1 -1
  47. package/dist/assets/{diagram-VX7I27RA-BA8is49N-Bq5gY7-i.js → diagram-VX7I27RA-BA8is49N-DOwC18Z0.js} +1 -1
  48. package/dist/assets/{diagram-Z3DM3KII-XPcU7IOQ-C0yHj4hB.js → diagram-Z3DM3KII-XPcU7IOQ-C9RPVYC4.js} +1 -1
  49. package/dist/assets/{dist-BIvNvTDO.js → dist-Bi70Jy-b.js} +1 -1
  50. package/dist/assets/{dist-OM0ZTf3D.js → dist-CXGYSqlO.js} +1 -1
  51. package/dist/assets/{dist-DgKptpvT.js → dist-CZghBWKw.js} +1 -1
  52. package/dist/assets/{dist-BwEUG-6y.js → dist-Cb59cZDS.js} +1 -1
  53. package/dist/assets/{dist-wMJX53du.js → dist-D2QMLIZp.js} +1 -1
  54. package/dist/assets/{dist-BP4I4Ek8.js → dist-D3PmXl_m.js} +1 -1
  55. package/dist/assets/{dist-DeiyD9Ki-CG6FY-Fn.js → dist-DeiyD9Ki-CJ4cIe6S.js} +1 -1
  56. package/dist/assets/{dist-CBAuHlC8.js → dist-Gt7_-BLP.js} +1 -1
  57. package/dist/assets/{dist-CoNrzCGM.js → dist-fO6jnnrd.js} +1 -1
  58. package/dist/assets/{dist-BNoLRzs-.js → dist-v-Rpnm_y.js} +1 -1
  59. package/dist/assets/{dist-Fs7Cl-b9.js → dist-wvHglY68.js} +1 -1
  60. package/dist/assets/{ebnfDiagram-PWID7BFC-CTHIHdBS-BJwIOuLO.js → ebnfDiagram-PWID7BFC-CTHIHdBS-DHkqIR3N.js} +1 -1
  61. package/dist/assets/{erDiagram-RLTQ6QDP-DVpWTNZj-D8m4MgiI.js → erDiagram-RLTQ6QDP-DVpWTNZj-C3lwqnXe.js} +1 -1
  62. package/dist/assets/eventmodeling-NTZA5JFV-B7bRrpt_-aX72rk9t.js +1 -0
  63. package/dist/assets/flowDiagram-HODETNUW-r-3T5g30-BJR3huwZ.js +1 -0
  64. package/dist/assets/{ganttDiagram-EL5Y4UJY-BfAgk15F-0jMcI0Yj.js → ganttDiagram-EL5Y4UJY-BfAgk15F-2NYwYOby.js} +1 -1
  65. package/dist/assets/gitGraph-4MIJSDKK-BhzSx5wq-D7vu6KLb.js +1 -0
  66. package/dist/assets/{gitGraphDiagram-WWUBYQGX-DEVVZ6wt-CawiFyGd.js → gitGraphDiagram-WWUBYQGX-DEVVZ6wt-k0BkI3nD.js} +1 -1
  67. package/dist/assets/{graphlib-BYLhHyYO-CEk4IQ-f.js → graphlib-BYLhHyYO-Bdiyyely.js} +1 -1
  68. package/dist/assets/{html-Z7dGbczU-BwxpBy6_.js → html-Z7dGbczU-BTiRsVw0.js} +1 -1
  69. package/dist/assets/{index-D7Oh_lqc.js → index-6GNSSCav.js} +325 -379
  70. package/dist/assets/index-C4KnFBMJ.css +1 -0
  71. package/dist/assets/info-A6RAGUB7-fR2SUJmJ-CeXI1IP4.js +1 -0
  72. package/dist/assets/{infoDiagram-27XIBGKW-CvHUhAHd-Y8J_Kc2X.js → infoDiagram-27XIBGKW-CvHUhAHd-CrTJpCqo.js} +1 -1
  73. package/dist/assets/{ishikawaDiagram-5VMMS53U-CeqyKdwk-q6ZNkcwN.js → ishikawaDiagram-5VMMS53U-CeqyKdwk-eDLXPEBD.js} +1 -1
  74. package/dist/assets/{journeyDiagram-3NMN7TZE-Jfi7MPDi-Bv6pv8wY.js → journeyDiagram-3NMN7TZE-Jfi7MPDi-CvhaSk4y.js} +1 -1
  75. package/dist/assets/{kanban-definition-UXKFOSKX-yOrlojns-B2y6NbLe.js → kanban-definition-UXKFOSKX-yOrlojns-C2SZht6T.js} +1 -1
  76. package/dist/assets/{lengths-CvmPfBid-CBfhrPT6.js → lengths-CvmPfBid-DqArahpv.js} +1 -1
  77. package/dist/assets/{linear-jdmEy-qs-oCunWRsH.js → linear-jdmEy-qs-Cv8NGHBd.js} +1 -1
  78. package/dist/assets/{liteAdaptor-pH5MXTG0-BY38m-jj.js → liteAdaptor-pH5MXTG0-B1LIDixs.js} +1 -1
  79. package/dist/assets/material-symbols-outlined-DhPLOrnb.woff2 +0 -0
  80. package/dist/assets/{mathjax-DVEo4UYj-C7BTzxwK.js → mathjax-DVEo4UYj-CTQSsbqK.js} +1 -1
  81. package/dist/assets/{mermaid-parser.core-CzBW8Fof-CixE9zmB.js → mermaid-parser.core-CzBW8Fof-BTOBTXVI.js} +2 -2
  82. package/dist/assets/{mermaid.core-Dv4uylek-Djmx6tFE.js → mermaid.core-Dv4uylek-CwMi65mG.js} +4 -4
  83. package/dist/assets/{mindmap-definition-YA3MSWOX-DP_2R9Ga-kTAulFVa.js → mindmap-definition-YA3MSWOX-DP_2R9Ga-BJ9md154.js} +1 -1
  84. package/dist/assets/{mo-Xv_6CC7A-CcvkyIE0.js → mo-Xv_6CC7A-YT1Ep9ep.js} +1 -1
  85. package/dist/assets/packet-AYTQ26CC-B_oKR9KZ-BTHvzsvA.js +1 -0
  86. package/dist/assets/{pegDiagram-XKGWAZYB-BsBWryhi-BiG1mp1T.js → pegDiagram-XKGWAZYB-BsBWryhi-DcmWmYCC.js} +1 -1
  87. package/dist/assets/pie-WAS4IAKB-D1ZXrN1W-D2lL43qt.js +1 -0
  88. package/dist/assets/{pieDiagram-E7YTZNPT-OugkS2pU-C5WoCQDp.js → pieDiagram-E7YTZNPT-OugkS2pU-cVOrSsmv.js} +1 -1
  89. package/dist/assets/{quadrantDiagram-AXDQQJYC-DXEAAaUE-U0asGLtC.js → quadrantDiagram-AXDQQJYC-DXEAAaUE-CJ7E8xF3.js} +1 -1
  90. package/dist/assets/radar-RG4KPBEZ-BmUgDkiH-C-pMUxsI.js +1 -0
  91. package/dist/assets/railroad-74A4TZTK-6lEXVJo8-D0K7WIF_.js +1 -0
  92. package/dist/assets/railroad-abnf-HS5TGJTU-BG28Qiz1-BwwZFdLC.js +1 -0
  93. package/dist/assets/railroad-ebnf-LZEXJU2U-DzpHhtTH-DEXLsLfR.js +1 -0
  94. package/dist/assets/railroad-peg-WCYAUIDC-B2CHCTyG-CIIHCbpi.js +1 -0
  95. package/dist/assets/{railroadDiagram-O6MQD6OU-BJys8O96-Dcm_CJA0.js → railroadDiagram-O6MQD6OU-BJys8O96-0MKi1nlY.js} +1 -1
  96. package/dist/assets/{requirementDiagram-BXWQKSXE-BaDgCtM5-BFyzmV4B.js → requirementDiagram-BXWQKSXE-BaDgCtM5-Dh9naf1P.js} +1 -1
  97. package/dist/assets/{sankeyDiagram-P5KCCOFB-puZsr_vK-CTerarXU.js → sankeyDiagram-P5KCCOFB-puZsr_vK-DnFp1pF-.js} +1 -1
  98. package/dist/assets/{sequenceDiagram-WJ2MYXX4-D1ziEryC-Dk_Vh7EW.js → sequenceDiagram-WJ2MYXX4-D1ziEryC-QyuuTtv6.js} +1 -1
  99. package/dist/assets/{src-CLC0ddSd-dG3DpXd2.js → src-CLC0ddSd-DaM5Q5tg.js} +1 -1
  100. package/dist/assets/{stateDiagram-D77RDMKH-HSEurT6h-CpOTqfOS.js → stateDiagram-D77RDMKH-HSEurT6h-CqWtYwN6.js} +1 -1
  101. package/dist/assets/stateDiagram-v2-MP3YSRHH-DnOa-Otc-DqMPmDPL.js +1 -0
  102. package/dist/assets/{svg-D_RYJvQC-C4pZWbZ-.js → svg-D_RYJvQC-T-beFXEZ.js} +1 -1
  103. package/dist/assets/{swimlanes-42K2YHIH-umBsuvsI-C-uZTY-8.js → swimlanes-42K2YHIH-umBsuvsI-CBrrgPel.js} +1 -1
  104. package/dist/assets/swimlanesDiagram-VR7AAH4N-ZLUyNmnU-Bew5AEPR.js +8 -0
  105. package/dist/assets/{tex-Dx2UJ3VU-Ch7WPvt4.js → tex-Dx2UJ3VU-tBwETaM2.js} +1 -1
  106. package/dist/assets/{timeline-definition-24CTP7MA-D9plt22Y-BgXy-Pja.js → timeline-definition-24CTP7MA-D9plt22Y-XpXWZKjL.js} +1 -1
  107. package/dist/assets/treeView-Q6P3EWNA-BdvZ0_C5-BheZ-W3N.js +1 -0
  108. package/dist/assets/treemap-WGGIJYW6-CIJLPQlC-Cjamu2ad.js +1 -0
  109. package/dist/assets/{vennDiagram-4TSXK5OY-DZe7wY85-HHFNkULb.js → vennDiagram-4TSXK5OY-DZe7wY85-BX7eqUQe.js} +1 -1
  110. package/dist/assets/wardley-WFR3VGLG-CKqtFD8V-BhmuAvdu.js +1 -0
  111. package/dist/assets/{wardleyDiagram-VM6X3IG4-DK9yytWx-qeOMmNlR.js → wardleyDiagram-VM6X3IG4-DK9yytWx-Dwg2gU8u.js} +1 -1
  112. package/dist/assets/{xychartDiagram-S5SC5T6Z-CLSO4Pc9-DLpk6ryk.js → xychartDiagram-S5SC5T6Z-CLSO4Pc9-D0s7XGBw.js} +1 -1
  113. package/dist/index.html +3 -3
  114. package/package.json +9 -9
  115. package/server/backends/calendarRefresh.ts +37 -0
  116. package/server/backends/calendarRefreshResult.ts +40 -0
  117. package/server/backends/feeds.ts +40 -9
  118. package/server/backends/sharedApp/headlessPreview.ts +46 -4
  119. package/server/config/config-schema.ts +6 -3
  120. package/server/files/files-browse.ts +14 -0
  121. package/server/files/project-files.ts +222 -0
  122. package/server/skills/mulmoterminal-dirs/SKILL.md +3 -1
  123. package/server/skills/mulmoterminal-keys/SKILL.md +6 -0
  124. package/server/skills/mulmoterminal-theme/SKILL.md +49 -7
  125. package/dist/assets/architecture-7GRP2DOG-otSkCkT5-CFnWjMcA.js +0 -1
  126. package/dist/assets/channel-Bmu_OOc6-CLX7xRxl.js +0 -1
  127. package/dist/assets/classDiagram-ZZMXUADV-BDQOAOBf-CH44RAkG.js +0 -1
  128. package/dist/assets/classDiagram-v2-VYDZK3BY-CwPXtzoF-CH44RAkG.js +0 -1
  129. package/dist/assets/cynefin-OW5HDTMX-Xr6IPdZG-Ce8mYJyA.js +0 -1
  130. package/dist/assets/eventmodeling-NTZA5JFV-B7bRrpt_-DnpJhuuA.js +0 -1
  131. package/dist/assets/flowDiagram-HODETNUW-r-3T5g30-BWizd0qT.js +0 -1
  132. package/dist/assets/gitGraph-4MIJSDKK-BhzSx5wq-BmNB3hui.js +0 -1
  133. package/dist/assets/index-BJzCebxZ.css +0 -1
  134. package/dist/assets/info-A6RAGUB7-fR2SUJmJ-DJ6qtBt_.js +0 -1
  135. package/dist/assets/material-symbols-outlined-Dp0GkOHZ.woff2 +0 -0
  136. package/dist/assets/packet-AYTQ26CC-B_oKR9KZ-Pi3e-tAz.js +0 -1
  137. package/dist/assets/pie-WAS4IAKB-D1ZXrN1W-BOglNRvk.js +0 -1
  138. package/dist/assets/radar-RG4KPBEZ-BmUgDkiH-zXnWiLPM.js +0 -1
  139. package/dist/assets/railroad-74A4TZTK-6lEXVJo8-CAtjJocL.js +0 -1
  140. package/dist/assets/railroad-abnf-HS5TGJTU-BG28Qiz1-BzFi41zD.js +0 -1
  141. package/dist/assets/railroad-ebnf-LZEXJU2U-DzpHhtTH-CFTlT-st.js +0 -1
  142. package/dist/assets/railroad-peg-WCYAUIDC-B2CHCTyG-uG4QNP6w.js +0 -1
  143. package/dist/assets/stateDiagram-v2-MP3YSRHH-DnOa-Otc-DgkDdTbh.js +0 -1
  144. package/dist/assets/swimlanesDiagram-VR7AAH4N-ZLUyNmnU-CxUAVNvR.js +0 -8
  145. package/dist/assets/treeView-Q6P3EWNA-BdvZ0_C5-VCyiiE1t.js +0 -1
  146. package/dist/assets/treemap-WGGIJYW6-CIJLPQlC-jg24gWZX.js +0 -1
  147. 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
- export const NEEDS_A_CURRENT_TERMINAL: readonly KeymapAction[] = ["zoom-next", "zoom-prev", "terminal-new-adjacent", "terminal-close", "terminal-restart"];
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.
@@ -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
+ }
@@ -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
- export function termThemeFromVars(vars: ThemeVars): { background: string; foreground: string; selectionBackground: string } {
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
  }