collabmd 0.1.48 → 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 (482) hide show
  1. package/README.md +15 -608
  2. package/bin/collabmd.js +39 -20
  3. package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-Crf9Y3Q6.js +1 -0
  4. package/dist/client/assets/abnfDiagram-VCTEODGH-PuinKbSQ.js +1 -0
  5. package/dist/client/assets/ar-SA-5WIASEJP-Di7OimCN.js +10 -0
  6. package/dist/client/assets/{architectureDiagram-5GKGNRK7-I39sYjHI.js → architectureDiagram-5GKGNRK7-46hPkrZv.js} +3 -3
  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-NRAW4CY4-C6DtJy5Y.js → blockDiagram-I7D4REHJ-C1S5Bzf8.js} +4 -4
  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/browser-utils-DbXSMI-6.js +1 -0
  14. package/dist/client/assets/{c4Diagram-UCG6FXSJ-CtWtxS9_.js → c4Diagram-7LVT6UL2-VAk1HPmz.js} +1 -1
  15. package/dist/client/assets/ca-ES-2KGUU5XB-C9t-c0cH.js +8 -0
  16. package/dist/client/assets/channel-jwdhnPiV.js +1 -0
  17. package/dist/client/assets/chunk-2E4U76K2-Ba8Wf22k.js +1 -0
  18. package/dist/client/assets/{chunk-TEH6E4GO-DVayPj-q.js → chunk-4HAMMTFA-Ht-73lsT.js} +20 -20
  19. package/dist/client/assets/chunk-5XKZK2GL-D4UAZSOJ.js +1 -0
  20. package/dist/client/assets/{chunk-75Z2AOVW-CdFSaPjz.js → chunk-75Z2AOVW-B2cZexqK.js} +1 -1
  21. package/dist/client/assets/{chunk-CLGD4ZFX-DQLgbQrv.js → chunk-CLGD4ZFX-Cmtx89ht.js} +1 -1
  22. package/dist/client/assets/chunk-DU6HZSFF-C6d6PJfE.js +127 -0
  23. package/dist/client/assets/{chunk-F27PBJKO-CNHIFhjo.js → chunk-F27PBJKO-Dg3H6KLL.js} +1 -1
  24. package/dist/client/assets/{chunk-GMAD6QVW-CbcBqPM5.js → chunk-GMAD6QVW-DUfjx_d5.js} +1 -1
  25. package/dist/client/assets/{chunk-OBVCFTLP-BJR7u1jh.js → chunk-GVQU2GXP-D1l7oRGR.js} +1 -1
  26. package/dist/client/assets/{chunk-G27WJ6UU-D9-eg537.js → chunk-IMKFNOWR-3F6NhHUP.js} +2 -2
  27. package/dist/client/assets/{chunk-JQ64N6SF-DSFNH4bh.js → chunk-L3NEJ4N5-BmCVn4y-.js} +1 -1
  28. package/dist/client/assets/chunk-OSK3NFVY-CWHXAmfx.js +10 -0
  29. package/dist/client/assets/{chunk-P2QGCYS3-BRpqY32H.js → chunk-P2QGCYS3-Du8EtwOa.js} +1 -1
  30. package/dist/client/assets/{chunk-POPQ4Y6H-Cb4SlVZF.js → chunk-POPQ4Y6H-B5yJIrZE.js} +1 -1
  31. package/dist/client/assets/{chunk-PWAF6VOD-Cz8IwBB5.js → chunk-PWAF6VOD-B3gML4ps.js} +1 -1
  32. package/dist/client/assets/{chunk-RHFEMEQ7-CWY8cf4H.js → chunk-SHT3W25Y-BKaI8jZO.js} +5 -5
  33. package/dist/client/assets/{chunk-SVP7TREG-CyHOmcac.js → chunk-SVP7TREG-XlsB_ZMZ.js} +1 -1
  34. package/dist/client/assets/{chunk-LCL6LL3I-DmDkVukh.js → chunk-TICWLB2K-Cpp2z8yK.js} +4 -4
  35. package/dist/client/assets/chunk-TLUHSLCS-Yl7B0Vrz.js +1 -0
  36. package/dist/client/assets/chunk-ZNVOA63L-BmCQjhx-.js +40 -0
  37. package/dist/client/assets/{chunk-FLYJHZSQ-Be7lKF17.js → chunk-ZPMXAHWN-Dt0TxJa6.js} +2 -2
  38. package/dist/client/assets/classDiagram-ZZMXUADV-BRw9vo8U.js +1 -0
  39. package/dist/client/assets/classDiagram-v2-VYDZK3BY-BRw9vo8U.js +1 -0
  40. package/dist/client/assets/comment-markdown-renderer-B9_vPc3F.js +1 -0
  41. package/dist/client/assets/comment-thread-store-NNHqRVsX.js +1 -0
  42. package/dist/client/assets/comment-threads-nJhK1yfc.js +4 -0
  43. package/dist/client/assets/cs-CZ-VUCGPRML-BfCoYAgj.js +7 -0
  44. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-CdTPi2yO.js → cynefinDiagram-5FMLGOSQ-BRoCEoZM.js} +1 -1
  45. package/dist/client/assets/da-DK-NNDP2IVP-DBw9ZNTR.js +2 -0
  46. package/dist/client/assets/{dagre-3AP2YEHR-5gtJtd0O.js → dagre-GXQ25YYZ-BSfKCfy7.js} +2 -2
  47. package/dist/client/assets/de-CH-I7RAVIZN-DYW18Vsr.js +11 -0
  48. package/dist/client/assets/de-DE-WBQ3DQLR-DYW18Vsr.js +11 -0
  49. package/dist/client/assets/deferred-collab-rBe4nuQ2.css +1 -0
  50. package/dist/client/assets/deferred-git-BHKtkFYi.css +1 -0
  51. package/dist/client/assets/deferred-preview-pe7Iwwx3.css +1 -0
  52. package/dist/client/assets/{diagram-S7CK7UJ4-BudWz9WU.js → diagram-S7CK7UJ4-D7KaM9yj.js} +2 -2
  53. package/dist/client/assets/{diagram-UQ7AKVKN-3v4rbH-s.js → diagram-UQ7AKVKN-JevUZuYi.js} +1 -1
  54. package/dist/client/assets/diagram-VSXAHHWV-B3-U-Q2E.js +3 -0
  55. package/dist/client/assets/{diagram-VX7I27RA-C_-rj0sw.js → diagram-VX7I27RA-pSD4HMh1.js} +1 -1
  56. package/dist/client/assets/{diagram-Z3DM3KII-B4yxavgj.js → diagram-Z3DM3KII-D8r1_CIb.js} +1 -1
  57. package/dist/client/assets/{direct-engine-DdrQKpgq-CtKfQzCt.js → direct-engine-DdrQKpgq-B5zIoeQw.js} +1 -1
  58. package/dist/client/assets/dist-B3HdUPsK.js +1 -0
  59. package/dist/client/assets/{dist-Tw-Fxpeb.js → dist-B7XMN9AT.js} +1 -1
  60. package/dist/client/assets/dist-BIRygGYH.js +1 -0
  61. package/dist/client/assets/dist-BPyOlNLY.js +2 -0
  62. package/dist/client/assets/{dist-D5wCC32z.js → dist-BR81yxMt.js} +1 -1
  63. package/dist/client/assets/{dist-Bw3VIE_v.js → dist-B_B4XLmq.js} +1 -1
  64. package/dist/client/assets/dist-Bdy9ZRzd.js +9 -0
  65. package/dist/client/assets/{dist-netZOQtD.js → dist-Bfxzlnrf.js} +1 -1
  66. package/dist/client/assets/{dist-CietwTVS.js → dist-Bx3QkS-3.js} +1 -1
  67. package/dist/client/assets/{dist-mj2Ht75J.js → dist-By7ieqAf.js} +1 -1
  68. package/dist/client/assets/dist-ByhQbe-x.js +1 -0
  69. package/dist/client/assets/{dist-CdmKGRGr.js → dist-BzFSJM0U.js} +1 -1
  70. package/dist/client/assets/dist-C5NkYKAa.js +1 -0
  71. package/dist/client/assets/{dist-D3fehAZ2.js → dist-CELhfKzh.js} +1 -1
  72. package/dist/client/assets/dist-CEirJSxk.js +1 -0
  73. package/dist/client/assets/dist-CO0-4CuV.js +39 -0
  74. package/dist/client/assets/dist-CRnJ0D9h.js +1 -0
  75. package/dist/client/assets/{dist-DDUn5zTz.js → dist-CbDyXgCo.js} +1 -1
  76. package/dist/client/assets/{dist-BeajGMhO.js → dist-CqXVyYoH.js} +1 -1
  77. package/dist/client/assets/{dist-LQ4kDCKz.js → dist-CrWzIWEE.js} +1 -1
  78. package/dist/client/assets/dist-CyNrloSI.js +1 -0
  79. package/dist/client/assets/dist-D60_kdpQ.js +1 -0
  80. package/dist/client/assets/{dist-DuH3ZrHo.js → dist-DCpIH3-_.js} +1 -1
  81. package/dist/client/assets/{dist-BPHLJ09L.js → dist-DJAMplZI.js} +2 -2
  82. package/dist/client/assets/{dist-DGEbEfw4.js → dist-DVXzbeDx.js} +1 -1
  83. package/dist/client/assets/{dist-C5NgpdG5.js → dist-Drv_wZYC.js} +1 -1
  84. package/dist/client/assets/{dist-DVy5woUy.js → dist-EWJYvBK1.js} +1 -1
  85. package/dist/client/assets/dist-Hdhj3L3t.js +1 -0
  86. package/dist/client/assets/{dist-B_yQaEv_.js → dist-gRRhmB-2.js} +3 -3
  87. package/dist/client/assets/dist-kWb2d1CH.js +1 -0
  88. package/dist/client/assets/dist-kiD2GIsD.js +13 -0
  89. package/dist/client/assets/dist-l-56SowH.js +19 -0
  90. package/dist/client/assets/{dist-BK9QvQrc.js → dist-nxQErAaK.js} +2 -2
  91. package/dist/client/assets/dist-sLzRQQk7.js +1 -0
  92. package/dist/client/assets/{document-formatter-Dxl_a8XO.js → document-formatter-Qdiq9uJs.js} +1 -2
  93. package/dist/client/assets/drawioEditor-CHf1vtdQ.js +9 -0
  94. package/dist/client/assets/ebnfDiagram-PWID7BFC-UJ0Fz5ci.js +1 -0
  95. package/dist/client/assets/editor-session-4Bn81iWm.js +14 -0
  96. package/dist/client/assets/el-GR-TYQHVGXW-Dx82YYAS.js +7 -0
  97. package/dist/client/assets/embedded-editor-base-jK221GC8.css +1 -0
  98. package/dist/client/assets/{embedpdf-DA4bA119-BPqZxwjc.js → embedpdf-DA4bA119-E8wZ11J2.js} +2 -3
  99. package/dist/client/assets/{embedpdf-BmE13ZZ0.js → embedpdf-LUXDBD3-.js} +1 -1
  100. package/dist/client/assets/{en-SJ2YIMFF-CJBL3nkq.js → en-2RFA324Y-BsuNJTcL.js} +1 -1
  101. package/dist/client/assets/{erDiagram-SSCWMZ5O-C-iy6VkX.js → erDiagram-RLTQ6QDP-CWrH1UJ9.js} +2 -2
  102. package/dist/client/assets/es-ES-JEUOREKJ-Rx0NUQDl.js +12 -0
  103. package/dist/client/assets/eu-ES-SO5DEEAN-CDYm-BcK.js +8 -0
  104. package/dist/client/assets/excalidraw-element-link-iA6zo0_f.js +7 -0
  105. package/dist/client/assets/{excalidraw-scene-BOben2gr.js → excalidraw-scene-6uROebca.js} +1 -1
  106. package/dist/client/assets/{excalidraw-editor-BbSbI80a.css → excalidrawEditor-DDE0n1Pk.css} +1 -1
  107. package/dist/client/assets/excalidrawEditor-WIuguTz7.js +9 -0
  108. package/dist/client/assets/export-page-AN-wI5p4.js +56 -0
  109. package/dist/client/assets/exportDocument-B7IagJhQ.css +1 -0
  110. package/dist/client/assets/exportDocument-B9xNKpQe.js +2 -0
  111. package/dist/client/assets/fa-IR-FIYUE2GQ-C865Nx3X.js +9 -0
  112. package/dist/client/assets/fi-FI-REAEF6HQ-BIpjJqIb.js +6 -0
  113. package/dist/client/assets/flowDiagram-HODETNUW-kb1lUSBo.js +1 -0
  114. package/dist/client/assets/fr-FR-SUCL7J6B-DGAKE8jH.js +12 -0
  115. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-DtKHAbez.js → ganttDiagram-EL5Y4UJY-BBNzDfaV.js} +1 -1
  116. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-oue8fQ5o.js → gitGraphDiagram-WWUBYQGX-Csf0Dm_1.js} +1 -1
  117. package/dist/client/assets/gl-ES-KHCSOGVH-DWKh0CMu.js +6 -0
  118. package/dist/client/assets/he-IL-JYXVXV2Q-zqbcM-4g.js +9 -0
  119. package/dist/client/assets/hi-IN-BU52H3BO-CY8v6eG9.js +3 -0
  120. package/dist/client/assets/highlight-theme-CzNkO-IJ.js +1 -0
  121. package/dist/client/assets/hu-HU-OWADXDQ3-CEl6Udfh.js +3 -0
  122. package/dist/client/assets/id-ID-EOMR5R3I-CGQwUjoL.js +8 -0
  123. package/dist/client/assets/image-2QKV3NAF-BUbX0y5Y.js +1 -0
  124. package/dist/client/assets/index-BAmZnTFV.css +1 -0
  125. package/dist/client/assets/index-mWiw418b.js +1111 -0
  126. package/dist/client/assets/{infoDiagram-RXCK75RN-BMzo6KIn.js → infoDiagram-27XIBGKW-Bzy6kCbb.js} +1 -1
  127. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-BIM3h287.js → ishikawaDiagram-5VMMS53U-CRy9vIS5.js} +1 -1
  128. package/dist/client/assets/it-IT-FC2VTM3L-KTijNcUe.js +12 -0
  129. package/dist/client/assets/ja-JP-JBNTKYP4-BflWlGhw.js +12 -0
  130. package/dist/client/assets/{journeyDiagram-EYS64GPL-mF6Lh8O-.js → journeyDiagram-3NMN7TZE-D4ZR_s9J.js} +2 -2
  131. package/dist/client/assets/kaa-TC3VIB7V-B-xtZfy0.js +1 -0
  132. package/dist/client/assets/kab-KAB-UOUDSQKM-BmO0O4Y4.js +4 -0
  133. package/dist/client/assets/{kanban-definition-3QL26DDD-DLN2NyoR.js → kanban-definition-UXKFOSKX-CIDTmu5g.js} +4 -4
  134. package/dist/client/assets/kk-KZ-P5H2X7YS-CSQFB8IN.js +1 -0
  135. package/dist/client/assets/{km-KH-PCWDKPHP-DSmy5shj.js → km-KH-IHMV2US7-BxrjuEzr.js} +4 -4
  136. package/dist/client/assets/ko-KR-ZTMANIDF-BnNRXd5J.js +5 -0
  137. package/dist/client/assets/ku-TR-GPJTRB5G-BZM7f2aT.js +6 -0
  138. package/dist/client/assets/{line-BfTWJmgf.js → line-DSWLHgpx.js} +1 -1
  139. package/dist/client/assets/lobby-presence-Rdjnc0_0.js +1 -0
  140. package/dist/client/assets/lt-LT-V3XDOK3P-MVQBOHmF.js +3 -0
  141. package/dist/client/assets/lv-LV-DVQ3FADO-CrenwAhS.js +4 -0
  142. package/dist/client/assets/markdown-it-CocJWnjv.js +13 -0
  143. package/dist/client/assets/mermaid-parser.core-DrdLA3p0.js +3 -0
  144. package/dist/client/assets/mermaid.core-C_FK-7n4.js +1 -0
  145. package/dist/client/assets/mermaid.core-D0cMM4Rl.js +10 -0
  146. package/dist/client/assets/{mindmap-definition-FBJOCRG2-CRyHaHTk.js → mindmap-definition-YA3MSWOX-DO8NB9VH.js} +8 -8
  147. package/dist/client/assets/mr-IN-VZ6HH5FE-B-PHPglH.js +9 -0
  148. package/dist/client/assets/my-MM-XYKWHRK6-Be5sYp5q.js +1 -0
  149. package/dist/client/assets/nb-NO-UNO2GGZJ-BvSKGdja.js +8 -0
  150. package/dist/client/assets/nl-NL-76EFHT4P-C2yNx1Cj.js +13 -0
  151. package/dist/client/assets/nn-NO-CFKD7ABE-4NsqlDRP.js +4 -0
  152. package/dist/client/assets/oc-FR-YBJTCJ3J-B4OTQsWW.js +4 -0
  153. package/dist/client/assets/pa-IN-SNOXSMRV-CKj_sOG7.js +4 -0
  154. package/dist/client/assets/pegDiagram-XKGWAZYB-DS6Ab21R.js +1 -0
  155. package/dist/client/assets/percentages-Q7USCRWZ-DWE6uvTs.js +1 -0
  156. package/dist/client/assets/{pieDiagram-E7YTZNPT-B5OZPb88.js → pieDiagram-E7YTZNPT-BbFe6Tgs.js} +1 -1
  157. package/dist/client/assets/pl-PL-BSY6YFZ3-CFuzA6L0.js +12 -0
  158. package/dist/client/assets/preload-helper-CtT0-S4g.js +1 -0
  159. package/dist/client/assets/preview-render-compiler-C_7J7eia.js +43 -0
  160. package/dist/client/assets/preview-render-compiler-DzJ1KR_M.js +1 -0
  161. package/dist/client/assets/preview-render-worker-1DoIDllV.js +59 -0
  162. package/dist/client/assets/prod-D5TxmmoB.js +1 -0
  163. package/dist/client/assets/prod-pbFU4TaM.js +145 -0
  164. package/dist/client/assets/pt-BR-CZDV62R3-CkPMtyNx.js +10 -0
  165. package/dist/client/assets/pt-PT-JO57XJJW-CBSnfGtF.js +12 -0
  166. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-Drrw14YH.js → quadrantDiagram-AXDQQJYC-fJE7iAxt.js} +1 -1
  167. package/dist/client/assets/quick-switcher-De4PjZFC.css +1 -0
  168. package/dist/client/assets/quick-switcher-controller-CUajuy78.js +1 -0
  169. package/dist/client/assets/railroadDiagram-O6MQD6OU-CUQKqbCK.js +1 -0
  170. package/dist/client/assets/{requirementDiagram-EFPCY7ZU-CRZG6mRB.js → requirementDiagram-BXWQKSXE-Balm0WW8.js} +2 -2
  171. package/dist/client/assets/ro-RO-UZ5ICYYN-BOuntc_r.js +12 -0
  172. package/dist/client/assets/room-DX7lIfnu.js +1 -0
  173. package/dist/client/assets/ru-RU-AN7JPREC-D-ow3SNR.js +10 -0
  174. package/dist/client/assets/runtime-config-BFVdhnJu.js +1 -0
  175. package/dist/client/assets/runtime-paths-Cn0snt_9.js +1 -0
  176. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-DvarEJpo.js → sankeyDiagram-P5KCCOFB-CcbMqrlQ.js} +1 -1
  177. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-B4oWlb-w.js → sequenceDiagram-WJ2MYXX4-BL1j3Sn-.js} +6 -6
  178. package/dist/client/assets/si-LK-7CBLD6QQ-c91EepX0.js +1 -0
  179. package/dist/client/assets/sk-SK-SWR6DKBI-D5vFMIL6.js +7 -0
  180. package/dist/client/assets/sl-SI-JRML4FIH-D53L_0S2.js +6 -0
  181. package/dist/client/assets/{stateDiagram-HBIQ2CUA-qbHIIqRZ.js → stateDiagram-D77RDMKH-DNi924hh.js} +1 -1
  182. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-C62JEwak.js +1 -0
  183. package/dist/client/assets/sv-SE-4ZPKFFXF-DT-G7RCI.js +12 -0
  184. package/dist/client/assets/{swimlanes-XN3QIQJK-xB6CtUGj.js → swimlanes-42K2YHIH-ColgjSH4.js} +1 -1
  185. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-B9UZhEj4.js +8 -0
  186. package/dist/client/assets/ta-IN-V6NHHU6Z-D5jy7_AE.js +6 -0
  187. package/dist/client/assets/th-TH-P7CTMGDK-6sy0NO7K.js +1 -0
  188. package/dist/client/assets/{timeline-definition-24CTP7MA-Lj_yTNlY.js → timeline-definition-24CTP7MA-7pch5JAr.js} +1 -1
  189. package/dist/client/assets/tr-TR-GUFYG22B-ClVaf8h1.js +4 -0
  190. package/dist/client/assets/uk-UA-K6SV5NFQ-BLTTtyNB.js +6 -0
  191. package/dist/client/assets/uz-UZ-TVKTZO2G-Bm02Eg3D.js +1 -0
  192. package/dist/client/assets/vault-api-client-QjZ_T03l.js +7 -0
  193. package/dist/client/assets/vault-utils-Bct69Xw2.js +1 -0
  194. package/dist/client/assets/{vennDiagram-4TSXK5OY-BekRp5Y0.js → vennDiagram-4TSXK5OY-C5taziCX.js} +1 -1
  195. package/dist/client/assets/vi-VN-7FKFXJNO-CL3WPhmG.js +7 -0
  196. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-kdnV_Hdm.js → wardleyDiagram-VM6X3IG4-BbSlUwuM.js} +1 -1
  197. package/dist/client/assets/wiki-link-resolver-C2P_WmTV.js +1 -0
  198. package/dist/client/assets/{worker-engine-m0rlHn8R-S8mpn_O0.js → worker-engine-m0rlHn8R-eSDcDGEI.js} +1 -1
  199. package/dist/client/assets/workspace-change-CVA9dVmy.js +1 -0
  200. package/dist/client/assets/workspace-sync-client-D4nblH_2.js +1 -0
  201. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-DufGwNSB.js → xychartDiagram-S5SC5T6Z-D06X1arY.js} +1 -1
  202. package/dist/client/assets/yjs-B41tM6Sz.js +4 -0
  203. package/dist/client/assets/yjs-provider-reset-guard-R43MnLNc.js +1 -0
  204. package/dist/client/assets/zh-CN-AOKVLNNK-DGidDH2b.js +11 -0
  205. package/dist/client/assets/zh-HK-CDKPF5DC-CRcNR3rk.js +1 -0
  206. package/dist/client/assets/zh-TW-ZVGYESGW-C7Qji1y6.js +13 -0
  207. package/dist/client/drawio-editor.html +12 -5
  208. package/dist/client/excalidraw-editor.html +46 -5
  209. package/dist/client/export-document.html +6 -8
  210. package/dist/client/index.html +79 -43
  211. package/package.json +39 -36
  212. package/src/client/app/drawio-editor.html +3 -3
  213. package/src/client/app/excalidraw-editor.html +3 -3
  214. package/src/client/app/export-document.html +2 -2
  215. package/src/client/app/index.html +77 -37
  216. package/src/client/app/main-entry.js +13 -17
  217. package/src/client/application/app-shell/chat-feature.js +7 -22
  218. package/src/client/application/app-shell/comments-feature.js +6 -0
  219. package/src/client/application/app-shell/git-feature.js +23 -5
  220. package/src/client/application/app-shell/presence-feature.js +8 -25
  221. package/src/client/application/app-shell/ui-feature-shell.js +172 -149
  222. package/src/client/application/app-shell/ui-feature-sidebar.js +43 -7
  223. package/src/client/application/app-shell/ui-feature-tab-activity.js +27 -9
  224. package/src/client/application/app-shell/ui-feature-toolbar.js +16 -129
  225. package/src/client/application/app-shell-elements.js +9 -0
  226. package/src/client/application/highlight-theme.js +16 -0
  227. package/src/client/application/preview-render-compiler.js +44 -107
  228. package/src/client/application/preview-render-executor.js +0 -26
  229. package/src/client/application/preview-render-scheduler.js +8 -24
  230. package/src/client/application/preview-renderer.js +26 -9
  231. package/src/client/application/webmcp-diagram-renderer.js +47 -0
  232. package/src/client/application/workspace-coordinator.js +23 -22
  233. package/src/client/application/workspace-route-controller.js +7 -0
  234. package/src/client/bootstrap/collabmd-app-shell.js +148 -35
  235. package/src/client/bootstrap/lazy-collab-clients.js +90 -0
  236. package/src/client/domain/excalidraw-element-link.js +73 -0
  237. package/src/client/domain/excalidraw-scene-reconcile.js +5 -2
  238. package/src/client/domain/excalidraw-scene.js +21 -0
  239. package/src/client/domain/hash-routes.js +13 -0
  240. package/src/client/domain/highlight-runtime.js +47 -0
  241. package/src/client/domain/lobby-chat.js +2 -0
  242. package/src/client/domain/room.js +1 -5
  243. package/src/client/domain/runtime-paths.js +61 -7
  244. package/src/client/domain/vault-utils.js +11 -0
  245. package/src/client/excalidraw-editor.js +155 -14
  246. package/src/client/export/export-host.js +3 -1
  247. package/src/client/export/export-pipeline.js +4 -17
  248. package/src/client/infrastructure/agent-connection-api-client.js +23 -0
  249. package/src/client/infrastructure/auth-client.js +4 -15
  250. package/src/client/infrastructure/browser-preferences-port.js +16 -0
  251. package/src/client/infrastructure/editor-session.js +11 -0
  252. package/src/client/infrastructure/editor-view-adapter.js +56 -8
  253. package/src/client/infrastructure/excalidraw-room-client.js +89 -2
  254. package/src/client/infrastructure/git-api-client.js +39 -33
  255. package/src/client/infrastructure/hosted-api-client.js +60 -0
  256. package/src/client/infrastructure/lobby-presence.js +4 -7
  257. package/src/client/infrastructure/runtime-config.js +14 -2
  258. package/src/client/infrastructure/tab-activity-lock.js +2 -5
  259. package/src/client/infrastructure/vault-api-client.js +33 -26
  260. package/src/client/infrastructure/webmcp-tool-registry.js +297 -0
  261. package/src/client/infrastructure/workspace-sync-client.js +6 -4
  262. package/src/client/presentation/agent-connection-controller.js +255 -0
  263. package/src/client/presentation/backlinks-panel.js +3 -0
  264. package/src/client/presentation/bases-preview-controller.js +27 -18
  265. package/src/client/presentation/comment-markdown-renderer.js +2 -14
  266. package/src/client/presentation/comment-overview-controller.js +1 -2
  267. package/src/client/presentation/comment-ui/comment-ui-card.js +4 -2
  268. package/src/client/presentation/comment-ui/comment-ui-shared.js +5 -2
  269. package/src/client/presentation/create-menu-presenter.js +19 -16
  270. package/src/client/presentation/excalidraw-embed-controller.js +164 -4
  271. package/src/client/presentation/file-explorer-controller.js +3 -0
  272. package/src/client/presentation/file-explorer-view.js +338 -182
  273. package/src/client/presentation/file-history-view-controller.js +13 -11
  274. package/src/client/presentation/git-diff-view-controller.js +35 -43
  275. package/src/client/presentation/git-panel-controller.js +78 -28
  276. package/src/client/presentation/hosted-workspace-gate-controller.js +180 -0
  277. package/src/client/presentation/image-lightbox-controller.js +20 -16
  278. package/src/client/presentation/layout-controller.js +13 -2
  279. package/src/client/presentation/quick-switcher-controller.js +20 -78
  280. package/src/client/presentation/quick-switcher-text-search.js +10 -14
  281. package/src/client/presentation/team-settings-controller.js +228 -0
  282. package/src/client/styles/components/navigation.css +1 -2
  283. package/src/client/styles/deferred-collab.css +5 -0
  284. package/src/client/styles/deferred-git.css +7 -0
  285. package/src/client/styles/deferred-preview.css +6 -0
  286. package/src/client/styles/features/agent-connection.css +202 -0
  287. package/src/client/styles/features/collaboration-chat.css +8 -1
  288. package/src/client/styles/features/collaboration-dialogs.css +16 -1
  289. package/src/client/styles/features/collaboration-presence.css +17 -4
  290. package/src/client/styles/features/diagram-preview.css +0 -15
  291. package/src/client/styles/features/diff-toolbar.css +1 -1
  292. package/src/client/styles/features/media-lightbox.css +12 -3
  293. package/src/client/styles/features/outline.css +4 -2
  294. package/src/client/styles/features/preview-markdown.css +25 -11
  295. package/src/client/styles/features/quick-switcher.css +20 -11
  296. package/src/client/styles/features/team-settings.css +162 -0
  297. package/src/client/styles/foundation/themes.css +2 -0
  298. package/src/client/styles/foundation/tokens.css +2 -2
  299. package/src/client/styles/layout/editor-page.css +25 -24
  300. package/src/client/styles/layout/overlays.css +16 -0
  301. package/src/client/styles/layout/responsive.css +7 -25
  302. package/src/client/styles/layout/shell.css +21 -1
  303. package/src/client/styles/layout/sidebar.css +99 -7
  304. package/src/client/styles/primitives/controls.css +21 -54
  305. package/src/client/styles/style.css +4 -19
  306. package/src/domain/agent-tool-definitions.js +872 -0
  307. package/src/domain/collabmd-content-capabilities.js +149 -0
  308. package/src/domain/collaboration-protocol.js +2 -0
  309. package/src/domain/comment-threads.js +3 -5
  310. package/src/domain/diagram-source.js +50 -0
  311. package/src/domain/editable-content-revision.js +10 -0
  312. package/src/domain/editable-text.js +3 -0
  313. package/src/domain/exact-text-edits.js +69 -0
  314. package/src/domain/excalidraw-agent-scene.js +624 -0
  315. package/src/domain/excalidraw-agent-verification.js +554 -0
  316. package/src/domain/excalidraw-room-codec.js +13 -6
  317. package/src/domain/literal-text-search.js +13 -0
  318. package/src/domain/video-embed.js +76 -0
  319. package/src/server/application/agent-connection-service.js +178 -0
  320. package/src/server/application/agent-content-service.js +841 -0
  321. package/src/server/application/workspace-reconciliation.js +5 -7
  322. package/src/server/config/env.js +147 -6
  323. package/src/server/create-app-server.js +47 -141
  324. package/src/server/domain/bases/base-query-service.js +1 -5
  325. package/src/server/domain/collaboration/collaboration-room.js +121 -25
  326. package/src/server/domain/collaboration/protocol.js +4 -0
  327. package/src/server/domain/hosted-workspace.js +31 -1
  328. package/src/server/domain/markdown-reference-extractor.js +15 -1
  329. package/src/server/domain/ripgrep-search-service.js +68 -21
  330. package/src/server/infrastructure/git/git-service.js +19 -1
  331. package/src/server/infrastructure/git/history-service.js +1 -1
  332. package/src/server/infrastructure/git/local-exclude.js +37 -0
  333. package/src/server/infrastructure/git/parsers.js +19 -17
  334. package/src/server/infrastructure/git/path-utils.js +0 -16
  335. package/src/server/infrastructure/git/status-service.js +1 -1
  336. package/src/server/infrastructure/git/untracked-files.js +12 -21
  337. package/src/server/infrastructure/http/create-agent-api-handler.js +171 -0
  338. package/src/server/infrastructure/http/create-git-api-command-handler.js +32 -0
  339. package/src/server/infrastructure/http/create-hosted-api-handler.js +5 -0
  340. package/src/server/infrastructure/http/create-request-handler.js +123 -26
  341. package/src/server/infrastructure/http/create-static-handler.js +9 -0
  342. package/src/server/infrastructure/http/create-vault-api-query-handler.js +15 -2
  343. package/src/server/infrastructure/mcp/create-agent-mcp-handler.js +200 -0
  344. package/src/server/infrastructure/persistence/agent-connection-store.js +120 -0
  345. package/src/server/infrastructure/persistence/pull-backup-store.js +2 -27
  346. package/src/server/infrastructure/persistence/sidecar-store.js +12 -5
  347. package/src/server/infrastructure/persistence/vault-file-store.js +11 -5
  348. package/src/server/infrastructure/websocket/attach-collaboration-gateway.js +48 -22
  349. package/src/server/shared/agent-tool-image.js +22 -0
  350. package/src/server/shared/agent-tool-rate-limiter.js +27 -0
  351. package/src/server/startup/git-remote-bootstrap.js +58 -79
  352. package/src/server/vault-registry.js +251 -0
  353. package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-BPH4FJkv.js +0 -1
  354. package/dist/client/assets/abnfDiagram-VCTEODGH-BNDLzJ7L.js +0 -1
  355. package/dist/client/assets/ar-SA-PQUY64WN-xjXgbW6d.js +0 -10
  356. package/dist/client/assets/az-AZ-OXJXL76K-4JkO4Pca.js +0 -1
  357. package/dist/client/assets/base-CaIEJUF9.css +0 -1
  358. package/dist/client/assets/bg-BG-W2GKIJDF-DnkH_o81.js +0 -5
  359. package/dist/client/assets/bn-BD-TGL7M4PJ-CG4JkmtP.js +0 -3
  360. package/dist/client/assets/bn-IN-BKETKYEH-CG4JkmtP.js +0 -3
  361. package/dist/client/assets/browser-utils--H_DkyEF.js +0 -1
  362. package/dist/client/assets/ca-ES-LD5SCRVV-U6_TVMX9.js +0 -8
  363. package/dist/client/assets/channel-CaoKA_We.js +0 -1
  364. package/dist/client/assets/chunk-7XWMRXBY-CfMzEq80.js +0 -1
  365. package/dist/client/assets/chunk-CKBBP62Z-DG26UiBv.js +0 -2
  366. package/dist/client/assets/chunk-DSNCTWBM-8xkug7fQ.js +0 -2
  367. package/dist/client/assets/chunk-DU6HZSFF-COXDzJK1.js +0 -127
  368. package/dist/client/assets/chunk-R7TYR2AO-CTd0Yj98.js +0 -10
  369. package/dist/client/assets/chunk-RM4UPSZO-CWRwxNWJ.js +0 -41
  370. package/dist/client/assets/classDiagram-DTDB5LWJ-7fEmn0zV.js +0 -1
  371. package/dist/client/assets/classDiagram-v2-JRS7N3AN-7fEmn0zV.js +0 -1
  372. package/dist/client/assets/comment-thread-store-CdcwrObc.js +0 -1
  373. package/dist/client/assets/comment-threads-9J6Em-_y.js +0 -4
  374. package/dist/client/assets/comment-ui-shared-DuoyznXW.js +0 -7
  375. package/dist/client/assets/cs-CZ-OFPU5DBV-BmFAIhqX.js +0 -7
  376. package/dist/client/assets/da-DK-FRDJFYWF-H387Jw8B.js +0 -2
  377. package/dist/client/assets/de-CH-ZG7H3QK3-C_groygo.js +0 -11
  378. package/dist/client/assets/de-DE-SIJYH4IH-C_groygo.js +0 -11
  379. package/dist/client/assets/diagram-VSXAHHWV-CQRVEZR7.js +0 -3
  380. package/dist/client/assets/dist-73RPdcyU.js +0 -1
  381. package/dist/client/assets/dist-BJ1bJs33.js +0 -1
  382. package/dist/client/assets/dist-ByrG2qBA.js +0 -1
  383. package/dist/client/assets/dist-CH-sQu3r.js +0 -1
  384. package/dist/client/assets/dist-CKS_-are.js +0 -1
  385. package/dist/client/assets/dist-D37Hyu3h.js +0 -9
  386. package/dist/client/assets/dist-DZAAWTG-.js +0 -1
  387. package/dist/client/assets/dist-Dir5dDKZ.js +0 -1
  388. package/dist/client/assets/dist-Dl_tpDSr.js +0 -1
  389. package/dist/client/assets/dist-DutPuFmC.js +0 -1
  390. package/dist/client/assets/dist-RKBTaQMb.js +0 -13
  391. package/dist/client/assets/dist-eBx8q6Sy.js +0 -1
  392. package/dist/client/assets/drawio-editor-BVaNNtYp.js +0 -9
  393. package/dist/client/assets/drawioEditor-BkIBlXx0.js +0 -2
  394. package/dist/client/assets/ebnfDiagram-PWID7BFC-OXa8VEp1.js +0 -1
  395. package/dist/client/assets/editor-session-DMyVdHLj.js +0 -54
  396. package/dist/client/assets/el-GR-IEE2CGI2-BkT6YT54.js +0 -7
  397. package/dist/client/assets/embedded-editor-base-B3l6Xy65.css +0 -1
  398. package/dist/client/assets/es-ES-TVVPWKV5-CpPKJXTM.js +0 -12
  399. package/dist/client/assets/eu-ES-CGBMFQDT-Bu3N2493.js +0 -8
  400. package/dist/client/assets/excalidraw-editor-BjYaNEMY.js +0 -9
  401. package/dist/client/assets/excalidraw-mermaid-stub-BNckbX2n.js +0 -1
  402. package/dist/client/assets/excalidraw-mermaid-stub-DE5FTiZB.js +0 -1
  403. package/dist/client/assets/excalidrawEditor-ChqF_d82.js +0 -2
  404. package/dist/client/assets/export-page-Dyu0XCbu.js +0 -57
  405. package/dist/client/assets/exportDocument-CJBx4Xjx.css +0 -1
  406. package/dist/client/assets/exportDocument-Dgvfa2Sd.js +0 -2
  407. package/dist/client/assets/fa-IR-IE6XAPR4-BEvLCORD.js +0 -9
  408. package/dist/client/assets/fi-FI-P7TKNHRM-DI0q8iSX.js +0 -6
  409. package/dist/client/assets/file-icon-svg-Y_kpF957.js +0 -1
  410. package/dist/client/assets/flowDiagram-A5DVABFB-CiW1eN8C.js +0 -1
  411. package/dist/client/assets/fr-FR-QI2XZNT7-y8kXd8LA.js +0 -12
  412. package/dist/client/assets/gl-ES-TLYCNOZZ-Br-Fhff-.js +0 -6
  413. package/dist/client/assets/he-IL-ZX43XLGP-qKQq6V9X.js +0 -9
  414. package/dist/client/assets/hi-IN-UTYRMTUF-DOUcwrDO.js +0 -3
  415. package/dist/client/assets/hu-HU-AJOSEBW6-FqTyvHlD.js +0 -3
  416. package/dist/client/assets/id-ID-ETLTVG6C-CQqh3CLS.js +0 -8
  417. package/dist/client/assets/image-ZVKINSPA-0zXSnE7M.js +0 -1
  418. package/dist/client/assets/index-CSNIMyOP.css +0 -1
  419. package/dist/client/assets/index-DG3N2Ps-.js +0 -2
  420. package/dist/client/assets/it-IT-B4B6TP6L-V-yK3SZz.js +0 -12
  421. package/dist/client/assets/ja-JP-IYKVURR5-BQKBXRpX.js +0 -12
  422. package/dist/client/assets/kaa-SE2BUIKX-CZ5kfwPg.js +0 -1
  423. package/dist/client/assets/kab-KAB-Y3GLKXLR-Do7GWfuN.js +0 -4
  424. package/dist/client/assets/kk-KZ-ABWUFVOH-BpqVciQz.js +0 -1
  425. package/dist/client/assets/ko-KR-7JQDXKGM-N42lep78.js +0 -5
  426. package/dist/client/assets/ku-TR-NAH2Q5B7-K8LLl9fk.js +0 -6
  427. package/dist/client/assets/lt-LT-VQFYRSNQ-BmOd0ALn.js +0 -3
  428. package/dist/client/assets/lv-LV-T62VSYUM-B22WdPhp.js +0 -4
  429. package/dist/client/assets/main-D0wCxpVn.js +0 -903
  430. package/dist/client/assets/mermaid-parser.core-Bl0efOMt.js +0 -4
  431. package/dist/client/assets/mermaid.core-BJRLUQZE.js +0 -11
  432. package/dist/client/assets/modulepreload-polyfill-P2Xu9kJm.js +0 -1
  433. package/dist/client/assets/mr-IN-V4FHLCJE-XX069tpm.js +0 -9
  434. package/dist/client/assets/my-MM-E3SQ6E54-cst_-5SB.js +0 -1
  435. package/dist/client/assets/nb-NO-MLNOFN5H-Bu2URWko.js +0 -8
  436. package/dist/client/assets/nl-NL-D5L3ZV4M-BqrV0btt.js +0 -13
  437. package/dist/client/assets/nn-NO-NNHDGPKB-DK-xZaWM.js +0 -4
  438. package/dist/client/assets/oc-FR-DWCRF55G-BZ5Po5R6.js +0 -4
  439. package/dist/client/assets/pa-IN-3JSAY44M-BZQSjKrS.js +0 -4
  440. package/dist/client/assets/pegDiagram-XKGWAZYB-B31fKPR2.js +0 -1
  441. package/dist/client/assets/percentages-ETZPVQEE-DFxFqXgH.js +0 -1
  442. package/dist/client/assets/pl-PL-ACURYKP3-qcEOSfCk.js +0 -12
  443. package/dist/client/assets/preload-helper-HclGiUj8.js +0 -1
  444. package/dist/client/assets/preview-render-compiler-CrJIooVD.js +0 -35
  445. package/dist/client/assets/preview-render-compiler-O0JxBVNF.js +0 -1
  446. package/dist/client/assets/preview-render-profile-B4RWYWHt.js +0 -1
  447. package/dist/client/assets/preview-render-worker-_QTxqKvP.js +0 -60
  448. package/dist/client/assets/prod-BiYPMR1i.js +0 -177
  449. package/dist/client/assets/prod-VxdGZ5Ly.js +0 -1
  450. package/dist/client/assets/pt-BR-LOX7MLGD-DLueHSyZ.js +0 -10
  451. package/dist/client/assets/pt-PT-CZ2U2RFQ-BJ-GAEm6.js +0 -12
  452. package/dist/client/assets/quick-switcher-controller-CaEjEtq_.js +0 -1
  453. package/dist/client/assets/railroadDiagram-O6MQD6OU-BPifP0MB.js +0 -1
  454. package/dist/client/assets/ro-RO-2HECL2X6-CJUvKAf0.js +0 -12
  455. package/dist/client/assets/ru-RU-HAYNXO46-BWSlvTrt.js +0 -10
  456. package/dist/client/assets/runtime-config-BLrEKVO1.js +0 -1
  457. package/dist/client/assets/si-LK-W5KNS4H6-DGGCsn7k.js +0 -1
  458. package/dist/client/assets/sk-SK-7K2CFGDV-CY4uTYgQ.js +0 -7
  459. package/dist/client/assets/sl-SI-OXV2QZWW-2-weqaBY.js +0 -6
  460. package/dist/client/assets/stateDiagram-v2-4QOOHH4V-B--gjrit.js +0 -1
  461. package/dist/client/assets/sv-SE-JTOBZRGL-9-IUtVkO.js +0 -12
  462. package/dist/client/assets/swimlanesDiagram-VK2B7HYN-DO8XNXEg.js +0 -8
  463. package/dist/client/assets/ta-IN-KFAVKXGT-gHO6Q_DH.js +0 -6
  464. package/dist/client/assets/th-TH-VDMSCPDL-BvJuw6PJ.js +0 -1
  465. package/dist/client/assets/tr-TR-CEZ6GX45-CG6UU3Su.js +0 -4
  466. package/dist/client/assets/uk-UA-Q3H3OXQC-CSuIg_DY.js +0 -6
  467. package/dist/client/assets/uz-UZ-NGCSWWPX-mom7rxSP.js +0 -1
  468. package/dist/client/assets/vault-api-client-BkwdFjx0.js +0 -6
  469. package/dist/client/assets/vault-utils-DvoSftJT.js +0 -22
  470. package/dist/client/assets/vi-VN-P3NDEVPS-BB0Fu9ck.js +0 -7
  471. package/dist/client/assets/yjs-provider-reset-guard-DE0vINDP.js +0 -4
  472. package/dist/client/assets/zh-CN-SS3O57GA-Bj8wsiMe.js +0 -11
  473. package/dist/client/assets/zh-HK-LWJT3VCF-DOTquTCh.js +0 -1
  474. package/dist/client/assets/zh-TW-VJXC72RT-B48PRo-l.js +0 -13
  475. package/src/client/app/drawio-editor-entry.js +0 -1
  476. package/src/client/app/excalidraw-editor-entry.js +0 -1
  477. package/src/client/excalidraw-mermaid-stub.js +0 -7
  478. package/src/client/main.js +0 -16
  479. /package/dist/client/assets/{vault-api-client-C3mlS_4N.css → auth-gate-C3mlS_4N.css} +0 -0
  480. /package/dist/client/assets/{drawio-editor-UQQ8XHou.css → drawioEditor-UQQ8XHou.css} +0 -0
  481. /package/dist/client/assets/{base-BYODPHdS.js → github.min-DBihDoic.js} +0 -0
  482. /package/dist/client/assets/{sizeCapture-X5ZJPWSS-B0uUizjq.js → sizeCapture-INFHLROL-B0uUizjq.js} +0 -0
@@ -4,12 +4,18 @@ import * as syncProtocol from 'y-protocols/sync';
4
4
  import * as encoding from 'lib0/encoding';
5
5
  import * as decoding from 'lib0/decoding';
6
6
 
7
- import { MSG_AWARENESS, MSG_SYNC } from './protocol.js';
7
+ import {
8
+ MSG_AGENT_FLUSH,
9
+ MSG_AGENT_FLUSH_ACK,
10
+ MSG_AWARENESS,
11
+ MSG_SYNC,
12
+ } from './protocol.js';
8
13
  import { CollaborationDocumentStore } from './collaboration-document-store.js';
9
14
  import { logPerfEvent } from '../../config/perf-logging.js';
10
15
  import { populateCommentThreads, serializeCommentThreads } from '../../../domain/comment-threads.js';
11
16
  import { getVaultFileKind } from '../../../domain/file-kind.js';
12
17
  import {
18
+ applySceneDiffToExcalidrawRoom,
13
19
  EXCALIDRAW_APP_STATE_KEY,
14
20
  EXCALIDRAW_ELEMENTS_KEY,
15
21
  EXCALIDRAW_FILES_KEY,
@@ -21,6 +27,7 @@ import {
21
27
  tryParseExcalidrawSceneJson,
22
28
  } from '../../../domain/excalidraw-room-codec.js';
23
29
  import { isDrawioLeaseRoom } from '../../../domain/drawio-room.js';
30
+ import { normalizeEditableText } from '../../../domain/editable-text.js';
24
31
  import { normalizeWorkspaceEvent } from '../../../domain/workspace-change.js';
25
32
  import { WORKSPACE_EVENT_MAX_MESSAGES, WORKSPACE_ROOM_NAME } from '../../../domain/workspace-room.js';
26
33
 
@@ -130,9 +137,6 @@ function isWorkspaceRoom(name) {
130
137
  return name === WORKSPACE_ROOM_NAME;
131
138
  }
132
139
 
133
- function normalizeEditableText(content) {
134
- return String(content ?? '').replace(/\r\n/g, '\n').replace(/\r/g, '\n');
135
- }
136
140
 
137
141
  function isContentCleanOrigin(origin) {
138
142
  return origin === 'hydrate'
@@ -171,6 +175,34 @@ function computeTextReplacement(currentContent, nextContent) {
171
175
  };
172
176
  }
173
177
 
178
+ function reconcileTextContent(baselineContent, currentContent, externalContent) {
179
+ const localReplacement = computeTextReplacement(baselineContent, currentContent);
180
+ const externalReplacement = computeTextReplacement(baselineContent, externalContent);
181
+ if (!externalReplacement) {
182
+ return { content: currentContent, preservesPendingChanges: true };
183
+ }
184
+
185
+ const localEnd = localReplacement.start + localReplacement.deleteCount;
186
+ const externalEnd = externalReplacement.start + externalReplacement.deleteCount;
187
+ let externalStart;
188
+ if (localEnd <= externalReplacement.start) {
189
+ externalStart = externalReplacement.start
190
+ + localReplacement.insertText.length
191
+ - localReplacement.deleteCount;
192
+ } else if (externalEnd <= localReplacement.start) {
193
+ externalStart = externalReplacement.start;
194
+ } else {
195
+ return { content: externalContent, preservesPendingChanges: false };
196
+ }
197
+
198
+ return {
199
+ content: currentContent.slice(0, externalStart)
200
+ + externalReplacement.insertText
201
+ + currentContent.slice(externalStart + externalReplacement.deleteCount),
202
+ preservesPendingChanges: true,
203
+ };
204
+ }
205
+
174
206
  export class CollaborationRoom {
175
207
  constructor({
176
208
  documentStore = null,
@@ -504,7 +536,8 @@ export class CollaborationRoom {
504
536
  snapshot: Y.encodeStateAsUpdate(this.doc),
505
537
  });
506
538
  if (includeContent) {
507
- this.resetContentBaseline();
539
+ this.persistedContentBaseline = content;
540
+ this.refreshContentDirty();
508
541
  }
509
542
  })();
510
543
 
@@ -568,29 +601,37 @@ export class CollaborationRoom {
568
601
  }
569
602
 
570
603
  const ytext = this.doc.getText('codemirror');
604
+ const currentContent = ytext.toString();
571
605
  const normalizedContent = normalizeEditableText(content);
572
- const replacement = computeTextReplacement(ytext.toString(), normalizedContent);
573
- if (!replacement && !replaceCommentThreads) {
574
- this.resetContentBaseline();
575
- return { highlightRange: null, ok: true, skipped: true };
576
- }
577
-
578
- this.doc.transact(() => {
579
- if (replacement?.deleteCount) {
580
- ytext.delete(replacement.start, replacement.deleteCount);
581
- }
582
- if (replacement?.insertText) {
583
- ytext.insert(replacement.start, replacement.insertText);
584
- }
585
- if (replaceCommentThreads) {
586
- if (comments.length > 0) {
587
- comments.delete(0, comments.length);
606
+ const reconciliation = this.refreshContentDirty() && this.persistedContentBaseline !== null
607
+ ? reconcileTextContent(this.persistedContentBaseline, currentContent, normalizedContent)
608
+ : { content: normalizedContent, preservesPendingChanges: false };
609
+ const replacement = computeTextReplacement(currentContent, reconciliation.content);
610
+ const skipped = !replacement && !replaceCommentThreads;
611
+ if (!skipped) {
612
+ this.doc.transact(() => {
613
+ if (replacement?.deleteCount) {
614
+ ytext.delete(replacement.start, replacement.deleteCount);
588
615
  }
589
- populateCommentThreads(comments, commentThreads);
590
- }
591
- }, 'workspace-reconcile');
616
+ if (replacement?.insertText) {
617
+ ytext.insert(replacement.start, replacement.insertText);
618
+ }
619
+ if (replaceCommentThreads) {
620
+ if (comments.length > 0) {
621
+ comments.delete(0, comments.length);
622
+ }
623
+ populateCommentThreads(comments, commentThreads);
624
+ }
625
+ }, 'workspace-reconcile');
626
+ }
592
627
 
593
- this.resetContentBaseline();
628
+ if (reconciliation.preservesPendingChanges) {
629
+ this.persistedContentBaseline = normalizedContent;
630
+ this.refreshContentDirty();
631
+ this.schedulePersist();
632
+ } else {
633
+ this.resetContentBaseline();
634
+ }
594
635
  return {
595
636
  highlightRange: replacement
596
637
  ? {
@@ -599,6 +640,7 @@ export class CollaborationRoom {
599
640
  }
600
641
  : null,
601
642
  ok: true,
643
+ ...(skipped && { skipped: true }),
602
644
  };
603
645
  }
604
646
 
@@ -832,6 +874,47 @@ export class CollaborationRoom {
832
874
  return true;
833
875
  }
834
876
 
877
+ isHydrated() {
878
+ return this.hydrated;
879
+ }
880
+
881
+ readEditableContent() {
882
+ if (!this.hydrated || this.deleted || this.destroyed || isExcalidrawRoom(this.name)) {
883
+ return null;
884
+ }
885
+ return this.doc.getText('codemirror').toString();
886
+ }
887
+
888
+ applyExactTextChanges(changes, { origin = 'agent' } = {}) {
889
+ if (!this.hydrated || this.deleted || this.destroyed || isExcalidrawRoom(this.name)) {
890
+ throw new Error('The collaborative document is unavailable');
891
+ }
892
+ const ytext = this.doc.getText('codemirror');
893
+ this.doc.transact(() => {
894
+ for (let index = changes.length - 1; index >= 0; index -= 1) {
895
+ const change = changes[index];
896
+ if (change.to > change.from) {
897
+ ytext.delete(change.from, change.to - change.from);
898
+ }
899
+ if (change.insert) {
900
+ ytext.insert(change.from, change.insert);
901
+ }
902
+ }
903
+ }, origin);
904
+ return changes.length;
905
+ }
906
+
907
+ applyExcalidrawScene(scene, { origin = 'agent' } = {}) {
908
+ if (!this.hydrated || this.deleted || this.destroyed || !isExcalidrawRoom(this.name)) {
909
+ throw new Error('The collaborative Excalidraw document is unavailable');
910
+ }
911
+ let changed = false;
912
+ this.doc.transact(() => {
913
+ changed = applySceneDiffToExcalidrawRoom(this.doc, scene);
914
+ }, origin);
915
+ return changed;
916
+ }
917
+
835
918
  getPersistedContent() {
836
919
  if (isWorkspaceRoom(this.name)) {
837
920
  return null;
@@ -897,6 +980,19 @@ export class CollaborationRoom {
897
980
  break;
898
981
  }
899
982
 
983
+ case MSG_AGENT_FLUSH: {
984
+ const requestId = decoding.readVarString(decoder);
985
+ if (!requestId || requestId.length > 128) {
986
+ break;
987
+ }
988
+
989
+ const encoder = encoding.createEncoder();
990
+ encoding.writeVarUint(encoder, MSG_AGENT_FLUSH_ACK);
991
+ encoding.writeVarString(encoder, requestId);
992
+ sendMessage.call(this, ws, encoding.toUint8Array(encoder), this);
993
+ break;
994
+ }
995
+
900
996
  default:
901
997
  console.warn(`[room:${this.name}] Unsupported message type: ${messageType}`);
902
998
  }
@@ -1,2 +1,6 @@
1
1
  export const MSG_SYNC = 0;
2
2
  export const MSG_AWARENESS = 1;
3
+ export {
4
+ MSG_AGENT_FLUSH,
5
+ MSG_AGENT_FLUSH_ACK,
6
+ } from '../../../domain/collaboration-protocol.js';
@@ -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
 
@@ -730,6 +739,27 @@ export class HostedWorkspaceService {
730
739
  return { ok: true };
731
740
  }
732
741
 
742
+ async recordAgentConnectionEvent({ connection, type, user }) {
743
+ if (!this.enabled) return;
744
+ const access = await this.authorizeWorkspaceAccess({ user });
745
+ if (!access.ok) {
746
+ throw createHostedError(access.statusCode, access.body.error, access.body.code);
747
+ }
748
+ await this.store.createAuditEvent(createAuditEvent({
749
+ actor: access.membership,
750
+ metadata: {
751
+ clientKind: connection.clientKind,
752
+ connectionId: connection.id,
753
+ expiresAt: connection.expiresAt,
754
+ label: connection.label,
755
+ scopes: connection.scopes,
756
+ },
757
+ targetRole: access.membership.role,
758
+ timestamp: nowMs(),
759
+ type,
760
+ }));
761
+ }
762
+
733
763
  async listAuditEvents(user) {
734
764
  await this.requireAdmin(user);
735
765
  return (await this.store.listAuditEvents()).map(publicAuditEvent);
@@ -130,6 +130,18 @@ export function createReferenceTargetAliasMap(renamedEntries = []) {
130
130
 
131
131
  return aliases;
132
132
  }
133
+ export function collectMarkdownImageSources(markdownText = '') {
134
+ const sources = [];
135
+ String(markdownText ?? '').split('\n').forEach((line, lineIndex) => {
136
+ MARKDOWN_IMAGE_OPEN_RE.lastIndex = 0;
137
+ while (MARKDOWN_IMAGE_OPEN_RE.exec(line) !== null) {
138
+ const source = parseMarkdownImageDestination(line.slice(MARKDOWN_IMAGE_OPEN_RE.lastIndex));
139
+ if (source) sources.push({ line: lineIndex + 1, source });
140
+ }
141
+ });
142
+ return sources;
143
+ }
144
+
133
145
 
134
146
  export function collectMarkdownReferences(markdownText = '', {
135
147
  sourceFilePath = '',
@@ -139,7 +151,7 @@ export function collectMarkdownReferences(markdownText = '', {
139
151
  const references = [];
140
152
  const lines = String(markdownText ?? '').split('\n');
141
153
 
142
- for (const line of lines) {
154
+ for (const [lineIndex, line] of lines.entries()) {
143
155
  const context = line.trim();
144
156
 
145
157
  INTERNAL_LINK_RE.lastIndex = 0;
@@ -155,6 +167,7 @@ export function collectMarkdownReferences(markdownText = '', {
155
167
  references.push({
156
168
  context,
157
169
  isEmbed: Boolean(linkMatch[1]),
170
+ line: lineIndex + 1,
158
171
  rawTarget,
159
172
  rawTargetKey: normalizeReferenceTargetKey(rawTarget),
160
173
  resolvedPath,
@@ -176,6 +189,7 @@ export function collectMarkdownReferences(markdownText = '', {
176
189
  references.push({
177
190
  context,
178
191
  isEmbed: true,
192
+ line: lineIndex + 1,
179
193
  rawTarget,
180
194
  rawTargetKey: normalizeReferenceTargetKey(targetPath),
181
195
  resolvedPath,
@@ -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', {
@@ -146,9 +146,18 @@ export class GitService {
146
146
  };
147
147
  }
148
148
 
149
+ async stageAll() {
150
+ await this.commandRunner.execGit(['add', '-A', '--']);
151
+ this.invalidateStatusCache();
152
+ return {
153
+ ok: true,
154
+ workspaceChange: createEmptyWorkspaceChange(),
155
+ };
156
+ }
157
+
149
158
  async unstageFile(path) {
150
159
  const normalizedPath = normalizeRelativeGitPath(path);
151
- await this.commandRunner.execGit(['reset', 'HEAD', '--', normalizedPath]);
160
+ await this.commandRunner.execGit(['reset', '--', normalizedPath]);
152
161
  this.invalidateStatusCache();
153
162
  return {
154
163
  ok: true,
@@ -157,6 +166,15 @@ export class GitService {
157
166
  };
158
167
  }
159
168
 
169
+ async unstageAll() {
170
+ await this.commandRunner.execGit(['reset', '--']);
171
+ this.invalidateStatusCache();
172
+ return {
173
+ ok: true,
174
+ workspaceChange: createEmptyWorkspaceChange(),
175
+ };
176
+ }
177
+
160
178
  async commitStaged({ author = null, message } = {}) {
161
179
  const normalizedMessage = String(message ?? '').trim();
162
180
  if (!normalizedMessage) {
@@ -233,7 +233,7 @@ export class GitHistoryService {
233
233
  '-n',
234
234
  String(normalizedLimit + 1),
235
235
  '--follow',
236
- '--find-renames=20%',
236
+ '--find-renames',
237
237
  '--date=iso-strict',
238
238
  '--format=%x1e%H%x1f%h%x1f%s%x1f%an%x1f%ae%x1f%aI%x1f%P',
239
239
  '--',
@@ -0,0 +1,37 @@
1
+ import { execFile as execFileCallback } from 'node:child_process';
2
+ import { readFile, writeFile } from 'node:fs/promises';
3
+ import { resolve } from 'node:path';
4
+ import { promisify } from 'node:util';
5
+
6
+ const execFile = promisify(execFileCallback);
7
+
8
+ export async function ensureCollabMetadataGitExclude(vaultDir) {
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
+ }
18
+ let existingContent = '';
19
+
20
+ try {
21
+ existingContent = await readFile(excludePath, 'utf8');
22
+ } catch (error) {
23
+ if (error?.code !== 'ENOENT') {
24
+ throw error;
25
+ }
26
+ }
27
+
28
+ const lines = existingContent
29
+ .split(/\r?\n/u)
30
+ .map((line) => line.trim());
31
+ if (lines.includes('.collabmd') || lines.includes('.collabmd/')) {
32
+ return;
33
+ }
34
+
35
+ const prefix = existingContent && !existingContent.endsWith('\n') ? '\n' : '';
36
+ await writeFile(excludePath, `${existingContent}${prefix}.collabmd/\n`, 'utf8');
37
+ }