collabmd 0.1.51 → 0.1.54

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 (600) hide show
  1. package/README.md +1 -1
  2. package/bin/collabmd.js +3 -2
  3. package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-kJfwukbn.js +1 -0
  4. package/dist/client/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  5. package/dist/client/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  6. package/dist/client/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  7. package/dist/client/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  8. package/dist/client/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  9. package/dist/client/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  10. package/dist/client/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  11. package/dist/client/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  12. package/dist/client/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  13. package/dist/client/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  14. package/dist/client/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  15. package/dist/client/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  16. package/dist/client/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  17. package/dist/client/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  18. package/dist/client/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  19. package/dist/client/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  20. package/dist/client/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  21. package/dist/client/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  22. package/dist/client/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  23. package/dist/client/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  24. package/dist/client/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  25. package/dist/client/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  26. package/dist/client/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  27. package/dist/client/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  28. package/dist/client/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  29. package/dist/client/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  30. package/dist/client/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  31. package/dist/client/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  32. package/dist/client/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  33. package/dist/client/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  34. package/dist/client/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  35. package/dist/client/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  36. package/dist/client/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  37. package/dist/client/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  38. package/dist/client/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  39. package/dist/client/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  40. package/dist/client/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  41. package/dist/client/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  42. package/dist/client/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  43. package/dist/client/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  44. package/dist/client/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  45. package/dist/client/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  46. package/dist/client/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  47. package/dist/client/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  48. package/dist/client/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  49. package/dist/client/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  50. package/dist/client/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  51. package/dist/client/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  52. package/dist/client/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  53. package/dist/client/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  54. package/dist/client/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  55. package/dist/client/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  56. package/dist/client/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  57. package/dist/client/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  58. package/dist/client/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  59. package/dist/client/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  60. package/dist/client/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  61. package/dist/client/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  62. package/dist/client/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  63. package/dist/client/assets/Middleware-DUgFSleI.js +1 -0
  64. package/dist/client/assets/_basePickBy-QJXUw_pr.js +1 -0
  65. package/dist/client/assets/_baseUniq-DR4vVjyC.js +1 -0
  66. package/dist/client/assets/abnfDiagram-O67JEVCF-Dwt6a0Ds.js +1 -0
  67. package/dist/client/assets/abnfDiagram-VCTEODGH-DxNxad6-.js +1 -0
  68. package/dist/client/assets/architecture-7GRP2DOG-BBwRXFv3.js +1 -0
  69. package/dist/client/assets/architecture-7GRP2DOG-DJVtYNt-.js +1 -0
  70. package/dist/client/assets/architectureDiagram-5GKGNRK7-C1uvg5id.js +36 -0
  71. package/dist/client/assets/architectureDiagram-NJMV4G6O-D5CGiX3G.js +36 -0
  72. package/dist/client/assets/{babel-CY5KOv-I.js → babel-Bi_28hhi.js} +1 -1
  73. package/dist/client/assets/band-D-Cum8PO.js +1 -0
  74. package/dist/client/assets/blockDiagram-BEXU5L5S-BgTM0var.js +140 -0
  75. package/dist/client/assets/blockDiagram-I7D4REHJ-B2YonsoG.js +129 -0
  76. package/dist/client/assets/{browser-BKLM0ThC-IxjwuOIz-DyJcVMFR.js → browser-BKLM0ThC-BCLQGPD6-K2seJgRL.js} +1 -1
  77. package/dist/client/assets/{browser-utils-DbXSMI-6.js → browser-utils-S4QYY31r.js} +1 -1
  78. package/dist/client/assets/{c4Diagram-7LVT6UL2-VAk1HPmz.js → c4Diagram-7LVT6UL2-r4IwomZm.js} +2 -2
  79. package/dist/client/assets/c4Diagram-YGBWAQC7-_xZPrNkB.js +38 -0
  80. package/dist/client/assets/channel-CgcHBnmr.js +1 -0
  81. package/dist/client/assets/chunk-2E4U76K2-CIQUuV9n.js +1 -0
  82. package/dist/client/assets/chunk-2Q5K7J3B-BMFG3ur0.js +1 -0
  83. package/dist/client/assets/{chunk-2ZTRR5NV-C2qZJila.js → chunk-2ZTRR5NV-CnDP55cn.js} +1 -1
  84. package/dist/client/assets/chunk-2ZTRR5NV-DcPRfelM.js +2 -0
  85. package/dist/client/assets/chunk-3FUC2YCW-8tZlhTGX.js +1 -0
  86. package/dist/client/assets/{chunk-3Z5EZCMW-DMniOlPd.js → chunk-3Z5EZCMW-BAnA6eQ7.js} +1 -1
  87. package/dist/client/assets/chunk-3Z5EZCMW-Yx4Q5AcN.js +1 -0
  88. package/dist/client/assets/chunk-4HAMMTFA-q0ldNVvr.js +62 -0
  89. package/dist/client/assets/chunk-5DYCD2WN-BKWCKnK-.js +1 -0
  90. package/dist/client/assets/{chunk-5V3GS4D5-i-ZDOEnP.js → chunk-5V3GS4D5-B5uC2oxu.js} +1 -1
  91. package/dist/client/assets/chunk-5V3GS4D5-BR7kgIgJ.js +1 -0
  92. package/dist/client/assets/chunk-5VM5RSS4-hE9rU_bl.js +15 -0
  93. package/dist/client/assets/chunk-6AEJRKK7-DTVZj5bY.js +1 -0
  94. package/dist/client/assets/{chunk-6AZGARVD-BB6FqMl-.js → chunk-6AZGARVD--pTGpDnx.js} +1 -1
  95. package/dist/client/assets/chunk-6AZGARVD-CnZDr4Cj.js +1 -0
  96. package/dist/client/assets/{chunk-6EIED4P4-DdUJkP0f.js → chunk-6EIED4P4-Bp8dpTvX.js} +1 -1
  97. package/dist/client/assets/chunk-6EIED4P4-DBVWq7Tz.js +1 -0
  98. package/dist/client/assets/{chunk-6K3QC6MW-CqVsVn-y.js → chunk-6K3QC6MW-DGVRzL6v.js} +1 -1
  99. package/dist/client/assets/chunk-6K3QC6MW-JnuvEGV4.js +1 -0
  100. package/dist/client/assets/{chunk-6TQVIW2G-DKlLbNIP.js → chunk-6TQVIW2G-BSj0l_pu.js} +1 -1
  101. package/dist/client/assets/chunk-6TQVIW2G-DgBX-Pv0.js +1 -0
  102. package/dist/client/assets/chunk-742MDFTN-D1nh6vNv.js +1 -0
  103. package/dist/client/assets/{chunk-747NJXEK-BFkZPlab.js → chunk-747NJXEK-BjqqAsS9.js} +1 -1
  104. package/dist/client/assets/chunk-747NJXEK-Cur1aosP.js +2 -0
  105. package/dist/client/assets/chunk-75Z2AOVW-DitkSoSG.js +2 -0
  106. package/dist/client/assets/chunk-7INBJB4K-CDmiHbaX.js +62 -0
  107. package/dist/client/assets/chunk-7M6MHVWA-BDakkknV.js +213 -0
  108. package/dist/client/assets/chunk-7PRAP22T-9uTvtc_-.js +1 -0
  109. package/dist/client/assets/{chunk-CLGD4ZFX-Cmtx89ht.js → chunk-CLGD4ZFX-BfYJtJm1.js} +1 -1
  110. package/dist/client/assets/chunk-DU6HZSFF-CWlP1Dk_.js +125 -0
  111. package/dist/client/assets/chunk-DUW6YSOI-Dgx8z5s3.js +1 -0
  112. package/dist/client/assets/chunk-DYU5D34O-DN0WQZBm.js +1 -0
  113. package/dist/client/assets/{chunk-F27PBJKO-Dg3H6KLL.js → chunk-F27PBJKO-DPcsPcEs.js} +1 -1
  114. package/dist/client/assets/{chunk-FOHPRMQF-DHwB1DNv.js → chunk-FOHPRMQF-Dmmo5Kak.js} +9 -9
  115. package/dist/client/assets/chunk-FOHPRMQF-DzxwRta7.js +161 -0
  116. package/dist/client/assets/chunk-GMAD6QVW-Bgk8qnty.js +8 -0
  117. package/dist/client/assets/chunk-GNY47TPC-CTrH5O5R.js +1 -0
  118. package/dist/client/assets/{chunk-SVP7TREG-XlsB_ZMZ.js → chunk-GTNCS2PH-ChgkzEIi.js} +1 -1
  119. package/dist/client/assets/chunk-GVQU2GXP-CQ8cl-Uu.js +1 -0
  120. package/dist/client/assets/chunk-GWA4HPMP-CGmv2yIq.js +1 -0
  121. package/dist/client/assets/{chunk-I5DQTOEV-Hm2LfiYI.js → chunk-I5DQTOEV-B98XA8VK.js} +1 -1
  122. package/dist/client/assets/chunk-I5DQTOEV-aBZooNp1.js +1 -0
  123. package/dist/client/assets/{chunk-ICYGCRZG-749o-pGJ.js → chunk-ICYGCRZG-D97UeqJs.js} +1 -1
  124. package/dist/client/assets/chunk-ICYGCRZG-odvlDZyA.js +1 -0
  125. package/dist/client/assets/{chunk-IH6LHLGP-CC6I9F3i.js → chunk-IH6LHLGP-BNevEHZK.js} +1 -1
  126. package/dist/client/assets/chunk-IH6LHLGP-CvXe34hB.js +1 -0
  127. package/dist/client/assets/{chunk-IMKFNOWR-3F6NhHUP.js → chunk-IMKFNOWR-CBqxfpcP.js} +2 -2
  128. package/dist/client/assets/{chunk-ZPMXAHWN-Dt0TxJa6.js → chunk-ISPTBLVO-BMsDq9Ha.js} +4 -4
  129. package/dist/client/assets/chunk-J5ZVWO5B-oDCd-gWO.js +1 -0
  130. package/dist/client/assets/chunk-JWPE2WC7-GDilnS5Y.js +1 -0
  131. package/dist/client/assets/{chunk-KI3K4JFJ-Rma-0k_M.js → chunk-KI3K4JFJ-D5XCPRZv.js} +1 -1
  132. package/dist/client/assets/chunk-KI3K4JFJ-FTtDwx3-.js +1 -0
  133. package/dist/client/assets/chunk-L3NEJ4N5-BflzkdTI.js +1 -0
  134. package/dist/client/assets/{chunk-LNGE3PJU-DWpGwHrW.js → chunk-LNGE3PJU-5-SxdO55.js} +1 -1
  135. package/dist/client/assets/chunk-LNGE3PJU-5nWSl6jJ.js +34 -0
  136. package/dist/client/assets/chunk-MBY4JIJT-DTJ4UcAm.js +8 -0
  137. package/dist/client/assets/chunk-NETBCI7D-CmUwDWUZ.js +1 -0
  138. package/dist/client/assets/chunk-O7XYJQB3-D0_ZY2za.js +126 -0
  139. package/dist/client/assets/chunk-OSK3NFVY-DqeKV_pg.js +10 -0
  140. package/dist/client/assets/{chunk-OUJLGHUK-D0j2JRSg.js → chunk-OUJLGHUK-75UXlPjl.js} +1 -1
  141. package/dist/client/assets/chunk-OUJLGHUK-DA95-S9B.js +2 -0
  142. package/dist/client/assets/{chunk-P2QGCYS3-Du8EtwOa.js → chunk-P2QGCYS3-BA--DhpW.js} +1 -1
  143. package/dist/client/assets/chunk-POPQ4Y6H-V_NEc45n.js +1 -0
  144. package/dist/client/assets/chunk-PWAF6VOD-D_kLse-N.js +1 -0
  145. package/dist/client/assets/{chunk-SHT3W25Y-BKaI8jZO.js → chunk-SHT3W25Y-YM3S-A_M.js} +5 -5
  146. package/dist/client/assets/chunk-SVP7TREG-DdNhDOmW.js +88 -0
  147. package/dist/client/assets/chunk-T5WUORNS-DD7KlyY6.js +40 -0
  148. package/dist/client/assets/{chunk-TICWLB2K-Cpp2z8yK.js → chunk-TICWLB2K-BGGgCr4x.js} +3 -3
  149. package/dist/client/assets/chunk-TLUHSLCS-DCZhIDYA.js +1 -0
  150. package/dist/client/assets/chunk-UA2S7LBM-DicYDjDM.js +1 -0
  151. package/dist/client/assets/{chunk-UY3FDG6J-CnmaAkG5.js → chunk-UY3FDG6J-DqSM_0FB.js} +1 -1
  152. package/dist/client/assets/chunk-UY3FDG6J-QT-rkt0y.js +1 -0
  153. package/dist/client/assets/chunk-WEXAMYUT-DDlVNp8J.js +1 -0
  154. package/dist/client/assets/chunk-X3CZISLH-BixgQztF.js +1 -0
  155. package/dist/client/assets/chunk-X3CZISLH-DwWpRaN8.js +1 -0
  156. package/dist/client/assets/{chunk-XHIXRSVI-BFQ6B8BE.js → chunk-XHIXRSVI-BSN7JlfK.js} +1 -1
  157. package/dist/client/assets/chunk-XHIXRSVI-DN_fEwws.js +1 -0
  158. package/dist/client/assets/chunk-XXDRQBXY-C7hQHDmQ.js +1 -0
  159. package/dist/client/assets/{chunk-XXDRQBXY-BvKO0v-W.js → chunk-XXDRQBXY-CdRN9Akd.js} +1 -1
  160. package/dist/client/assets/chunk-Y2CYZVJY-BbRBGnmc.js +1 -0
  161. package/dist/client/assets/chunk-Z7XXMR3K-P4Vaq8hD.js +10 -0
  162. package/dist/client/assets/chunk-ZIGJFQKS-b8OUHKK5.js +2 -0
  163. package/dist/client/assets/classDiagram-ZZMXUADV-QLbh_Nkf.js +1 -0
  164. package/dist/client/assets/classDiagram-v2-NBCMYWYE-3TQORq33.js +217 -0
  165. package/dist/client/assets/classDiagram-v2-VYDZK3BY-QLbh_Nkf.js +1 -0
  166. package/dist/client/assets/clone-C1hp9FUh.js +1 -0
  167. package/dist/client/assets/comment-markdown-renderer-Bxi_JRSR.js +1 -0
  168. package/dist/client/assets/comment-thread-store-CHvy8GF8.js +1 -0
  169. package/dist/client/assets/cose-bilkent-JH36ORCC-Czr0rwGr.js +1 -0
  170. package/dist/client/assets/cose-bilkent-JH36ORCC-DLmEf9HS.js +1 -0
  171. package/dist/client/assets/cynefin-OW5HDTMX-CF3N9j1_.js +1 -0
  172. package/dist/client/assets/cynefin-OW5HDTMX-e-Quc9Yl.js +1 -0
  173. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-DTnLZaO7.js +62 -0
  174. package/dist/client/assets/cynefinDiagram-VND7K2PF-DwfMZ3vk.js +62 -0
  175. package/dist/client/assets/cytoscape-cose-bilkent-NdTYBUiT.js +1 -0
  176. package/dist/client/assets/cytoscape-fcose-DE9_QRG_.js +1 -0
  177. package/dist/client/assets/cytoscape.esm-EK2DW5Qr.js +321 -0
  178. package/dist/client/assets/dagre-6A5THRUB-DewyAGK6.js +4 -0
  179. package/dist/client/assets/dagre-D7FiCLLP.js +1 -0
  180. package/dist/client/assets/{dagre-GXQ25YYZ-BSfKCfy7.js → dagre-GXQ25YYZ-Vtyx08Qh.js} +2 -2
  181. package/dist/client/assets/deferred-collab-D4cxEdad.css +1 -0
  182. package/dist/client/assets/deferred-preview-BAXYgf4T.css +1 -0
  183. package/dist/client/assets/diagram-22UHCM2B-DbZirFfl.js +200 -0
  184. package/dist/client/assets/diagram-3UASUU5V-DmhdYv6_.js +24 -0
  185. package/dist/client/assets/diagram-ATOU4E4O-B5uX-jVO.js +3 -0
  186. package/dist/client/assets/diagram-CDSNMT55-D_qyS11R.js +30 -0
  187. package/dist/client/assets/diagram-MLGK6HIB-DIBG6Ivu.js +24 -0
  188. package/dist/client/assets/diagram-MPIPVDR6-D9XsALDV.js +41 -0
  189. package/dist/client/assets/{diagram-S7CK7UJ4-D7KaM9yj.js → diagram-S7CK7UJ4-CGTzfo2f.js} +3 -3
  190. package/dist/client/assets/diagram-UQ7AKVKN-CWZS8QtB.js +41 -0
  191. package/dist/client/assets/{diagram-VSXAHHWV-B3-U-Q2E.js → diagram-VSXAHHWV-DaO1nOZF.js} +3 -3
  192. package/dist/client/assets/diagram-VX7I27RA-B54P6Cyf.js +24 -0
  193. package/dist/client/assets/diagram-Z3DM3KII-Cl2EXiXp.js +24 -0
  194. package/dist/client/assets/direct-engine-DVLMOJWp-C-YL5NFb.js +5 -0
  195. package/dist/client/assets/{dist-B7XMN9AT.js → dist-9Eodxf4G.js} +1 -1
  196. package/dist/client/assets/{dist-Bfxzlnrf.js → dist-B2ZNQifU.js} +1 -1
  197. package/dist/client/assets/dist-B6QCMNze.js +1 -0
  198. package/dist/client/assets/dist-BIAv19LO.js +1 -0
  199. package/dist/client/assets/dist-BKYp1-dl.js +13 -0
  200. package/dist/client/assets/{dist-CO0-4CuV.js → dist-BSAZ-Hek.js} +8 -8
  201. package/dist/client/assets/{dist-DJAMplZI.js → dist-BSTbcioM.js} +2 -2
  202. package/dist/client/assets/{dist-EWJYvBK1.js → dist-BT9gJXCb.js} +1 -1
  203. package/dist/client/assets/dist-BTVg1m-V.js +1 -0
  204. package/dist/client/assets/{dist-Bdy9ZRzd.js → dist-Bi9ZIYXq.js} +1 -1
  205. package/dist/client/assets/{dist-Drv_wZYC.js → dist-BpAUe9sL.js} +1 -1
  206. package/dist/client/assets/dist-Bqo-XRVG.js +1 -0
  207. package/dist/client/assets/{dist-CqXVyYoH.js → dist-BrKhPlc9.js} +1 -1
  208. package/dist/client/assets/dist-CBsvKPcT.js +1 -0
  209. package/dist/client/assets/{dist-nxQErAaK.js → dist-CJBYh9Wy.js} +9 -9
  210. package/dist/client/assets/dist-CRwfjtwz.js +2 -0
  211. package/dist/client/assets/{dist-BzFSJM0U.js → dist-CX7Kc61C.js} +1 -1
  212. package/dist/client/assets/dist-CYfPeupF.js +1 -0
  213. package/dist/client/assets/dist-Ch6Sr9KF.js +28 -0
  214. package/dist/client/assets/{dist-DCpIH3-_.js → dist-CoXN2D3R.js} +1 -1
  215. package/dist/client/assets/{dist-CbDyXgCo.js → dist-CucpLxUY.js} +1 -1
  216. package/dist/client/assets/dist-DHBMeCxC.js +6 -0
  217. package/dist/client/assets/dist-DLEg9d4u.js +1 -0
  218. package/dist/client/assets/{dist-By7ieqAf.js → dist-DOHWxIty.js} +1 -1
  219. package/dist/client/assets/dist-DYFBD-wW.js +1 -0
  220. package/dist/client/assets/{dist-BR81yxMt.js → dist-DeCV9FU4.js} +1 -1
  221. package/dist/client/assets/dist-DugWGOjQ.js +1 -0
  222. package/dist/client/assets/{dist-DVXzbeDx.js → dist-KrdpB_GB.js} +1 -1
  223. package/dist/client/assets/{dist-B_B4XLmq.js → dist-NNrRnB-f.js} +1 -1
  224. package/dist/client/assets/{dist-Bx3QkS-3.js → dist-PUxZqhFe.js} +1 -1
  225. package/dist/client/assets/dist-cYiJMWHJ.js +1 -0
  226. package/dist/client/assets/dist-iKC7go4m.js +1 -0
  227. package/dist/client/assets/{dist-CrWzIWEE.js → dist-lw5TGjI6.js} +1 -1
  228. package/dist/client/assets/{dist-CELhfKzh.js → dist-uk11ih8u.js} +2 -2
  229. package/dist/client/assets/{document-formatter-Qdiq9uJs.js → document-formatter-6I63vstk.js} +1 -1
  230. package/dist/client/assets/{drawioEditor-CHf1vtdQ.js → drawioEditor-DNTjsjzJ.js} +2 -2
  231. package/dist/client/assets/duration-BiuFXtXd.js +1 -0
  232. package/dist/client/assets/ebnfDiagram-PWID7BFC-PfC84FyI.js +1 -0
  233. package/dist/client/assets/ebnfDiagram-ZINNZB2B-DYvm_QtE.js +1 -0
  234. package/dist/client/assets/editor-session-D8GGkJak.js +14 -0
  235. package/dist/client/assets/elk-276RUBZZ-B8LB3Pac.js +27 -0
  236. package/dist/client/assets/embedded-editor-base-elU0Avik.css +1 -0
  237. package/dist/client/assets/{embedpdf-LUXDBD3-.js → embedpdf-TkbBYowM.js} +1 -1
  238. package/dist/client/assets/{embedpdf-DA4bA119-E8wZ11J2.js → embedpdf-cl9qiF45-itpgqvGY.js} +5 -5
  239. package/dist/client/assets/{en-2RFA324Y-BsuNJTcL.js → en-JTHJ2SIP-DBz9bRq4.js} +1 -1
  240. package/dist/client/assets/erDiagram-OPXOYQCR-o8GRv8A_.js +99 -0
  241. package/dist/client/assets/{erDiagram-RLTQ6QDP-CWrH1UJ9.js → erDiagram-RLTQ6QDP-C9cJl5NB.js} +2 -2
  242. package/dist/client/assets/esm-BzZ1JFVo.js +65 -0
  243. package/dist/client/assets/{estree-CuT_pB8K.js → estree-DGmLqopC.js} +18 -18
  244. package/dist/client/assets/eventmodeling-NTZA5JFV-CDy1bN6j.js +1 -0
  245. package/dist/client/assets/eventmodeling-NTZA5JFV-Dxtv5D-P.js +1 -0
  246. package/dist/client/assets/{excalidraw-element-link-iA6zo0_f.js → excalidraw-element-link-BRZOTIeI.js} +2 -2
  247. package/dist/client/assets/{excalidrawEditor-DDE0n1Pk.css → excalidrawEditor-BCTFp_CV.css} +1 -1
  248. package/dist/client/assets/excalidrawEditor-D0orhhku.js +9 -0
  249. package/dist/client/assets/export-page-CVJNMERq.js +46 -0
  250. package/dist/client/assets/exportDocument-Ba-n1X4U.css +1 -0
  251. package/dist/client/assets/exportDocument-DSshnmnZ.js +2 -0
  252. package/dist/client/assets/{fa-IR-FIYUE2GQ-C865Nx3X.js → fa-IR-I4JNTJHK-CFtHZqoT.js} +1 -1
  253. package/dist/client/assets/file-search-BA8o_gs0.js +1 -0
  254. package/dist/client/assets/flowDiagram-HODETNUW-Bq4470NR.js +1 -0
  255. package/dist/client/assets/flowDiagram-KWPJA3E3-DQG9qGiU.js +1 -0
  256. package/dist/client/assets/forth-D6RzAl64.js +1 -0
  257. package/dist/client/assets/ganttDiagram-EL5Y4UJY-x40PW0Ah.js +292 -0
  258. package/dist/client/assets/ganttDiagram-FUAMR5RP-BQpsI7gQ.js +292 -0
  259. package/dist/client/assets/gitGraph-4MIJSDKK-B-rpDYbz.js +1 -0
  260. package/dist/client/assets/gitGraph-4MIJSDKK-ZaBIE4Lb.js +1 -0
  261. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-ahsNaZsp.js +106 -0
  262. package/dist/client/assets/gitGraphDiagram-X574FWY7-wbs_2m9f.js +106 -0
  263. package/dist/client/assets/graphlib-C9Tl7QrK.js +1 -0
  264. package/dist/client/assets/{html-Cdnr2qzU.js → html-BryNQ_yx.js} +7 -7
  265. package/dist/client/assets/html-DTuc_pxj.js +1 -0
  266. package/dist/client/assets/{id-ID-EOMR5R3I-CGQwUjoL.js → id-ID-2WY7E4VX-CCAeQpPr.js} +2 -2
  267. package/dist/client/assets/image-I42VHMUI-B2-c_ifV.js +1 -0
  268. package/dist/client/assets/{image-blob-reduce.esm-Dj7YBvMv.js → image-blob-reduce.esm-BFq-Mx5V.js} +2 -2
  269. package/dist/client/assets/index-BCgNcVNs.css +1 -0
  270. package/dist/client/assets/index-BpmR5Qqk.js +1140 -0
  271. package/dist/client/assets/info-A6RAGUB7-BcGxhjED.js +1 -0
  272. package/dist/client/assets/info-A6RAGUB7-BlutK7BT.js +1 -0
  273. package/dist/client/assets/infoDiagram-27XIBGKW-MrZyptIy.js +2 -0
  274. package/dist/client/assets/infoDiagram-VRGFBTTK-KkUjDRAQ.js +2 -0
  275. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-CRy9vIS5.js → ishikawaDiagram-5VMMS53U-Bnt9yM0O.js} +2 -2
  276. package/dist/client/assets/ishikawaDiagram-OU5B5YK6-Di9BcpOY.js +70 -0
  277. package/dist/client/assets/{it-IT-FC2VTM3L-KTijNcUe.js → it-IT-INVHSAJF-DytAgndh.js} +1 -1
  278. package/dist/client/assets/javascript-B9I2pbsP.js +1 -0
  279. package/dist/client/assets/javascript-DctB8BJo.js +1 -0
  280. package/dist/client/assets/{journeyDiagram-3NMN7TZE-D4ZR_s9J.js → journeyDiagram-3NMN7TZE-Bl0abK1r.js} +1 -1
  281. package/dist/client/assets/journeyDiagram-ZHPQQLJL-J-sGrs9e.js +139 -0
  282. package/dist/client/assets/jsx-runtime-DKj5X9O4.js +1 -0
  283. package/dist/client/assets/kanban-definition-PNTS6WVX-5ZDV_yIa.js +89 -0
  284. package/dist/client/assets/{kanban-definition-UXKFOSKX-CIDTmu5g.js → kanban-definition-UXKFOSKX-DMgUfNt0.js} +10 -10
  285. package/dist/client/assets/{katex-CXMH3UgJ.js → katex-9NBMfU68.js} +2 -2
  286. package/dist/client/assets/katex-ZlcWpGUi.js +257 -0
  287. package/dist/client/assets/line-DEbP8Ok6.js +1 -0
  288. package/dist/client/assets/linear-DExL6ILt.js +1 -0
  289. package/dist/client/assets/{lobby-presence-Rdjnc0_0.js → lobby-presence-KJrYhMdN.js} +1 -1
  290. package/dist/client/assets/{lua-CL1SqxuB.js → lua-zbJo2mq3.js} +1 -1
  291. package/dist/client/assets/{markdown-CByV-4CU.js → markdown-CZ1tYEW8.js} +23 -23
  292. package/dist/client/assets/markdown-it-DpvIRaVq.js +13 -0
  293. package/dist/client/assets/markdown-math-CyyBVuDO.js +517 -0
  294. package/dist/client/assets/merge-CALoRt3l.js +1 -0
  295. package/dist/client/assets/{mermaid-parser.core-DrdLA3p0.js → mermaid-parser.core-Bpogunsh.js} +1 -1
  296. package/dist/client/assets/mermaid-parser.core-DBy--Jc0.js +3 -0
  297. package/dist/client/assets/mermaid.core-BeOUPE3Q.js +10 -0
  298. package/dist/client/assets/mindmap-definition-NLK3R4M7-ByVb-0vj.js +96 -0
  299. package/dist/client/assets/{mindmap-definition-YA3MSWOX-DO8NB9VH.js → mindmap-definition-YA3MSWOX-DBZN5_GH.js} +29 -29
  300. package/dist/client/assets/{nginx-BMaDbqW3.js → nginx-8H7HVH4w.js} +1 -1
  301. package/dist/client/assets/packet-AYTQ26CC-CqpSjTWl.js +1 -0
  302. package/dist/client/assets/packet-AYTQ26CC-DvbY8dI6.js +1 -0
  303. package/dist/client/assets/{pdfium-RAgkpwfK.wasm → pdfium-BJ2Yip8Q.wasm} +0 -0
  304. package/dist/client/assets/pegDiagram-GJSIUBJH-aost1sSO.js +1 -0
  305. package/dist/client/assets/pegDiagram-XKGWAZYB-DRo8CZu3.js +1 -0
  306. package/dist/client/assets/percentages-LWOC67ZH-VhvllE7L.js +1 -0
  307. package/dist/client/assets/{pica-xkWDouSg.js → pica-BPrp-GK1.js} +1 -1
  308. package/dist/client/assets/pie-DzWLGKAD.js +1 -0
  309. package/dist/client/assets/pie-WAS4IAKB-Bg2eCNl5.js +1 -0
  310. package/dist/client/assets/pie-WAS4IAKB-DWSm9SSD.js +1 -0
  311. package/dist/client/assets/pieDiagram-5QR66LMP-BICdpEuz.js +39 -0
  312. package/dist/client/assets/pieDiagram-E7YTZNPT-CZThaHsc.js +39 -0
  313. package/dist/client/assets/{preload-helper-CtT0-S4g.js → preload-helper-BAlEavIC.js} +1 -1
  314. package/dist/client/assets/preview-render-compiler-BmWQStaL.js +43 -0
  315. package/dist/client/assets/preview-render-profile-D652PAjA.js +1 -0
  316. package/dist/client/assets/preview-render-worker-BA4VK_GY.js +575 -0
  317. package/dist/client/assets/prod-CA0ie9yD.js +145 -0
  318. package/dist/client/assets/prod-yKJZ3E4s.js +1 -0
  319. package/dist/client/assets/{pug-Wky5Dnfy.js → pug-CqqUmdG7.js} +1 -1
  320. package/dist/client/assets/purify.es-go7v6Te-.js +3 -0
  321. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-fJE7iAxt.js → quadrantDiagram-AXDQQJYC-C5iowkl_.js} +3 -3
  322. package/dist/client/assets/quadrantDiagram-O4NWA36T-Bgx5bF97.js +7 -0
  323. package/dist/client/assets/quick-switcher-controller-B5vT9Vj5.js +1 -0
  324. package/dist/client/assets/radar-RG4KPBEZ-BfNQUEQy.js +1 -0
  325. package/dist/client/assets/radar-RG4KPBEZ-DxExotg6.js +1 -0
  326. package/dist/client/assets/railroad-74A4TZTK-BaQ6U6eJ.js +1 -0
  327. package/dist/client/assets/railroad-74A4TZTK-FfHmeIQk.js +1 -0
  328. package/dist/client/assets/railroad-abnf-HS5TGJTU-BJ3KZw7J.js +1 -0
  329. package/dist/client/assets/railroad-abnf-HS5TGJTU-CLkdDRsJ.js +1 -0
  330. package/dist/client/assets/railroad-ebnf-LZEXJU2U-B162zvcG.js +1 -0
  331. package/dist/client/assets/railroad-ebnf-LZEXJU2U-DA0sEq7w.js +1 -0
  332. package/dist/client/assets/railroad-peg-WCYAUIDC-CGs5GeJ5.js +1 -0
  333. package/dist/client/assets/railroad-peg-WCYAUIDC-DCmlICzO.js +1 -0
  334. package/dist/client/assets/railroadDiagram-O6MQD6OU-BTt_rKjT.js +1 -0
  335. package/dist/client/assets/railroadDiagram-XR7U4H2S-DbVoNgSz.js +1 -0
  336. package/dist/client/assets/{requirementDiagram-BXWQKSXE-Balm0WW8.js → requirementDiagram-BXWQKSXE-BkvazG7r.js} +1 -1
  337. package/dist/client/assets/requirementDiagram-PLB6GJNP-BT0j9C40.js +84 -0
  338. package/dist/client/assets/runtime-config-CvrkHb0n.js +1 -0
  339. package/dist/client/assets/runtime-paths-qQGhzNx4.js +1 -0
  340. package/dist/client/assets/sankeyDiagram-IPEJSGJF-X1BCUIrf.js +40 -0
  341. package/dist/client/assets/sankeyDiagram-P5KCCOFB-C_IemB9h.js +40 -0
  342. package/dist/client/assets/sankeyLinkHorizontal-usjP1-Cg.js +1 -0
  343. package/dist/client/assets/sequenceDiagram-PO4LG4MO-B-2QfXhV.js +169 -0
  344. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-BL1j3Sn-.js → sequenceDiagram-WJ2MYXX4-CxFBgLGd.js} +3 -3
  345. package/dist/client/assets/{sieve-BAxa3IjF.js → sieve-tLWDfEkZ.js} +1 -1
  346. package/dist/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -1
  347. package/dist/client/assets/sizeCapture-INFHLROL-DrzwYt5z.js +1 -0
  348. package/dist/client/assets/sl-SI-QY5KCFGA-RZhwMpQL.js +8 -0
  349. package/dist/client/assets/solr-B78wSQJQ.js +1 -0
  350. package/dist/client/assets/src-XiVvaevx.js +1 -0
  351. package/dist/client/assets/{standalone-6z5x8CWe.js → standalone-DbyFjvTU.js} +1 -1
  352. package/dist/client/assets/stateDiagram-D77RDMKH-BaSQ6Owj.js +1 -0
  353. package/dist/client/assets/stateDiagram-v2-GCMORJYK-CsVcfwVp.js +291 -0
  354. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CLlwrdvU.js +1 -0
  355. package/dist/client/assets/sv-SE-O3OFCY3J-DnS86_7q.js +12 -0
  356. package/dist/client/assets/swimlanes-2SLR337P-CnYTVqRX.js +1 -0
  357. package/dist/client/assets/swimlanes-42K2YHIH-CALFEmiS.js +1 -0
  358. package/dist/client/assets/swimlanesDiagram-TC7HE7FX-Bh4tmz27.js +8 -0
  359. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-xhehUG9e.js +8 -0
  360. package/dist/client/assets/th-TH-WLSZUSBX-DHehoYR2.js +1 -0
  361. package/dist/client/assets/{timeline-definition-24CTP7MA-7pch5JAr.js → timeline-definition-24CTP7MA-zse-5Dbm.js} +5 -5
  362. package/dist/client/assets/timeline-definition-EJHVYXUP-BhqPlKkN.js +120 -0
  363. package/dist/client/assets/treeView-Q6P3EWNA-BvHOzbu9.js +1 -0
  364. package/dist/client/assets/treeView-Q6P3EWNA-Cccy0ngL.js +1 -0
  365. package/dist/client/assets/treemap-CxZTjHiH.js +1 -0
  366. package/dist/client/assets/treemap-WGGIJYW6-oety7paS.js +1 -0
  367. package/dist/client/assets/treemap-WGGIJYW6-sMRCjCtX.js +1 -0
  368. package/dist/client/assets/usecaseDiagram-POWQR4AR-DR2LHQYs.js +328 -0
  369. package/dist/client/assets/v4-DDdyfk2q.js +1 -0
  370. package/dist/client/assets/{vault-api-client-QjZ_T03l.js → vault-api-client-NS_EVHJ3.js} +2 -2
  371. package/dist/client/assets/vault-paths-BT-6nztu.js +1 -0
  372. package/dist/client/assets/venn.esm-C5rDfA9t.js +7 -0
  373. package/dist/client/assets/vennDiagram-4TSXK5OY-DgHr6cJD.js +28 -0
  374. package/dist/client/assets/vennDiagram-UO4OBE2U-BRwLn2Q1.js +28 -0
  375. package/dist/client/assets/{verilog-7LoJAqYT.js → verilog-CjI9Y6RI.js} +1 -1
  376. package/dist/client/assets/wardley-WFR3VGLG-BdwDpX_I.js +1 -0
  377. package/dist/client/assets/wardley-WFR3VGLG-Y7xty_3m.js +1 -0
  378. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-BbSlUwuM.js → wardleyDiagram-VM6X3IG4-9A60XZis.js} +3 -3
  379. package/dist/client/assets/wardleyDiagram-VNRHLVJA-B_tMcVFG.js +78 -0
  380. package/dist/client/assets/wiki-link-resolver-Dch88erO.js +1 -0
  381. package/dist/client/assets/{worker-engine-m0rlHn8R-eSDcDGEI.js → worker-engine-BCCrxWYm-CX0qJ_cG.js} +1 -1
  382. package/dist/client/assets/{workspace-sync-client-D4nblH_2.js → workspace-sync-client-BrMtf6zN.js} +1 -1
  383. package/dist/client/assets/xychartDiagram-PMCCYNJV-fRpZ1MA5.js +7 -0
  384. package/dist/client/assets/xychartDiagram-S5SC5T6Z-D00iy-wB.js +7 -0
  385. package/dist/client/assets/{yaml-9ltHPDNO.js → yaml-BcZaqAz8.js} +1 -1
  386. package/dist/client/assets/{yjs-provider-reset-guard-R43MnLNc.js → yjs-provider-reset-guard-DpntzUDR.js} +1 -1
  387. package/dist/client/drawio-editor.html +8 -7
  388. package/dist/client/excalidraw-editor.html +41 -34
  389. package/dist/client/export-document.html +4 -3
  390. package/dist/client/index.html +32 -14
  391. package/package.json +22 -19
  392. package/src/client/app/drawio-editor.html +1 -0
  393. package/src/client/app/excalidraw-editor.html +1 -0
  394. package/src/client/app/export-document-entry.js +1 -0
  395. package/src/client/app/export-document.html +1 -0
  396. package/src/client/app/index.html +30 -12
  397. package/src/client/app/main-entry.js +30 -4
  398. package/src/client/application/app-shell/ui-feature-shell.js +20 -1
  399. package/src/client/application/app-shell-elements.js +2 -0
  400. package/src/client/application/diagram-preview-hydrator.js +7 -0
  401. package/src/client/application/mermaid-preview-hydrator.js +89 -3
  402. package/src/client/application/preview-diagram-utils.js +1 -0
  403. package/src/client/application/preview-render-compiler.js +2 -0
  404. package/src/client/application/preview-render-executor.js +4 -1
  405. package/src/client/application/preview-render-profile.js +8 -12
  406. package/src/client/application/preview-renderer.js +3 -0
  407. package/src/client/bootstrap/collabmd-app-shell.js +19 -8
  408. package/src/client/browser-utils.js +22 -1
  409. package/src/client/domain/excalidraw-scene.js +0 -11
  410. package/src/client/domain/file-search.js +2 -1
  411. package/src/client/domain/highlight-runtime.js +30 -3
  412. package/src/client/domain/markdown-math.js +14 -0
  413. package/src/client/domain/runtime-paths.js +4 -0
  414. package/src/client/export/export-host.js +3 -7
  415. package/src/client/export/export-pipeline.js +208 -21
  416. package/src/client/infrastructure/browser-preferences-port.js +8 -0
  417. package/src/client/infrastructure/editor-session.js +20 -0
  418. package/src/client/infrastructure/editor-view-adapter.js +8 -7
  419. package/src/client/infrastructure/excalidraw-room-client.js +2 -45
  420. package/src/client/infrastructure/git-api-client.js +5 -0
  421. package/src/client/infrastructure/runtime-config.js +14 -0
  422. package/src/client/infrastructure/tab-activity-lock.js +8 -4
  423. package/src/client/infrastructure/webmcp-tool-registry.js +12 -5
  424. package/src/client/presentation/bases-preview-controller.js +2 -1
  425. package/src/client/presentation/comment-markdown-renderer.js +2 -0
  426. package/src/client/presentation/comment-ui-controller.js +21 -30
  427. package/src/client/presentation/create-menu-presenter.js +16 -18
  428. package/src/client/presentation/drawio-embed-controller.js +58 -8
  429. package/src/client/presentation/excalidraw-embed-controller.js +14 -4
  430. package/src/client/presentation/file-action-controller.js +21 -1
  431. package/src/client/presentation/file-explorer-controller.js +1 -0
  432. package/src/client/presentation/file-explorer-view.js +56 -8
  433. package/src/client/presentation/file-history-view-controller.js +6 -0
  434. package/src/client/presentation/git-diff-view-controller.js +3 -2
  435. package/src/client/presentation/git-panel-controller.js +6 -5
  436. package/src/client/presentation/image-lightbox-controller.js +7 -6
  437. package/src/client/presentation/outline-controller.js +0 -86
  438. package/src/client/presentation/quick-switcher-controller.js +50 -13
  439. package/src/client/presentation/scroll-sync-controller.js +69 -21
  440. package/src/client/presentation/vault-dashboard.js +63 -0
  441. package/src/client/styles/components/navigation.css +2 -2
  442. package/src/client/styles/deferred-collab.css +1 -0
  443. package/src/client/styles/deferred-preview.css +1 -0
  444. package/src/client/styles/features/diagram-preview.css +1 -0
  445. package/src/client/styles/features/preview-markdown.css +4 -4
  446. package/src/client/styles/foundation/themes.css +56 -271
  447. package/src/client/styles/foundation/utilities.css +2 -0
  448. package/src/client/styles/layout/editor-page.css +0 -1
  449. package/src/client/styles/layout/overlays.css +5 -0
  450. package/src/client/styles/layout/shell.css +158 -0
  451. package/src/client/styles/layout/sidebar.css +3 -0
  452. package/src/client/styles/surfaces/landing-page.css +260 -0
  453. package/src/domain/agent-tool-definitions.js +45 -13
  454. package/src/domain/collabmd-content-capabilities.js +59 -4
  455. package/src/domain/collaboration-protocol.js +2 -0
  456. package/src/domain/markdown-outline.js +35 -0
  457. package/src/server/application/agent-connection-service.js +6 -2
  458. package/src/server/application/agent-content-service.js +124 -56
  459. package/src/server/auth/create-auth-service.js +40 -12
  460. package/src/server/auth/session-cookie.js +49 -38
  461. package/src/server/config/env.js +40 -7
  462. package/src/server/domain/backlink-index.js +1 -11
  463. package/src/server/domain/bases/base-query-results.js +7 -3
  464. package/src/server/domain/bases/base-query-service.js +2 -7
  465. package/src/server/domain/collaboration/collaboration-room.js +54 -16
  466. package/src/server/domain/docx-exporter.js +256 -2
  467. package/src/server/domain/hosted-workspace-contract.js +7 -0
  468. package/src/server/domain/hosted-workspace.js +29 -62
  469. package/src/server/domain/ripgrep-search-service.js +44 -28
  470. package/src/server/infrastructure/git/diff-service.js +15 -11
  471. package/src/server/infrastructure/git/git-service.js +4 -0
  472. package/src/server/infrastructure/git/image-mime.js +4 -3
  473. package/src/server/infrastructure/git/status-service.js +10 -6
  474. package/src/server/infrastructure/http/create-git-api-query-handler.js +25 -0
  475. package/src/server/infrastructure/http/create-static-handler.js +3 -1
  476. package/src/server/infrastructure/http/create-vault-api-query-handler.js +14 -54
  477. package/src/server/infrastructure/http/http-response.js +2 -0
  478. package/src/server/infrastructure/persistence/hosted-metadata-store.js +42 -5
  479. package/src/server/infrastructure/persistence/path-utils.js +23 -3
  480. package/src/server/infrastructure/persistence/pull-backup-store.js +52 -42
  481. package/src/server/infrastructure/persistence/sidecar-store.js +7 -4
  482. package/src/server/infrastructure/persistence/vault-file-store.js +55 -168
  483. package/src/server/infrastructure/plantuml/plantuml-renderer.js +33 -0
  484. package/src/server/infrastructure/structurizr/structurizr-workspace-service.js +24 -10
  485. package/src/server/infrastructure/websocket/attach-collaboration-gateway.js +7 -3
  486. package/src/server/infrastructure/websocket/client-socket-session.js +32 -4
  487. package/src/server/infrastructure/workspace/file-system-sync-service.js +4 -2
  488. package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-Crf9Y3Q6.js +0 -1
  489. package/dist/client/assets/abnfDiagram-VCTEODGH-PuinKbSQ.js +0 -1
  490. package/dist/client/assets/architecture-7GRP2DOG-BMOPAkUC.js +0 -1
  491. package/dist/client/assets/architectureDiagram-5GKGNRK7-46hPkrZv.js +0 -36
  492. package/dist/client/assets/blockDiagram-I7D4REHJ-C1S5Bzf8.js +0 -129
  493. package/dist/client/assets/channel-jwdhnPiV.js +0 -1
  494. package/dist/client/assets/chunk-2E4U76K2-Ba8Wf22k.js +0 -1
  495. package/dist/client/assets/chunk-4HAMMTFA-Ht-73lsT.js +0 -62
  496. package/dist/client/assets/chunk-5XKZK2GL-D4UAZSOJ.js +0 -1
  497. package/dist/client/assets/chunk-75Z2AOVW-B2cZexqK.js +0 -2
  498. package/dist/client/assets/chunk-DU6HZSFF-C6d6PJfE.js +0 -127
  499. package/dist/client/assets/chunk-GMAD6QVW-DUfjx_d5.js +0 -72
  500. package/dist/client/assets/chunk-GVQU2GXP-D1l7oRGR.js +0 -1
  501. package/dist/client/assets/chunk-L3NEJ4N5-BmCVn4y-.js +0 -1
  502. package/dist/client/assets/chunk-OSK3NFVY-CWHXAmfx.js +0 -10
  503. package/dist/client/assets/chunk-POPQ4Y6H-B5yJIrZE.js +0 -1
  504. package/dist/client/assets/chunk-PWAF6VOD-B3gML4ps.js +0 -1
  505. package/dist/client/assets/chunk-TLUHSLCS-Yl7B0Vrz.js +0 -1
  506. package/dist/client/assets/chunk-ZNVOA63L-BmCQjhx-.js +0 -40
  507. package/dist/client/assets/classDiagram-ZZMXUADV-BRw9vo8U.js +0 -1
  508. package/dist/client/assets/classDiagram-v2-VYDZK3BY-BRw9vo8U.js +0 -1
  509. package/dist/client/assets/comment-markdown-renderer-B9_vPc3F.js +0 -1
  510. package/dist/client/assets/comment-thread-store-NNHqRVsX.js +0 -1
  511. package/dist/client/assets/cose-bilkent-JH36ORCC-Cm_QF_yb.js +0 -1
  512. package/dist/client/assets/cynefin-OW5HDTMX-7tP7QfM3.js +0 -1
  513. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-BRoCEoZM.js +0 -62
  514. package/dist/client/assets/cytoscape.esm-B-NFISlW.js +0 -321
  515. package/dist/client/assets/dagre-PrKaheQc.js +0 -1
  516. package/dist/client/assets/deferred-collab-rBe4nuQ2.css +0 -1
  517. package/dist/client/assets/deferred-preview-pe7Iwwx3.css +0 -1
  518. package/dist/client/assets/diagram-UQ7AKVKN-JevUZuYi.js +0 -41
  519. package/dist/client/assets/diagram-VX7I27RA-pSD4HMh1.js +0 -24
  520. package/dist/client/assets/diagram-Z3DM3KII-D8r1_CIb.js +0 -24
  521. package/dist/client/assets/direct-engine-DdrQKpgq-B5zIoeQw.js +0 -5
  522. package/dist/client/assets/dist-B3HdUPsK.js +0 -1
  523. package/dist/client/assets/dist-BIRygGYH.js +0 -1
  524. package/dist/client/assets/dist-BPyOlNLY.js +0 -2
  525. package/dist/client/assets/dist-ByhQbe-x.js +0 -1
  526. package/dist/client/assets/dist-C5NkYKAa.js +0 -1
  527. package/dist/client/assets/dist-CEirJSxk.js +0 -1
  528. package/dist/client/assets/dist-CRnJ0D9h.js +0 -1
  529. package/dist/client/assets/dist-CyNrloSI.js +0 -1
  530. package/dist/client/assets/dist-D60_kdpQ.js +0 -1
  531. package/dist/client/assets/dist-Hdhj3L3t.js +0 -1
  532. package/dist/client/assets/dist-gRRhmB-2.js +0 -6
  533. package/dist/client/assets/dist-kWb2d1CH.js +0 -1
  534. package/dist/client/assets/dist-kiD2GIsD.js +0 -13
  535. package/dist/client/assets/dist-l-56SowH.js +0 -19
  536. package/dist/client/assets/dist-sLzRQQk7.js +0 -1
  537. package/dist/client/assets/ebnfDiagram-PWID7BFC-UJ0Fz5ci.js +0 -1
  538. package/dist/client/assets/editor-session-4Bn81iWm.js +0 -14
  539. package/dist/client/assets/embedded-editor-base-jK221GC8.css +0 -1
  540. package/dist/client/assets/eventmodeling-NTZA5JFV-BR2FzK4R.js +0 -1
  541. package/dist/client/assets/excalidrawEditor-WIuguTz7.js +0 -9
  542. package/dist/client/assets/export-page-AN-wI5p4.js +0 -56
  543. package/dist/client/assets/exportDocument-B7IagJhQ.css +0 -1
  544. package/dist/client/assets/exportDocument-B9xNKpQe.js +0 -2
  545. package/dist/client/assets/file-search-DDLyyLDU.js +0 -1
  546. package/dist/client/assets/flowDiagram-HODETNUW-kb1lUSBo.js +0 -1
  547. package/dist/client/assets/forth-Cezjo90N.js +0 -1
  548. package/dist/client/assets/ganttDiagram-EL5Y4UJY-BBNzDfaV.js +0 -292
  549. package/dist/client/assets/gitGraph-4MIJSDKK-DYlXv_yJ.js +0 -1
  550. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-Csf0Dm_1.js +0 -106
  551. package/dist/client/assets/graphlib-DS17s2tU.js +0 -1
  552. package/dist/client/assets/image-2QKV3NAF-BUbX0y5Y.js +0 -1
  553. package/dist/client/assets/index-BAmZnTFV.css +0 -1
  554. package/dist/client/assets/index-mWiw418b.js +0 -1111
  555. package/dist/client/assets/info-A6RAGUB7-BlU-8_xu.js +0 -1
  556. package/dist/client/assets/infoDiagram-27XIBGKW-Bzy6kCbb.js +0 -2
  557. package/dist/client/assets/javascript-BWjar7HY.js +0 -1
  558. package/dist/client/assets/javascript-D-FtdkNC.js +0 -1
  559. package/dist/client/assets/jsx-runtime-BpzPEenQ.js +0 -1
  560. package/dist/client/assets/line-DSWLHgpx.js +0 -1
  561. package/dist/client/assets/linear-n-3HSMUF.js +0 -1
  562. package/dist/client/assets/markdown-it-CocJWnjv.js +0 -13
  563. package/dist/client/assets/mermaid.core-C_FK-7n4.js +0 -1
  564. package/dist/client/assets/mermaid.core-D0cMM4Rl.js +0 -10
  565. package/dist/client/assets/packet-AYTQ26CC-BSJEH9Lb.js +0 -1
  566. package/dist/client/assets/pegDiagram-XKGWAZYB-DS6Ab21R.js +0 -1
  567. package/dist/client/assets/percentages-Q7USCRWZ-DWE6uvTs.js +0 -1
  568. package/dist/client/assets/pie-WAS4IAKB-qxv01Y8W.js +0 -1
  569. package/dist/client/assets/pieDiagram-E7YTZNPT-BbFe6Tgs.js +0 -39
  570. package/dist/client/assets/preview-render-compiler-C_7J7eia.js +0 -43
  571. package/dist/client/assets/preview-render-compiler-DzJ1KR_M.js +0 -1
  572. package/dist/client/assets/preview-render-worker-1DoIDllV.js +0 -59
  573. package/dist/client/assets/prod-D5TxmmoB.js +0 -1
  574. package/dist/client/assets/prod-pbFU4TaM.js +0 -145
  575. package/dist/client/assets/quick-switcher-controller-CUajuy78.js +0 -1
  576. package/dist/client/assets/radar-RG4KPBEZ-B6h6pWOs.js +0 -1
  577. package/dist/client/assets/railroad-74A4TZTK-CGtTWdGc.js +0 -1
  578. package/dist/client/assets/railroad-abnf-HS5TGJTU-Cq7y22IA.js +0 -1
  579. package/dist/client/assets/railroad-ebnf-LZEXJU2U-V0aQVv9m.js +0 -1
  580. package/dist/client/assets/railroad-peg-WCYAUIDC-BQiIsX_p.js +0 -1
  581. package/dist/client/assets/railroadDiagram-O6MQD6OU-CUQKqbCK.js +0 -1
  582. package/dist/client/assets/runtime-config-BFVdhnJu.js +0 -1
  583. package/dist/client/assets/runtime-paths-Cn0snt_9.js +0 -1
  584. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CcbMqrlQ.js +0 -40
  585. package/dist/client/assets/sl-SI-JRML4FIH-D53L_0S2.js +0 -6
  586. package/dist/client/assets/solr-BBopId9w.js +0 -1
  587. package/dist/client/assets/src-oBChb5qS.js +0 -1
  588. package/dist/client/assets/stateDiagram-D77RDMKH-DNi924hh.js +0 -1
  589. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-C62JEwak.js +0 -1
  590. package/dist/client/assets/sv-SE-4ZPKFFXF-DT-G7RCI.js +0 -12
  591. package/dist/client/assets/swimlanes-42K2YHIH-ColgjSH4.js +0 -1
  592. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-B9UZhEj4.js +0 -8
  593. package/dist/client/assets/th-TH-P7CTMGDK-6sy0NO7K.js +0 -1
  594. package/dist/client/assets/treeView-Q6P3EWNA-BTTYcvrF.js +0 -1
  595. package/dist/client/assets/treemap-WGGIJYW6-Cg7tyfH8.js +0 -1
  596. package/dist/client/assets/vennDiagram-4TSXK5OY-C5taziCX.js +0 -34
  597. package/dist/client/assets/wardley-WFR3VGLG-C6N1rULY.js +0 -1
  598. package/dist/client/assets/wiki-link-resolver-C2P_WmTV.js +0 -1
  599. package/dist/client/assets/xychartDiagram-S5SC5T6Z-D06X1arY.js +0 -7
  600. package/src/server/domain/collaboration/protocol.js +0 -6
@@ -16,6 +16,7 @@ import {
16
16
  } from '../../domain/excalidraw-agent-scene.js';
17
17
  import { inspectAgentExcalidrawScene, renderAgentExcalidrawSvg } from '../../domain/excalidraw-agent-verification.js';
18
18
  import { getVaultFileKind, isBaseFilePath } from '../../domain/file-kind.js';
19
+ import { collectMarkdownOutline } from '../../domain/markdown-outline.js';
19
20
  import { isWholeWordMatch } from '../../domain/literal-text-search.js';
20
21
  import { createWikiTargetIndex } from '../../domain/wiki-link-resolver.js';
21
22
  import {
@@ -27,6 +28,7 @@ import {
27
28
  collectMarkdownImageSources,
28
29
  collectMarkdownReferences,
29
30
  } from '../domain/markdown-reference-extractor.js';
31
+ import { searchExcalidrawSceneText } from '../domain/ripgrep-search-service.js';
30
32
  import { compareWorkspacePaths, normalizeWorkspacePath } from '../domain/workspace-state.js';
31
33
 
32
34
  const MAX_DOCUMENT_CHARACTERS = 200_000;
@@ -337,8 +339,8 @@ export class AgentContentService {
337
339
 
338
340
  async searchVault(actor, {
339
341
  kinds = [],
340
- limit = 50,
341
- maxSnippetsPerFile = 5,
342
+ limit = 10,
343
+ maxSnippetsPerFile = 2,
342
344
  prefix = '',
343
345
  query = '',
344
346
  wholeWord = false,
@@ -348,85 +350,124 @@ export class AgentContentService {
348
350
  const normalizedQuery = String(query ?? '').trim().slice(0, 500);
349
351
  const normalizedPrefix = normalizeWorkspacePath(prefix);
350
352
  const kindFilter = new Set(Array.isArray(kinds) ? kinds : []);
351
- const snippetLimit = clampInteger(maxSnippetsPerFile, 5, 1, 10);
352
- const result = await this.searchService.search({
353
- kinds: [...kindFilter],
354
- limit,
355
- maxSnippetsPerFile: snippetLimit,
356
- prefix: normalizedPrefix,
357
- query: normalizedQuery,
358
- wholeWord,
359
- signal,
360
- });
361
- if (normalizedQuery.length < 2) return result;
362
-
353
+ const snippetLimit = clampInteger(maxSnippetsPerFile, 2, 1, 10);
354
+ const pageSize = clampInteger(limit, 10, 1, 50);
355
+ const livePaths = new Set();
356
+ let liveIncomplete = false;
363
357
  const liveFiles = [];
364
- for (const [path, room] of this.roomRegistry?.getRooms?.() ?? []) {
358
+ for (const [path, room] of normalizedQuery.length >= 2 ? this.roomRegistry?.getRooms?.() ?? [] : []) {
365
359
  const kind = getVaultFileKind(path);
366
360
  if (
367
361
  !isAgentReadablePath(path)
368
- || !room.isHydrated?.()
369
362
  || (normalizedPrefix && path !== normalizedPrefix && !path.startsWith(`${normalizedPrefix}/`))
370
363
  || (kindFilter.size > 0 && !kindFilter.has(kind))
371
364
  ) continue;
372
- const content = room.readEditableContent?.();
373
- if (content === null || content === undefined) continue;
374
- if (content.length > MAX_AGENT_READ_SOURCE_CHARACTERS) continue;
375
- const live = searchLiveText(content, normalizedQuery, snippetLimit, wholeWord);
365
+ livePaths.add(path);
366
+ const content = room.isHydrated?.()
367
+ ? room.readEditableContent?.() ?? room.getPersistedContent?.()
368
+ : null;
369
+ if (content == null || content.length > MAX_AGENT_READ_SOURCE_CHARACTERS) {
370
+ liveIncomplete = true;
371
+ continue;
372
+ }
373
+ signal?.throwIfAborted();
374
+ let live;
375
+ if (kind === 'excalidraw') {
376
+ let scene;
377
+ try {
378
+ scene = JSON.parse(content);
379
+ } catch {
380
+ liveIncomplete = true;
381
+ continue;
382
+ }
383
+ live = searchExcalidrawSceneText(scene, {
384
+ query: normalizedQuery, maxSnippetsPerFile: snippetLimit, wholeWord,
385
+ });
386
+ } else {
387
+ live = searchLiveText(content, normalizedQuery, snippetLimit, wholeWord);
388
+ }
376
389
  if (live.matchCount > 0) {
377
390
  liveFiles.push({ file: path, kind, ...live });
378
391
  }
379
392
  }
380
- if (liveFiles.length === 0) return result;
381
-
382
- const livePaths = new Set(liveFiles.map(({ file }) => file));
383
- const files = [...result.files.filter(({ file }) => !livePaths.has(file)), ...liveFiles]
384
- .sort((left, right) => compareWorkspacePaths(left.file, right.file))
385
- .slice(0, clampInteger(limit, 50, 1, 50));
393
+ const result = await this.searchService.search({
394
+ excludedPaths: [...livePaths],
395
+ kinds: [...kindFilter],
396
+ limit: pageSize,
397
+ maxSnippetsPerFile: snippetLimit,
398
+ prefix: normalizedPrefix,
399
+ query: normalizedQuery,
400
+ wholeWord,
401
+ signal,
402
+ });
403
+ const candidates = [...result.files.filter(({ file }) => !livePaths.has(file)), ...liveFiles]
404
+ .sort((left, right) => compareWorkspacePaths(left.file, right.file));
405
+ const files = candidates.slice(0, pageSize);
386
406
  return {
387
407
  ...result,
388
408
  files,
389
409
  matchCount: files.reduce((sum, file) => sum + file.matchCount, 0),
390
- truncated: result.truncated || files.length < result.files.length + liveFiles.length,
410
+ truncated: result.truncated || liveIncomplete || candidates.length > files.length
411
+ || files.some((file) => file.truncated),
391
412
  };
392
413
  }
393
414
 
394
- async readDocument(actor, { lineCount = MAX_READ_LINES, path, startLine = 1 } = {}) {
415
+ async readDocument(actor, { lineCount = 80, mode = 'content', path, startLine = 1 } = {}) {
395
416
  requireScope(actor, 'vault:read');
396
417
  const normalizedPath = normalizeWorkspacePath(path);
418
+ const kind = getVaultFileKind(normalizedPath);
397
419
  if (!isAgentReadablePath(normalizedPath)) {
398
420
  throw createAgentContentError('AGENT_UNSUPPORTED_DOCUMENT', 'Document type is not readable by agents', 400);
399
421
  }
422
+ if (!['content', 'outline'].includes(mode) || (mode === 'outline' && kind !== 'markdown')) {
423
+ throw createAgentContentError('AGENT_INPUT_INVALID', 'Outline mode requires a Markdown document', 400);
424
+ }
400
425
  const content = await this.readCurrentContent(normalizedPath);
401
426
  if (content.length > MAX_AGENT_READ_SOURCE_CHARACTERS) {
402
427
  throw createAgentContentError('AGENT_DOCUMENT_TOO_LARGE', 'Document is too large for agent reading', 413);
403
428
  }
404
429
  const lines = content.split('\n');
405
430
  const start = clampInteger(startLine, 1, 1, Math.max(lines.length, 1));
406
- const count = clampInteger(lineCount, MAX_READ_LINES, 1, MAX_READ_LINES);
407
- let selected = lines.slice(start - 1, start - 1 + count).join('\n');
408
- let characterTruncated = false;
409
- let endLine = Math.min(start + count - 1, lines.length);
410
- if (selected.length > MAX_READ_CHARACTERS) {
411
- selected = selected.slice(0, MAX_READ_CHARACTERS);
412
- characterTruncated = true;
413
- let returnedLineCount = 1;
414
- for (let index = 0; index < selected.length; index += 1) {
415
- if (selected.charCodeAt(index) === 10) returnedLineCount += 1;
416
- }
417
- if (selected.endsWith('\n')) returnedLineCount -= 1;
418
- endLine = Math.min(start + Math.max(returnedLineCount, 1) - 1, lines.length);
419
- }
420
- return {
421
- content: selected,
422
- endLine,
423
- kind: getVaultFileKind(normalizedPath),
431
+ const count = clampInteger(lineCount, 80, 1, MAX_READ_LINES);
432
+ const result = {
433
+ content: '',
434
+ endLine: lines.length,
435
+ kind,
436
+ nextStartLine: null,
424
437
  path: normalizedPath,
425
438
  revision: await createEditableContentRevision(content),
426
439
  startLine: start,
427
440
  totalLines: lines.length,
428
- truncated: characterTruncated || endLine < lines.length,
441
+ truncated: false,
429
442
  };
443
+ if (mode === 'outline') {
444
+ const headings = collectMarkdownOutline(content).filter(({ line }) => line >= start);
445
+ result.headings = headings.slice(0, count);
446
+ if (headings.length > count) {
447
+ result.endLine = result.headings.at(-1).line;
448
+ result.nextStartLine = headings[count].line;
449
+ result.truncated = true;
450
+ }
451
+ return result;
452
+ }
453
+ const selected = [];
454
+ let characters = 0;
455
+ for (const line of lines.slice(start - 1, start - 1 + count)) {
456
+ const size = line.length + (selected.length ? 1 : 0);
457
+ if (characters + size > MAX_READ_CHARACTERS) {
458
+ if (selected.length === 0) {
459
+ throw createAgentContentError('AGENT_DOCUMENT_LINE_TOO_LARGE', 'This line exceeds the 100000-character read limit; read a different line or use Markdown outline mode', 413);
460
+ }
461
+ break;
462
+ }
463
+ selected.push(line);
464
+ characters += size;
465
+ }
466
+ result.content = selected.join('\n');
467
+ result.endLine = start + selected.length - 1;
468
+ result.truncated = result.endLine < lines.length;
469
+ result.nextStartLine = result.truncated ? result.endLine + 1 : null;
470
+ return result;
430
471
  }
431
472
  async inspectDocumentReferences(actor, { path } = {}) {
432
473
  requireScope(actor, 'vault:read');
@@ -438,13 +479,22 @@ export class AgentContentService {
438
479
  if (content.length > MAX_AGENT_READ_SOURCE_CHARACTERS) {
439
480
  throw createAgentContentError('AGENT_DOCUMENT_TOO_LARGE', 'Document is too large for agent inspection', 413);
440
481
  }
482
+ return {
483
+ ...this.inspectMarkdownContent(normalizedPath, content),
484
+ backlinks: await this.backlinkIndex?.getBacklinks?.(normalizedPath) ?? [],
485
+ path: normalizedPath,
486
+ revision: await createEditableContentRevision(content),
487
+ };
488
+ }
489
+
490
+ inspectMarkdownContent(normalizedPath, content) {
441
491
  const entries = Array.from(this.workspaceMutationCoordinator?.workspaceState?.entries?.values?.() ?? []);
442
492
  const filePaths = entries
443
493
  .filter((entry) => entry.nodeType !== 'directory')
444
494
  .map((entry) => entry.path);
445
495
  const references = collectMarkdownReferences(content, {
446
496
  sourceFilePath: normalizedPath,
447
- wikiTargetIndex: createWikiTargetIndex(filePaths),
497
+ wikiTargetIndex: createWikiTargetIndex([...filePaths, normalizedPath]),
448
498
  });
449
499
  const toPublicReference = (reference) => ({
450
500
  exists: Boolean(reference.resolvedPath),
@@ -468,10 +518,7 @@ export class AgentContentService {
468
518
  };
469
519
  });
470
520
  return {
471
- backlinks: await this.backlinkIndex?.getBacklinks?.(normalizedPath) ?? [],
472
521
  embeds: references.filter(({ isEmbed }) => isEmbed).map(toPublicReference),
473
- path: normalizedPath,
474
- revision: await createEditableContentRevision(content),
475
522
  videos,
476
523
  wikiLinks: references.filter(({ isEmbed }) => !isEmbed).map(toPublicReference),
477
524
  };
@@ -479,6 +526,10 @@ export class AgentContentService {
479
526
 
480
527
  async validateDocument(actor, { path } = {}) {
481
528
  const inspected = await this.inspectDocumentReferences(actor, { path });
529
+ return { ...this.validateMarkdownReferences(inspected), path: inspected.path, revision: inspected.revision };
530
+ }
531
+
532
+ validateMarkdownReferences(inspected) {
482
533
  const issues = [];
483
534
  inspected.wikiLinks.filter(({ exists }) => !exists).forEach((reference) => {
484
535
  issues.push({
@@ -506,8 +557,6 @@ export class AgentContentService {
506
557
  });
507
558
  return {
508
559
  issues,
509
- path: inspected.path,
510
- revision: inspected.revision,
511
560
  valid: issues.length === 0,
512
561
  };
513
562
  }
@@ -587,12 +636,13 @@ export class AgentContentService {
587
636
  }
588
637
 
589
638
 
590
- async applyTextEdits(actor, { path, replacements, revision } = {}) {
639
+ async applyTextEdits(actor, { path, replacements, revision, validate = false } = {}) {
591
640
  requireScope(actor, 'vault:edit');
592
641
  const normalizedPath = normalizeWorkspacePath(path);
593
642
  if (!isAgentEditablePath(normalizedPath)) {
594
643
  throw createAgentContentError('AGENT_UNSUPPORTED_DOCUMENT', 'Document type is not editable by agents', 400);
595
644
  }
645
+ this.requireMarkdownValidation(normalizedPath, validate);
596
646
  return this.runForPath(normalizedPath, async () => {
597
647
  const content = await this.readCurrentContent(normalizedPath);
598
648
  if (content.length > MAX_DOCUMENT_CHARACTERS) {
@@ -619,7 +669,13 @@ export class AgentContentService {
619
669
  const nextContent = applyExactTextChanges(content, changes);
620
670
  assertValidAgentBaseContent(normalizedPath, nextContent);
621
671
  const room = this.roomRegistry?.get?.(normalizedPath);
672
+ const validation = validate
673
+ ? this.validateMarkdownReferences(this.inspectMarkdownContent(normalizedPath, nextContent))
674
+ : null;
622
675
  if (room) {
676
+ if (room.readEditableContent() !== content) {
677
+ throw createAgentContentError('AGENT_REVISION_CONFLICT', 'Document changed; read it again before editing', 409);
678
+ }
623
679
  room.applyExactTextChanges(changes, {
624
680
  origin: createCollaborationOrigin(actor),
625
681
  });
@@ -636,7 +692,8 @@ export class AgentContentService {
636
692
  return {
637
693
  path: normalizedPath,
638
694
  replacementCount: changes.length,
639
- revision: await createEditableContentRevision(room ? room.readEditableContent() : nextContent),
695
+ revision: await createEditableContentRevision(nextContent),
696
+ ...(validation ? { validation } : {}),
640
697
  };
641
698
  });
642
699
  }
@@ -795,18 +852,22 @@ export class AgentContentService {
795
852
  });
796
853
  }
797
854
 
798
- async createDocument(actor, { content = '', path } = {}) {
855
+ async createDocument(actor, { content = '', path, validate = false } = {}) {
799
856
  requireScope(actor, 'vault:edit');
800
857
  const normalizedPath = normalizeWorkspacePath(path);
801
858
  if (!isAgentCreatablePath(normalizedPath)) {
802
859
  throw createAgentContentError('AGENT_UNSUPPORTED_DOCUMENT', 'Document type cannot be created by agents', 400);
803
860
  }
861
+ this.requireMarkdownValidation(normalizedPath, validate);
804
862
  const normalizedContent = normalizeEditableText(content);
805
863
  if (normalizedContent.length > MAX_DOCUMENT_CHARACTERS) {
806
864
  throw createAgentContentError('AGENT_DOCUMENT_TOO_LARGE', 'Document is too large for agent creation', 413);
807
865
  }
808
866
  assertValidAgentBaseContent(normalizedPath, normalizedContent);
809
867
  return this.runForPath(normalizedPath, async () => {
868
+ const validation = validate
869
+ ? this.validateMarkdownReferences(this.inspectMarkdownContent(normalizedPath, normalizedContent))
870
+ : null;
810
871
  const result = await this.workspaceMutationCoordinator.createFile({
811
872
  content: normalizedContent,
812
873
  origin: getMutationOrigin(actor),
@@ -827,10 +888,17 @@ export class AgentContentService {
827
888
  kind: getVaultFileKind(normalizedPath),
828
889
  path: normalizedPath,
829
890
  revision: await createEditableContentRevision(normalizedContent),
891
+ ...(validation ? { validation } : {}),
830
892
  };
831
893
  });
832
894
  }
833
895
 
896
+ requireMarkdownValidation(path, validate) {
897
+ if (validate && getVaultFileKind(path) !== 'markdown') {
898
+ throw createAgentContentError('AGENT_INPUT_INVALID', 'Reference validation requires a Markdown document', 400);
899
+ }
900
+ }
901
+
834
902
  getSyntax(actor, { kind = '' } = {}) {
835
903
  requireScope(actor, 'vault:read');
836
904
  if (!kind) return { capabilities: listCollabMdContentCapabilities() };
@@ -3,9 +3,6 @@ import {
3
3
  AUTH_STRATEGY_NONE,
4
4
  AUTH_STRATEGY_OIDC,
5
5
  AUTH_STRATEGY_PASSWORD,
6
- SUPPORTED_AUTH_STRATEGIES,
7
- createRandomAuthPassword,
8
- createRandomSessionSecret,
9
6
  } from './auth-constants.js';
10
7
  import {
11
8
  buildClientConfig,
@@ -18,14 +15,27 @@ import {
18
15
  createPasswordStrategy,
19
16
  } from './auth-strategies.js';
20
17
 
21
- export {
22
- AUTH_STRATEGY_NONE,
23
- AUTH_STRATEGY_OIDC,
24
- AUTH_STRATEGY_PASSWORD,
25
- SUPPORTED_AUTH_STRATEGIES,
26
- createRandomAuthPassword,
27
- createRandomSessionSecret,
28
- };
18
+ function resolveRequestProtocol(req) {
19
+ const forwarded = String(req.headers['x-forwarded-proto'] ?? '').split(',')[0].trim().toLowerCase();
20
+ if (forwarded === 'https' || forwarded === 'http') {
21
+ return `${forwarded}:`;
22
+ }
23
+
24
+ try {
25
+ const cfVisitor = JSON.parse(req.headers['cf-visitor'] ?? '');
26
+ if (String(cfVisitor?.scheme).toLowerCase() === 'https') {
27
+ return 'https:';
28
+ }
29
+ } catch {
30
+ // Non-Cloudflare requests carry no cf-visitor payload.
31
+ }
32
+
33
+ if (req.socket?.encrypted) {
34
+ return 'https:';
35
+ }
36
+
37
+ return 'http:';
38
+ }
29
39
 
30
40
  export function createAuthService(config) {
31
41
  const authConfig = config.auth ?? { strategy: AUTH_STRATEGY_NONE };
@@ -72,8 +82,26 @@ export function createAuthService(config) {
72
82
  },
73
83
 
74
84
  authorizeWebSocketRequest(req) {
85
+ // Browsers always send Origin; clients without it still need authentication.
86
+ if (req.headers.origin !== undefined) {
87
+ let allowed = false;
88
+ try {
89
+ const protocol = resolveRequestProtocol(req);
90
+ const expectedOrigin = authConfig.oidc?.publicBaseUrl
91
+ ? new URL(authConfig.oidc.publicBaseUrl).origin
92
+ : new URL(`${protocol}//${req.headers.host}`).origin;
93
+ allowed = req.headers.origin === expectedOrigin;
94
+ } catch {
95
+ // Malformed or opaque origins are forbidden.
96
+ }
97
+ if (!allowed) {
98
+ return { ok: false, statusCode: 403, statusMessage: 'Forbidden', body: 'Origin not allowed' };
99
+ }
100
+ }
75
101
  if (strategy.isAuthenticated(req)) {
76
- return { ok: true };
102
+ const expiresAt = authConfig.strategy === AUTH_STRATEGY_NONE
103
+ ? null : sessionCookieManager.readSession(req)?.expiresAt;
104
+ return { ok: true, expiresAt: Number.isFinite(expiresAt) ? expiresAt : null };
77
105
  }
78
106
 
79
107
  return {
@@ -1,19 +1,11 @@
1
1
  import { createHmac, timingSafeEqual } from 'node:crypto';
2
2
 
3
3
  function decodeBase64Url(value) {
4
- const normalized = String(value ?? '')
5
- .replace(/-/g, '+')
6
- .replace(/_/g, '/');
7
- const paddingLength = (4 - (normalized.length % 4)) % 4;
8
- return Buffer.from(`${normalized}${'='.repeat(paddingLength)}`, 'base64');
4
+ return Buffer.from(String(value ?? ''), 'base64url');
9
5
  }
10
6
 
11
7
  function encodeBase64Url(value) {
12
- return Buffer.from(value)
13
- .toString('base64')
14
- .replace(/\+/g, '-')
15
- .replace(/\//g, '_')
16
- .replace(/=+$/g, '');
8
+ return Buffer.from(value).toString('base64url');
17
9
  }
18
10
 
19
11
  function parseCookieHeader(headerValue) {
@@ -78,6 +70,44 @@ export function createSignedCookieManager({
78
70
  cookiePath = '/',
79
71
  secret,
80
72
  }) {
73
+ // Authenticating one request can verify the same cookie several times
74
+ // (strategy check + expiry read + user lookup). Memoize per request object;
75
+ // the cookie-header check keeps it correct if headers ever change.
76
+ const readCache = new WeakMap();
77
+
78
+ function readSignedCookie(req) {
79
+ const token = parseCookieHeader(req.headers.cookie).get(cookieName);
80
+ if (!token) {
81
+ return null;
82
+ }
83
+
84
+ const separatorIndex = token.lastIndexOf('.');
85
+ if (separatorIndex <= 0) {
86
+ return null;
87
+ }
88
+
89
+ const encodedPayload = token.slice(0, separatorIndex);
90
+ const encodedSignature = token.slice(separatorIndex + 1);
91
+
92
+ try {
93
+ const expectedSignature = createSignature(encodedPayload, secret);
94
+ const actualSignature = decodeBase64Url(encodedSignature);
95
+
96
+ if (actualSignature.length !== expectedSignature.length) {
97
+ return null;
98
+ }
99
+
100
+ if (!timingSafeEqual(actualSignature, expectedSignature)) {
101
+ return null;
102
+ }
103
+
104
+ const payloadBuffer = decodeBase64Url(encodedPayload);
105
+ const payload = JSON.parse(payloadBuffer.toString('utf8'));
106
+ return payload && typeof payload === 'object' ? payload : null;
107
+ } catch {
108
+ return null;
109
+ }
110
+ }
81
111
  function createCookieAttributes(req, { expires = null } = {}) {
82
112
  const attributes = [
83
113
  'HttpOnly',
@@ -115,37 +145,18 @@ export function createSignedCookieManager({
115
145
  },
116
146
 
117
147
  read(req) {
118
- const token = parseCookieHeader(req.headers.cookie).get(cookieName);
119
- if (!token) {
120
- return null;
121
- }
122
-
123
- const separatorIndex = token.lastIndexOf('.');
124
- if (separatorIndex <= 0) {
125
- return null;
126
- }
127
-
128
- const encodedPayload = token.slice(0, separatorIndex);
129
- const encodedSignature = token.slice(separatorIndex + 1);
130
-
131
- try {
132
- const expectedSignature = createSignature(encodedPayload, secret);
133
- const actualSignature = decodeBase64Url(encodedSignature);
134
-
135
- if (actualSignature.length !== expectedSignature.length) {
136
- return null;
137
- }
138
-
139
- if (!timingSafeEqual(actualSignature, expectedSignature)) {
140
- return null;
148
+ if (req && typeof req === 'object') {
149
+ const cached = readCache.get(req);
150
+ if (cached !== undefined) {
151
+ return cached;
141
152
  }
142
153
 
143
- const payloadBuffer = decodeBase64Url(encodedPayload);
144
- const payload = JSON.parse(payloadBuffer.toString('utf8'));
145
- return payload && typeof payload === 'object' ? payload : null;
146
- } catch {
147
- return null;
154
+ const result = readSignedCookie(req);
155
+ readCache.set(req, result);
156
+ return result;
148
157
  }
158
+
159
+ return readSignedCookie(req);
149
160
  },
150
161
  };
151
162
  }
@@ -1,5 +1,5 @@
1
1
  import { basename, isAbsolute, relative, resolve } from 'path';
2
- import { readFileSync } from 'node:fs';
2
+ import { lstatSync, readdirSync, readFileSync } from 'node:fs';
3
3
  import { fileURLToPath } from 'url';
4
4
 
5
5
  import {
@@ -9,7 +9,7 @@ import {
9
9
  SUPPORTED_AUTH_STRATEGIES,
10
10
  createRandomAuthPassword,
11
11
  createRandomSessionSecret,
12
- } from '../auth/create-auth-service.js';
12
+ } from '../auth/auth-constants.js';
13
13
  import { loadBuildInfo } from './build-info.js';
14
14
  import { isPerfLoggingEnabled } from './perf-logging.js';
15
15
 
@@ -222,11 +222,11 @@ export function parseVaultList(rawValue) {
222
222
 
223
223
  export function resolveConfiguredVaults(overrides = {}, env = process.env) {
224
224
  if (Array.isArray(overrides.vaults)) {
225
- return overrides.vaults.map(({ id, dir, repoUrl }) => {
225
+ return overrides.vaults.map(({ id, dir, name, repoUrl }) => {
226
226
  if (!VAULT_ID_PATTERN.test(String(id ?? ''))) {
227
227
  throw new Error(`Invalid vault id "${id}". ${VAULT_ID_HINT}`);
228
228
  }
229
- return { id, dir: resolve(dir), repoUrl: normalizeOptionalString(repoUrl) };
229
+ return { id, dir: resolve(dir), ...(name ? { name: normalizeOptionalString(name) } : {}), repoUrl: normalizeOptionalString(repoUrl) };
230
230
  });
231
231
  }
232
232
  // ponytail: explicit directory (CLI positional) wins over the operator list
@@ -235,13 +235,34 @@ export function resolveConfiguredVaults(overrides = {}, env = process.env) {
235
235
  return [{ id: basename(dir), dir }];
236
236
  }
237
237
  const rawList = normalizeOptionalString(env.COLLABMD_VAULTS);
238
- if (!rawList) {
238
+ const discovery = normalizeOptionalString(env.COLLABMD_VAULT_DISCOVERY);
239
+ if (!rawList && !discovery) {
239
240
  const dir = resolveConfiguredVaultDir(overrides, env);
240
241
  return [{ id: basename(dir), dir }];
241
242
  }
242
- const vaults = parseVaultList(rawList);
243
+ let vaults;
244
+ if (rawList) {
245
+ vaults = parseVaultList(rawList);
246
+ } else {
247
+ if (!['all', 'marked'].includes(discovery)) {
248
+ throw new Error('COLLABMD_VAULT_DISCOVERY must be "all" or "marked".');
249
+ }
250
+ const root = resolve(env.COLLABMD_VAULT_DIR || '.');
251
+ // ponytail: discover immediate real directories at startup; restart to pick up additions.
252
+ vaults = readdirSync(root, { withFileTypes: true })
253
+ .filter((entry) => entry.isDirectory() && !entry.name.startsWith('.')
254
+ && (discovery === 'all' || lstatSync(resolve(root, entry.name, '.collabmd'), { throwIfNoEntry: false })?.isDirectory()))
255
+ .sort((a, b) => a.name.localeCompare(b.name, 'en'))
256
+ .map((entry) => ({ id: entry.name, dir: resolve(root, entry.name) }));
257
+ if (vaults.length === 0) {
258
+ throw new Error('No vaults found. Check COLLABMD_VAULT_DIR and COLLABMD_VAULT_DISCOVERY.');
259
+ }
260
+ }
243
261
  const seenIds = new Set();
244
262
  for (const vault of vaults) {
263
+ if (!VAULT_ID_PATTERN.test(vault.id)) {
264
+ throw new Error(`Invalid vault id "${vault.id}". ${VAULT_ID_HINT}`);
265
+ }
245
266
  if (seenIds.has(vault.id)) {
246
267
  throw new Error(`Duplicate vault id "${vault.id}" in COLLABMD_VAULTS.`);
247
268
  }
@@ -262,6 +283,17 @@ export function mangleVaultIdForEnv(vaultId) {
262
283
  return String(vaultId ?? '').toUpperCase().replace(/[^A-Z0-9]/g, '_');
263
284
  }
264
285
 
286
+ export function resolveVaultNames(vaults, env = process.env) {
287
+ return vaults.map((vault) => {
288
+ const suffix = mangleVaultIdForEnv(vault.id);
289
+ const name = normalizeOptionalString(env[`COLLABMD_VAULT_NAME_${suffix}`]);
290
+ if (name && vaults.filter((entry) => mangleVaultIdForEnv(entry.id) === suffix).length > 1) {
291
+ throw new Error(`Ambiguous vault name: multiple vaults share COLLABMD_VAULT_NAME_${suffix}.`);
292
+ }
293
+ return { ...vault, name: vault.name || name || vault.id };
294
+ });
295
+ }
296
+
265
297
  // ponytail: explicit repoUrl wins, then COLLABMD_GIT_REPO_URL_<ID>, then the shared URL for the primary
266
298
  export function resolveVaultRepoUrls(vaultDefs = [], overrides = {}, env = process.env) {
267
299
  const globalRepoUrl = normalizeOptionalString(overrides.remote?.repoUrl ?? overrides.git?.remote?.repoUrl ?? env.COLLABMD_GIT_REPO_URL);
@@ -540,7 +572,7 @@ function resolvePublicDir(nodeEnv) {
540
572
 
541
573
  export function loadConfig(overrides = {}) {
542
574
  const nodeEnv = process.env.NODE_ENV || 'development';
543
- const vaults = resolveVaultRepoUrls(resolveConfiguredVaults(overrides), overrides);
575
+ const vaults = resolveVaultNames(resolveVaultRepoUrls(resolveConfiguredVaults(overrides), overrides));
544
576
  // ponytail: vaultDir stays the primary vault; other vaults resolve through the registry
545
577
  const vaultDir = overrides.vaultDir || vaults[0].dir;
546
578
  const basePath = normalizeAppBasePath(process.env.BASE_PATH || '');
@@ -622,6 +654,7 @@ export function loadConfig(overrides = {}) {
622
654
  publicDir,
623
655
  vaultDir,
624
656
  vaults,
657
+ vaultDashboard: overrides.vaultDashboard ?? parseBooleanFlag(process.env.COLLABMD_VAULT_DASHBOARD),
625
658
  publicWsBaseUrl: process.env.PUBLIC_WS_BASE_URL || '',
626
659
  testWsRoomHydrateDelayMs: parsePositiveInt(process.env.TEST_WS_ROOM_HYDRATE_DELAY_MS, 0),
627
660
  wikiLinkAutoCreate: process.env.COLLABMD_WIKI_LINK_AUTO_CREATE !== 'false',
@@ -21,16 +21,6 @@ import { mapWithConcurrency } from '../shared/async-utils.js';
21
21
 
22
22
  const BACKLINK_BUILD_CONCURRENCY = 8;
23
23
 
24
- function createDeferred() {
25
- let resolve;
26
- let reject;
27
- const promise = new Promise((nextResolve, nextReject) => {
28
- resolve = nextResolve;
29
- reject = nextReject;
30
- });
31
- return { promise, reject, resolve };
32
- }
33
-
34
24
  export class BacklinkIndex {
35
25
  constructor({
36
26
  rebuildDelayMs = 150,
@@ -83,7 +73,7 @@ export class BacklinkIndex {
83
73
  this._latestRequestedWorkspaceState = workspaceState;
84
74
  }
85
75
  if (!this._scheduledBuildDeferred) {
86
- this._scheduledBuildDeferred = createDeferred();
76
+ this._scheduledBuildDeferred = Promise.withResolvers();
87
77
  }
88
78
 
89
79
  if (this._scheduledBuildTimer) {
@@ -103,8 +103,12 @@ function createSummaryPayload(columns, rows, summaries, definition, snapshot, th
103
103
 
104
104
  function createCsv(rows, columns) {
105
105
  const escapeCell = (value) => {
106
- const text = String(value ?? '');
107
- if (/[,"\n]/u.test(text)) {
106
+ let text = toDisplayText(value);
107
+ // CSV quoting alone does not prevent spreadsheets from evaluating formulas.
108
+ if (typeof value !== 'number' && /^[\s\p{Cc}]*[=+@-]|^[\t\r\n]/u.test(text)) {
109
+ text = `'${text}`;
110
+ }
111
+ if (/[,"\r\n]/u.test(text)) {
108
112
  return `"${text.replace(/"/g, '""')}"`;
109
113
  }
110
114
  return text;
@@ -112,7 +116,7 @@ function createCsv(rows, columns) {
112
116
 
113
117
  const lines = [
114
118
  columns.map((column) => escapeCell(column.label)).join(','),
115
- ...rows.map((row) => columns.map((column) => escapeCell(toDisplayText(row.rawCells[column.id]))).join(',')),
119
+ ...rows.map((row) => columns.map((column) => escapeCell(row.rawCells[column.id])).join(',')),
116
120
  ];
117
121
  return `${lines.join('\n')}\n`;
118
122
  }