collabmd 0.1.49 → 0.1.51

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 (400) hide show
  1. package/README.md +10 -659
  2. package/bin/collabmd.js +36 -20
  3. package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-Crf9Y3Q6.js +1 -0
  4. package/dist/client/assets/{abnfDiagram-VCTEODGH-CdVZqicp.js → abnfDiagram-VCTEODGH-PuinKbSQ.js} +1 -1
  5. package/dist/client/assets/ar-SA-5WIASEJP-Di7OimCN.js +10 -0
  6. package/dist/client/assets/{architectureDiagram-5GKGNRK7-wUo0bXif.js → architectureDiagram-5GKGNRK7-46hPkrZv.js} +1 -1
  7. package/dist/client/assets/az-AZ-V5EUQD6C-C19OGTT_.js +1 -0
  8. package/dist/client/assets/bg-BG-EXASCMTR-BIt0xWyb.js +5 -0
  9. package/dist/client/assets/{blockDiagram-I7D4REHJ-BRSK3m49.js → blockDiagram-I7D4REHJ-C1S5Bzf8.js} +1 -1
  10. package/dist/client/assets/bn-BD-U4SYNFCO-CdNaPy4Q.js +3 -0
  11. package/dist/client/assets/bn-IN-HKDJIITE-CdNaPy4Q.js +3 -0
  12. package/dist/client/assets/{browser-BKLM0ThC-IxjwuOIz-BBqQnUEb.js → browser-BKLM0ThC-IxjwuOIz-DyJcVMFR.js} +1 -1
  13. package/dist/client/assets/{c4Diagram-7LVT6UL2-yD2poxqw.js → c4Diagram-7LVT6UL2-VAk1HPmz.js} +1 -1
  14. package/dist/client/assets/ca-ES-2KGUU5XB-C9t-c0cH.js +8 -0
  15. package/dist/client/assets/channel-jwdhnPiV.js +1 -0
  16. package/dist/client/assets/chunk-2E4U76K2-Ba8Wf22k.js +1 -0
  17. package/dist/client/assets/{chunk-4HAMMTFA-DStbIfJ1.js → chunk-4HAMMTFA-Ht-73lsT.js} +1 -1
  18. package/dist/client/assets/chunk-5XKZK2GL-D4UAZSOJ.js +1 -0
  19. package/dist/client/assets/{chunk-75Z2AOVW-C5pGd3W9.js → chunk-75Z2AOVW-B2cZexqK.js} +1 -1
  20. package/dist/client/assets/{chunk-CLGD4ZFX-BMeArk03.js → chunk-CLGD4ZFX-Cmtx89ht.js} +1 -1
  21. package/dist/client/assets/{chunk-DU6HZSFF-Zkp69c6c.js → chunk-DU6HZSFF-C6d6PJfE.js} +1 -1
  22. package/dist/client/assets/{chunk-F27PBJKO-D4xNct1r.js → chunk-F27PBJKO-Dg3H6KLL.js} +1 -1
  23. package/dist/client/assets/{chunk-GMAD6QVW-NZ6WpDb8.js → chunk-GMAD6QVW-DUfjx_d5.js} +1 -1
  24. package/dist/client/assets/{chunk-GVQU2GXP-D8SDprfX.js → chunk-GVQU2GXP-D1l7oRGR.js} +1 -1
  25. package/dist/client/assets/{chunk-IMKFNOWR-D8jEuU3Q.js → chunk-IMKFNOWR-3F6NhHUP.js} +1 -1
  26. package/dist/client/assets/{chunk-L3NEJ4N5-aijKP-eh.js → chunk-L3NEJ4N5-BmCVn4y-.js} +1 -1
  27. package/dist/client/assets/{chunk-OSK3NFVY-CCbLQAMa.js → chunk-OSK3NFVY-CWHXAmfx.js} +1 -1
  28. package/dist/client/assets/{chunk-P2QGCYS3-Oag_FdCq.js → chunk-P2QGCYS3-Du8EtwOa.js} +1 -1
  29. package/dist/client/assets/{chunk-POPQ4Y6H-CYnpIgXT.js → chunk-POPQ4Y6H-B5yJIrZE.js} +1 -1
  30. package/dist/client/assets/{chunk-PWAF6VOD-JSNrcBmP.js → chunk-PWAF6VOD-B3gML4ps.js} +1 -1
  31. package/dist/client/assets/{chunk-SHT3W25Y-BiQGljao.js → chunk-SHT3W25Y-BKaI8jZO.js} +1 -1
  32. package/dist/client/assets/{chunk-SVP7TREG-DB485R5x.js → chunk-SVP7TREG-XlsB_ZMZ.js} +1 -1
  33. package/dist/client/assets/{chunk-TICWLB2K-8rAVvoS3.js → chunk-TICWLB2K-Cpp2z8yK.js} +1 -1
  34. package/dist/client/assets/chunk-TLUHSLCS-Yl7B0Vrz.js +1 -0
  35. package/dist/client/assets/chunk-ZNVOA63L-BmCQjhx-.js +40 -0
  36. package/dist/client/assets/{chunk-FLYJHZSQ-Be7lKF17.js → chunk-ZPMXAHWN-Dt0TxJa6.js} +2 -2
  37. package/dist/client/assets/classDiagram-ZZMXUADV-BRw9vo8U.js +1 -0
  38. package/dist/client/assets/classDiagram-v2-VYDZK3BY-BRw9vo8U.js +1 -0
  39. package/dist/client/assets/comment-markdown-renderer-B9_vPc3F.js +1 -0
  40. package/dist/client/assets/comment-thread-store-NNHqRVsX.js +1 -0
  41. package/dist/client/assets/comment-threads-nJhK1yfc.js +4 -0
  42. package/dist/client/assets/cs-CZ-VUCGPRML-BfCoYAgj.js +7 -0
  43. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-rTz9RhFH.js → cynefinDiagram-5FMLGOSQ-BRoCEoZM.js} +1 -1
  44. package/dist/client/assets/da-DK-NNDP2IVP-DBw9ZNTR.js +2 -0
  45. package/dist/client/assets/{dagre-GXQ25YYZ-Cr67wLpQ.js → dagre-GXQ25YYZ-BSfKCfy7.js} +1 -1
  46. package/dist/client/assets/de-CH-I7RAVIZN-DYW18Vsr.js +11 -0
  47. package/dist/client/assets/de-DE-WBQ3DQLR-DYW18Vsr.js +11 -0
  48. package/dist/client/assets/deferred-collab-rBe4nuQ2.css +1 -0
  49. package/dist/client/assets/deferred-git-BHKtkFYi.css +1 -0
  50. package/dist/client/assets/deferred-preview-pe7Iwwx3.css +1 -0
  51. package/dist/client/assets/{diagram-S7CK7UJ4-DywERe__.js → diagram-S7CK7UJ4-D7KaM9yj.js} +1 -1
  52. package/dist/client/assets/{diagram-UQ7AKVKN-CNYlXtu4.js → diagram-UQ7AKVKN-JevUZuYi.js} +1 -1
  53. package/dist/client/assets/{diagram-VSXAHHWV-0H1a61Bn.js → diagram-VSXAHHWV-B3-U-Q2E.js} +1 -1
  54. package/dist/client/assets/{diagram-VX7I27RA-CsJbsx5F.js → diagram-VX7I27RA-pSD4HMh1.js} +1 -1
  55. package/dist/client/assets/{diagram-Z3DM3KII-D0mLxEgI.js → diagram-Z3DM3KII-D8r1_CIb.js} +1 -1
  56. package/dist/client/assets/{direct-engine-DdrQKpgq-CtKfQzCt.js → direct-engine-DdrQKpgq-B5zIoeQw.js} +1 -1
  57. package/dist/client/assets/dist-B3HdUPsK.js +1 -0
  58. package/dist/client/assets/{dist-Tw-Fxpeb.js → dist-B7XMN9AT.js} +1 -1
  59. package/dist/client/assets/dist-BIRygGYH.js +1 -0
  60. package/dist/client/assets/dist-BPyOlNLY.js +2 -0
  61. package/dist/client/assets/{dist-D5wCC32z.js → dist-BR81yxMt.js} +1 -1
  62. package/dist/client/assets/{dist-TW8iFRyW.js → dist-B_B4XLmq.js} +1 -1
  63. package/dist/client/assets/dist-Bdy9ZRzd.js +9 -0
  64. package/dist/client/assets/{dist-netZOQtD.js → dist-Bfxzlnrf.js} +1 -1
  65. package/dist/client/assets/{dist-DzNmC81X.js → dist-Bx3QkS-3.js} +1 -1
  66. package/dist/client/assets/{dist-mj2Ht75J.js → dist-By7ieqAf.js} +1 -1
  67. package/dist/client/assets/dist-ByhQbe-x.js +1 -0
  68. package/dist/client/assets/{dist-CdmKGRGr.js → dist-BzFSJM0U.js} +1 -1
  69. package/dist/client/assets/dist-C5NkYKAa.js +1 -0
  70. package/dist/client/assets/{dist-D3fehAZ2.js → dist-CELhfKzh.js} +1 -1
  71. package/dist/client/assets/dist-CEirJSxk.js +1 -0
  72. package/dist/client/assets/dist-CO0-4CuV.js +39 -0
  73. package/dist/client/assets/dist-CRnJ0D9h.js +1 -0
  74. package/dist/client/assets/{dist-GvvCNBe4.js → dist-CbDyXgCo.js} +1 -1
  75. package/dist/client/assets/{dist-BeajGMhO.js → dist-CqXVyYoH.js} +1 -1
  76. package/dist/client/assets/{dist-LQ4kDCKz.js → dist-CrWzIWEE.js} +1 -1
  77. package/dist/client/assets/dist-CyNrloSI.js +1 -0
  78. package/dist/client/assets/dist-D60_kdpQ.js +1 -0
  79. package/dist/client/assets/{dist-DuH3ZrHo.js → dist-DCpIH3-_.js} +1 -1
  80. package/dist/client/assets/{dist-BPHLJ09L.js → dist-DJAMplZI.js} +2 -2
  81. package/dist/client/assets/{dist-DGEbEfw4.js → dist-DVXzbeDx.js} +1 -1
  82. package/dist/client/assets/{dist-C5NgpdG5.js → dist-Drv_wZYC.js} +1 -1
  83. package/dist/client/assets/{dist-DVy5woUy.js → dist-EWJYvBK1.js} +1 -1
  84. package/dist/client/assets/dist-Hdhj3L3t.js +1 -0
  85. package/dist/client/assets/{dist-DpYDHR9p.js → dist-gRRhmB-2.js} +3 -3
  86. package/dist/client/assets/dist-kWb2d1CH.js +1 -0
  87. package/dist/client/assets/dist-kiD2GIsD.js +13 -0
  88. package/dist/client/assets/{dist-JaU3aRlD.js → dist-l-56SowH.js} +1 -1
  89. package/dist/client/assets/{dist-BK9QvQrc.js → dist-nxQErAaK.js} +2 -2
  90. package/dist/client/assets/dist-sLzRQQk7.js +1 -0
  91. package/dist/client/assets/document-formatter-Qdiq9uJs.js +1 -0
  92. package/dist/client/assets/drawioEditor-CHf1vtdQ.js +9 -0
  93. package/dist/client/assets/{ebnfDiagram-PWID7BFC-HeTxHpCU.js → ebnfDiagram-PWID7BFC-UJ0Fz5ci.js} +1 -1
  94. package/dist/client/assets/editor-session-4Bn81iWm.js +14 -0
  95. package/dist/client/assets/el-GR-TYQHVGXW-Dx82YYAS.js +7 -0
  96. package/dist/client/assets/embedded-editor-base-jK221GC8.css +1 -0
  97. package/dist/client/assets/{embedpdf-DA4bA119-BPqZxwjc.js → embedpdf-DA4bA119-E8wZ11J2.js} +2 -3
  98. package/dist/client/assets/{embedpdf-BmE13ZZ0.js → embedpdf-LUXDBD3-.js} +1 -1
  99. package/dist/client/assets/{en-SJ2YIMFF-CJBL3nkq.js → en-2RFA324Y-BsuNJTcL.js} +1 -1
  100. package/dist/client/assets/{erDiagram-RLTQ6QDP-CbrDdd5P.js → erDiagram-RLTQ6QDP-CWrH1UJ9.js} +1 -1
  101. package/dist/client/assets/es-ES-JEUOREKJ-Rx0NUQDl.js +12 -0
  102. package/dist/client/assets/eu-ES-SO5DEEAN-CDYm-BcK.js +8 -0
  103. package/dist/client/assets/excalidraw-element-link-iA6zo0_f.js +7 -0
  104. package/dist/client/assets/{excalidrawEditor-BbSbI80a.css → excalidrawEditor-DDE0n1Pk.css} +1 -1
  105. package/dist/client/assets/excalidrawEditor-WIuguTz7.js +9 -0
  106. package/dist/client/assets/export-page-AN-wI5p4.js +56 -0
  107. package/dist/client/assets/exportDocument-B7IagJhQ.css +1 -0
  108. package/dist/client/assets/exportDocument-B9xNKpQe.js +2 -0
  109. package/dist/client/assets/fa-IR-FIYUE2GQ-C865Nx3X.js +9 -0
  110. package/dist/client/assets/fi-FI-REAEF6HQ-BIpjJqIb.js +6 -0
  111. package/dist/client/assets/flowDiagram-HODETNUW-kb1lUSBo.js +1 -0
  112. package/dist/client/assets/fr-FR-SUCL7J6B-DGAKE8jH.js +12 -0
  113. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-BHgOYiZz.js → ganttDiagram-EL5Y4UJY-BBNzDfaV.js} +1 -1
  114. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-Dl__X3Sk.js → gitGraphDiagram-WWUBYQGX-Csf0Dm_1.js} +1 -1
  115. package/dist/client/assets/gl-ES-KHCSOGVH-DWKh0CMu.js +6 -0
  116. package/dist/client/assets/he-IL-JYXVXV2Q-zqbcM-4g.js +9 -0
  117. package/dist/client/assets/hi-IN-BU52H3BO-CY8v6eG9.js +3 -0
  118. package/dist/client/assets/highlight-theme-CzNkO-IJ.js +1 -0
  119. package/dist/client/assets/hu-HU-OWADXDQ3-CEl6Udfh.js +3 -0
  120. package/dist/client/assets/id-ID-EOMR5R3I-CGQwUjoL.js +8 -0
  121. package/dist/client/assets/image-2QKV3NAF-BUbX0y5Y.js +1 -0
  122. package/dist/client/assets/index-BAmZnTFV.css +1 -0
  123. package/dist/client/assets/index-mWiw418b.js +1111 -0
  124. package/dist/client/assets/{infoDiagram-27XIBGKW-DBpoANC9.js → infoDiagram-27XIBGKW-Bzy6kCbb.js} +1 -1
  125. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-BMPC6hfp.js → ishikawaDiagram-5VMMS53U-CRy9vIS5.js} +1 -1
  126. package/dist/client/assets/it-IT-FC2VTM3L-KTijNcUe.js +12 -0
  127. package/dist/client/assets/ja-JP-JBNTKYP4-BflWlGhw.js +12 -0
  128. package/dist/client/assets/{journeyDiagram-3NMN7TZE-B1sApUmM.js → journeyDiagram-3NMN7TZE-D4ZR_s9J.js} +1 -1
  129. package/dist/client/assets/kaa-TC3VIB7V-B-xtZfy0.js +1 -0
  130. package/dist/client/assets/kab-KAB-UOUDSQKM-BmO0O4Y4.js +4 -0
  131. package/dist/client/assets/{kanban-definition-UXKFOSKX-C9yP4td1.js → kanban-definition-UXKFOSKX-CIDTmu5g.js} +1 -1
  132. package/dist/client/assets/kk-KZ-P5H2X7YS-CSQFB8IN.js +1 -0
  133. package/dist/client/assets/{km-KH-PCWDKPHP-DSmy5shj.js → km-KH-IHMV2US7-BxrjuEzr.js} +4 -4
  134. package/dist/client/assets/ko-KR-ZTMANIDF-BnNRXd5J.js +5 -0
  135. package/dist/client/assets/ku-TR-GPJTRB5G-BZM7f2aT.js +6 -0
  136. package/dist/client/assets/{line-BFl3ujec.js → line-DSWLHgpx.js} +1 -1
  137. package/dist/client/assets/lobby-presence-Rdjnc0_0.js +1 -0
  138. package/dist/client/assets/lt-LT-V3XDOK3P-MVQBOHmF.js +3 -0
  139. package/dist/client/assets/lv-LV-DVQ3FADO-CrenwAhS.js +4 -0
  140. package/dist/client/assets/markdown-it-CocJWnjv.js +13 -0
  141. package/dist/client/assets/mermaid-parser.core-DrdLA3p0.js +3 -0
  142. package/dist/client/assets/mermaid.core-C_FK-7n4.js +1 -0
  143. package/dist/client/assets/{mermaid.core-BrY09czX.js → mermaid.core-D0cMM4Rl.js} +2 -3
  144. package/dist/client/assets/{mindmap-definition-YA3MSWOX-BUQHcYbK.js → mindmap-definition-YA3MSWOX-DO8NB9VH.js} +1 -1
  145. package/dist/client/assets/mr-IN-VZ6HH5FE-B-PHPglH.js +9 -0
  146. package/dist/client/assets/my-MM-XYKWHRK6-Be5sYp5q.js +1 -0
  147. package/dist/client/assets/nb-NO-UNO2GGZJ-BvSKGdja.js +8 -0
  148. package/dist/client/assets/nl-NL-76EFHT4P-C2yNx1Cj.js +13 -0
  149. package/dist/client/assets/nn-NO-CFKD7ABE-4NsqlDRP.js +4 -0
  150. package/dist/client/assets/oc-FR-YBJTCJ3J-B4OTQsWW.js +4 -0
  151. package/dist/client/assets/pa-IN-SNOXSMRV-CKj_sOG7.js +4 -0
  152. package/dist/client/assets/{pegDiagram-XKGWAZYB-Bi2Iml7Z.js → pegDiagram-XKGWAZYB-DS6Ab21R.js} +1 -1
  153. package/dist/client/assets/percentages-Q7USCRWZ-DWE6uvTs.js +1 -0
  154. package/dist/client/assets/{pieDiagram-E7YTZNPT-_gYXnMoi.js → pieDiagram-E7YTZNPT-BbFe6Tgs.js} +1 -1
  155. package/dist/client/assets/pl-PL-BSY6YFZ3-CFuzA6L0.js +12 -0
  156. package/dist/client/assets/preload-helper-CtT0-S4g.js +1 -0
  157. package/dist/client/assets/preview-render-compiler-C_7J7eia.js +43 -0
  158. package/dist/client/assets/preview-render-compiler-DzJ1KR_M.js +1 -0
  159. package/dist/client/assets/preview-render-worker-1DoIDllV.js +59 -0
  160. package/dist/client/assets/prod-D5TxmmoB.js +1 -0
  161. package/dist/client/assets/prod-pbFU4TaM.js +145 -0
  162. package/dist/client/assets/pt-BR-CZDV62R3-CkPMtyNx.js +10 -0
  163. package/dist/client/assets/pt-PT-JO57XJJW-CBSnfGtF.js +12 -0
  164. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-DwexhEhd.js → quadrantDiagram-AXDQQJYC-fJE7iAxt.js} +1 -1
  165. package/dist/client/assets/quick-switcher-De4PjZFC.css +1 -0
  166. package/dist/client/assets/quick-switcher-controller-CUajuy78.js +1 -0
  167. package/dist/client/assets/{railroadDiagram-O6MQD6OU-BVA5UbMu.js → railroadDiagram-O6MQD6OU-CUQKqbCK.js} +1 -1
  168. package/dist/client/assets/{requirementDiagram-BXWQKSXE-C4cKwiIw.js → requirementDiagram-BXWQKSXE-Balm0WW8.js} +1 -1
  169. package/dist/client/assets/ro-RO-UZ5ICYYN-BOuntc_r.js +12 -0
  170. package/dist/client/assets/room-DX7lIfnu.js +1 -0
  171. package/dist/client/assets/ru-RU-AN7JPREC-D-ow3SNR.js +10 -0
  172. package/dist/client/assets/runtime-config-BFVdhnJu.js +1 -0
  173. package/dist/client/assets/runtime-paths-Cn0snt_9.js +1 -0
  174. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-B5HHkRT2.js → sankeyDiagram-P5KCCOFB-CcbMqrlQ.js} +1 -1
  175. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-BX6jqJFD.js → sequenceDiagram-WJ2MYXX4-BL1j3Sn-.js} +1 -1
  176. package/dist/client/assets/si-LK-7CBLD6QQ-c91EepX0.js +1 -0
  177. package/dist/client/assets/sk-SK-SWR6DKBI-D5vFMIL6.js +7 -0
  178. package/dist/client/assets/sl-SI-JRML4FIH-D53L_0S2.js +6 -0
  179. package/dist/client/assets/{stateDiagram-D77RDMKH-CmqxyRGx.js → stateDiagram-D77RDMKH-DNi924hh.js} +1 -1
  180. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-C62JEwak.js +1 -0
  181. package/dist/client/assets/sv-SE-4ZPKFFXF-DT-G7RCI.js +12 -0
  182. package/dist/client/assets/{swimlanes-42K2YHIH-Bmgb9Zld.js → swimlanes-42K2YHIH-ColgjSH4.js} +1 -1
  183. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-B9UZhEj4.js +8 -0
  184. package/dist/client/assets/ta-IN-V6NHHU6Z-D5jy7_AE.js +6 -0
  185. package/dist/client/assets/th-TH-P7CTMGDK-6sy0NO7K.js +1 -0
  186. package/dist/client/assets/{timeline-definition-24CTP7MA-BA-lVH6P.js → timeline-definition-24CTP7MA-7pch5JAr.js} +1 -1
  187. package/dist/client/assets/tr-TR-GUFYG22B-ClVaf8h1.js +4 -0
  188. package/dist/client/assets/uk-UA-K6SV5NFQ-BLTTtyNB.js +6 -0
  189. package/dist/client/assets/uz-UZ-TVKTZO2G-Bm02Eg3D.js +1 -0
  190. package/dist/client/assets/vault-api-client-QjZ_T03l.js +7 -0
  191. package/dist/client/assets/vault-utils-Bct69Xw2.js +1 -0
  192. package/dist/client/assets/{vennDiagram-4TSXK5OY-DNdUC_Xj.js → vennDiagram-4TSXK5OY-C5taziCX.js} +1 -1
  193. package/dist/client/assets/vi-VN-7FKFXJNO-CL3WPhmG.js +7 -0
  194. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-C2oY-YbF.js → wardleyDiagram-VM6X3IG4-BbSlUwuM.js} +1 -1
  195. package/dist/client/assets/{wiki-link-resolver-DFIwErjc.js → wiki-link-resolver-C2P_WmTV.js} +1 -1
  196. package/dist/client/assets/{worker-engine-m0rlHn8R-S8mpn_O0.js → worker-engine-m0rlHn8R-eSDcDGEI.js} +1 -1
  197. package/dist/client/assets/workspace-change-CVA9dVmy.js +1 -0
  198. package/dist/client/assets/workspace-sync-client-D4nblH_2.js +1 -0
  199. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-CoIR8CBX.js → xychartDiagram-S5SC5T6Z-D06X1arY.js} +1 -1
  200. package/dist/client/assets/yjs-B41tM6Sz.js +4 -0
  201. package/dist/client/assets/yjs-provider-reset-guard-R43MnLNc.js +1 -0
  202. package/dist/client/assets/zh-CN-AOKVLNNK-DGidDH2b.js +11 -0
  203. package/dist/client/assets/zh-HK-CDKPF5DC-CRcNR3rk.js +1 -0
  204. package/dist/client/assets/zh-TW-ZVGYESGW-C7Qji1y6.js +13 -0
  205. package/dist/client/drawio-editor.html +7 -8
  206. package/dist/client/excalidraw-editor.html +31 -33
  207. package/dist/client/export-document.html +5 -7
  208. package/dist/client/index.html +30 -26
  209. package/package.json +14 -20
  210. package/src/client/app/drawio-editor.html +1 -1
  211. package/src/client/app/excalidraw-editor.html +1 -1
  212. package/src/client/app/export-document.html +1 -1
  213. package/src/client/app/index.html +28 -4
  214. package/src/client/app/main-entry.js +1 -19
  215. package/src/client/application/app-shell/comments-feature.js +6 -0
  216. package/src/client/application/app-shell/ui-feature-shell.js +136 -58
  217. package/src/client/application/app-shell/ui-feature-tab-activity.js +8 -3
  218. package/src/client/application/app-shell-elements.js +5 -0
  219. package/src/client/application/highlight-theme.js +16 -0
  220. package/src/client/application/preview-render-compiler.js +43 -20
  221. package/src/client/application/preview-render-executor.js +0 -26
  222. package/src/client/application/preview-renderer.js +24 -7
  223. package/src/client/application/workspace-coordinator.js +20 -21
  224. package/src/client/bootstrap/collabmd-app-shell.js +71 -35
  225. package/src/client/bootstrap/lazy-collab-clients.js +90 -0
  226. package/src/client/domain/excalidraw-scene-reconcile.js +5 -2
  227. package/src/client/domain/hash-routes.js +5 -0
  228. package/src/client/domain/highlight-runtime.js +47 -0
  229. package/src/client/domain/lobby-chat.js +2 -0
  230. package/src/client/domain/runtime-paths.js +56 -7
  231. package/src/client/domain/vault-utils.js +11 -0
  232. package/src/client/excalidraw-editor.js +20 -4
  233. package/src/client/infrastructure/auth-client.js +1 -2
  234. package/src/client/infrastructure/browser-preferences-port.js +16 -0
  235. package/src/client/infrastructure/editor-view-adapter.js +43 -8
  236. package/src/client/infrastructure/excalidraw-room-client.js +9 -1
  237. package/src/client/infrastructure/hosted-api-client.js +60 -0
  238. package/src/client/infrastructure/lobby-presence.js +2 -2
  239. package/src/client/infrastructure/runtime-config.js +3 -1
  240. package/src/client/infrastructure/webmcp-tool-registry.js +16 -2
  241. package/src/client/presentation/comment-markdown-renderer.js +2 -14
  242. package/src/client/presentation/comment-overview-controller.js +1 -2
  243. package/src/client/presentation/comment-ui/comment-ui-shared.js +5 -2
  244. package/src/client/presentation/file-explorer-controller.js +3 -0
  245. package/src/client/presentation/file-explorer-view.js +272 -174
  246. package/src/client/presentation/git-panel-controller.js +1 -1
  247. package/src/client/presentation/hosted-workspace-gate-controller.js +180 -0
  248. package/src/client/presentation/layout-controller.js +10 -1
  249. package/src/client/presentation/team-settings-controller.js +228 -0
  250. package/src/client/styles/deferred-collab.css +5 -0
  251. package/src/client/styles/deferred-git.css +7 -0
  252. package/src/client/styles/deferred-preview.css +6 -0
  253. package/src/client/styles/features/diagram-preview.css +0 -15
  254. package/src/client/styles/features/outline.css +4 -2
  255. package/src/client/styles/features/preview-markdown.css +25 -11
  256. package/src/client/styles/features/team-settings.css +162 -0
  257. package/src/client/styles/foundation/tokens.css +2 -2
  258. package/src/client/styles/layout/editor-page.css +0 -13
  259. package/src/client/styles/layout/overlays.css +16 -0
  260. package/src/client/styles/layout/responsive.css +5 -5
  261. package/src/client/styles/layout/shell.css +20 -1
  262. package/src/client/styles/layout/sidebar.css +92 -3
  263. package/src/client/styles/style.css +3 -19
  264. package/src/domain/agent-tool-definitions.js +139 -63
  265. package/src/domain/collabmd-content-capabilities.js +4 -4
  266. package/src/domain/excalidraw-agent-scene.js +108 -6
  267. package/src/domain/excalidraw-agent-verification.js +95 -1
  268. package/src/domain/excalidraw-room-codec.js +12 -1
  269. package/src/domain/literal-text-search.js +13 -0
  270. package/src/server/application/agent-content-service.js +142 -74
  271. package/src/server/config/env.js +96 -5
  272. package/src/server/create-app-server.js +23 -153
  273. package/src/server/domain/hosted-workspace.js +10 -1
  274. package/src/server/domain/ripgrep-search-service.js +68 -21
  275. package/src/server/infrastructure/git/local-exclude.js +13 -1
  276. package/src/server/infrastructure/http/create-agent-api-handler.js +1 -1
  277. package/src/server/infrastructure/http/create-hosted-api-handler.js +5 -0
  278. package/src/server/infrastructure/http/create-request-handler.js +95 -26
  279. package/src/server/infrastructure/http/create-static-handler.js +3 -0
  280. package/src/server/infrastructure/http/create-vault-api-query-handler.js +15 -2
  281. package/src/server/infrastructure/mcp/create-agent-mcp-handler.js +2 -1
  282. package/src/server/infrastructure/persistence/sidecar-store.js +12 -5
  283. package/src/server/infrastructure/persistence/vault-file-store.js +2 -3
  284. package/src/server/infrastructure/websocket/attach-collaboration-gateway.js +48 -22
  285. package/src/server/shared/agent-tool-rate-limiter.js +7 -0
  286. package/src/server/startup/git-remote-bootstrap.js +56 -49
  287. package/src/server/vault-registry.js +251 -0
  288. package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-C-nmgL5g.js +0 -1
  289. package/dist/client/assets/ar-SA-PQUY64WN-xjXgbW6d.js +0 -10
  290. package/dist/client/assets/az-AZ-OXJXL76K-4JkO4Pca.js +0 -1
  291. package/dist/client/assets/base-CaIEJUF9.css +0 -1
  292. package/dist/client/assets/bg-BG-W2GKIJDF-DnkH_o81.js +0 -5
  293. package/dist/client/assets/bn-BD-TGL7M4PJ-CG4JkmtP.js +0 -3
  294. package/dist/client/assets/bn-IN-BKETKYEH-CG4JkmtP.js +0 -3
  295. package/dist/client/assets/ca-ES-LD5SCRVV-U6_TVMX9.js +0 -8
  296. package/dist/client/assets/channel-Fa4GS_-F.js +0 -1
  297. package/dist/client/assets/chunk-2E4U76K2-BPnTT-J3.js +0 -2
  298. package/dist/client/assets/chunk-7XWMRXBY-CfMzEq80.js +0 -1
  299. package/dist/client/assets/chunk-RM4UPSZO-DOWllDY8.js +0 -41
  300. package/dist/client/assets/chunk-TLUHSLCS-DTY5v0aj.js +0 -2
  301. package/dist/client/assets/classDiagram-ZZMXUADV-BsQWoR3Q.js +0 -1
  302. package/dist/client/assets/classDiagram-v2-VYDZK3BY-BsQWoR3Q.js +0 -1
  303. package/dist/client/assets/comment-thread-store-CX98zR6q.js +0 -1
  304. package/dist/client/assets/comment-threads-BnRwo5B9.js +0 -4
  305. package/dist/client/assets/cs-CZ-OFPU5DBV-BmFAIhqX.js +0 -7
  306. package/dist/client/assets/da-DK-FRDJFYWF-H387Jw8B.js +0 -2
  307. package/dist/client/assets/de-CH-ZG7H3QK3-C_groygo.js +0 -11
  308. package/dist/client/assets/de-DE-SIJYH4IH-C_groygo.js +0 -11
  309. package/dist/client/assets/dist--hk9I5HQ.js +0 -1
  310. package/dist/client/assets/dist-B1XEa-Zs.js +0 -1
  311. package/dist/client/assets/dist-BJ1bJs33.js +0 -1
  312. package/dist/client/assets/dist-Bd1JucQF.js +0 -1
  313. package/dist/client/assets/dist-ByrG2qBA.js +0 -1
  314. package/dist/client/assets/dist-C0G3AaXG.js +0 -1
  315. package/dist/client/assets/dist-CKS_-are.js +0 -1
  316. package/dist/client/assets/dist-D37Hyu3h.js +0 -9
  317. package/dist/client/assets/dist-Dl_tpDSr.js +0 -1
  318. package/dist/client/assets/dist-Dm4w5UId.js +0 -1
  319. package/dist/client/assets/dist-RKBTaQMb.js +0 -13
  320. package/dist/client/assets/dist-eBx8q6Sy.js +0 -1
  321. package/dist/client/assets/dist-jVU5Be5P.js +0 -1
  322. package/dist/client/assets/document-formatter-rDDjRfZ2.js +0 -2
  323. package/dist/client/assets/drawioEditor-JubEEha7.js +0 -9
  324. package/dist/client/assets/editor-session-Bk6oIvSr.js +0 -54
  325. package/dist/client/assets/el-GR-IEE2CGI2-BkT6YT54.js +0 -7
  326. package/dist/client/assets/embedded-editor-base-BlCgz6mw.css +0 -1
  327. package/dist/client/assets/es-Bfdp096f.js +0 -22
  328. package/dist/client/assets/es-ES-TVVPWKV5-CpPKJXTM.js +0 -12
  329. package/dist/client/assets/eu-ES-CGBMFQDT-Bu3N2493.js +0 -8
  330. package/dist/client/assets/excalidraw-element-link-YLIaTnVF.js +0 -7
  331. package/dist/client/assets/excalidrawEditor-dBMbRX_S.js +0 -9
  332. package/dist/client/assets/export-page-CRRQ2NEl.js +0 -57
  333. package/dist/client/assets/exportDocument-BlQRd9_m.js +0 -2
  334. package/dist/client/assets/exportDocument-CNSbjZwu.css +0 -1
  335. package/dist/client/assets/fa-IR-IE6XAPR4-BEvLCORD.js +0 -9
  336. package/dist/client/assets/fi-FI-P7TKNHRM-DI0q8iSX.js +0 -6
  337. package/dist/client/assets/file-icon-svg-Y_kpF957.js +0 -1
  338. package/dist/client/assets/flowDiagram-HODETNUW-D5Gy0wmg.js +0 -1
  339. package/dist/client/assets/fr-FR-QI2XZNT7-y8kXd8LA.js +0 -12
  340. package/dist/client/assets/gl-ES-TLYCNOZZ-Br-Fhff-.js +0 -6
  341. package/dist/client/assets/he-IL-ZX43XLGP-qKQq6V9X.js +0 -9
  342. package/dist/client/assets/hi-IN-UTYRMTUF-DOUcwrDO.js +0 -3
  343. package/dist/client/assets/hu-HU-AJOSEBW6-FqTyvHlD.js +0 -3
  344. package/dist/client/assets/id-ID-ETLTVG6C-CQqh3CLS.js +0 -8
  345. package/dist/client/assets/image-ZVKINSPA-DgzW5zAy.js +0 -1
  346. package/dist/client/assets/index-D3RER1SZ.js +0 -1023
  347. package/dist/client/assets/index-DREVKl_K.css +0 -1
  348. package/dist/client/assets/it-IT-B4B6TP6L-V-yK3SZz.js +0 -12
  349. package/dist/client/assets/ja-JP-IYKVURR5-BQKBXRpX.js +0 -12
  350. package/dist/client/assets/kaa-SE2BUIKX-CZ5kfwPg.js +0 -1
  351. package/dist/client/assets/kab-KAB-Y3GLKXLR-Do7GWfuN.js +0 -4
  352. package/dist/client/assets/kk-KZ-ABWUFVOH-BpqVciQz.js +0 -1
  353. package/dist/client/assets/ko-KR-7JQDXKGM-N42lep78.js +0 -5
  354. package/dist/client/assets/ku-TR-NAH2Q5B7-K8LLl9fk.js +0 -6
  355. package/dist/client/assets/lt-LT-VQFYRSNQ-BmOd0ALn.js +0 -3
  356. package/dist/client/assets/lv-LV-T62VSYUM-B22WdPhp.js +0 -4
  357. package/dist/client/assets/mermaid-parser.core-Bl0efOMt.js +0 -4
  358. package/dist/client/assets/mermaid.core-DfcNfOTv.js +0 -1
  359. package/dist/client/assets/modulepreload-polyfill-P2Xu9kJm.js +0 -1
  360. package/dist/client/assets/mr-IN-V4FHLCJE-XX069tpm.js +0 -9
  361. package/dist/client/assets/my-MM-E3SQ6E54-cst_-5SB.js +0 -1
  362. package/dist/client/assets/nb-NO-MLNOFN5H-Bu2URWko.js +0 -8
  363. package/dist/client/assets/nl-NL-D5L3ZV4M-BqrV0btt.js +0 -13
  364. package/dist/client/assets/nn-NO-NNHDGPKB-DK-xZaWM.js +0 -4
  365. package/dist/client/assets/oc-FR-DWCRF55G-BZ5Po5R6.js +0 -4
  366. package/dist/client/assets/pa-IN-3JSAY44M-BZQSjKrS.js +0 -4
  367. package/dist/client/assets/percentages-ETZPVQEE-DFxFqXgH.js +0 -1
  368. package/dist/client/assets/pl-PL-ACURYKP3-qcEOSfCk.js +0 -12
  369. package/dist/client/assets/preload-helper-HclGiUj8.js +0 -1
  370. package/dist/client/assets/preview-render-compiler-CfxJYldJ.js +0 -41
  371. package/dist/client/assets/preview-render-compiler-Cu8_i9iS.js +0 -1
  372. package/dist/client/assets/preview-render-worker-c4Yi93qW.js +0 -66
  373. package/dist/client/assets/prod-BiJL30sl.js +0 -1
  374. package/dist/client/assets/prod-qAk7rHa4.js +0 -177
  375. package/dist/client/assets/pt-BR-LOX7MLGD-DLueHSyZ.js +0 -10
  376. package/dist/client/assets/pt-PT-CZ2U2RFQ-BJ-GAEm6.js +0 -12
  377. package/dist/client/assets/quick-switcher-controller-BoIK_wuG.js +0 -1
  378. package/dist/client/assets/ro-RO-2HECL2X6-CJUvKAf0.js +0 -12
  379. package/dist/client/assets/ru-RU-HAYNXO46-BWSlvTrt.js +0 -10
  380. package/dist/client/assets/runtime-config-DcmnGcXU.js +0 -1
  381. package/dist/client/assets/si-LK-W5KNS4H6-DGGCsn7k.js +0 -1
  382. package/dist/client/assets/sk-SK-7K2CFGDV-CY4uTYgQ.js +0 -7
  383. package/dist/client/assets/sl-SI-OXV2QZWW-2-weqaBY.js +0 -6
  384. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-zoLLQVyh.js +0 -1
  385. package/dist/client/assets/sv-SE-JTOBZRGL-9-IUtVkO.js +0 -12
  386. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DS-KQN37.js +0 -8
  387. package/dist/client/assets/ta-IN-KFAVKXGT-gHO6Q_DH.js +0 -6
  388. package/dist/client/assets/th-TH-VDMSCPDL-BvJuw6PJ.js +0 -1
  389. package/dist/client/assets/tr-TR-CEZ6GX45-CG6UU3Su.js +0 -4
  390. package/dist/client/assets/uk-UA-Q3H3OXQC-CSuIg_DY.js +0 -6
  391. package/dist/client/assets/uz-UZ-NGCSWWPX-mom7rxSP.js +0 -1
  392. package/dist/client/assets/vault-api-client-iZLhMJKe.js +0 -6
  393. package/dist/client/assets/vi-VN-P3NDEVPS-BB0Fu9ck.js +0 -7
  394. package/dist/client/assets/yjs-provider-reset-guard-9ul1qF6k.js +0 -4
  395. package/dist/client/assets/zh-CN-SS3O57GA-Bj8wsiMe.js +0 -11
  396. package/dist/client/assets/zh-HK-LWJT3VCF-DOTquTCh.js +0 -1
  397. package/dist/client/assets/zh-TW-VJXC72RT-B48PRo-l.js +0 -13
  398. package/integrations/pi/index.ts +0 -94
  399. /package/dist/client/assets/{vault-api-client-C3mlS_4N.css → auth-gate-C3mlS_4N.css} +0 -0
  400. /package/dist/client/assets/{base-BYODPHdS.js → github.min-DBihDoic.js} +0 -0
@@ -6,32 +6,18 @@ import { AgentConnectionService } from './application/agent-connection-service.j
6
6
  import { AgentContentService } from './application/agent-content-service.js';
7
7
  import { createAuthService } from './auth/create-auth-service.js';
8
8
  import { logPerfEvent } from './config/perf-logging.js';
9
- import { BacklinkIndex } from './domain/backlink-index.js';
10
- import { BaseQueryService } from './domain/bases/base-query-service.js';
11
- import { CollaborationDocumentStore } from './domain/collaboration/collaboration-document-store.js';
12
- import { CollaborationRoom } from './domain/collaboration/collaboration-room.js';
13
9
  import { renderDocx } from './domain/docx-exporter.js';
14
- import { GitService } from './infrastructure/git/git-service.js';
15
- import { ensureCollabMetadataGitExclude } from './infrastructure/git/local-exclude.js';
16
10
  import { GitHubAppClient } from './infrastructure/github/github-app-client.js';
17
11
  import { GitHubSetupFlow } from './infrastructure/github/github-setup-flow.js';
18
12
  import { HostedWorkspaceService } from './domain/hosted-workspace.js';
19
13
  import { PlantUmlRenderer } from './infrastructure/plantuml/plantuml-renderer.js';
20
14
  import { StructurizrWorkspaceService } from './infrastructure/structurizr/structurizr-workspace-service.js';
21
- import { RoomRegistry } from './domain/collaboration/room-registry.js';
22
- import { RipgrepSearchService } from './domain/ripgrep-search-service.js';
23
15
  import { createRequestHandler } from './infrastructure/http/create-request-handler.js';
24
16
  import { AgentConnectionStore } from './infrastructure/persistence/agent-connection-store.js';
25
17
  import { HostedMetadataStore } from './infrastructure/persistence/hosted-metadata-store.js';
26
- import { VaultFileStore } from './infrastructure/persistence/vault-file-store.js';
27
18
  import { attachCollaborationGateway } from './infrastructure/websocket/attach-collaboration-gateway.js';
28
- import { isDrawioLeaseRoom } from '../domain/drawio-room.js';
29
- import { WORKSPACE_ROOM_NAME } from '../domain/workspace-room.js';
30
- import { FileSystemSyncService } from './infrastructure/workspace/file-system-sync-service.js';
31
- import { WorkspaceReconciliation } from './application/workspace-reconciliation.js';
32
- import { createWorkspaceStateFileSystemAdapter } from './infrastructure/workspace/workspace-state-file-system-adapter.js';
33
19
  import { createSignedCookieManager } from './auth/session-cookie.js';
34
- import { workspaceStateMetadataEqual } from './domain/workspace-state.js';
20
+ import { createVaultRegistry } from './vault-registry.js';
35
21
 
36
22
  function getDisplayHost(host) {
37
23
  return host === '127.0.0.1' ? 'localhost' : host;
@@ -76,16 +62,20 @@ export function createAppServer(config = loadConfig()) {
76
62
  githubAppClient,
77
63
  })
78
64
  : null;
79
- const vaultFileStore = new VaultFileStore({ vaultDir: config.vaultDir });
80
- const backlinkIndex = new BacklinkIndex({ vaultFileStore });
81
- let fileSystemSyncService = null;
82
- let workspaceMutationCoordinator = null;
83
- const baseQueryService = new BaseQueryService({
84
- maxResultRows: config.maxBaseQueryRows,
85
- vaultFileStore,
86
- workspaceStateProvider: () => workspaceMutationCoordinator?.workspaceState ?? null,
87
- workspaceStateSynchronizer: () => fileSystemSyncService?.flushPendingChanges?.(),
88
- });
65
+ const testControls = {
66
+ wsRoomHydrateDelayMs: Math.max(0, Number(config.testWsRoomHydrateDelayMs || 0)),
67
+ };
68
+ // ponytail: one live context per vault; agent/hosted/structurizr stay on the primary this slice
69
+ const vaultRegistry = createVaultRegistry({ config, testControls });
70
+ const primary = vaultRegistry.getPrimaryContext();
71
+ const vaultFileStore = primary.vaultFileStore;
72
+ const backlinkIndex = primary.backlinkIndex;
73
+ const baseQueryService = primary.baseQueryService;
74
+ const gitService = primary.gitService;
75
+ const searchService = primary.searchService;
76
+ const roomRegistry = primary.roomRegistry;
77
+ const workspaceMutationCoordinator = primary.workspaceMutationCoordinator;
78
+ const fileSystemSyncService = primary.fileSystemSyncService;
89
79
  const plantUmlRenderer = new PlantUmlRenderer({
90
80
  serverUrl: config.plantumlServerUrl,
91
81
  });
@@ -95,56 +85,6 @@ export function createAppServer(config = loadConfig()) {
95
85
  trustedExecutableDsl: config.structurizr?.trustedExecutableDsl,
96
86
  vaultDir: config.vaultDir,
97
87
  });
98
- const gitService = new GitService({
99
- commandEnv: config.git?.commandEnv,
100
- enabled: config.gitEnabled,
101
- vaultDir: config.vaultDir,
102
- });
103
- const searchService = new RipgrepSearchService({
104
- maxBufferBytes: config.searchMaxBufferBytes,
105
- maxFileSize: config.searchMaxFileSize,
106
- perfLoggingEnabled: config.perfLoggingEnabled,
107
- vaultDir: config.vaultDir,
108
- });
109
- const testControls = {
110
- wsRoomHydrateDelayMs: Math.max(0, Number(config.testWsRoomHydrateDelayMs || 0)),
111
- };
112
- const roomRegistry = new RoomRegistry({
113
- createRoom: ({ name, onEmpty }) => {
114
- const isTransientRoom = name === '__lobby__' || name === WORKSPACE_ROOM_NAME || isDrawioLeaseRoom(name);
115
- const room = new CollaborationRoom({
116
- documentStore: new CollaborationDocumentStore({
117
- backlinkIndex: isTransientRoom ? null : backlinkIndex,
118
- name,
119
- vaultFileStore: isTransientRoom ? null : vaultFileStore,
120
- }),
121
- getHydrateDelayMs: () => testControls.wsRoomHydrateDelayMs,
122
- idleGraceMs: config.wsRoomIdleGraceMs,
123
- maxInitialSyncBytes: config.maxInitialSyncBytes,
124
- maxBufferedAmountBytes: config.wsMaxBufferedAmountBytes,
125
- name,
126
- onEmpty,
127
- perfLoggingEnabled: config.perfLoggingEnabled,
128
- });
129
-
130
- if (name === WORKSPACE_ROOM_NAME && workspaceMutationCoordinator?.workspaceState) {
131
- room.replaceWorkspaceEntries(workspaceMutationCoordinator.workspaceState.entries, {
132
- generatedAt: workspaceMutationCoordinator.workspaceState.scannedAt,
133
- });
134
- }
135
-
136
- return room;
137
- },
138
- });
139
- workspaceMutationCoordinator = new WorkspaceReconciliation({
140
- backlinkIndex,
141
- baseQueryService,
142
- roomRegistry,
143
- vaultFileStore,
144
- workspaceStateAdapter: createWorkspaceStateFileSystemAdapter({
145
- vaultDir: vaultFileStore.vaultDir,
146
- }),
147
- });
148
88
  const agentConnectionStore = new AgentConnectionStore({
149
89
  dbPath: config.agentAccess.dbPath,
150
90
  });
@@ -156,18 +96,13 @@ export function createAppServer(config = loadConfig()) {
156
96
  });
157
97
  const agentContentService = new AgentContentService({
158
98
  backlinkIndex,
99
+ baseQueryService,
159
100
  plantUmlRenderer,
160
101
  roomRegistry,
161
102
  searchService,
162
103
  vaultFileStore,
163
104
  workspaceMutationCoordinator,
164
105
  });
165
- vaultFileStore.setManagedWriteTracker(workspaceMutationCoordinator);
166
- fileSystemSyncService = new FileSystemSyncService({
167
- mutationCoordinator: workspaceMutationCoordinator,
168
- perfLoggingEnabled: config.perfLoggingEnabled,
169
- vaultFileStore,
170
- });
171
106
  const requestHandler = createRequestHandler(
172
107
  config,
173
108
  authService,
@@ -189,6 +124,7 @@ export function createAppServer(config = loadConfig()) {
189
124
  connectionService: agentConnectionService,
190
125
  contentService: agentContentService,
191
126
  },
127
+ vaultRegistry,
192
128
  );
193
129
  const httpServer = createServer((req, res) => {
194
130
  requestHandler(req, res).catch((error) => {
@@ -211,6 +147,7 @@ export function createAppServer(config = loadConfig()) {
211
147
  roomRegistry,
212
148
  wsBasePath: config.wsBasePath,
213
149
  hostedWorkspaceService,
150
+ vaultRegistry,
214
151
  });
215
152
 
216
153
  let shutdownPromise = null;
@@ -219,81 +156,14 @@ export function createAppServer(config = loadConfig()) {
219
156
  async function listen() {
220
157
  const startupStartedAt = Date.now();
221
158
 
222
- if (await gitService.isGitRepo()) {
223
- await ensureCollabMetadataGitExclude(config.vaultDir);
224
- }
225
159
  await hostedWorkspaceService.initialize();
226
160
  if (config.agentAccess.enabled && config.auth.strategy !== 'none') {
227
161
  await agentConnectionService.initialize();
228
162
  }
229
163
 
230
- const searchCapabilityStartedAt = Date.now();
231
- config.search = await searchService.initialize();
232
- logPerfEvent(config.perfLoggingEnabled, 'startup', {
233
- available: config.search.available,
234
- durationMs: Date.now() - searchCapabilityStartedAt,
235
- phase: 'search-capability',
236
- });
237
-
238
- const initialWorkspaceScanStartedAt = Date.now();
239
- const initialWorkspaceSnapshot = await vaultFileStore.scanWorkspaceState();
240
- vaultFileCount = initialWorkspaceSnapshot.vaultFileCount ?? 0;
241
- logPerfEvent(config.perfLoggingEnabled, 'startup', {
242
- durationMs: Date.now() - initialWorkspaceScanStartedAt,
243
- phase: 'workspace-scan',
244
- vaultFileCount,
245
- });
246
-
247
- const backlinkBuildStartedAt = Date.now();
248
- await backlinkIndex.build({ workspaceState: initialWorkspaceSnapshot });
249
- logPerfEvent(config.perfLoggingEnabled, 'startup', {
250
- durationMs: Date.now() - backlinkBuildStartedAt,
251
- markdownFileCount: initialWorkspaceSnapshot.markdownPaths?.length ?? 0,
252
- phase: 'backlink-build',
253
- });
254
-
255
- const liveWorkspaceScanStartedAt = Date.now();
256
- const liveWorkspaceSnapshot = await vaultFileStore.scanWorkspaceState();
257
- const workspaceChangedDuringStartup = !workspaceStateMetadataEqual(initialWorkspaceSnapshot, liveWorkspaceSnapshot);
258
- vaultFileCount = liveWorkspaceSnapshot.vaultFileCount ?? vaultFileCount;
259
- logPerfEvent(config.perfLoggingEnabled, 'startup', {
260
- changedDuringStartup: workspaceChangedDuringStartup,
261
- durationMs: Date.now() - liveWorkspaceScanStartedAt,
262
- phase: 'workspace-rescan',
263
- vaultFileCount,
264
- });
265
-
266
- if (workspaceChangedDuringStartup) {
267
- const backlinkRebuildStartedAt = Date.now();
268
- await backlinkIndex.build({ workspaceState: liveWorkspaceSnapshot });
269
- logPerfEvent(config.perfLoggingEnabled, 'startup', {
270
- durationMs: Date.now() - backlinkRebuildStartedAt,
271
- markdownFileCount: liveWorkspaceSnapshot.markdownPaths?.length ?? 0,
272
- phase: 'backlink-rebuild',
273
- });
274
- }
275
-
276
- const workspaceInitStartedAt = Date.now();
277
- await workspaceMutationCoordinator.initialize({ snapshot: liveWorkspaceSnapshot });
278
- logPerfEvent(config.perfLoggingEnabled, 'startup', {
279
- durationMs: Date.now() - workspaceInitStartedAt,
280
- phase: 'workspace-init',
281
- });
282
-
283
- if (config.fileWatcherEnabled !== false) {
284
- const watcherStartStartedAt = Date.now();
285
- await fileSystemSyncService.start({ snapshot: liveWorkspaceSnapshot });
286
- logPerfEvent(config.perfLoggingEnabled, 'startup', {
287
- durationMs: Date.now() - watcherStartStartedAt,
288
- phase: 'watcher-start',
289
- });
290
- } else {
291
- fileSystemSyncService.initializeFromSnapshot({ snapshot: liveWorkspaceSnapshot });
292
- logPerfEvent(config.perfLoggingEnabled, 'startup', {
293
- durationMs: 0,
294
- phase: 'watcher-skipped',
295
- });
296
- }
164
+ const { searchCapability, snapshot: liveWorkspaceSnapshot, vaultFileCount: primaryFileCount } = await vaultRegistry.initializePrimary();
165
+ config.search = searchCapability;
166
+ vaultFileCount = primaryFileCount;
297
167
 
298
168
  return new Promise((resolve, reject) => {
299
169
  const listenStartedAt = Date.now();
@@ -331,8 +201,7 @@ export function createAppServer(config = loadConfig()) {
331
201
 
332
202
  shutdownPromise = (async () => {
333
203
  await collaborationGateway.close();
334
- await fileSystemSyncService.close();
335
- await roomRegistry.reset();
204
+ await vaultRegistry.closeAll();
336
205
  await Promise.all([
337
206
  closeHttpServer(httpServer),
338
207
  config.git?.cleanup?.(),
@@ -367,6 +236,7 @@ export function createAppServer(config = loadConfig()) {
367
236
  testControls.wsRoomHydrateDelayMs = Math.max(0, Number(delayMs) || 0);
368
237
  },
369
238
  vaultFileStore,
239
+ vaultRegistry,
370
240
  get vaultFileCount() { return vaultFileCount; },
371
241
  };
372
242
  }
@@ -381,7 +381,7 @@ export class HostedWorkspaceService {
381
381
  };
382
382
  }
383
383
 
384
- async completeWorkspaceSetup() {
384
+ async completeWorkspaceSetup({ user = null } = {}) {
385
385
  await this.initialize();
386
386
  const team = await this.store.getTeam();
387
387
  if (!team) {
@@ -394,6 +394,15 @@ export class HostedWorkspaceService {
394
394
  setupCompletedAt: team.setupCompletedAt || timestamp,
395
395
  };
396
396
  await this.store.updateTeam(updatedTeam);
397
+ if (!team.setupCompletedAt) {
398
+ await this.store.createAuditEvent(createAuditEvent({
399
+ actor: user,
400
+ targetEmail: user?.email ?? '',
401
+ targetRole: user?.role ?? '',
402
+ timestamp,
403
+ type: 'workspace_setup_completed',
404
+ }));
405
+ }
397
406
  return updatedTeam;
398
407
  }
399
408
 
@@ -4,6 +4,7 @@ import { join } from 'node:path';
4
4
  import { promisify } from 'node:util';
5
5
 
6
6
  import { getVaultFileKind } from '../../domain/file-kind.js';
7
+ import { isWholeWordMatch } from '../../domain/literal-text-search.js';
7
8
  import { logPerfEvent } from '../config/perf-logging.js';
8
9
 
9
10
  const execFile = promisify(execFileCallback);
@@ -108,6 +109,7 @@ function createSnippet(lineText = '', matchStart = 0, matchEnd = matchStart) {
108
109
  function createRipgrepArgs(query, {
109
110
  maxFileSize = DEFAULT_MAX_FILE_SIZE,
110
111
  maxSnippetsPerFile = DEFAULT_MAX_SNIPPETS_PER_FILE,
112
+ wholeWord = false,
111
113
  } = {}) {
112
114
  const args = [
113
115
  '--json',
@@ -130,6 +132,7 @@ function createRipgrepArgs(query, {
130
132
  '--glob',
131
133
  '!.trash/**',
132
134
  ];
135
+ if (wholeWord) args.push('--word-regexp');
133
136
 
134
137
  TEXT_SEARCH_GLOBS.forEach((glob) => {
135
138
  args.push('--glob', glob);
@@ -140,10 +143,13 @@ function createRipgrepArgs(query, {
140
143
  }
141
144
 
142
145
  export function parseRipgrepJson(stdout, {
146
+ kinds = [],
143
147
  maxFiles = DEFAULT_MAX_FILES,
144
148
  maxSnippetsPerFile = DEFAULT_MAX_SNIPPETS_PER_FILE,
149
+ prefix = '',
145
150
  query = '',
146
151
  } = {}) {
152
+ const kindFilter = new Set(Array.isArray(kinds) ? kinds : []);
147
153
  const files = [];
148
154
  const filesByPath = new Map();
149
155
  let matchCount = 0;
@@ -167,7 +173,12 @@ export function parseRipgrepJson(stdout, {
167
173
  }
168
174
 
169
175
  const filePath = String(event?.data?.path?.text ?? '').replace(/^\.\//u, '');
170
- if (!filePath) {
176
+ const kind = getVaultFileKind(filePath) ?? 'text';
177
+ if (
178
+ !filePath
179
+ || (prefix && filePath !== prefix && !filePath.startsWith(`${prefix}/`))
180
+ || (kindFilter.size > 0 && !kindFilter.has(kind))
181
+ ) {
171
182
  continue;
172
183
  }
173
184
 
@@ -180,7 +191,7 @@ export function parseRipgrepJson(stdout, {
180
191
 
181
192
  fileGroup = {
182
193
  file: filePath,
183
- kind: getVaultFileKind(filePath) ?? 'text',
194
+ kind,
184
195
  matchCount: 0,
185
196
  snippets: [],
186
197
  truncated: false,
@@ -226,7 +237,21 @@ export function parseRipgrepJson(stdout, {
226
237
  };
227
238
  }
228
239
 
229
- async function searchExcalidrawText({ maxFileSize, maxFiles, maxSnippetsPerFile, query, signal, vaultDir }) {
240
+ async function searchExcalidrawText({
241
+ kinds = [],
242
+ maxFileSize,
243
+ maxFiles,
244
+ maxSnippetsPerFile,
245
+ prefix = '',
246
+ query,
247
+ wholeWord = false,
248
+ signal,
249
+ vaultDir,
250
+ }) {
251
+ const kindFilter = new Set(Array.isArray(kinds) ? kinds : []);
252
+ if (kindFilter.size > 0 && !kindFilter.has('excalidraw')) {
253
+ return { files: [], matchCount: 0, truncated: false };
254
+ }
230
255
  const files = [];
231
256
  let matchCount = 0;
232
257
  let truncated = false;
@@ -237,6 +262,8 @@ async function searchExcalidrawText({ maxFileSize, maxFiles, maxSnippetsPerFile,
237
262
  });
238
263
 
239
264
  for await (const filePath of paths) {
265
+ const normalizedPath = filePath.replaceAll('\\', '/');
266
+ if (prefix && normalizedPath !== prefix && !normalizedPath.startsWith(`${prefix}/`)) continue;
240
267
  signal?.throwIfAborted?.();
241
268
  const absolutePath = join(vaultDir, filePath);
242
269
  if ((await stat(absolutePath)).size > parseByteLimit(maxFileSize)) continue;
@@ -256,19 +283,21 @@ async function searchExcalidrawText({ maxFileSize, maxFiles, maxSnippetsPerFile,
256
283
  const normalizedText = text.toLocaleLowerCase();
257
284
  let matchStart = normalizedText.indexOf(normalizedQuery);
258
285
  while (matchStart >= 0) {
259
- fileMatchCount += 1;
260
- matchCount += 1;
261
- if (snippets.length < maxSnippetsPerFile) {
262
- const snippet = createSnippet(text, matchStart, matchStart + query.length);
263
- snippets.push({
264
- column: matchStart + 1,
265
- line: 1,
266
- matchEnd: snippet.matchEnd,
267
- matchStart: snippet.matchStart,
268
- text: snippet.text,
269
- });
270
- } else {
271
- truncated = true;
286
+ if (!wholeWord || isWholeWordMatch(normalizedText, matchStart, matchStart + normalizedQuery.length)) {
287
+ fileMatchCount += 1;
288
+ matchCount += 1;
289
+ if (snippets.length < maxSnippetsPerFile) {
290
+ const snippet = createSnippet(text, matchStart, matchStart + query.length);
291
+ snippets.push({
292
+ column: matchStart + 1,
293
+ line: 1,
294
+ matchEnd: snippet.matchEnd,
295
+ matchStart: snippet.matchStart,
296
+ text: snippet.text,
297
+ });
298
+ } else {
299
+ truncated = true;
300
+ }
272
301
  }
273
302
  matchStart = normalizedText.indexOf(normalizedQuery, matchStart + Math.max(query.length, 1));
274
303
  }
@@ -280,7 +309,7 @@ async function searchExcalidrawText({ maxFileSize, maxFiles, maxSnippetsPerFile,
280
309
  continue;
281
310
  }
282
311
  files.push({
283
- file: filePath.replaceAll('\\', '/'),
312
+ file: normalizedPath,
284
313
  kind: 'excalidraw',
285
314
  matchCount: fileMatchCount,
286
315
  snippets,
@@ -354,11 +383,19 @@ export class RipgrepSearchService {
354
383
  }
355
384
 
356
385
  async search({
386
+ kinds = [],
357
387
  limit = DEFAULT_MAX_FILES,
388
+ maxSnippetsPerFile = DEFAULT_MAX_SNIPPETS_PER_FILE,
389
+ prefix = '',
358
390
  query = '',
359
391
  signal = null,
392
+ wholeWord = false,
360
393
  } = {}) {
361
394
  const normalizedQuery = String(query ?? '').trim();
395
+ const snippetLimit = normalizePositiveInt(maxSnippetsPerFile, this.maxSnippetsPerFile, {
396
+ max: 10,
397
+ min: 1,
398
+ });
362
399
  const maxFiles = normalizePositiveInt(limit, this.maxFiles, {
363
400
  max: this.maxFiles,
364
401
  min: 1,
@@ -381,7 +418,8 @@ export class RipgrepSearchService {
381
418
  const startedAt = Date.now();
382
419
  const args = createRipgrepArgs(normalizedQuery, {
383
420
  maxFileSize: this.maxFileSize,
384
- maxSnippetsPerFile: this.maxSnippetsPerFile,
421
+ maxSnippetsPerFile: snippetLimit,
422
+ wholeWord,
385
423
  });
386
424
  let parsed;
387
425
  try {
@@ -393,8 +431,10 @@ export class RipgrepSearchService {
393
431
  timeout: this.timeoutMs,
394
432
  });
395
433
  parsed = parseRipgrepJson(result.stdout, {
434
+ kinds,
396
435
  maxFiles,
397
- maxSnippetsPerFile: this.maxSnippetsPerFile,
436
+ maxSnippetsPerFile: snippetLimit,
437
+ prefix,
398
438
  query: normalizedQuery,
399
439
  });
400
440
  } catch (error) {
@@ -406,8 +446,10 @@ export class RipgrepSearchService {
406
446
  } else {
407
447
  const isMaxBuffer = error?.code === 'ERR_CHILD_PROCESS_STDIO_MAXBUFFER';
408
448
  parsed = parseRipgrepJson(error?.stdout ?? '', {
449
+ kinds,
409
450
  maxFiles,
410
- maxSnippetsPerFile: this.maxSnippetsPerFile,
451
+ maxSnippetsPerFile: snippetLimit,
452
+ prefix,
411
453
  query: normalizedQuery,
412
454
  });
413
455
  if (isMaxBuffer && parsed.files.length > 0) {
@@ -421,16 +463,21 @@ export class RipgrepSearchService {
421
463
 
422
464
  if (parsed.files.length < maxFiles) {
423
465
  const excalidraw = await searchExcalidrawText({
466
+ kinds,
424
467
  maxFileSize: this.maxFileSize,
425
468
  maxFiles: maxFiles - parsed.files.length,
426
- maxSnippetsPerFile: this.maxSnippetsPerFile,
469
+ maxSnippetsPerFile: snippetLimit,
470
+ prefix,
427
471
  query: normalizedQuery,
472
+ wholeWord,
428
473
  signal,
429
474
  vaultDir: this.vaultDir,
430
475
  });
431
476
  parsed.files.push(...excalidraw.files);
432
477
  parsed.matchCount += excalidraw.matchCount;
433
478
  parsed.truncated ||= excalidraw.truncated;
479
+ } else if (kinds.length === 0 || kinds.includes('excalidraw')) {
480
+ parsed.truncated = true;
434
481
  }
435
482
  parsed.search = this.getClientConfig();
436
483
  logPerfEvent(this.perfLoggingEnabled, 'search-query', {
@@ -1,8 +1,20 @@
1
+ import { execFile as execFileCallback } from 'node:child_process';
1
2
  import { readFile, writeFile } from 'node:fs/promises';
2
3
  import { resolve } from 'node:path';
4
+ import { promisify } from 'node:util';
5
+
6
+ const execFile = promisify(execFileCallback);
3
7
 
4
8
  export async function ensureCollabMetadataGitExclude(vaultDir) {
5
- const excludePath = resolve(vaultDir, '.git/info/exclude');
9
+ let excludePath = resolve(vaultDir, '.git/info/exclude');
10
+ try {
11
+ const { stdout } = await execFile('git', ['rev-parse', '--git-path', 'info/exclude'], {
12
+ cwd: vaultDir,
13
+ });
14
+ excludePath = resolve(vaultDir, String(stdout).trim());
15
+ } catch {
16
+ // Preserve support for repositories represented by a local .git directory.
17
+ }
6
18
  let existingContent = '';
7
19
 
8
20
  try {
@@ -63,7 +63,7 @@ async function createWebMcpActor({ agentConnectionService, authService, config,
63
63
  }
64
64
 
65
65
  async function mapWebMcpResult(definition, value) {
66
- if (definition.resultKind === 'image' && value.svg) {
66
+ if (value.svg && ['image', 'optional-image'].includes(definition.resultKind)) {
67
67
  const { data, mimeType, structuredContent } = await encodeAgentToolImage(value);
68
68
  return {
69
69
  ...structuredContent,
@@ -43,6 +43,11 @@ export function createHostedApiHandler({
43
43
  user,
44
44
  }));
45
45
  }],
46
+ ['POST /api/hosted/setup/complete', async ({ req, res, user }) => {
47
+ const admin = await hostedWorkspaceService.requireAdmin(user);
48
+ const team = await hostedWorkspaceService.completeWorkspaceSetup({ user: admin });
49
+ jsonResponse(req, res, 200, { ok: true, setupComplete: true, team });
50
+ }],
46
51
  ['GET /api/hosted/vault-source', async ({ req, res, user }) => {
47
52
  jsonResponse(req, res, 200, { vaultSource: await hostedWorkspaceService.getVaultSource(user) });
48
53
  }],