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
@@ -1,4 +1,3 @@
1
- import { vim } from '@replit/codemirror-vim';
2
1
  import { autocompletion, closeBrackets, closeBracketsKeymap } from '@codemirror/autocomplete';
3
2
  import {
4
3
  defaultKeymap,
@@ -50,6 +49,7 @@ import {
50
49
  isPlantUmlFilePath,
51
50
  isStructurizrFilePath,
52
51
  } from '../../domain/file-kind.js';
52
+ import { resolveExactTextChanges } from '../../domain/exact-text-edits.js';
53
53
  import { normalizeCommentQuote } from '../../domain/comment-threads.js';
54
54
  import { formatDocumentText } from '../domain/document-formatter.js';
55
55
  import { createMarkdownToolbarEdit } from '../domain/markdown-formatting.js';
@@ -59,8 +59,20 @@ import { plantUmlLanguage, plantUmlLanguageDescription } from '../domain/plantum
59
59
  import { structurizrLanguage, structurizrLanguageDescription } from '../domain/structurizr-language.js';
60
60
  import { handleImagePasteEvent } from './editor-paste-utils.js';
61
61
 
62
+ const MARKDOWN_CODE_LANGUAGE_ALIASES = new Set([
63
+ 'bash', 'c', 'c++', 'cpp', 'css', 'diff', 'html', 'java', 'javascript', 'js',
64
+ 'json', 'jsx', 'markdown', 'md', 'python', 'py', 'rust', 'sh', 'shell', 'sql',
65
+ 'ts', 'tsx', 'typescript', 'xml', 'yaml', 'yml',
66
+ ]);
67
+
68
+ function isMarkdownCodeLanguage(language) {
69
+ const names = [language.name, ...(language.alias || [])]
70
+ .map((value) => String(value).toLowerCase());
71
+ return names.some((name) => MARKDOWN_CODE_LANGUAGE_ALIASES.has(name));
72
+ }
73
+
62
74
  const markdownCodeLanguages = [
63
- ...languages,
75
+ ...languages.filter(isMarkdownCodeLanguage),
64
76
  mermaidLanguageDescription,
65
77
  plantUmlLanguageDescription,
66
78
  structurizrLanguageDescription,
@@ -500,7 +512,7 @@ export class EditorViewAdapter {
500
512
  highlightActiveLine(),
501
513
  highlightSelectionMatches(),
502
514
  createSearchNavigationListener(),
503
- this.vimModeCompartment.of(!readOnly && this.vimModeEnabled ? vim({ status: true }) : []),
515
+ this.vimModeCompartment.of([]),
504
516
  keymap.of([
505
517
  ...closeBracketsKeymap,
506
518
  ...defaultKeymap,
@@ -584,6 +596,10 @@ export class EditorViewAdapter {
584
596
  this.onSelectionChanged?.(this.editorView.state);
585
597
  this.emitViewportChange();
586
598
 
599
+ if (this.vimModeEnabled && editorMode !== 'provisional') {
600
+ void this.applyVimExtension();
601
+ }
602
+
587
603
  if (preserveScrollTop > 0) {
588
604
  requestAnimationFrame(() => {
589
605
  if (this.editorView?.scrollDOM) {
@@ -675,6 +691,21 @@ export class EditorViewAdapter {
675
691
  return this.vimModeEnabled;
676
692
  }
677
693
 
694
+ async applyVimExtension() {
695
+ if (!this.vimModeEnabled || !this.editorView || this.editorView.state.readOnly) {
696
+ return;
697
+ }
698
+
699
+ const { vim } = await import('@replit/codemirror-vim');
700
+ if (!this.vimModeEnabled || !this.editorView || this.editorView.state.readOnly) {
701
+ return;
702
+ }
703
+
704
+ this.editorView.dispatch({
705
+ effects: this.vimModeCompartment.reconfigure(vim({ status: true })),
706
+ });
707
+ }
708
+
678
709
  setVimMode(enabled) {
679
710
  const nextEnabled = Boolean(enabled);
680
711
  if (nextEnabled === this.vimModeEnabled) {
@@ -686,12 +717,17 @@ export class EditorViewAdapter {
686
717
  return nextEnabled;
687
718
  }
688
719
 
689
- this.editorView.dispatch({
690
- effects: this.vimModeCompartment.reconfigure(
691
- nextEnabled ? vim({ status: true }) : [],
692
- ),
720
+ if (!nextEnabled) {
721
+ this.editorView.dispatch({
722
+ effects: this.vimModeCompartment.reconfigure([]),
723
+ });
724
+ this.editorView.focus();
725
+ return nextEnabled;
726
+ }
727
+
728
+ void this.applyVimExtension().then(() => {
729
+ this.editorView?.focus();
693
730
  });
694
- this.editorView.focus();
695
731
  return nextEnabled;
696
732
  }
697
733
 
@@ -1143,6 +1179,18 @@ export class EditorViewAdapter {
1143
1179
  return true;
1144
1180
  }
1145
1181
 
1182
+ applyTextReplacements(replacements) {
1183
+ if (!this.editorView) {
1184
+ throw new Error('The editor is not available');
1185
+ }
1186
+
1187
+ const { state } = this.editorView;
1188
+ const changes = resolveExactTextChanges(state.doc.toString(), replacements);
1189
+
1190
+ this.editorView.dispatch({ changes, userEvent: 'input' });
1191
+ return changes.length;
1192
+ }
1193
+
1146
1194
  replaceText(text) {
1147
1195
  if (!this.editorView) {
1148
1196
  return false;
@@ -1,5 +1,7 @@
1
1
  import { Doc } from 'yjs';
2
2
  import { WebsocketProvider } from 'y-websocket';
3
+ import * as decoding from 'lib0/decoding';
4
+ import * as encoding from 'lib0/encoding';
3
5
  import {
4
6
  EXCALIDRAW_APP_STATE_KEY,
5
7
  EXCALIDRAW_ELEMENTS_KEY,
@@ -9,9 +11,14 @@ import {
9
11
  buildExcalidrawRoomScene,
10
12
  ensureExcalidrawRoomSchema,
11
13
  isExcalidrawRoomDocStructured,
14
+ readExcalidrawReplaceGeneration,
12
15
  readLegacyExcalidrawRoomScene,
13
16
  replaceExcalidrawRoomScene,
14
17
  } from '../../domain/excalidraw-room-codec.js';
18
+ import {
19
+ MSG_AGENT_FLUSH,
20
+ MSG_AGENT_FLUSH_ACK,
21
+ } from '../../domain/collaboration-protocol.js';
15
22
 
16
23
  import {
17
24
  buildCollaboratorsMap,
@@ -33,6 +40,7 @@ import { stopReconnectOnControlledClose } from './yjs-provider-reset-guard.js';
33
40
  const DEFAULT_EMPTY_SCENE_GUARD_MS = 250;
34
41
  const DEFAULT_SAVE_THROTTLE_MS = 48;
35
42
  const DEFAULT_SYNC_TIMEOUT_MS = 4000;
43
+ const DEFAULT_AGENT_FLUSH_TIMEOUT_MS = 1000;
36
44
 
37
45
  export const EXCALIDRAW_ROOM_CONNECTION_STATE = Object.freeze({
38
46
  AUTHORITATIVE: 'authoritative',
@@ -167,6 +175,7 @@ export class ExcalidrawRoomClient {
167
175
  this.handleProviderSync = null;
168
176
  this.handleProviderStatus = null;
169
177
  this.lastSceneJson = '';
178
+ this.lastReplaceGeneration = null;
170
179
  this.sceneSyncTimer = null;
171
180
  this.sceneSyncDueAt = 0;
172
181
  this.lastSceneSyncAt = 0;
@@ -178,6 +187,8 @@ export class ExcalidrawRoomClient {
178
187
  this.lastViewportSignature = '';
179
188
  this.lastSelectedIdsSignature = '';
180
189
  this.pendingEmptySceneCandidate = null;
190
+ this.agentFlushRequestCounter = 0;
191
+ this.pendingAgentFlushRequests = new Map();
181
192
  this.structuredObserversAttached = false;
182
193
  this.canWriteToRoom = false;
183
194
  this.waitingForAuthoritativeSync = false;
@@ -208,6 +219,11 @@ export class ExcalidrawRoomClient {
208
219
  return;
209
220
  }
210
221
 
222
+ const prevReplaceGeneration = this.lastReplaceGeneration;
223
+ this.lastReplaceGeneration = readExcalidrawReplaceGeneration(this.ydoc);
224
+ const authoritative = prevReplaceGeneration !== null
225
+ && this.lastReplaceGeneration > prevReplaceGeneration;
226
+
211
227
  const remoteJson = this.getStructuredSceneJson();
212
228
  if (!remoteJson || remoteJson === this.lastSceneJson) {
213
229
  return;
@@ -215,7 +231,7 @@ export class ExcalidrawRoomClient {
215
231
 
216
232
  this.pendingEmptySceneCandidate = null;
217
233
  this.lastSceneJson = JSON.stringify(parseSceneJson(remoteJson));
218
- this.onRemoteSceneJson(this.lastSceneJson);
234
+ this.onRemoteSceneJson(this.lastSceneJson, { authoritative });
219
235
  };
220
236
  }
221
237
 
@@ -250,6 +266,74 @@ export class ExcalidrawRoomClient {
250
266
  return this.connectionState;
251
267
  }
252
268
 
269
+ installAgentFlushHandler() {
270
+ const messageHandlers = this.provider?.messageHandlers;
271
+ if (!messageHandlers || typeof messageHandlers !== 'object') {
272
+ return false;
273
+ }
274
+
275
+ messageHandlers[MSG_AGENT_FLUSH_ACK] = (_encoder, decoder) => {
276
+ let requestId;
277
+ try {
278
+ requestId = decoding.readVarString(decoder);
279
+ } catch {
280
+ return;
281
+ }
282
+
283
+ const request = this.pendingAgentFlushRequests.get(requestId);
284
+ if (!request) {
285
+ return;
286
+ }
287
+
288
+ request.resolve({ status: 'acknowledged' });
289
+ };
290
+ return true;
291
+ }
292
+
293
+ settleAgentFlushRequests(status) {
294
+ const requests = [...this.pendingAgentFlushRequests.values()];
295
+ requests.forEach((request) => request.resolve({ status }));
296
+ }
297
+
298
+ waitForServerFlush({ timeoutMs = DEFAULT_AGENT_FLUSH_TIMEOUT_MS } = {}) {
299
+ const ws = this.provider?.ws;
300
+ const openState = ws?.OPEN ?? globalThis.WebSocket?.OPEN ?? 1;
301
+ if (
302
+ !this.canWriteToRoom
303
+ || !ws
304
+ || ws.readyState !== openState
305
+ || !this.provider?.messageHandlers?.[MSG_AGENT_FLUSH_ACK]
306
+ ) {
307
+ return Promise.resolve({ status: 'unavailable' });
308
+ }
309
+
310
+ const requestId = `agent-flush-${this.ydoc?.clientID ?? 'client'}-${++this.agentFlushRequestCounter}`;
311
+ return new Promise((resolve) => {
312
+ const finish = (result) => {
313
+ const request = this.pendingAgentFlushRequests.get(requestId);
314
+ if (!request) {
315
+ return;
316
+ }
317
+ this.clearTimeoutFn(request.timeoutId);
318
+ this.pendingAgentFlushRequests.delete(requestId);
319
+ resolve(result);
320
+ };
321
+ this.pendingAgentFlushRequests.set(requestId, {
322
+ resolve: finish,
323
+ timeoutId: this.setTimeoutFn(() => finish({ status: 'timeout' }), timeoutMs),
324
+ });
325
+
326
+ try {
327
+ const encoder = encoding.createEncoder();
328
+ encoding.writeVarUint(encoder, MSG_AGENT_FLUSH);
329
+ encoding.writeVarString(encoder, requestId);
330
+ ws.send(encoding.toUint8Array(encoder));
331
+ } catch {
332
+ finish({ status: 'unavailable' });
333
+ }
334
+ });
335
+ }
336
+
253
337
  hasPendingWrites() {
254
338
  return Boolean(this.pendingSceneSyncPayload);
255
339
  }
@@ -368,6 +452,7 @@ export class ExcalidrawRoomClient {
368
452
  disableBc: true,
369
453
  maxBackoffTime: 5000,
370
454
  });
455
+ this.installAgentFlushHandler();
371
456
  stopReconnectOnControlledClose(this.provider);
372
457
 
373
458
  this.awareness = this.provider.awareness;
@@ -636,7 +721,7 @@ export class ExcalidrawRoomClient {
636
721
  }
637
722
 
638
723
  scheduleSceneSync(elements, appState, files) {
639
- if (!this.canWriteToRoom) {
724
+ if (!this.canWriteToRoom || this.isApplyingSharedSnapshot()) {
640
725
  return false;
641
726
  }
642
727
 
@@ -933,6 +1018,7 @@ export class ExcalidrawRoomClient {
933
1018
 
934
1019
  disconnect() {
935
1020
  this.flushSceneSync();
1021
+ this.settleAgentFlushRequests('disconnected');
936
1022
  this.setConnectionState(EXCALIDRAW_ROOM_CONNECTION_STATE.DISCONNECTING);
937
1023
  this.clearTimeoutFn(this.sceneSyncTimer);
938
1024
  this.sceneSyncTimer = null;
@@ -992,5 +1078,6 @@ export class ExcalidrawRoomClient {
992
1078
  this.setConnectionState(EXCALIDRAW_ROOM_CONNECTION_STATE.CLOSED);
993
1079
  this.applyingSharedSnapshotDepth = 0;
994
1080
  this.suppressStructuredSceneUpdateDepth = 0;
1081
+ this.lastReplaceGeneration = null;
995
1082
  }
996
1083
  }
@@ -13,28 +13,37 @@ function createSearchParams(values = {}) {
13
13
  return params;
14
14
  }
15
15
 
16
- export class GitApiClient {
16
+ async function postJson(path, payload, { fallbackError, requestId = null } = {}) {
17
+ const response = await fetch(resolveApiUrl(path), {
18
+ body: JSON.stringify(payload),
19
+ headers: createRequestHeaders(requestId, { 'Content-Type': 'application/json' }),
20
+ method: 'POST',
21
+ });
22
+ return parseApiResponse(response, fallbackError);
23
+ }
24
+
25
+ export const gitApiClient = {
17
26
  async readStatus({ force = false } = {}) {
18
27
  const response = await fetch(resolveApiUrl(`/git/status${force ? '?force=true' : ''}`));
19
28
  return parseApiResponse(response, 'Failed to load git status');
20
- }
29
+ },
21
30
 
22
31
  async readPullBackups() {
23
32
  const response = await fetch(resolveApiUrl('/git/pull-backups'));
24
33
  return parseApiResponse(response, 'Failed to load pull backups');
25
- }
34
+ },
26
35
 
27
36
  async readHistory({ limit, offset } = {}) {
28
37
  const params = createSearchParams({ limit, offset });
29
38
  const response = await fetch(resolveApiUrl(`/git/history?${params.toString()}`));
30
39
  return parseApiResponse(response, 'Failed to load git history');
31
- }
40
+ },
32
41
 
33
42
  async readFileHistory({ path, limit, offset } = {}) {
34
43
  const params = createSearchParams({ limit, offset, path });
35
44
  const response = await fetch(resolveApiUrl(`/git/file-history?${params.toString()}`));
36
45
  return parseApiResponse(response, 'Failed to load file history');
37
- }
46
+ },
38
47
 
39
48
  async readDiff({
40
49
  allowLargePatch = false,
@@ -50,7 +59,7 @@ export class GitApiClient {
50
59
  });
51
60
  const response = await fetch(resolveApiUrl(`/git/diff?${params.toString()}`));
52
61
  return parseApiResponse(response, 'Failed to load git diff');
53
- }
62
+ },
54
63
 
55
64
  async readCommit({
56
65
  allowLargePatch = false,
@@ -66,51 +75,48 @@ export class GitApiClient {
66
75
  });
67
76
  const response = await fetch(resolveApiUrl(`/git/commit?${params.toString()}`));
68
77
  return parseApiResponse(response, 'Failed to load git commit');
69
- }
78
+ },
70
79
 
71
80
  async readFileSnapshot({ hash, path } = {}) {
72
81
  const params = createSearchParams({ hash, path });
73
82
  const response = await fetch(resolveApiUrl(`/git/file-snapshot?${params.toString()}`));
74
83
  return parseApiResponse(response, 'Failed to load historical file preview');
75
- }
84
+ },
76
85
 
77
86
  getFileAttachmentUrl({ hash, path } = {}) {
78
87
  const params = createSearchParams({ hash, path });
79
88
  return resolveApiUrl(`/git/file-attachment?${params.toString()}`);
80
- }
89
+ },
81
90
 
82
91
  async stageFile({ path, requestId = null } = {}) {
83
- return this.#postJson('/git/stage', { path }, { requestId, fallbackError: 'Failed to stage file' });
84
- }
92
+ return postJson('/git/stage', { path }, { requestId, fallbackError: 'Failed to stage file' });
93
+ },
85
94
 
86
95
  async unstageFile({ path, requestId = null } = {}) {
87
- return this.#postJson('/git/unstage', { path }, { requestId, fallbackError: 'Failed to unstage file' });
88
- }
96
+ return postJson('/git/unstage', { path }, { requestId, fallbackError: 'Failed to unstage file' });
97
+ },
98
+
99
+ async stageAll({ requestId = null } = {}) {
100
+ return postJson('/git/stage-all', {}, { requestId, fallbackError: 'Failed to stage all changes' });
101
+ },
102
+
103
+ async unstageAll({ requestId = null } = {}) {
104
+ return postJson('/git/unstage-all', {}, { requestId, fallbackError: 'Failed to unstage all changes' });
105
+ },
89
106
 
90
107
  async pushBranch({ requestId = null } = {}) {
91
- return this.#postJson('/git/push', {}, { requestId, fallbackError: 'Failed to push branch' });
92
- }
108
+ return postJson('/git/push', {}, { requestId, fallbackError: 'Failed to push branch' });
109
+ },
93
110
 
94
111
  async pullBranch({ requestId = null } = {}) {
95
- return this.#postJson('/git/pull', {}, { requestId, fallbackError: 'Failed to pull branch' });
96
- }
112
+ return postJson('/git/pull', {}, { requestId, fallbackError: 'Failed to pull branch' });
113
+ },
97
114
 
98
115
  async resetFile({ path, requestId = null } = {}) {
99
- return this.#postJson('/git/reset-file', { path }, { requestId, fallbackError: 'Failed to reset file' });
100
- }
116
+ return postJson('/git/reset-file', { path }, { requestId, fallbackError: 'Failed to reset file' });
117
+ },
101
118
 
102
119
  async commit({ message, requestId = null } = {}) {
103
- return this.#postJson('/git/commit', { message }, { requestId, fallbackError: 'Failed to commit staged changes' });
104
- }
105
-
106
- async #postJson(path, payload, { fallbackError, requestId = null } = {}) {
107
- const response = await fetch(resolveApiUrl(path), {
108
- body: JSON.stringify(payload),
109
- headers: createRequestHeaders(requestId, { 'Content-Type': 'application/json' }),
110
- method: 'POST',
111
- });
112
- return parseApiResponse(response, fallbackError);
113
- }
114
- }
115
-
116
- export const gitApiClient = new GitApiClient();
120
+ return postJson('/git/commit', { message }, { requestId, fallbackError: 'Failed to commit staged changes' });
121
+ },
122
+ };
@@ -0,0 +1,60 @@
1
+ import { resolveApiUrl } from '../domain/runtime-paths.js';
2
+ import { parseApiResponse } from './api-client-utils.js';
3
+
4
+ function request(path, { body = null, fallback = 'Request failed', method = 'GET' } = {}) {
5
+ return fetch(resolveApiUrl(path), {
6
+ ...(body === null ? {} : { body: JSON.stringify(body) }),
7
+ headers: { 'Content-Type': 'application/json' },
8
+ method,
9
+ }).then((response) => parseApiResponse(response, fallback));
10
+ }
11
+
12
+ export const hostedApiClient = {
13
+ acceptInvitation() {
14
+ return request('/hosted/invitations/accept', { fallback: 'Failed to accept invitation', method: 'POST' });
15
+ },
16
+
17
+ claimWorkspace({ teamName, token }) {
18
+ return request('/hosted/claim', { body: { teamName, token }, fallback: 'Failed to claim workspace', method: 'POST' });
19
+ },
20
+
21
+ completeSetup() {
22
+ return request('/hosted/setup/complete', { fallback: 'Failed to complete setup', method: 'POST' });
23
+ },
24
+
25
+ createInvitation({ email, role }) {
26
+ return request('/hosted/invitations', { body: { email, role }, fallback: 'Failed to create invitation', method: 'POST' });
27
+ },
28
+
29
+ getStatus() {
30
+ return request('/hosted/status', { fallback: 'Failed to load workspace status' });
31
+ },
32
+
33
+ listAuditEvents() {
34
+ return request('/hosted/audit', { fallback: 'Failed to load access history' });
35
+ },
36
+
37
+ listInvitations() {
38
+ return request('/hosted/invitations', { fallback: 'Failed to load invitations' });
39
+ },
40
+
41
+ listMemberships() {
42
+ return request('/hosted/memberships', { fallback: 'Failed to load collaborators' });
43
+ },
44
+
45
+ removeMembership(membershipId) {
46
+ return request(`/hosted/memberships/${encodeURIComponent(membershipId)}`, { fallback: 'Failed to remove collaborator', method: 'DELETE' });
47
+ },
48
+
49
+ revokeInvitation(invitationId) {
50
+ return request(`/hosted/invitations/${encodeURIComponent(invitationId)}`, { fallback: 'Failed to revoke invitation', method: 'DELETE' });
51
+ },
52
+
53
+ updateInvitationRole(invitationId, role) {
54
+ return request(`/hosted/invitations/${encodeURIComponent(invitationId)}`, { body: { role }, fallback: 'Failed to update invitation', method: 'PATCH' });
55
+ },
56
+
57
+ updateMembershipRole(membershipId, role) {
58
+ return request(`/hosted/memberships/${encodeURIComponent(membershipId)}`, { body: { role }, fallback: 'Failed to update role', method: 'PATCH' });
59
+ },
60
+ };
@@ -2,12 +2,12 @@ import { WebsocketProvider } from 'y-websocket';
2
2
  import * as Y from 'yjs';
3
3
 
4
4
  import { createRandomUser } from '../domain/room.js';
5
+ import { LOBBY_CHAT_MAX_MESSAGES, LOBBY_CHAT_MESSAGE_MAX_LENGTH } from '../domain/lobby-chat.js';
5
6
  import { resolveWsBaseUrl } from './runtime-config.js';
6
7
  import { stopReconnectOnControlledClose } from './yjs-provider-reset-guard.js';
7
8
 
8
9
  const LOBBY_ROOM_NAME = '__lobby__';
9
- export const LOBBY_CHAT_MESSAGE_MAX_LENGTH = 280;
10
- export const LOBBY_CHAT_MAX_MESSAGES = 40;
10
+
11
11
 
12
12
  function normalizeChatMessage(value) {
13
13
  const normalized = String(value ?? '')
@@ -19,11 +19,8 @@ function normalizeChatMessage(value) {
19
19
  }
20
20
 
21
21
  function createLobbyMessageId(peerId) {
22
- if (globalThis.crypto?.randomUUID) {
23
- return globalThis.crypto.randomUUID();
24
- }
25
-
26
- return `${peerId || 'user'}-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
22
+ return globalThis.crypto?.randomUUID?.()
23
+ ?? `${peerId || 'user'}-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
27
24
  }
28
25
 
29
26
  function normalizeWorkspaceEvent(event) {
@@ -1,9 +1,11 @@
1
1
  import {
2
+ getActiveVaultId,
2
3
  getClientRuntimeConfig,
3
4
  resolveApiUrl,
4
5
  resolveAppPath,
5
6
  resolveAppUrl,
6
7
  resolveWsBaseUrl,
8
+ setActiveVaultId,
7
9
  } from '../domain/runtime-paths.js';
8
10
  import {
9
11
  createFileRouteHash,
@@ -16,7 +18,7 @@ export function getRuntimeConfig() {
16
18
  return getClientRuntimeConfig();
17
19
  }
18
20
 
19
- export { resolveApiUrl, resolveAppPath, resolveAppUrl, resolveWsBaseUrl };
21
+ export { getActiveVaultId, resolveApiUrl, resolveAppPath, resolveAppUrl, resolveWsBaseUrl, setActiveVaultId };
20
22
  export { createFileRouteHash, isCollabMdHashRoute };
21
23
 
22
24
  function getHashParams() {
@@ -74,7 +76,7 @@ export function getHashRoute() {
74
76
  }
75
77
 
76
78
  if (params.has(HASH_ROUTE_KEYS.file)) {
77
- return {
79
+ const route = {
78
80
  anchor: params.get('anchor') || null,
79
81
  column: params.has('column') ? Number(params.get('column')) || null : null,
80
82
  drawioMode: params.get('drawio') || null,
@@ -83,6 +85,12 @@ export function getHashRoute() {
83
85
  matchLength: params.has('matchLength') ? Number(params.get('matchLength')) || null : null,
84
86
  type: 'file',
85
87
  };
88
+ const elementId = params.get('element') || '';
89
+ if (elementId) {
90
+ route.elementId = elementId;
91
+ route.elementType = params.get('elementType') === 'group' ? 'group' : 'element';
92
+ }
93
+ return route;
86
94
  }
87
95
 
88
96
  return { type: 'empty' };
@@ -92,6 +100,8 @@ export function navigateToFile(filePath, {
92
100
  anchor = null,
93
101
  column = null,
94
102
  drawioMode = null,
103
+ elementId = null,
104
+ elementType = null,
95
105
  line = null,
96
106
  matchLength = null,
97
107
  } = {}) {
@@ -99,6 +109,8 @@ export function navigateToFile(filePath, {
99
109
  anchor,
100
110
  column,
101
111
  drawioMode,
112
+ elementId,
113
+ elementType,
102
114
  line,
103
115
  matchLength,
104
116
  });
@@ -8,11 +8,8 @@ function now() {
8
8
  }
9
9
 
10
10
  function createTabId() {
11
- if (globalThis.crypto?.randomUUID) {
12
- return globalThis.crypto.randomUUID();
13
- }
14
-
15
- return `tab-${now()}-${Math.random().toString(36).slice(2, 10)}`;
11
+ return globalThis.crypto?.randomUUID?.()
12
+ ?? `tab-${now()}-${Math.random().toString(36).slice(2, 10)}`;
16
13
  }
17
14
 
18
15
  function safeJsonParse(value) {