mulmoclaude 0.9.0 → 0.9.2

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 (458) hide show
  1. package/README.md +95 -38
  2. package/bin/mulmoclaude.js +1 -2
  3. package/client/assets/JsonEditor-CPJfn76E.css +1 -0
  4. package/client/assets/JsonEditor-CoWGJG3Y.js +10 -0
  5. package/client/assets/abnfDiagram-VRR7QNED-6nNByj6v-By7GJ3xW.js +1 -0
  6. package/client/assets/abnfDiagram-VRR7QNED-BrQlVixL.js +1 -0
  7. package/client/assets/arc-BXutyUAX.js +1 -0
  8. package/client/assets/arc-zT0wd74V-DulGJNnb.js +1 -0
  9. package/client/assets/architecture-TIHT7OUA-CYMWc3UT-C7HoFzWN.js +1 -0
  10. package/client/assets/architecture-TIHT7OUA-aml8u-G9.js +1 -0
  11. package/client/assets/architectureDiagram-ZJ3FMSHR-Bgnyaj_i-CCpEsCHN.js +36 -0
  12. package/client/assets/architectureDiagram-ZJ3FMSHR-DJTFpPjB.js +36 -0
  13. package/client/assets/array-BifhSqXX.js +1 -0
  14. package/client/assets/array-CApNbSU9-BifhSqXX.js +1 -0
  15. package/client/assets/blockDiagram-677ZJIJ3-DQ35o5E4-BXS11D3J.js +132 -0
  16. package/client/assets/blockDiagram-677ZJIJ3-aYvCODxv.js +132 -0
  17. package/client/assets/c4Diagram-LMCZKHZV-Bau6RMBb.js +10 -0
  18. package/client/assets/c4Diagram-LMCZKHZV-ClWZeiWo-DXGnOOUf.js +10 -0
  19. package/client/assets/channel-D9VSi_QV.js +1 -0
  20. package/client/assets/channel-Di5rtkx0-C3gZcytF.js +1 -0
  21. package/client/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  22. package/client/assets/chunk-2Q5K7J3B-DfKpwyl9-DTxwf5E9.js +1 -0
  23. package/client/assets/chunk-32BRIVSS-CCt9wtYd-Cwa_IP35.js +1 -0
  24. package/client/assets/chunk-32BRIVSS-CxzHeys5.js +1 -0
  25. package/client/assets/chunk-52WLFC77-BtNjbTdw.js +10 -0
  26. package/client/assets/chunk-52WLFC77-FbBbR4uI-wsNC5d-f.js +10 -0
  27. package/client/assets/chunk-5VM5RSS4-BYnnUiN6-C4rOnu9A.js +15 -0
  28. package/client/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  29. package/client/assets/chunk-7BUUIJ7U-Bb538aSH.js +1 -0
  30. package/client/assets/chunk-7BUUIJ7U-hh8aCuGX-mGEpPzQy.js +1 -0
  31. package/client/assets/chunk-C7G6YPKG-BE8ehsnc.js +1 -0
  32. package/client/assets/chunk-C7G6YPKG-C87hlS9c-BitbJpTa.js +1 -0
  33. package/client/assets/{chunk-D8eiyYIV-BY16KEZc.js → chunk-D8eiyYIV-BeeEsA1B.js} +1 -1
  34. package/client/assets/chunk-EX3LRPZG-Bhgskzyy.js +231 -0
  35. package/client/assets/chunk-EX3LRPZG-BqGqMXLN-Cl2Eo1_u.js +231 -0
  36. package/client/assets/chunk-FWX5IMBZ-BkbSAAuW-C2r4AuAO.js +2 -0
  37. package/client/assets/chunk-FWX5IMBZ-D9sskZb_.js +2 -0
  38. package/client/assets/chunk-HOUHSVGY-CBCXk7rb.js +1 -0
  39. package/client/assets/chunk-HOUHSVGY-Cxu0eDlh-owg_DcY0.js +1 -0
  40. package/client/assets/chunk-ICXQ74PX-DTqPpDQ9.js +2 -0
  41. package/client/assets/chunk-ICXQ74PX-hiraF_Xj-CdaEwVin.js +2 -0
  42. package/client/assets/chunk-JWPE2WC7-BQ3zXr2k-DSd3Ct95.js +1 -0
  43. package/client/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  44. package/client/assets/chunk-KEIR6QF5-DNzq6p3w.js +161 -0
  45. package/client/assets/chunk-MOJQB5TN-CqxshQHA-Cn_EpDyZ.js +88 -0
  46. package/client/assets/chunk-MOJQB5TN-D1s_zUGz.js +88 -0
  47. package/client/assets/chunk-OGEWGWER-CjCr7ceX-Dfk5-70y.js +1 -0
  48. package/client/assets/chunk-OGEWGWER-DzfhxoQd.js +1 -0
  49. package/client/assets/chunk-PUDLZKDR-BZlebNhn.js +156 -0
  50. package/client/assets/chunk-PUDLZKDR-Dx6M-vz1-CLyVurOz.js +156 -0
  51. package/client/assets/chunk-Q4XR5HBZ-BcJb7mwA.js +70 -0
  52. package/client/assets/chunk-Q4XR5HBZ-CZd-9lTB-qPEYoRNc.js +11 -0
  53. package/client/assets/chunk-RYQCIY6F-B_IgMG7T.js +1 -0
  54. package/client/assets/chunk-RYQCIY6F-YkbemkCt-CX4fncTQ.js +1 -0
  55. package/client/assets/chunk-V7JOEXUC-Buce04o6.js +206 -0
  56. package/client/assets/chunk-V7JOEXUC-rI0xlC_O-C607vJXy.js +206 -0
  57. package/client/assets/chunk-VAUOI2AC-CxhkzXN0.js +1 -0
  58. package/client/assets/chunk-VAUOI2AC-DrcykVNK-CSROJWdE.js +1 -0
  59. package/client/assets/chunk-VR4S4FIN-D5afNrsS.js +1 -0
  60. package/client/assets/chunk-VR4S4FIN-O6iF8Yvf-CLIwrgqU.js +1 -0
  61. package/client/assets/chunk-WYO6CB5R-B83L_z6I-Cs8mg9If.js +127 -0
  62. package/client/assets/chunk-WYO6CB5R-BXTIdTMw.js +125 -0
  63. package/client/assets/chunk-XXDRQBXY-DFXH_lWn-B5HjCp2c.js +1 -0
  64. package/client/assets/chunk-XXDRQBXY-DXMD6ofA.js +1 -0
  65. package/client/assets/chunk-Y2CYZVJY-Bdt8pFDJ-DsF7k-Jl.js +1 -0
  66. package/client/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  67. package/client/assets/chunk-ZGVPDNZ5-BpFv9JSP-CHYySMjV.js +62 -0
  68. package/client/assets/chunk-ZGVPDNZ5-CYusI0J_.js +62 -0
  69. package/client/assets/chunk-ZIRB5QZD-Biy6ZNFG-D1maAiXb.js +32 -0
  70. package/client/assets/chunk-ZIRB5QZD-C6fEPe3t.js +32 -0
  71. package/client/assets/classDiagram-OUVF2IWQ-BgAZMSbT-BgxEE1D3.js +1 -0
  72. package/client/assets/classDiagram-OUVF2IWQ-CBD3Eidl.js +1 -0
  73. package/client/assets/classDiagram-v2-EOCWNBFH-CBD3Eidl.js +1 -0
  74. package/client/assets/classDiagram-v2-EOCWNBFH-DxHTyui1-BgxEE1D3.js +1 -0
  75. package/client/assets/cose-bilkent-JH36ORCC-CuSL2tA8-aMIqISfj.js +1 -0
  76. package/client/assets/cose-bilkent-JH36ORCC-WAJDBXv1.js +1 -0
  77. package/client/assets/cynefin-VYW2F7L2-DH2qkJKw.js +1 -0
  78. package/client/assets/cynefin-VYW2F7L2-DqA3n9nY-BNWhIK_n.js +1 -0
  79. package/client/assets/cynefinDiagram-TSTJHNR4-CUvPV9MV.js +62 -0
  80. package/client/assets/cynefinDiagram-TSTJHNR4-x0-0sQ15-Cq1gFcFu.js +62 -0
  81. package/client/assets/cytoscape.esm-CzdwbRaj-Djp6vQyU.js +321 -0
  82. package/client/assets/cytoscape.esm-Djp6vQyU.js +321 -0
  83. package/client/assets/dagre-CXRCoUWR.js +1 -0
  84. package/client/assets/dagre-VKFMJZFB-CQdfl-bx-CzZZuace.js +4 -0
  85. package/client/assets/dagre-VKFMJZFB-C_9IS7mB.js +4 -0
  86. package/client/assets/dagre-wczQIDso-CfevN9RO.js +1 -0
  87. package/client/assets/defaultLocale-C8Fc0cco.js +1 -0
  88. package/client/assets/defaultLocale-DUNguUWs-BbDo_yJX.js +1 -0
  89. package/client/assets/diagram-FQU43EPY-BOSB6VUb-isPdQ8WX.js +3 -0
  90. package/client/assets/diagram-FQU43EPY-BP8N00-b.js +3 -0
  91. package/client/assets/diagram-G47NLZAW-DLXrcXsN-BIqj7RKy.js +24 -0
  92. package/client/assets/diagram-G47NLZAW-ulE1JlWG.js +24 -0
  93. package/client/assets/diagram-NH7WQ7WH-BMQp1rkF-D6-fOq_v.js +24 -0
  94. package/client/assets/diagram-NH7WQ7WH-D_IXrL3i.js +24 -0
  95. package/client/assets/diagram-OA4YK3LP-C-pC6Eyu.js +30 -0
  96. package/client/assets/diagram-OA4YK3LP-D1wQ0vUj-BNi6QLCK.js +30 -0
  97. package/client/assets/diagram-WEI45ONY-Di9m35i-.js +41 -0
  98. package/client/assets/diagram-WEI45ONY-RR0DpF8R-BS3nrb3w.js +41 -0
  99. package/client/assets/dist-BQBs5pjy-BmtZ7Oc2.js +1 -0
  100. package/client/assets/dist-CQ3HaWOk.js +1 -0
  101. package/client/assets/ebnfDiagram-CCIWWBDH-Cbwnim2x.js +1 -0
  102. package/client/assets/ebnfDiagram-CCIWWBDH-M123uVJ8-9-dq55nQ.js +1 -0
  103. package/client/assets/erDiagram-Q63AITRT-BWx_-PXG-CWGfG4z5.js +85 -0
  104. package/client/assets/erDiagram-Q63AITRT-CMbtO3Sm.js +85 -0
  105. package/client/assets/eventmodeling-45OFAUF4--32SIpkL.js +1 -0
  106. package/client/assets/eventmodeling-45OFAUF4-_BVSjAXf-DQdL0Icr.js +1 -0
  107. package/client/assets/flowDiagram-23GEKE2U-BeOc_anm-CuVzKmmU.js +1 -0
  108. package/client/assets/flowDiagram-23GEKE2U-Dofa_qxG.js +1 -0
  109. package/client/assets/ganttDiagram-NO4QXBWP-BOoJ1eTw-TWoNmSvq.js +292 -0
  110. package/client/assets/ganttDiagram-NO4QXBWP-BgoAVKuc.js +292 -0
  111. package/client/assets/gitGraph-TEB2WS4Q-CH12KLTN-Bz4frAhV.js +1 -0
  112. package/client/assets/gitGraph-TEB2WS4Q-DIMvNvqt.js +1 -0
  113. package/client/assets/gitGraphDiagram-IHSO6WYX-B2CJhk_G-ClOKkjxw.js +106 -0
  114. package/client/assets/gitGraphDiagram-IHSO6WYX-Dmb6KnPz.js +106 -0
  115. package/client/assets/graphlib-B8gBHxth.js +1 -0
  116. package/client/assets/graphlib-hY-1btwe-DQjxxcnr.js +1 -0
  117. package/client/assets/{html2canvas-CDGcmOD3-CKJ6vKPo.js → html2canvas-CDGcmOD3-DRL9pFVl.js} +2 -2
  118. package/client/assets/{index-9lmYSaus.js → index-Dc0R-HW5.js} +129 -190
  119. package/client/assets/index-Dxo1Zdd-.css +2 -0
  120. package/client/assets/{index.es-DqtpmBm8-DFXjJgCa.js → index.es-DqtpmBm8-EQk3NgR8.js} +1 -1
  121. package/client/assets/info-DKCQHKI2-Cbw3mbiK-GsDZz9IO.js +1 -0
  122. package/client/assets/info-DKCQHKI2-ViCqobGo.js +1 -0
  123. package/client/assets/infoDiagram-FWYZ7A6U-HKV7LIG-.js +2 -0
  124. package/client/assets/infoDiagram-FWYZ7A6U-Mp1X3pBP-ATJv87Ur.js +2 -0
  125. package/client/assets/init-D6jRqBbL.js +1 -0
  126. package/client/assets/init-DEsX3bhM-D6jRqBbL.js +1 -0
  127. package/client/assets/ishikawaDiagram-FXEZZL3T-BNG7tkJu-CGCeOIlJ.js +70 -0
  128. package/client/assets/ishikawaDiagram-FXEZZL3T-CVDUj46f.js +70 -0
  129. package/client/assets/journeyDiagram-5HDEW3XC-BA-ESGLP.js +139 -0
  130. package/client/assets/journeyDiagram-5HDEW3XC-Dbp_hY9X-Bx-IoCe9.js +139 -0
  131. package/client/assets/kanban-definition-HUTT4EX6-Bqaet01L.js +89 -0
  132. package/client/assets/kanban-definition-HUTT4EX6-DSTc5u3q-C0JGckt1.js +89 -0
  133. package/client/assets/katex-CddkPoXu.js +257 -0
  134. package/client/assets/katex-M0IxphGf-CddkPoXu.js +257 -0
  135. package/client/assets/lib-4Tgx7rAy.js +114 -0
  136. package/client/assets/line-B1wBwzrY-f5wxpqoF.js +1 -0
  137. package/client/assets/line-CkyHfW7d.js +1 -0
  138. package/client/assets/linear-B9fuEF4c.js +1 -0
  139. package/client/assets/linear-lrGinF5_-CqNBync7.js +1 -0
  140. package/client/assets/map-CgrwEyH7-DWQFomlZ.js +1 -0
  141. package/client/assets/map-DsCK-0Cs.js +1 -0
  142. package/client/assets/marked.esm-CIU5FDdN.js +64 -0
  143. package/client/assets/marp-CSq0PPfK.js +3448 -0
  144. package/client/assets/material-symbols-outlined-DdRFxZLh.woff2 +0 -0
  145. package/client/assets/mermaid-parser.core-DC7NPJ_M-Ca6XzwfM.js +166 -0
  146. package/client/assets/mermaid-parser.core-SAwSf4_o.js +7 -0
  147. package/client/assets/mermaid.core-BBEQfkdJ.js +11 -0
  148. package/client/assets/mermaid.core-DZM3Ha-E-BxOo-RYG.js +11 -0
  149. package/client/assets/mindmap-definition-LN4V7U3C-B4BN0efL.js +96 -0
  150. package/client/assets/mindmap-definition-LN4V7U3C-DYtgcMsY-DynyLTNv.js +96 -0
  151. package/client/assets/ordinal-B9_Llu10-CU85fhaB.js +1 -0
  152. package/client/assets/ordinal-CopWnP7w.js +1 -0
  153. package/client/assets/packet-7NZHBO7P-CY4XRk9N.js +1 -0
  154. package/client/assets/packet-7NZHBO7P-lwb58iYx--vqSg65J.js +1 -0
  155. package/client/assets/path-BWPyau1x.js +1 -0
  156. package/client/assets/path-COivZ1Gw-C5riojK2.js +1 -0
  157. package/client/assets/pegDiagram-2B236MQR-BOKErjUu.js +1 -0
  158. package/client/assets/pegDiagram-2B236MQR-C43eIpKM-Bi_5Sxjt.js +1 -0
  159. package/client/assets/pie-RZYD4A2V-6BHB7bAx.js +1 -0
  160. package/client/assets/pie-RZYD4A2V-B1UWb4Gu-Dmn2hLWH.js +1 -0
  161. package/client/assets/pieDiagram-ENE6RG2P-BkTqgJyR-Bcdm19kR.js +39 -0
  162. package/client/assets/pieDiagram-ENE6RG2P-DtNjvz-U.js +39 -0
  163. package/client/assets/preload-helper-CZgWQFsJ.js +1 -0
  164. package/client/assets/purify.es-DY32g7DN.js +3 -0
  165. package/client/assets/quadrantDiagram-ABIIQ3AL-BQmAJL2v.js +7 -0
  166. package/client/assets/quadrantDiagram-ABIIQ3AL-Bm1Zjm45-B3orqx_f.js +7 -0
  167. package/client/assets/radar-I7S5WNFK-7CKcb_l--CqKdnR0v.js +1 -0
  168. package/client/assets/radar-I7S5WNFK-R7Jhjfdt.js +1 -0
  169. package/client/assets/railroad-3IZDKUUU-BepSPyHI.js +1 -0
  170. package/client/assets/railroad-3IZDKUUU-gCySKdnW-CKU26HTP.js +1 -0
  171. package/client/assets/railroad-abnf-AHOZXSZD-BlsHsp3c.js +1 -0
  172. package/client/assets/railroad-abnf-AHOZXSZD-BophH4r--CGkGHq54.js +1 -0
  173. package/client/assets/railroad-ebnf-EBAXGLYW-AZNjl_Zu-B7bn_PF3.js +1 -0
  174. package/client/assets/railroad-ebnf-EBAXGLYW-B4fMcGEH.js +1 -0
  175. package/client/assets/railroad-peg-LSFZ7HO6-B1ZrjJIu.js +1 -0
  176. package/client/assets/railroad-peg-LSFZ7HO6-BSiEEyeb-CP_B-N5g.js +1 -0
  177. package/client/assets/railroadDiagram-RFXS5EU6-8cz0Iby3.js +1 -0
  178. package/client/assets/railroadDiagram-RFXS5EU6-BkfbdeAs-Di6jH5I6.js +1 -0
  179. package/client/assets/requirementDiagram-TGXJPOKE-CrGTTjYg-DmIC7Shp.js +84 -0
  180. package/client/assets/requirementDiagram-TGXJPOKE-Dlqoe9TY.js +84 -0
  181. package/client/assets/rough.esm-CSKSodPl.js +1 -0
  182. package/client/assets/rough.esm-wVmwlXu7-CSKSodPl.js +1 -0
  183. package/client/assets/runtime-protocol-vue-WG3JLsjz.js +1 -0
  184. package/client/assets/runtime-vue-lHsY5zMj.js +1 -0
  185. package/client/assets/sankeyDiagram-HTMAVEWB-BkTKgu8Q.js +40 -0
  186. package/client/assets/sankeyDiagram-HTMAVEWB-rWXPf03Z-CjV9pCSJ.js +40 -0
  187. package/client/assets/{schemas-D_RbFtuQ.js → schemas-DGvl73AE.js} +3 -3
  188. package/client/assets/sequenceDiagram-DBY2YBRQ-BpuXUcFy.js +162 -0
  189. package/client/assets/sequenceDiagram-DBY2YBRQ-nkJYWO2m-BqS_sTCH.js +162 -0
  190. package/client/assets/sizeCapture-X5ZJPWSS-B0uUizjq.js +1 -0
  191. package/client/assets/sizeCapture-X5ZJPWSS-F5SadAuT-VHIb4_NU.js +1 -0
  192. package/client/assets/src-Brzfja-q-DNc4Or4z.js +1 -0
  193. package/client/assets/src-Cqa3Jy1j.js +1 -0
  194. package/client/assets/stateDiagram-2N3HPSRC-CdlGXuo7.js +1 -0
  195. package/client/assets/stateDiagram-2N3HPSRC-T4-clK8b-DQRiB4va.js +1 -0
  196. package/client/assets/stateDiagram-v2-6OUMAXLB-BN8Jr3ZM.js +1 -0
  197. package/client/assets/stateDiagram-v2-6OUMAXLB-DIp7nhRd-DbrOhUn_.js +1 -0
  198. package/client/assets/swimlanes-5IMT3BWC-HmQNEntu-CNBgZdur.js +2 -0
  199. package/client/assets/swimlanes-5IMT3BWC-iEJg5gki.js +2 -0
  200. package/client/assets/swimlanesDiagram-G3AALYLV-BeoZhwg7-DpqgeNRA.js +8 -0
  201. package/client/assets/swimlanesDiagram-G3AALYLV-o-sS6aEP.js +8 -0
  202. package/client/assets/timeline-definition-FHXFAJF6-Bjh-7QmL.js +120 -0
  203. package/client/assets/timeline-definition-FHXFAJF6-CNc9jSTP-BKNSymgY.js +120 -0
  204. package/client/assets/treeView-QDETBFTQ-D3cqRl6k.js +1 -0
  205. package/client/assets/treeView-QDETBFTQ-nIQcG1h9-O_ri9HxD.js +1 -0
  206. package/client/assets/treemap-6X3UGDF4-BnsvC8yL-Cfsty1e3.js +1 -0
  207. package/client/assets/treemap-6X3UGDF4-DGkZcvDG.js +1 -0
  208. package/client/assets/v4-B29ayslu.js +1 -0
  209. package/client/assets/vennDiagram-L72KCM5P-Cz3dbe7b.js +34 -0
  210. package/client/assets/vennDiagram-L72KCM5P-Dr3pTJ_0-C38xwcVo.js +34 -0
  211. package/client/assets/vue-C6d2VveO.js +1 -0
  212. package/client/assets/vue-i18n-CL-ejuNu.js +3 -0
  213. package/client/assets/vue.runtime.esm-bundler-BeoTfMNc.js +4 -0
  214. package/client/assets/wardley-OPB4EBWU-8Odxkx6V-CCDIVuBs.js +1 -0
  215. package/client/assets/wardley-OPB4EBWU-CZsCDvKk.js +1 -0
  216. package/client/assets/wardleyDiagram-EHGQE667-DSFc7ZZa-mlWXRiWx.js +78 -0
  217. package/client/assets/wardleyDiagram-EHGQE667-DiyoyO_X.js +78 -0
  218. package/client/assets/xychartDiagram-FW5EYKEG-BP0Nn4Pp-DRRiStGZ.js +7 -0
  219. package/client/assets/xychartDiagram-FW5EYKEG-DhY1_UGM.js +7 -0
  220. package/client/index.html +16 -12
  221. package/package.json +17 -19
  222. package/server/agent/backend/types.ts +1 -1
  223. package/server/agent/backgroundSessions.ts +43 -0
  224. package/server/agent/config.ts +3 -2
  225. package/server/agent/mcp-tools/manageCollection.ts +4 -4
  226. package/server/agent/sandboxMounts.ts +1 -1
  227. package/server/agent/stream.ts +1 -3
  228. package/server/api/auth/viewToken.ts +1 -1
  229. package/server/api/bridge/sessionRole.ts +47 -0
  230. package/server/api/routes/agent.ts +79 -2
  231. package/server/api/routes/collections.ts +60 -7
  232. package/server/api/routes/collectionsRegistry.ts +113 -0
  233. package/server/api/routes/dashboard.ts +47 -0
  234. package/server/api/routes/feeds.ts +2 -2
  235. package/server/api/routes/files.ts +1 -2
  236. package/server/api/routes/pdf.ts +48 -9
  237. package/server/api/routes/plugins.ts +2 -2
  238. package/server/api/routes/remoteHost.ts +55 -0
  239. package/server/api/routes/sessions.ts +20 -11
  240. package/server/api/routes/share.ts +105 -0
  241. package/server/api/routes/transcribe.ts +1 -1
  242. package/server/api/routes/wiki/history.ts +2 -2
  243. package/server/api/routes/wiki.ts +29 -177
  244. package/server/api/sandboxStatus.ts +1 -1
  245. package/server/build/dispatcher.mjs +25 -14928
  246. package/server/events/collection-change.ts +4 -4
  247. package/server/events/file-change.ts +2 -2
  248. package/server/events/scheduler-adapter.ts +3 -3
  249. package/server/events/task-manager/index.ts +3 -3
  250. package/server/index.ts +53 -17
  251. package/server/notifier/engine.ts +3 -3
  252. package/server/notifier/types.ts +2 -2
  253. package/server/plugins/html-builtin.ts +15 -1
  254. package/server/prompts/system/system.md +4 -0
  255. package/server/remoteHost/auth.ts +29 -0
  256. package/server/remoteHost/commandChannel.ts +56 -0
  257. package/server/remoteHost/firebase.ts +16 -0
  258. package/server/remoteHost/handlers/collectionPage.ts +29 -0
  259. package/server/remoteHost/handlers/getCollection.ts +32 -0
  260. package/server/remoteHost/handlers/getFeed.ts +35 -0
  261. package/server/remoteHost/handlers/index.ts +19 -0
  262. package/server/remoteHost/handlers/listCollections.ts +29 -0
  263. package/server/remoteHost/handlers/listFeeds.ts +37 -0
  264. package/server/remoteHost/handlers/listShortcuts.ts +24 -0
  265. package/server/remoteHost/handlers/startChat.ts +78 -0
  266. package/server/remoteHost/hostRunner.ts +122 -0
  267. package/server/remoteHost/index.ts +117 -0
  268. package/server/system/config.ts +1 -1
  269. package/server/system/credentials.ts +2 -3
  270. package/server/system/docker.ts +9 -8
  271. package/server/system/env.ts +8 -0
  272. package/server/system/whisper/index.ts +4 -4
  273. package/server/utils/claudeConfigPath.ts +57 -0
  274. package/server/utils/files/dashboard-io.ts +87 -0
  275. package/server/utils/files/session-io.ts +11 -0
  276. package/server/utils/markdown/frontmatter.ts +8 -4
  277. package/server/utils/regex.ts +4 -3
  278. package/server/utils/share/packHtml.ts +108 -0
  279. package/server/utils/share/rewriteAssets.ts +178 -0
  280. package/server/workspace/chat-index/paths.ts +8 -2
  281. package/server/workspace/chat-index/summarizer.ts +23 -15
  282. package/server/workspace/collections/configure.ts +5 -3
  283. package/server/workspace/collections/index.ts +8 -6
  284. package/server/workspace/collections/notifications.ts +3 -3
  285. package/server/workspace/collections/types.ts +2 -2
  286. package/server/workspace/collections/watcher.ts +2 -2
  287. package/server/workspace/feeds/configure.ts +24 -0
  288. package/server/workspace/hooks/handlers/skillBridge.ts +2 -2
  289. package/server/workspace/hooks/handlers/wikiSnapshot.ts +1 -1
  290. package/server/workspace/paths.ts +8 -1
  291. package/server/workspace/skills/catalog.ts +1 -3
  292. package/server/workspace/skills/external/catalog.ts +1 -3
  293. package/server/workspace/skills/paths.ts +4 -3
  294. package/server/workspace/skills/writer.ts +1 -4
  295. package/server/workspace/skills-preset.ts +3 -3
  296. package/server/workspace/wiki-pages/io.ts +2 -2
  297. package/server/workspace/workspace.ts +2 -2
  298. package/src/App.vue +41 -18
  299. package/src/components/ChatInput.vue +1 -1
  300. package/src/components/DashboardView.vue +372 -0
  301. package/src/components/FileContentRenderer.vue +32 -7
  302. package/src/components/JsonEditor.vue +1 -1
  303. package/src/components/PluginLauncher.vue +122 -79
  304. package/src/components/RemoteHostControl.vue +159 -0
  305. package/src/components/SessionCountBadges.vue +32 -0
  306. package/src/components/SessionHeaderControls.vue +1 -8
  307. package/src/components/SessionHistoryPanel.vue +2 -0
  308. package/src/components/SessionHistoryToggleButton.vue +1 -15
  309. package/src/components/SidebarHeader.vue +2 -0
  310. package/src/components/collectionTypes.ts +2 -2
  311. package/src/composables/accountingHost.ts +24 -0
  312. package/src/composables/collections/uiHost.ts +17 -2
  313. package/src/composables/useDashboard.ts +191 -0
  314. package/src/composables/useMarkdownZip.ts +51 -0
  315. package/src/composables/useNotifications.ts +1 -4
  316. package/src/composables/useSharePack.ts +60 -0
  317. package/src/composables/useTranslatedQueries.ts +15 -95
  318. package/src/composables/useTranslatedStrings.ts +68 -0
  319. package/src/composables/useVoiceInput.ts +3 -3
  320. package/src/config/apiRoutes.ts +57 -9
  321. package/src/config/createFilePolicy.ts +1 -1
  322. package/src/config/firebase.ts +12 -0
  323. package/src/config/firebaseConfig.ts +18 -0
  324. package/src/config/historyFilters.ts +7 -0
  325. package/src/config/pubsubChannels.ts +7 -27
  326. package/src/config/roles.ts +12 -10
  327. package/src/config/workspacePaths.ts +10 -0
  328. package/src/index.css +1 -1
  329. package/src/lang/de.ts +39 -220
  330. package/src/lang/en.ts +39 -191
  331. package/src/lang/es.ts +39 -218
  332. package/src/lang/fr.ts +39 -220
  333. package/src/lang/ja.ts +39 -216
  334. package/src/lang/ko.ts +39 -216
  335. package/src/lang/pt-BR.ts +39 -217
  336. package/src/lang/zh.ts +39 -215
  337. package/src/main.ts +3 -0
  338. package/src/plugins/accounting/definition.ts +12 -8
  339. package/src/plugins/accounting/index.ts +7 -4
  340. package/src/plugins/accounting/meta.ts +23 -60
  341. package/src/plugins/manageSkills/View.vue +9 -1
  342. package/src/plugins/photoLocations/View.vue +2 -2
  343. package/src/plugins/presentCollection/definition.ts +2 -2
  344. package/src/plugins/presentCollection/plugin.ts +2 -2
  345. package/src/plugins/presentCollection/types.ts +2 -2
  346. package/src/plugins/presentHtml/definition.ts +1 -1
  347. package/src/plugins/presentMulmoScript/View.vue +2 -2
  348. package/src/plugins/presentMulmoScript/helpers.ts +1 -1
  349. package/src/plugins/presentSVG/View.vue +2 -2
  350. package/src/plugins/scheduler/TasksTab.vue +1 -2
  351. package/src/plugins/skill/View.vue +7 -3
  352. package/src/plugins/spreadsheet/View.vue +3 -3
  353. package/src/plugins/spreadsheet/engine/functions/logical.ts +8 -1
  354. package/src/plugins/textResponse/View.vue +43 -16
  355. package/src/plugins/wiki/View.vue +29 -2
  356. package/src/plugins/wiki/components/WikiGraphView.vue +1 -1
  357. package/src/plugins/wiki/components/WikiPageBody.vue +4 -1
  358. package/src/plugins/wiki/helpers.ts +13 -81
  359. package/src/plugins/wiki/index.ts +1 -1
  360. package/src/router/guards.ts +1 -1
  361. package/src/router/index.ts +12 -0
  362. package/src/router/pageRoutes.ts +2 -0
  363. package/src/types/dashboard.ts +40 -0
  364. package/src/types/session.ts +3 -0
  365. package/src/utils/blobDownload.ts +19 -0
  366. package/src/utils/collections/presentSeed.ts +1 -1
  367. package/src/utils/html/customViewSrcdoc.ts +31 -3
  368. package/src/utils/html/previewCsp.ts +1 -1
  369. package/src/utils/id.ts +1 -1
  370. package/src/utils/image/htmlSrcAttrs.ts +1 -1
  371. package/src/utils/markdown/frontmatter.ts +12 -7
  372. package/src/utils/markdown/highlight.ts +22 -0
  373. package/src/utils/markdown/marpCustomSize.ts +2 -2
  374. package/src/utils/markdown/mermaidExtension.ts +56 -0
  375. package/src/utils/markdown/mermaidRender.ts +147 -0
  376. package/src/utils/markdown/setup.ts +17 -4
  377. package/src/utils/markdown/useMermaid.ts +33 -0
  378. package/src/utils/session/longRunning.ts +33 -0
  379. package/src/utils/session/mergeSessions.ts +1 -1
  380. package/client/assets/JsonEditor-Di5xGeZY.css +0 -1
  381. package/client/assets/JsonEditor-o5--tPQH.js +0 -10
  382. package/client/assets/index-tOu5ArRZ.css +0 -2
  383. package/client/assets/lib-D6Xy0IFc.js +0 -114
  384. package/client/assets/marp-D6GXA-EB.js +0 -3452
  385. package/client/assets/material-symbols-outlined-DtIK7AQn.woff2 +0 -0
  386. package/client/assets/runtime-protocol-vue-pU0Mw7Zm.js +0 -1
  387. package/client/assets/runtime-vue-fFYhnNg3.js +0 -1
  388. package/client/assets/vue-UDIWDtr8.js +0 -1
  389. package/client/assets/vue-i18n-CQbxVmNs.js +0 -3
  390. package/client/assets/vue.runtime.esm-bundler-BTyIdNAI.js +0 -4
  391. package/server/accounting/accountNormalize.ts +0 -32
  392. package/server/accounting/defaultAccounts.ts +0 -87
  393. package/server/accounting/eventPublisher.ts +0 -52
  394. package/server/accounting/journal.ts +0 -252
  395. package/server/accounting/openingBalances.ts +0 -114
  396. package/server/accounting/report.ts +0 -237
  397. package/server/accounting/service.ts +0 -718
  398. package/server/accounting/snapshotCache.ts +0 -334
  399. package/server/accounting/timeSeries.ts +0 -265
  400. package/server/accounting/types.ts +0 -148
  401. package/server/api/routes/accounting.ts +0 -373
  402. package/server/api/routes/wiki/frontmatter.ts +0 -34
  403. package/server/api/routes/wiki/pageIndex.ts +0 -53
  404. package/server/system/logs/aaa +0 -737
  405. package/server/system/logs/bb +0 -446
  406. package/server/utils/files/accounting-io.ts +0 -294
  407. package/server/workspace/feeds/engine.ts +0 -143
  408. package/server/workspace/feeds/fetch/httpClient.ts +0 -127
  409. package/server/workspace/feeds/fetch/rssParser.ts +0 -117
  410. package/server/workspace/feeds/index.ts +0 -8
  411. package/server/workspace/feeds/ingestTypes.ts +0 -62
  412. package/server/workspace/feeds/pathResolver.ts +0 -74
  413. package/server/workspace/feeds/paths.ts +0 -30
  414. package/server/workspace/feeds/projectItem.ts +0 -92
  415. package/server/workspace/feeds/registry.ts +0 -43
  416. package/server/workspace/feeds/retrievers/httpJson.ts +0 -19
  417. package/server/workspace/feeds/retrievers/index.ts +0 -27
  418. package/server/workspace/feeds/retrievers/registerAll.ts +0 -5
  419. package/server/workspace/feeds/retrievers/rss.ts +0 -24
  420. package/server/workspace/feeds/state.ts +0 -55
  421. package/src/composables/useAccountingChannel.ts +0 -58
  422. package/src/lib/wiki-page/graph.ts +0 -108
  423. package/src/lib/wiki-page/index-parse.ts +0 -221
  424. package/src/lib/wiki-page/link.ts +0 -62
  425. package/src/lib/wiki-page/lint.ts +0 -105
  426. package/src/lib/wiki-page/paths.ts +0 -35
  427. package/src/lib/wiki-page/slug.ts +0 -54
  428. package/src/plugins/accounting/Preview.vue +0 -103
  429. package/src/plugins/accounting/View.vue +0 -633
  430. package/src/plugins/accounting/actions.ts +0 -34
  431. package/src/plugins/accounting/api.ts +0 -301
  432. package/src/plugins/accounting/components/AccountEditor.vue +0 -250
  433. package/src/plugins/accounting/components/AccountRow.vue +0 -50
  434. package/src/plugins/accounting/components/AccountsList.vue +0 -102
  435. package/src/plugins/accounting/components/AccountsModal.vue +0 -301
  436. package/src/plugins/accounting/components/BalanceSheet.vue +0 -186
  437. package/src/plugins/accounting/components/BookSettings.vue +0 -284
  438. package/src/plugins/accounting/components/BookSwitcher.vue +0 -78
  439. package/src/plugins/accounting/components/DateRangePicker.vue +0 -140
  440. package/src/plugins/accounting/components/JournalEntryForm.vue +0 -505
  441. package/src/plugins/accounting/components/JournalList.vue +0 -554
  442. package/src/plugins/accounting/components/Ledger.vue +0 -206
  443. package/src/plugins/accounting/components/NewBookForm.vue +0 -211
  444. package/src/plugins/accounting/components/OpeningBalancesForm.vue +0 -272
  445. package/src/plugins/accounting/components/ProfitLoss.vue +0 -160
  446. package/src/plugins/accounting/components/accountDraft.ts +0 -13
  447. package/src/plugins/accounting/components/accountNumbering.ts +0 -103
  448. package/src/plugins/accounting/components/accountValidation.ts +0 -75
  449. package/src/plugins/accounting/components/useLatestRequest.ts +0 -44
  450. package/src/plugins/accounting/countries.ts +0 -158
  451. package/src/plugins/accounting/currencies.ts +0 -77
  452. package/src/plugins/accounting/dates.ts +0 -51
  453. package/src/plugins/accounting/fiscalYear.ts +0 -136
  454. package/src/plugins/accounting/timeSeriesEnums.ts +0 -16
  455. package/src/plugins/wiki/route.ts +0 -137
  456. /package/client/assets/{_plugin-vue_export-helper-B67ILkmu.js → _plugin-vue_export-helper-BDNMzG2s.js} +0 -0
  457. /package/client/assets/{purify.es-B27wDFIb-51iYcXuK.js → purify.es-B27wDFIb-Bu4Grnl0.js} +0 -0
  458. /package/client/assets/{typeof-DBp4T-Ny-z2wCIsir.js → typeof-DBp4T-Ny-B5XbjTb1.js} +0 -0
@@ -1,158 +0,0 @@
1
- // Country utilities for the accounting plugin.
2
- //
3
- // The book's country (ISO 3166-1 alpha-2) identifies the tax
4
- // jurisdiction the book is kept under. The Accounting role uses it
5
- // to give country-aware advice — Japanese T-number under
6
- // インボイス制度, EU VAT ID, UK VAT, GSTIN, ABN, etc.
7
- //
8
- // Curated against the supported currency list and the tax-regime
9
- // guidance in `src/config/roles.ts` (Accounting role prompt).
10
- // Intl.DisplayNames provides the localized human name at render
11
- // time, so this stays a flat list of codes.
12
-
13
- /** ISO 3166-1 alpha-2 country codes shown in the book country
14
- * dropdown. Curated to cover every jurisdiction the Accounting role
15
- * has explicit tax-registration advice for, plus the major economies
16
- * represented in `SUPPORTED_CURRENCY_CODES`. */
17
- export const SUPPORTED_COUNTRY_CODES = [
18
- "US",
19
- "JP",
20
- "GB",
21
- "CA",
22
- "AU",
23
- "NZ",
24
- "DE",
25
- "FR",
26
- "IT",
27
- "ES",
28
- "NL",
29
- "BE",
30
- "AT",
31
- "IE",
32
- "PT",
33
- "FI",
34
- "SE",
35
- "DK",
36
- "PL",
37
- "CH",
38
- "NO",
39
- "CN",
40
- "KR",
41
- "TW",
42
- "HK",
43
- "SG",
44
- "IN",
45
- "BR",
46
- "MX",
47
- ] as const;
48
-
49
- export type SupportedCountryCode = (typeof SUPPORTED_COUNTRY_CODES)[number];
50
-
51
- /** EU member states as of 2026. Used by the role-prompt advice path
52
- * to recommend a VAT identification number when the book country is
53
- * in the EU. */
54
- export const EU_COUNTRY_CODES: ReadonlySet<string> = new Set([
55
- "AT",
56
- "BE",
57
- "BG",
58
- "CY",
59
- "CZ",
60
- "DE",
61
- "DK",
62
- "EE",
63
- "ES",
64
- "FI",
65
- "FR",
66
- "GR",
67
- "HR",
68
- "HU",
69
- "IE",
70
- "IT",
71
- "LT",
72
- "LU",
73
- "LV",
74
- "MT",
75
- "NL",
76
- "PL",
77
- "PT",
78
- "RO",
79
- "SE",
80
- "SI",
81
- "SK",
82
- ]);
83
-
84
- /** Localized human name for a country code. Falls back to the code
85
- * itself if the runtime can't resolve the name. */
86
- export function localizedCountryName(code: string, locale: string): string {
87
- try {
88
- return new Intl.DisplayNames([locale], { type: "region" }).of(code) ?? code;
89
- } catch {
90
- return code;
91
- }
92
- }
93
-
94
- /** Runtime guard for `BookSummary.country`. The type is the union
95
- * `SupportedCountryCode`, but every entry point that takes user /
96
- * LLM input arrives as raw `string` (form submit, JSON-RPC body),
97
- * so the service layer narrows here before persisting. */
98
- export function isSupportedCountryCode(value: unknown): value is SupportedCountryCode {
99
- return typeof value === "string" && (SUPPORTED_COUNTRY_CODES as readonly string[]).includes(value);
100
- }
101
-
102
- /** Country-gated UI features. Each key is a feature name; the value
103
- * is the set of country codes for which the feature is enabled.
104
- * Components ask `countryHasFeature("...", country)` instead of
105
- * hard-coding country lists at the call site.
106
- *
107
- * Add a new country-specific feature by adding a new key here and
108
- * reading it via `countryHasFeature`. An unknown / undefined
109
- * country never has any feature — components fall back to neutral
110
- * default UI rather than guessing.
111
- *
112
- * Mirrors the "Country-aware tax behaviour" prose in the
113
- * Accounting role prompt (`src/config/roles.ts`). The two MUST
114
- * stay in sync — drift means the LLM and the form give the user
115
- * contradictory advice. The prompt is the source of truth for
116
- * agent behaviour; this table is structured-data sibling for the
117
- * form. */
118
- export const COUNTRY_FEATURES = {
119
- /** Show an amber "missing tax ID" warning + helper text on a
120
- * postable 14xx (input-tax) line whose taxRegistrationId is
121
- * blank. Limited to jurisdictions where the role prompt
122
- * explicitly requires the counterparty registration number
123
- * (JP T-number, EU VAT ID, GB VAT, GSTIN, ABN, NZ GST, CA BN).
124
- * The "other countries" bucket and US (no federal sales-tax
125
- * registration) intentionally stay quiet. 24xx output-tax
126
- * lines don't trigger the warning — see `isTaxAccountCode`. */
127
- warnMissingTaxRegistrationId: new Set<SupportedCountryCode>([
128
- "JP",
129
- "GB",
130
- "DE",
131
- "FR",
132
- "IT",
133
- "ES",
134
- "NL",
135
- "BE",
136
- "AT",
137
- "IE",
138
- "PT",
139
- "FI",
140
- "SE",
141
- "DK",
142
- "PL",
143
- "IN",
144
- "AU",
145
- "NZ",
146
- "CA",
147
- ]),
148
- } as const;
149
-
150
- export type CountryFeature = keyof typeof COUNTRY_FEATURES;
151
-
152
- /** Resolve a country-gated feature flag. Returns `false` when the
153
- * country is undefined / unsupported — components default to the
154
- * neutral path (no warning, no extra UI) rather than guessing. */
155
- export function countryHasFeature(feature: CountryFeature, country: SupportedCountryCode | undefined): boolean {
156
- if (!country) return false;
157
- return COUNTRY_FEATURES[feature].has(country);
158
- }
@@ -1,77 +0,0 @@
1
- // Currency utilities for the accounting plugin.
2
- //
3
- // We expose a curated list of ISO 4217 codes for the New Book
4
- // dropdown — covering the major reserve currencies plus the most
5
- // requested Asian / regional ones — plus per-currency formatting
6
- // helpers built on Intl.NumberFormat.
7
- //
8
- // The book's currency is per-book metadata (BookSummary.currency)
9
- // and only matters once the user has opened the book; cross-book
10
- // aggregation isn't supported.
11
-
12
- /** ISO 4217 codes shown in the New Book dropdown. Curated for
13
- * recognisability — Intl.DisplayNames provides the localised
14
- * human name at render time, so this stays a flat list of codes. */
15
- export const SUPPORTED_CURRENCY_CODES = ["USD", "EUR", "JPY", "GBP", "CNY", "KRW", "TWD", "HKD", "SGD", "AUD", "CAD", "CHF", "INR", "BRL", "MXN"] as const;
16
-
17
- export type SupportedCurrencyCode = (typeof SUPPORTED_CURRENCY_CODES)[number];
18
-
19
- const DEFAULT_FALLBACK_DIGITS = 2;
20
-
21
- /** Localised human name for a currency code. Falls back to the
22
- * code itself if the runtime can't resolve the name. */
23
- export function localizedCurrencyName(code: string, locale: string): string {
24
- try {
25
- return new Intl.DisplayNames([locale], { type: "currency" }).of(code) ?? code;
26
- } catch {
27
- return code;
28
- }
29
- }
30
-
31
- /** Number of fraction digits ISO 4217 specifies for a currency.
32
- * JPY = 0, USD = 2, KWD = 3. Used both for amount formatting and
33
- * for the HTML input step on debit/credit fields. */
34
- export function fractionDigitsFor(currency: string): number {
35
- try {
36
- const opts = new Intl.NumberFormat("en", { style: "currency", currency }).resolvedOptions();
37
- return opts.maximumFractionDigits ?? DEFAULT_FALLBACK_DIGITS;
38
- } catch {
39
- return DEFAULT_FALLBACK_DIGITS;
40
- }
41
- }
42
-
43
- /** "1" for JPY, "0.01" for USD, "0.001" for KWD. Used as the HTML
44
- * input step on debit/credit fields so a JPY book doesn't let the
45
- * user type cents that would just round-trip back through the
46
- * decimal validator. */
47
- export function inputStepFor(currency: string): string {
48
- const digits = fractionDigitsFor(currency);
49
- if (digits === 0) return "1";
50
- return (1 / 10 ** digits).toFixed(digits);
51
- }
52
-
53
- /** Locale-aware currency formatter — returns "¥1,130" / "$1,130.00"
54
- * etc. Falls back to fixed-point formatting if the runtime can't
55
- * resolve the currency code; the fallback still respects the
56
- * currency's natural fraction-digit count so JPY shows whole
57
- * numbers even on the slow path. */
58
- export function formatAmount(value: number, currency: string, locale?: string): string {
59
- try {
60
- return new Intl.NumberFormat(locale, { style: "currency", currency }).format(value);
61
- } catch {
62
- return value.toFixed(fractionDigitsFor(currency));
63
- }
64
- }
65
-
66
- /** Currency-agnostic amount formatter — "1,130.00" — for places that
67
- * don't carry the currency code on the data path (compact preview
68
- * envelopes etc.). Use `formatAmount(value, currency)` whenever the
69
- * currency IS available — the currency-aware path picks the right
70
- * fraction-digit count automatically (JPY = 0, USD = 2).
71
- *
72
- * `locale` mirrors `formatAmount`'s signature: pass an explicit BCP-47
73
- * locale (`"en-US"`, `"ja-JP"`, …) when the caller knows the desired
74
- * grouping / digit-shape; omit to fall back to the runtime default. */
75
- export function formatAmountNumeric(value: number, decimals = 2, locale?: string): string {
76
- return value.toLocaleString(locale, { minimumFractionDigits: decimals, maximumFractionDigits: decimals });
77
- }
@@ -1,51 +0,0 @@
1
- // Local-calendar date helpers for the accounting forms.
2
- //
3
- // Why not `new Date().toISOString().slice(0, 10)`? `toISOString` is
4
- // UTC. In a negative-offset zone (US Pacific, Eastern, …) the UTC
5
- // date crosses to "tomorrow" several hours before midnight local,
6
- // so a naively prefilled date input would post entries into the
7
- // wrong accounting day. Same mistake near month boundaries flips
8
- // the default Balance Sheet period to the next month.
9
- //
10
- // All four helpers below are pure local-calendar formatters built
11
- // from `getFullYear` / `getMonth` / `getDate`, which the JS engine
12
- // resolves in the user's local timezone.
13
-
14
- function pad2(num: number): string {
15
- return String(num).padStart(2, "0");
16
- }
17
-
18
- /** Today as `YYYY-MM-DD` in the user's local timezone. */
19
- export function localDateString(now: Date = new Date()): string {
20
- return `${now.getFullYear()}-${pad2(now.getMonth() + 1)}-${pad2(now.getDate())}`;
21
- }
22
-
23
- /** Current month as `YYYY-MM` in the user's local timezone. */
24
- export function localMonthString(now: Date = new Date()): string {
25
- return `${now.getFullYear()}-${pad2(now.getMonth() + 1)}`;
26
- }
27
-
28
- /** First day of the current calendar year as `YYYY-MM-DD`. */
29
- export function localStartOfYearString(now: Date = new Date()): string {
30
- return `${now.getFullYear()}-01-01`;
31
- }
32
-
33
- /** Previous calendar month as `YYYY-MM` in the user's local timezone. */
34
- export function previousMonthString(now: Date = new Date()): string {
35
- const target = new Date(now.getFullYear(), now.getMonth() - 1, 1);
36
- return `${target.getFullYear()}-${pad2(target.getMonth() + 1)}`;
37
- }
38
-
39
- /** Last month of the previous calendar quarter as `YYYY-MM`. Calendar
40
- * quarters: Q1=Jan–Mar, Q2=Apr–Jun, Q3=Jul–Sep, Q4=Oct–Dec. When the
41
- * current month is in Q1, this rolls back to December of last year. */
42
- export function lastMonthOfPreviousQuarterString(now: Date = new Date()): string {
43
- const firstMonthOfCurrentQuarter = Math.floor(now.getMonth() / 3) * 3;
44
- const target = new Date(now.getFullYear(), firstMonthOfCurrentQuarter - 1, 1);
45
- return `${target.getFullYear()}-${pad2(target.getMonth() + 1)}`;
46
- }
47
-
48
- /** December of the previous calendar year as `YYYY-MM`. */
49
- export function decemberOfPreviousYearString(now: Date = new Date()): string {
50
- return `${now.getFullYear() - 1}-12`;
51
- }
@@ -1,136 +0,0 @@
1
- // Fiscal-year arithmetic for the accounting plugin.
2
- //
3
- // Each book stores a `fiscalYearEnd` token (Q1..Q4) that says which
4
- // calendar-quarter end is the book's fiscal year end:
5
- //
6
- // Q1 → fiscal year ends March 31 (FY runs Apr 1 → Mar 31)
7
- // Q2 → fiscal year ends June 30 (FY runs Jul 1 → Jun 30)
8
- // Q3 → fiscal year ends September 30 (FY runs Oct 1 → Sep 30)
9
- // Q4 → fiscal year ends December 31 (FY runs Jan 1 → Dec 31; default)
10
- //
11
- // "Current quarter" / "current year" everywhere in the UI refer to
12
- // the *fiscal* quarter / *fiscal* year that contains today, under the
13
- // active book's `fiscalYearEnd`. For Q4 books fiscal quarters and
14
- // fiscal years coincide with calendar quarters / calendar years; for
15
- // the other three a shift applies.
16
- //
17
- // All helpers return `YYYY-MM-DD` strings in the user's local
18
- // timezone — same convention as `dates.ts`.
19
-
20
- export const FISCAL_YEAR_ENDS = ["Q1", "Q2", "Q3", "Q4"] as const;
21
- export type FiscalYearEnd = (typeof FISCAL_YEAR_ENDS)[number];
22
-
23
- export const DEFAULT_FISCAL_YEAR_END: FiscalYearEnd = "Q4";
24
-
25
- export function isFiscalYearEnd(value: unknown): value is FiscalYearEnd {
26
- return typeof value === "string" && (FISCAL_YEAR_ENDS as readonly string[]).includes(value);
27
- }
28
-
29
- /** Books written before the field existed are treated as Q4 in code
30
- * but never auto-rewritten on disk. The settings UI persists through
31
- * the field the next time the user saves anything on the book. */
32
- export function resolveFiscalYearEnd(value: FiscalYearEnd | undefined): FiscalYearEnd {
33
- return value ?? DEFAULT_FISCAL_YEAR_END;
34
- }
35
-
36
- /** Last calendar month (1-12) of the fiscal year for the given Q. */
37
- export function fiscalYearEndMonth(end: FiscalYearEnd): 3 | 6 | 9 | 12 {
38
- if (end === "Q1") return 3;
39
- if (end === "Q2") return 6;
40
- if (end === "Q3") return 9;
41
- return 12;
42
- }
43
-
44
- export interface DateRange {
45
- /** Inclusive lower bound (YYYY-MM-DD). Empty string = unbounded. */
46
- from: string;
47
- /** Inclusive upper bound (YYYY-MM-DD). Empty string = unbounded. */
48
- to: string;
49
- }
50
-
51
- function pad2(num: number): string {
52
- return String(num).padStart(2, "0");
53
- }
54
-
55
- function lastDayOfMonth(year: number, monthZeroBased: number): number {
56
- // Day 0 of next month = last day of this month, all in local time.
57
- return new Date(year, monthZeroBased + 1, 0).getDate();
58
- }
59
-
60
- function ymd(year: number, monthOneBased: number, day: number): string {
61
- return `${year}-${pad2(monthOneBased)}-${pad2(day)}`;
62
- }
63
-
64
- /** Fiscal quarter index (0..3) of the given local date under `end`,
65
- * where 0 is the first quarter of the fiscal year (right after the
66
- * prior year's close) and 3 is the closing quarter. */
67
- function fiscalQuarterIndex(end: FiscalYearEnd, today: Date): number {
68
- const closingMonth = fiscalYearEndMonth(end); // 1-based
69
- const month = today.getMonth() + 1; // 1-based local month
70
- // Months past the close of the prior fiscal year, mod 12.
71
- const offset = (month - closingMonth - 1 + 12) % 12;
72
- return Math.floor(offset / 3);
73
- }
74
-
75
- /** Calendar (year, monthOneBased) of the *first* month of the fiscal
76
- * quarter at index `index` in the fiscal year that *contains*
77
- * `today`. Returned both as the first day of that month and as the
78
- * count of months covered (always 3 — exposed as a constant). */
79
- function fiscalQuarterStart(end: FiscalYearEnd, today: Date, index: number): { year: number; month: number } {
80
- const closingMonth = fiscalYearEndMonth(end);
81
- const todayMonth = today.getMonth() + 1;
82
- const todayYear = today.getFullYear();
83
- // Month after the close of the prior fiscal year — fiscal-year start month.
84
- const startMonth = (closingMonth % 12) + 1;
85
- // The fiscal year that contains `today` started in the calendar
86
- // year ≤ today's year. Specifically: if today's calendar month is
87
- // ≥ startMonth (or startMonth is 1, which is the Q4 case), the FY
88
- // started this calendar year; otherwise it started last year.
89
- const fyStartYear = todayMonth >= startMonth ? todayYear : todayYear - 1;
90
- // Month of the requested fiscal quarter's first month, expressed
91
- // as a 1-based offset from January of fyStartYear.
92
- const flatMonth = startMonth + index * 3; // 1-based, may exceed 12
93
- const year = fyStartYear + Math.floor((flatMonth - 1) / 12);
94
- const month = ((flatMonth - 1) % 12) + 1;
95
- return { year, month };
96
- }
97
-
98
- function quarterRangeAt(end: FiscalYearEnd, today: Date, index: number): DateRange {
99
- const start = fiscalQuarterStart(end, today, index);
100
- // Quarter spans 3 calendar months starting at `start`.
101
- const lastMonthFlat = start.month - 1 + 2; // 0-based offset of the third month
102
- const lastMonthYear = start.year + Math.floor(lastMonthFlat / 12);
103
- const lastMonth = (lastMonthFlat % 12) + 1; // 1-based
104
- const lastDay = lastDayOfMonth(lastMonthYear, lastMonth - 1);
105
- return {
106
- from: ymd(start.year, start.month, 1),
107
- to: ymd(lastMonthYear, lastMonth, lastDay),
108
- };
109
- }
110
-
111
- export function currentQuarterRange(end: FiscalYearEnd, today: Date = new Date()): DateRange {
112
- return quarterRangeAt(end, today, fiscalQuarterIndex(end, today));
113
- }
114
-
115
- export function previousQuarterRange(end: FiscalYearEnd, today: Date = new Date()): DateRange {
116
- const idx = fiscalQuarterIndex(end, today);
117
- if (idx > 0) return quarterRangeAt(end, today, idx - 1);
118
- // Wrap to Q4 of the prior fiscal year. Step `today` back 3 months
119
- // — that lands inside the prior fiscal year regardless of `end`,
120
- // and Q4 (closing) is index 3 within whichever FY contains it.
121
- const stepped = new Date(today.getFullYear(), today.getMonth() - 3, 1);
122
- return quarterRangeAt(end, stepped, 3);
123
- }
124
-
125
- /** Current fiscal year — Q0 start through Q3 close. */
126
- export function currentFiscalYearRange(end: FiscalYearEnd, today: Date = new Date()): DateRange {
127
- const first = quarterRangeAt(end, today, 0);
128
- const last = quarterRangeAt(end, today, 3);
129
- return { from: first.from, to: last.to };
130
- }
131
-
132
- export function previousFiscalYearRange(end: FiscalYearEnd, today: Date = new Date()): DateRange {
133
- // Step a year back so `quarterRangeAt` resolves the prior FY.
134
- const stepped = new Date(today.getFullYear() - 1, today.getMonth(), today.getDate());
135
- return currentFiscalYearRange(end, stepped);
136
- }
@@ -1,16 +0,0 @@
1
- // Single source of truth for the `getTimeSeries` action's enum
2
- // surfaces — kept outside the server module so the frontend tool
3
- // definition (`definition.ts`) and the server validator
4
- // (`server/accounting/timeSeries.ts`) can both import without
5
- // crossing the src ↔ server boundary in the wrong direction.
6
- //
7
- // Adding a new metric / granularity: extend the array here, then
8
- // extend the corresponding switch / aggregation in
9
- // `server/accounting/timeSeries.ts`. The LLM tool schema picks up
10
- // the new value automatically via `definition.ts`'s `enum` field.
11
-
12
- export const TIME_SERIES_METRICS = ["revenue", "expense", "netIncome", "accountBalance"] as const;
13
- export type TimeSeriesMetric = (typeof TIME_SERIES_METRICS)[number];
14
-
15
- export const TIME_SERIES_GRANULARITIES = ["month", "quarter", "year"] as const;
16
- export type TimeSeriesGranularity = (typeof TIME_SERIES_GRANULARITIES)[number];
@@ -1,137 +0,0 @@
1
- // Pure helpers for reading, building, and validating wiki route
2
- // params. Kept free of Vue / vue-router imports so it can be used
3
- // from:
4
- //
5
- // - `src/router/guards.ts` (synchronous validation at navigation time)
6
- // - `src/plugins/wiki/View.vue` (watcher + push helpers)
7
- // - `src/App.vue` (workspace-link click handler)
8
- // - unit tests
9
- //
10
- // Mirrors the pattern established by `src/composables/useFileSelection.ts`
11
- // (#633): one file owns the URL ↔ domain mapping, so the literals don't
12
- // drift across the router definition, guards, views, and tests.
13
-
14
- import { isSafeSlug } from "../../lib/wiki-page/slug";
15
-
16
- // URL segment used in `/wiki/:section/...`. Closed enum — the router
17
- // regex `(pages|log|lint-report)` rejects anything else.
18
- export const WIKI_ROUTE_SECTION = {
19
- pages: "pages",
20
- log: "log",
21
- lintReport: "lint-report",
22
- graph: "graph",
23
- } as const;
24
-
25
- export type WikiRouteSection = (typeof WIKI_ROUTE_SECTION)[keyof typeof WIKI_ROUTE_SECTION];
26
-
27
- // Internal action name sent to the server / shown in the View. Diverges
28
- // from the URL segment in one place only: `lint-report` (URL) vs
29
- // `lint_report` (action), because the server API still speaks the
30
- // underscore form.
31
- export const WIKI_ACTION = {
32
- index: "index",
33
- page: "page",
34
- log: "log",
35
- lintReport: "lint_report",
36
- graph: "graph",
37
- save: "save",
38
- } as const;
39
-
40
- export type WikiAction = (typeof WIKI_ACTION)[keyof typeof WIKI_ACTION];
41
-
42
- // Route-level representation. `pushWiki(target)` and
43
- // `readWikiRouteTarget(params)` both speak this so the watcher, the
44
- // button handlers, and the router guard agree on the same shape.
45
- export type WikiTarget = { kind: "index" } | { kind: "page"; slug: string } | { kind: "log" } | { kind: "lint_report" } | { kind: "graph" };
46
-
47
- // Reject anything that could escape `data/wiki/pages/` or collide
48
- // with a different page. Vue Router decodes `%2F` back to `/` in
49
- // `route.params.slug`, so `/wiki/pages/..%2Fsecrets` lands here as
50
- // `slug === "../secrets"` — this check is the last line of defence
51
- // before the slug is passed to the server's page resolver. Non-
52
- // ASCII characters (e.g. Japanese page titles) are allowed; only
53
- // separators and the literal `.` / `..` are blocked.
54
- //
55
- // Delegates the actual rule to `isSafeSlug` in
56
- // `src/lib/wiki-page/slug.ts` (imported at the top of this file)
57
- // so server and frontend share one implementation (#1297). The
58
- // wrapper adds the type-guard / non-string-input handling the
59
- // router needs.
60
- export function isSafeWikiSlug(value: unknown): value is string {
61
- return typeof value === "string" && isSafeSlug(value);
62
- }
63
-
64
- // Read `route.params` from the wiki route and normalise to a
65
- // `WikiTarget`. Returns `null` when the params describe an invalid
66
- // state (unknown section, missing slug for a page view, unsafe slug)
67
- // so the caller can decide what to do — the router guard redirects to
68
- // `/wiki`, the view watcher treats it as "render the index".
69
- export function readWikiRouteTarget(params: unknown): WikiTarget | null {
70
- if (!params || typeof params !== "object") return null;
71
- const { section, slug } = params as { section?: unknown; slug?: unknown };
72
-
73
- if (section === undefined || section === "") return { kind: "index" };
74
-
75
- if (section === WIKI_ROUTE_SECTION.pages) {
76
- if (!isSafeWikiSlug(slug)) return null;
77
- return { kind: "page", slug };
78
- }
79
- if (section === WIKI_ROUTE_SECTION.log) return { kind: "log" };
80
- if (section === WIKI_ROUTE_SECTION.lintReport) return { kind: "lint_report" };
81
- if (section === WIKI_ROUTE_SECTION.graph) return { kind: "graph" };
82
-
83
- return null;
84
- }
85
-
86
- // Inverse of `readWikiRouteTarget`: given a target, produce the
87
- // `{ section, slug }` params object that `router.push({ name: "wiki",
88
- // params })` needs.
89
- //
90
- // Optional route params are NOT cleared by named-route navigation
91
- // unless explicitly set — returning `{}` for `kind: "index"` would
92
- // leak the previous `section`/`slug` into the URL when navigating
93
- // from `/wiki/pages/foo` back to the index, leaving the user on
94
- // `/wiki/pages/foo` with the View believing it's the index. Pass
95
- // empty strings so the router writes out `/wiki` cleanly. The
96
- // readWikiRouteTarget() branch for `section === ""` already
97
- // normalises those back to `{ kind: "index" }`.
98
- export function buildWikiRouteParams(target: WikiTarget): Record<string, string> {
99
- switch (target.kind) {
100
- case "index":
101
- return { section: "", slug: "" };
102
- case "page":
103
- return { section: WIKI_ROUTE_SECTION.pages, slug: target.slug };
104
- case "log":
105
- return { section: WIKI_ROUTE_SECTION.log, slug: "" };
106
- case "lint_report":
107
- return { section: WIKI_ROUTE_SECTION.lintReport, slug: "" };
108
- case "graph":
109
- return { section: WIKI_ROUTE_SECTION.graph, slug: "" };
110
- default: {
111
- const exhaustive: never = target;
112
- throw new Error(`unreachable WikiTarget kind: ${JSON.stringify(exhaustive)}`);
113
- }
114
- }
115
- }
116
-
117
- // Resolve a target to the action name the server expects. Centralises
118
- // the one place URL-shape and action-shape diverge (`lint-report` ↔
119
- // `lint_report`).
120
- export function wikiActionFor(target: WikiTarget): WikiAction {
121
- switch (target.kind) {
122
- case "index":
123
- return WIKI_ACTION.index;
124
- case "page":
125
- return WIKI_ACTION.page;
126
- case "log":
127
- return WIKI_ACTION.log;
128
- case "lint_report":
129
- return WIKI_ACTION.lintReport;
130
- case "graph":
131
- return WIKI_ACTION.graph;
132
- default: {
133
- const exhaustive: never = target;
134
- throw new Error(`unreachable WikiTarget kind: ${JSON.stringify(exhaustive)}`);
135
- }
136
- }
137
- }