collabmd 0.1.49 → 0.1.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (400) hide show
  1. package/README.md +10 -659
  2. package/bin/collabmd.js +36 -20
  3. package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-Crf9Y3Q6.js +1 -0
  4. package/dist/client/assets/{abnfDiagram-VCTEODGH-CdVZqicp.js → abnfDiagram-VCTEODGH-PuinKbSQ.js} +1 -1
  5. package/dist/client/assets/ar-SA-5WIASEJP-Di7OimCN.js +10 -0
  6. package/dist/client/assets/{architectureDiagram-5GKGNRK7-wUo0bXif.js → architectureDiagram-5GKGNRK7-46hPkrZv.js} +1 -1
  7. package/dist/client/assets/az-AZ-V5EUQD6C-C19OGTT_.js +1 -0
  8. package/dist/client/assets/bg-BG-EXASCMTR-BIt0xWyb.js +5 -0
  9. package/dist/client/assets/{blockDiagram-I7D4REHJ-BRSK3m49.js → blockDiagram-I7D4REHJ-C1S5Bzf8.js} +1 -1
  10. package/dist/client/assets/bn-BD-U4SYNFCO-CdNaPy4Q.js +3 -0
  11. package/dist/client/assets/bn-IN-HKDJIITE-CdNaPy4Q.js +3 -0
  12. package/dist/client/assets/{browser-BKLM0ThC-IxjwuOIz-BBqQnUEb.js → browser-BKLM0ThC-IxjwuOIz-DyJcVMFR.js} +1 -1
  13. package/dist/client/assets/{c4Diagram-7LVT6UL2-yD2poxqw.js → c4Diagram-7LVT6UL2-VAk1HPmz.js} +1 -1
  14. package/dist/client/assets/ca-ES-2KGUU5XB-C9t-c0cH.js +8 -0
  15. package/dist/client/assets/channel-jwdhnPiV.js +1 -0
  16. package/dist/client/assets/chunk-2E4U76K2-Ba8Wf22k.js +1 -0
  17. package/dist/client/assets/{chunk-4HAMMTFA-DStbIfJ1.js → chunk-4HAMMTFA-Ht-73lsT.js} +1 -1
  18. package/dist/client/assets/chunk-5XKZK2GL-D4UAZSOJ.js +1 -0
  19. package/dist/client/assets/{chunk-75Z2AOVW-C5pGd3W9.js → chunk-75Z2AOVW-B2cZexqK.js} +1 -1
  20. package/dist/client/assets/{chunk-CLGD4ZFX-BMeArk03.js → chunk-CLGD4ZFX-Cmtx89ht.js} +1 -1
  21. package/dist/client/assets/{chunk-DU6HZSFF-Zkp69c6c.js → chunk-DU6HZSFF-C6d6PJfE.js} +1 -1
  22. package/dist/client/assets/{chunk-F27PBJKO-D4xNct1r.js → chunk-F27PBJKO-Dg3H6KLL.js} +1 -1
  23. package/dist/client/assets/{chunk-GMAD6QVW-NZ6WpDb8.js → chunk-GMAD6QVW-DUfjx_d5.js} +1 -1
  24. package/dist/client/assets/{chunk-GVQU2GXP-D8SDprfX.js → chunk-GVQU2GXP-D1l7oRGR.js} +1 -1
  25. package/dist/client/assets/{chunk-IMKFNOWR-D8jEuU3Q.js → chunk-IMKFNOWR-3F6NhHUP.js} +1 -1
  26. package/dist/client/assets/{chunk-L3NEJ4N5-aijKP-eh.js → chunk-L3NEJ4N5-BmCVn4y-.js} +1 -1
  27. package/dist/client/assets/{chunk-OSK3NFVY-CCbLQAMa.js → chunk-OSK3NFVY-CWHXAmfx.js} +1 -1
  28. package/dist/client/assets/{chunk-P2QGCYS3-Oag_FdCq.js → chunk-P2QGCYS3-Du8EtwOa.js} +1 -1
  29. package/dist/client/assets/{chunk-POPQ4Y6H-CYnpIgXT.js → chunk-POPQ4Y6H-B5yJIrZE.js} +1 -1
  30. package/dist/client/assets/{chunk-PWAF6VOD-JSNrcBmP.js → chunk-PWAF6VOD-B3gML4ps.js} +1 -1
  31. package/dist/client/assets/{chunk-SHT3W25Y-BiQGljao.js → chunk-SHT3W25Y-BKaI8jZO.js} +1 -1
  32. package/dist/client/assets/{chunk-SVP7TREG-DB485R5x.js → chunk-SVP7TREG-XlsB_ZMZ.js} +1 -1
  33. package/dist/client/assets/{chunk-TICWLB2K-8rAVvoS3.js → chunk-TICWLB2K-Cpp2z8yK.js} +1 -1
  34. package/dist/client/assets/chunk-TLUHSLCS-Yl7B0Vrz.js +1 -0
  35. package/dist/client/assets/chunk-ZNVOA63L-BmCQjhx-.js +40 -0
  36. package/dist/client/assets/{chunk-FLYJHZSQ-Be7lKF17.js → chunk-ZPMXAHWN-Dt0TxJa6.js} +2 -2
  37. package/dist/client/assets/classDiagram-ZZMXUADV-BRw9vo8U.js +1 -0
  38. package/dist/client/assets/classDiagram-v2-VYDZK3BY-BRw9vo8U.js +1 -0
  39. package/dist/client/assets/comment-markdown-renderer-B9_vPc3F.js +1 -0
  40. package/dist/client/assets/comment-thread-store-NNHqRVsX.js +1 -0
  41. package/dist/client/assets/comment-threads-nJhK1yfc.js +4 -0
  42. package/dist/client/assets/cs-CZ-VUCGPRML-BfCoYAgj.js +7 -0
  43. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-rTz9RhFH.js → cynefinDiagram-5FMLGOSQ-BRoCEoZM.js} +1 -1
  44. package/dist/client/assets/da-DK-NNDP2IVP-DBw9ZNTR.js +2 -0
  45. package/dist/client/assets/{dagre-GXQ25YYZ-Cr67wLpQ.js → dagre-GXQ25YYZ-BSfKCfy7.js} +1 -1
  46. package/dist/client/assets/de-CH-I7RAVIZN-DYW18Vsr.js +11 -0
  47. package/dist/client/assets/de-DE-WBQ3DQLR-DYW18Vsr.js +11 -0
  48. package/dist/client/assets/deferred-collab-rBe4nuQ2.css +1 -0
  49. package/dist/client/assets/deferred-git-BHKtkFYi.css +1 -0
  50. package/dist/client/assets/deferred-preview-pe7Iwwx3.css +1 -0
  51. package/dist/client/assets/{diagram-S7CK7UJ4-DywERe__.js → diagram-S7CK7UJ4-D7KaM9yj.js} +1 -1
  52. package/dist/client/assets/{diagram-UQ7AKVKN-CNYlXtu4.js → diagram-UQ7AKVKN-JevUZuYi.js} +1 -1
  53. package/dist/client/assets/{diagram-VSXAHHWV-0H1a61Bn.js → diagram-VSXAHHWV-B3-U-Q2E.js} +1 -1
  54. package/dist/client/assets/{diagram-VX7I27RA-CsJbsx5F.js → diagram-VX7I27RA-pSD4HMh1.js} +1 -1
  55. package/dist/client/assets/{diagram-Z3DM3KII-D0mLxEgI.js → diagram-Z3DM3KII-D8r1_CIb.js} +1 -1
  56. package/dist/client/assets/{direct-engine-DdrQKpgq-CtKfQzCt.js → direct-engine-DdrQKpgq-B5zIoeQw.js} +1 -1
  57. package/dist/client/assets/dist-B3HdUPsK.js +1 -0
  58. package/dist/client/assets/{dist-Tw-Fxpeb.js → dist-B7XMN9AT.js} +1 -1
  59. package/dist/client/assets/dist-BIRygGYH.js +1 -0
  60. package/dist/client/assets/dist-BPyOlNLY.js +2 -0
  61. package/dist/client/assets/{dist-D5wCC32z.js → dist-BR81yxMt.js} +1 -1
  62. package/dist/client/assets/{dist-TW8iFRyW.js → dist-B_B4XLmq.js} +1 -1
  63. package/dist/client/assets/dist-Bdy9ZRzd.js +9 -0
  64. package/dist/client/assets/{dist-netZOQtD.js → dist-Bfxzlnrf.js} +1 -1
  65. package/dist/client/assets/{dist-DzNmC81X.js → dist-Bx3QkS-3.js} +1 -1
  66. package/dist/client/assets/{dist-mj2Ht75J.js → dist-By7ieqAf.js} +1 -1
  67. package/dist/client/assets/dist-ByhQbe-x.js +1 -0
  68. package/dist/client/assets/{dist-CdmKGRGr.js → dist-BzFSJM0U.js} +1 -1
  69. package/dist/client/assets/dist-C5NkYKAa.js +1 -0
  70. package/dist/client/assets/{dist-D3fehAZ2.js → dist-CELhfKzh.js} +1 -1
  71. package/dist/client/assets/dist-CEirJSxk.js +1 -0
  72. package/dist/client/assets/dist-CO0-4CuV.js +39 -0
  73. package/dist/client/assets/dist-CRnJ0D9h.js +1 -0
  74. package/dist/client/assets/{dist-GvvCNBe4.js → dist-CbDyXgCo.js} +1 -1
  75. package/dist/client/assets/{dist-BeajGMhO.js → dist-CqXVyYoH.js} +1 -1
  76. package/dist/client/assets/{dist-LQ4kDCKz.js → dist-CrWzIWEE.js} +1 -1
  77. package/dist/client/assets/dist-CyNrloSI.js +1 -0
  78. package/dist/client/assets/dist-D60_kdpQ.js +1 -0
  79. package/dist/client/assets/{dist-DuH3ZrHo.js → dist-DCpIH3-_.js} +1 -1
  80. package/dist/client/assets/{dist-BPHLJ09L.js → dist-DJAMplZI.js} +2 -2
  81. package/dist/client/assets/{dist-DGEbEfw4.js → dist-DVXzbeDx.js} +1 -1
  82. package/dist/client/assets/{dist-C5NgpdG5.js → dist-Drv_wZYC.js} +1 -1
  83. package/dist/client/assets/{dist-DVy5woUy.js → dist-EWJYvBK1.js} +1 -1
  84. package/dist/client/assets/dist-Hdhj3L3t.js +1 -0
  85. package/dist/client/assets/{dist-DpYDHR9p.js → dist-gRRhmB-2.js} +3 -3
  86. package/dist/client/assets/dist-kWb2d1CH.js +1 -0
  87. package/dist/client/assets/dist-kiD2GIsD.js +13 -0
  88. package/dist/client/assets/{dist-JaU3aRlD.js → dist-l-56SowH.js} +1 -1
  89. package/dist/client/assets/{dist-BK9QvQrc.js → dist-nxQErAaK.js} +2 -2
  90. package/dist/client/assets/dist-sLzRQQk7.js +1 -0
  91. package/dist/client/assets/document-formatter-Qdiq9uJs.js +1 -0
  92. package/dist/client/assets/drawioEditor-CHf1vtdQ.js +9 -0
  93. package/dist/client/assets/{ebnfDiagram-PWID7BFC-HeTxHpCU.js → ebnfDiagram-PWID7BFC-UJ0Fz5ci.js} +1 -1
  94. package/dist/client/assets/editor-session-4Bn81iWm.js +14 -0
  95. package/dist/client/assets/el-GR-TYQHVGXW-Dx82YYAS.js +7 -0
  96. package/dist/client/assets/embedded-editor-base-jK221GC8.css +1 -0
  97. package/dist/client/assets/{embedpdf-DA4bA119-BPqZxwjc.js → embedpdf-DA4bA119-E8wZ11J2.js} +2 -3
  98. package/dist/client/assets/{embedpdf-BmE13ZZ0.js → embedpdf-LUXDBD3-.js} +1 -1
  99. package/dist/client/assets/{en-SJ2YIMFF-CJBL3nkq.js → en-2RFA324Y-BsuNJTcL.js} +1 -1
  100. package/dist/client/assets/{erDiagram-RLTQ6QDP-CbrDdd5P.js → erDiagram-RLTQ6QDP-CWrH1UJ9.js} +1 -1
  101. package/dist/client/assets/es-ES-JEUOREKJ-Rx0NUQDl.js +12 -0
  102. package/dist/client/assets/eu-ES-SO5DEEAN-CDYm-BcK.js +8 -0
  103. package/dist/client/assets/excalidraw-element-link-iA6zo0_f.js +7 -0
  104. package/dist/client/assets/{excalidrawEditor-BbSbI80a.css → excalidrawEditor-DDE0n1Pk.css} +1 -1
  105. package/dist/client/assets/excalidrawEditor-WIuguTz7.js +9 -0
  106. package/dist/client/assets/export-page-AN-wI5p4.js +56 -0
  107. package/dist/client/assets/exportDocument-B7IagJhQ.css +1 -0
  108. package/dist/client/assets/exportDocument-B9xNKpQe.js +2 -0
  109. package/dist/client/assets/fa-IR-FIYUE2GQ-C865Nx3X.js +9 -0
  110. package/dist/client/assets/fi-FI-REAEF6HQ-BIpjJqIb.js +6 -0
  111. package/dist/client/assets/flowDiagram-HODETNUW-kb1lUSBo.js +1 -0
  112. package/dist/client/assets/fr-FR-SUCL7J6B-DGAKE8jH.js +12 -0
  113. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-BHgOYiZz.js → ganttDiagram-EL5Y4UJY-BBNzDfaV.js} +1 -1
  114. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-Dl__X3Sk.js → gitGraphDiagram-WWUBYQGX-Csf0Dm_1.js} +1 -1
  115. package/dist/client/assets/gl-ES-KHCSOGVH-DWKh0CMu.js +6 -0
  116. package/dist/client/assets/he-IL-JYXVXV2Q-zqbcM-4g.js +9 -0
  117. package/dist/client/assets/hi-IN-BU52H3BO-CY8v6eG9.js +3 -0
  118. package/dist/client/assets/highlight-theme-CzNkO-IJ.js +1 -0
  119. package/dist/client/assets/hu-HU-OWADXDQ3-CEl6Udfh.js +3 -0
  120. package/dist/client/assets/id-ID-EOMR5R3I-CGQwUjoL.js +8 -0
  121. package/dist/client/assets/image-2QKV3NAF-BUbX0y5Y.js +1 -0
  122. package/dist/client/assets/index-BAmZnTFV.css +1 -0
  123. package/dist/client/assets/index-mWiw418b.js +1111 -0
  124. package/dist/client/assets/{infoDiagram-27XIBGKW-DBpoANC9.js → infoDiagram-27XIBGKW-Bzy6kCbb.js} +1 -1
  125. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-BMPC6hfp.js → ishikawaDiagram-5VMMS53U-CRy9vIS5.js} +1 -1
  126. package/dist/client/assets/it-IT-FC2VTM3L-KTijNcUe.js +12 -0
  127. package/dist/client/assets/ja-JP-JBNTKYP4-BflWlGhw.js +12 -0
  128. package/dist/client/assets/{journeyDiagram-3NMN7TZE-B1sApUmM.js → journeyDiagram-3NMN7TZE-D4ZR_s9J.js} +1 -1
  129. package/dist/client/assets/kaa-TC3VIB7V-B-xtZfy0.js +1 -0
  130. package/dist/client/assets/kab-KAB-UOUDSQKM-BmO0O4Y4.js +4 -0
  131. package/dist/client/assets/{kanban-definition-UXKFOSKX-C9yP4td1.js → kanban-definition-UXKFOSKX-CIDTmu5g.js} +1 -1
  132. package/dist/client/assets/kk-KZ-P5H2X7YS-CSQFB8IN.js +1 -0
  133. package/dist/client/assets/{km-KH-PCWDKPHP-DSmy5shj.js → km-KH-IHMV2US7-BxrjuEzr.js} +4 -4
  134. package/dist/client/assets/ko-KR-ZTMANIDF-BnNRXd5J.js +5 -0
  135. package/dist/client/assets/ku-TR-GPJTRB5G-BZM7f2aT.js +6 -0
  136. package/dist/client/assets/{line-BFl3ujec.js → line-DSWLHgpx.js} +1 -1
  137. package/dist/client/assets/lobby-presence-Rdjnc0_0.js +1 -0
  138. package/dist/client/assets/lt-LT-V3XDOK3P-MVQBOHmF.js +3 -0
  139. package/dist/client/assets/lv-LV-DVQ3FADO-CrenwAhS.js +4 -0
  140. package/dist/client/assets/markdown-it-CocJWnjv.js +13 -0
  141. package/dist/client/assets/mermaid-parser.core-DrdLA3p0.js +3 -0
  142. package/dist/client/assets/mermaid.core-C_FK-7n4.js +1 -0
  143. package/dist/client/assets/{mermaid.core-BrY09czX.js → mermaid.core-D0cMM4Rl.js} +2 -3
  144. package/dist/client/assets/{mindmap-definition-YA3MSWOX-BUQHcYbK.js → mindmap-definition-YA3MSWOX-DO8NB9VH.js} +1 -1
  145. package/dist/client/assets/mr-IN-VZ6HH5FE-B-PHPglH.js +9 -0
  146. package/dist/client/assets/my-MM-XYKWHRK6-Be5sYp5q.js +1 -0
  147. package/dist/client/assets/nb-NO-UNO2GGZJ-BvSKGdja.js +8 -0
  148. package/dist/client/assets/nl-NL-76EFHT4P-C2yNx1Cj.js +13 -0
  149. package/dist/client/assets/nn-NO-CFKD7ABE-4NsqlDRP.js +4 -0
  150. package/dist/client/assets/oc-FR-YBJTCJ3J-B4OTQsWW.js +4 -0
  151. package/dist/client/assets/pa-IN-SNOXSMRV-CKj_sOG7.js +4 -0
  152. package/dist/client/assets/{pegDiagram-XKGWAZYB-Bi2Iml7Z.js → pegDiagram-XKGWAZYB-DS6Ab21R.js} +1 -1
  153. package/dist/client/assets/percentages-Q7USCRWZ-DWE6uvTs.js +1 -0
  154. package/dist/client/assets/{pieDiagram-E7YTZNPT-_gYXnMoi.js → pieDiagram-E7YTZNPT-BbFe6Tgs.js} +1 -1
  155. package/dist/client/assets/pl-PL-BSY6YFZ3-CFuzA6L0.js +12 -0
  156. package/dist/client/assets/preload-helper-CtT0-S4g.js +1 -0
  157. package/dist/client/assets/preview-render-compiler-C_7J7eia.js +43 -0
  158. package/dist/client/assets/preview-render-compiler-DzJ1KR_M.js +1 -0
  159. package/dist/client/assets/preview-render-worker-1DoIDllV.js +59 -0
  160. package/dist/client/assets/prod-D5TxmmoB.js +1 -0
  161. package/dist/client/assets/prod-pbFU4TaM.js +145 -0
  162. package/dist/client/assets/pt-BR-CZDV62R3-CkPMtyNx.js +10 -0
  163. package/dist/client/assets/pt-PT-JO57XJJW-CBSnfGtF.js +12 -0
  164. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-DwexhEhd.js → quadrantDiagram-AXDQQJYC-fJE7iAxt.js} +1 -1
  165. package/dist/client/assets/quick-switcher-De4PjZFC.css +1 -0
  166. package/dist/client/assets/quick-switcher-controller-CUajuy78.js +1 -0
  167. package/dist/client/assets/{railroadDiagram-O6MQD6OU-BVA5UbMu.js → railroadDiagram-O6MQD6OU-CUQKqbCK.js} +1 -1
  168. package/dist/client/assets/{requirementDiagram-BXWQKSXE-C4cKwiIw.js → requirementDiagram-BXWQKSXE-Balm0WW8.js} +1 -1
  169. package/dist/client/assets/ro-RO-UZ5ICYYN-BOuntc_r.js +12 -0
  170. package/dist/client/assets/room-DX7lIfnu.js +1 -0
  171. package/dist/client/assets/ru-RU-AN7JPREC-D-ow3SNR.js +10 -0
  172. package/dist/client/assets/runtime-config-BFVdhnJu.js +1 -0
  173. package/dist/client/assets/runtime-paths-Cn0snt_9.js +1 -0
  174. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-B5HHkRT2.js → sankeyDiagram-P5KCCOFB-CcbMqrlQ.js} +1 -1
  175. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-BX6jqJFD.js → sequenceDiagram-WJ2MYXX4-BL1j3Sn-.js} +1 -1
  176. package/dist/client/assets/si-LK-7CBLD6QQ-c91EepX0.js +1 -0
  177. package/dist/client/assets/sk-SK-SWR6DKBI-D5vFMIL6.js +7 -0
  178. package/dist/client/assets/sl-SI-JRML4FIH-D53L_0S2.js +6 -0
  179. package/dist/client/assets/{stateDiagram-D77RDMKH-CmqxyRGx.js → stateDiagram-D77RDMKH-DNi924hh.js} +1 -1
  180. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-C62JEwak.js +1 -0
  181. package/dist/client/assets/sv-SE-4ZPKFFXF-DT-G7RCI.js +12 -0
  182. package/dist/client/assets/{swimlanes-42K2YHIH-Bmgb9Zld.js → swimlanes-42K2YHIH-ColgjSH4.js} +1 -1
  183. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-B9UZhEj4.js +8 -0
  184. package/dist/client/assets/ta-IN-V6NHHU6Z-D5jy7_AE.js +6 -0
  185. package/dist/client/assets/th-TH-P7CTMGDK-6sy0NO7K.js +1 -0
  186. package/dist/client/assets/{timeline-definition-24CTP7MA-BA-lVH6P.js → timeline-definition-24CTP7MA-7pch5JAr.js} +1 -1
  187. package/dist/client/assets/tr-TR-GUFYG22B-ClVaf8h1.js +4 -0
  188. package/dist/client/assets/uk-UA-K6SV5NFQ-BLTTtyNB.js +6 -0
  189. package/dist/client/assets/uz-UZ-TVKTZO2G-Bm02Eg3D.js +1 -0
  190. package/dist/client/assets/vault-api-client-QjZ_T03l.js +7 -0
  191. package/dist/client/assets/vault-utils-Bct69Xw2.js +1 -0
  192. package/dist/client/assets/{vennDiagram-4TSXK5OY-DNdUC_Xj.js → vennDiagram-4TSXK5OY-C5taziCX.js} +1 -1
  193. package/dist/client/assets/vi-VN-7FKFXJNO-CL3WPhmG.js +7 -0
  194. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-C2oY-YbF.js → wardleyDiagram-VM6X3IG4-BbSlUwuM.js} +1 -1
  195. package/dist/client/assets/{wiki-link-resolver-DFIwErjc.js → wiki-link-resolver-C2P_WmTV.js} +1 -1
  196. package/dist/client/assets/{worker-engine-m0rlHn8R-S8mpn_O0.js → worker-engine-m0rlHn8R-eSDcDGEI.js} +1 -1
  197. package/dist/client/assets/workspace-change-CVA9dVmy.js +1 -0
  198. package/dist/client/assets/workspace-sync-client-D4nblH_2.js +1 -0
  199. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-CoIR8CBX.js → xychartDiagram-S5SC5T6Z-D06X1arY.js} +1 -1
  200. package/dist/client/assets/yjs-B41tM6Sz.js +4 -0
  201. package/dist/client/assets/yjs-provider-reset-guard-R43MnLNc.js +1 -0
  202. package/dist/client/assets/zh-CN-AOKVLNNK-DGidDH2b.js +11 -0
  203. package/dist/client/assets/zh-HK-CDKPF5DC-CRcNR3rk.js +1 -0
  204. package/dist/client/assets/zh-TW-ZVGYESGW-C7Qji1y6.js +13 -0
  205. package/dist/client/drawio-editor.html +7 -8
  206. package/dist/client/excalidraw-editor.html +31 -33
  207. package/dist/client/export-document.html +5 -7
  208. package/dist/client/index.html +30 -26
  209. package/package.json +14 -20
  210. package/src/client/app/drawio-editor.html +1 -1
  211. package/src/client/app/excalidraw-editor.html +1 -1
  212. package/src/client/app/export-document.html +1 -1
  213. package/src/client/app/index.html +28 -4
  214. package/src/client/app/main-entry.js +1 -19
  215. package/src/client/application/app-shell/comments-feature.js +6 -0
  216. package/src/client/application/app-shell/ui-feature-shell.js +136 -58
  217. package/src/client/application/app-shell/ui-feature-tab-activity.js +8 -3
  218. package/src/client/application/app-shell-elements.js +5 -0
  219. package/src/client/application/highlight-theme.js +16 -0
  220. package/src/client/application/preview-render-compiler.js +43 -20
  221. package/src/client/application/preview-render-executor.js +0 -26
  222. package/src/client/application/preview-renderer.js +24 -7
  223. package/src/client/application/workspace-coordinator.js +20 -21
  224. package/src/client/bootstrap/collabmd-app-shell.js +71 -35
  225. package/src/client/bootstrap/lazy-collab-clients.js +90 -0
  226. package/src/client/domain/excalidraw-scene-reconcile.js +5 -2
  227. package/src/client/domain/hash-routes.js +5 -0
  228. package/src/client/domain/highlight-runtime.js +47 -0
  229. package/src/client/domain/lobby-chat.js +2 -0
  230. package/src/client/domain/runtime-paths.js +56 -7
  231. package/src/client/domain/vault-utils.js +11 -0
  232. package/src/client/excalidraw-editor.js +20 -4
  233. package/src/client/infrastructure/auth-client.js +1 -2
  234. package/src/client/infrastructure/browser-preferences-port.js +16 -0
  235. package/src/client/infrastructure/editor-view-adapter.js +43 -8
  236. package/src/client/infrastructure/excalidraw-room-client.js +9 -1
  237. package/src/client/infrastructure/hosted-api-client.js +60 -0
  238. package/src/client/infrastructure/lobby-presence.js +2 -2
  239. package/src/client/infrastructure/runtime-config.js +3 -1
  240. package/src/client/infrastructure/webmcp-tool-registry.js +16 -2
  241. package/src/client/presentation/comment-markdown-renderer.js +2 -14
  242. package/src/client/presentation/comment-overview-controller.js +1 -2
  243. package/src/client/presentation/comment-ui/comment-ui-shared.js +5 -2
  244. package/src/client/presentation/file-explorer-controller.js +3 -0
  245. package/src/client/presentation/file-explorer-view.js +272 -174
  246. package/src/client/presentation/git-panel-controller.js +1 -1
  247. package/src/client/presentation/hosted-workspace-gate-controller.js +180 -0
  248. package/src/client/presentation/layout-controller.js +10 -1
  249. package/src/client/presentation/team-settings-controller.js +228 -0
  250. package/src/client/styles/deferred-collab.css +5 -0
  251. package/src/client/styles/deferred-git.css +7 -0
  252. package/src/client/styles/deferred-preview.css +6 -0
  253. package/src/client/styles/features/diagram-preview.css +0 -15
  254. package/src/client/styles/features/outline.css +4 -2
  255. package/src/client/styles/features/preview-markdown.css +25 -11
  256. package/src/client/styles/features/team-settings.css +162 -0
  257. package/src/client/styles/foundation/tokens.css +2 -2
  258. package/src/client/styles/layout/editor-page.css +0 -13
  259. package/src/client/styles/layout/overlays.css +16 -0
  260. package/src/client/styles/layout/responsive.css +5 -5
  261. package/src/client/styles/layout/shell.css +20 -1
  262. package/src/client/styles/layout/sidebar.css +92 -3
  263. package/src/client/styles/style.css +3 -19
  264. package/src/domain/agent-tool-definitions.js +139 -63
  265. package/src/domain/collabmd-content-capabilities.js +4 -4
  266. package/src/domain/excalidraw-agent-scene.js +108 -6
  267. package/src/domain/excalidraw-agent-verification.js +95 -1
  268. package/src/domain/excalidraw-room-codec.js +12 -1
  269. package/src/domain/literal-text-search.js +13 -0
  270. package/src/server/application/agent-content-service.js +142 -74
  271. package/src/server/config/env.js +96 -5
  272. package/src/server/create-app-server.js +23 -153
  273. package/src/server/domain/hosted-workspace.js +10 -1
  274. package/src/server/domain/ripgrep-search-service.js +68 -21
  275. package/src/server/infrastructure/git/local-exclude.js +13 -1
  276. package/src/server/infrastructure/http/create-agent-api-handler.js +1 -1
  277. package/src/server/infrastructure/http/create-hosted-api-handler.js +5 -0
  278. package/src/server/infrastructure/http/create-request-handler.js +95 -26
  279. package/src/server/infrastructure/http/create-static-handler.js +3 -0
  280. package/src/server/infrastructure/http/create-vault-api-query-handler.js +15 -2
  281. package/src/server/infrastructure/mcp/create-agent-mcp-handler.js +2 -1
  282. package/src/server/infrastructure/persistence/sidecar-store.js +12 -5
  283. package/src/server/infrastructure/persistence/vault-file-store.js +2 -3
  284. package/src/server/infrastructure/websocket/attach-collaboration-gateway.js +48 -22
  285. package/src/server/shared/agent-tool-rate-limiter.js +7 -0
  286. package/src/server/startup/git-remote-bootstrap.js +56 -49
  287. package/src/server/vault-registry.js +251 -0
  288. package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-C-nmgL5g.js +0 -1
  289. package/dist/client/assets/ar-SA-PQUY64WN-xjXgbW6d.js +0 -10
  290. package/dist/client/assets/az-AZ-OXJXL76K-4JkO4Pca.js +0 -1
  291. package/dist/client/assets/base-CaIEJUF9.css +0 -1
  292. package/dist/client/assets/bg-BG-W2GKIJDF-DnkH_o81.js +0 -5
  293. package/dist/client/assets/bn-BD-TGL7M4PJ-CG4JkmtP.js +0 -3
  294. package/dist/client/assets/bn-IN-BKETKYEH-CG4JkmtP.js +0 -3
  295. package/dist/client/assets/ca-ES-LD5SCRVV-U6_TVMX9.js +0 -8
  296. package/dist/client/assets/channel-Fa4GS_-F.js +0 -1
  297. package/dist/client/assets/chunk-2E4U76K2-BPnTT-J3.js +0 -2
  298. package/dist/client/assets/chunk-7XWMRXBY-CfMzEq80.js +0 -1
  299. package/dist/client/assets/chunk-RM4UPSZO-DOWllDY8.js +0 -41
  300. package/dist/client/assets/chunk-TLUHSLCS-DTY5v0aj.js +0 -2
  301. package/dist/client/assets/classDiagram-ZZMXUADV-BsQWoR3Q.js +0 -1
  302. package/dist/client/assets/classDiagram-v2-VYDZK3BY-BsQWoR3Q.js +0 -1
  303. package/dist/client/assets/comment-thread-store-CX98zR6q.js +0 -1
  304. package/dist/client/assets/comment-threads-BnRwo5B9.js +0 -4
  305. package/dist/client/assets/cs-CZ-OFPU5DBV-BmFAIhqX.js +0 -7
  306. package/dist/client/assets/da-DK-FRDJFYWF-H387Jw8B.js +0 -2
  307. package/dist/client/assets/de-CH-ZG7H3QK3-C_groygo.js +0 -11
  308. package/dist/client/assets/de-DE-SIJYH4IH-C_groygo.js +0 -11
  309. package/dist/client/assets/dist--hk9I5HQ.js +0 -1
  310. package/dist/client/assets/dist-B1XEa-Zs.js +0 -1
  311. package/dist/client/assets/dist-BJ1bJs33.js +0 -1
  312. package/dist/client/assets/dist-Bd1JucQF.js +0 -1
  313. package/dist/client/assets/dist-ByrG2qBA.js +0 -1
  314. package/dist/client/assets/dist-C0G3AaXG.js +0 -1
  315. package/dist/client/assets/dist-CKS_-are.js +0 -1
  316. package/dist/client/assets/dist-D37Hyu3h.js +0 -9
  317. package/dist/client/assets/dist-Dl_tpDSr.js +0 -1
  318. package/dist/client/assets/dist-Dm4w5UId.js +0 -1
  319. package/dist/client/assets/dist-RKBTaQMb.js +0 -13
  320. package/dist/client/assets/dist-eBx8q6Sy.js +0 -1
  321. package/dist/client/assets/dist-jVU5Be5P.js +0 -1
  322. package/dist/client/assets/document-formatter-rDDjRfZ2.js +0 -2
  323. package/dist/client/assets/drawioEditor-JubEEha7.js +0 -9
  324. package/dist/client/assets/editor-session-Bk6oIvSr.js +0 -54
  325. package/dist/client/assets/el-GR-IEE2CGI2-BkT6YT54.js +0 -7
  326. package/dist/client/assets/embedded-editor-base-BlCgz6mw.css +0 -1
  327. package/dist/client/assets/es-Bfdp096f.js +0 -22
  328. package/dist/client/assets/es-ES-TVVPWKV5-CpPKJXTM.js +0 -12
  329. package/dist/client/assets/eu-ES-CGBMFQDT-Bu3N2493.js +0 -8
  330. package/dist/client/assets/excalidraw-element-link-YLIaTnVF.js +0 -7
  331. package/dist/client/assets/excalidrawEditor-dBMbRX_S.js +0 -9
  332. package/dist/client/assets/export-page-CRRQ2NEl.js +0 -57
  333. package/dist/client/assets/exportDocument-BlQRd9_m.js +0 -2
  334. package/dist/client/assets/exportDocument-CNSbjZwu.css +0 -1
  335. package/dist/client/assets/fa-IR-IE6XAPR4-BEvLCORD.js +0 -9
  336. package/dist/client/assets/fi-FI-P7TKNHRM-DI0q8iSX.js +0 -6
  337. package/dist/client/assets/file-icon-svg-Y_kpF957.js +0 -1
  338. package/dist/client/assets/flowDiagram-HODETNUW-D5Gy0wmg.js +0 -1
  339. package/dist/client/assets/fr-FR-QI2XZNT7-y8kXd8LA.js +0 -12
  340. package/dist/client/assets/gl-ES-TLYCNOZZ-Br-Fhff-.js +0 -6
  341. package/dist/client/assets/he-IL-ZX43XLGP-qKQq6V9X.js +0 -9
  342. package/dist/client/assets/hi-IN-UTYRMTUF-DOUcwrDO.js +0 -3
  343. package/dist/client/assets/hu-HU-AJOSEBW6-FqTyvHlD.js +0 -3
  344. package/dist/client/assets/id-ID-ETLTVG6C-CQqh3CLS.js +0 -8
  345. package/dist/client/assets/image-ZVKINSPA-DgzW5zAy.js +0 -1
  346. package/dist/client/assets/index-D3RER1SZ.js +0 -1023
  347. package/dist/client/assets/index-DREVKl_K.css +0 -1
  348. package/dist/client/assets/it-IT-B4B6TP6L-V-yK3SZz.js +0 -12
  349. package/dist/client/assets/ja-JP-IYKVURR5-BQKBXRpX.js +0 -12
  350. package/dist/client/assets/kaa-SE2BUIKX-CZ5kfwPg.js +0 -1
  351. package/dist/client/assets/kab-KAB-Y3GLKXLR-Do7GWfuN.js +0 -4
  352. package/dist/client/assets/kk-KZ-ABWUFVOH-BpqVciQz.js +0 -1
  353. package/dist/client/assets/ko-KR-7JQDXKGM-N42lep78.js +0 -5
  354. package/dist/client/assets/ku-TR-NAH2Q5B7-K8LLl9fk.js +0 -6
  355. package/dist/client/assets/lt-LT-VQFYRSNQ-BmOd0ALn.js +0 -3
  356. package/dist/client/assets/lv-LV-T62VSYUM-B22WdPhp.js +0 -4
  357. package/dist/client/assets/mermaid-parser.core-Bl0efOMt.js +0 -4
  358. package/dist/client/assets/mermaid.core-DfcNfOTv.js +0 -1
  359. package/dist/client/assets/modulepreload-polyfill-P2Xu9kJm.js +0 -1
  360. package/dist/client/assets/mr-IN-V4FHLCJE-XX069tpm.js +0 -9
  361. package/dist/client/assets/my-MM-E3SQ6E54-cst_-5SB.js +0 -1
  362. package/dist/client/assets/nb-NO-MLNOFN5H-Bu2URWko.js +0 -8
  363. package/dist/client/assets/nl-NL-D5L3ZV4M-BqrV0btt.js +0 -13
  364. package/dist/client/assets/nn-NO-NNHDGPKB-DK-xZaWM.js +0 -4
  365. package/dist/client/assets/oc-FR-DWCRF55G-BZ5Po5R6.js +0 -4
  366. package/dist/client/assets/pa-IN-3JSAY44M-BZQSjKrS.js +0 -4
  367. package/dist/client/assets/percentages-ETZPVQEE-DFxFqXgH.js +0 -1
  368. package/dist/client/assets/pl-PL-ACURYKP3-qcEOSfCk.js +0 -12
  369. package/dist/client/assets/preload-helper-HclGiUj8.js +0 -1
  370. package/dist/client/assets/preview-render-compiler-CfxJYldJ.js +0 -41
  371. package/dist/client/assets/preview-render-compiler-Cu8_i9iS.js +0 -1
  372. package/dist/client/assets/preview-render-worker-c4Yi93qW.js +0 -66
  373. package/dist/client/assets/prod-BiJL30sl.js +0 -1
  374. package/dist/client/assets/prod-qAk7rHa4.js +0 -177
  375. package/dist/client/assets/pt-BR-LOX7MLGD-DLueHSyZ.js +0 -10
  376. package/dist/client/assets/pt-PT-CZ2U2RFQ-BJ-GAEm6.js +0 -12
  377. package/dist/client/assets/quick-switcher-controller-BoIK_wuG.js +0 -1
  378. package/dist/client/assets/ro-RO-2HECL2X6-CJUvKAf0.js +0 -12
  379. package/dist/client/assets/ru-RU-HAYNXO46-BWSlvTrt.js +0 -10
  380. package/dist/client/assets/runtime-config-DcmnGcXU.js +0 -1
  381. package/dist/client/assets/si-LK-W5KNS4H6-DGGCsn7k.js +0 -1
  382. package/dist/client/assets/sk-SK-7K2CFGDV-CY4uTYgQ.js +0 -7
  383. package/dist/client/assets/sl-SI-OXV2QZWW-2-weqaBY.js +0 -6
  384. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-zoLLQVyh.js +0 -1
  385. package/dist/client/assets/sv-SE-JTOBZRGL-9-IUtVkO.js +0 -12
  386. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DS-KQN37.js +0 -8
  387. package/dist/client/assets/ta-IN-KFAVKXGT-gHO6Q_DH.js +0 -6
  388. package/dist/client/assets/th-TH-VDMSCPDL-BvJuw6PJ.js +0 -1
  389. package/dist/client/assets/tr-TR-CEZ6GX45-CG6UU3Su.js +0 -4
  390. package/dist/client/assets/uk-UA-Q3H3OXQC-CSuIg_DY.js +0 -6
  391. package/dist/client/assets/uz-UZ-NGCSWWPX-mom7rxSP.js +0 -1
  392. package/dist/client/assets/vault-api-client-iZLhMJKe.js +0 -6
  393. package/dist/client/assets/vi-VN-P3NDEVPS-BB0Fu9ck.js +0 -7
  394. package/dist/client/assets/yjs-provider-reset-guard-9ul1qF6k.js +0 -4
  395. package/dist/client/assets/zh-CN-SS3O57GA-Bj8wsiMe.js +0 -11
  396. package/dist/client/assets/zh-HK-LWJT3VCF-DOTquTCh.js +0 -1
  397. package/dist/client/assets/zh-TW-VJXC72RT-B48PRo-l.js +0 -13
  398. package/integrations/pi/index.ts +0 -94
  399. /package/dist/client/assets/{vault-api-client-C3mlS_4N.css → auth-gate-C3mlS_4N.css} +0 -0
  400. /package/dist/client/assets/{base-BYODPHdS.js → github.min-DBihDoic.js} +0 -0
@@ -18,6 +18,17 @@ export function escapeHtml(text) {
18
18
  .replace(/'/g, ''');
19
19
  }
20
20
 
21
+ /**
22
+ * Builds a document fragment from an HTML string for a single
23
+ * replaceChildren() call. Escape untrusted parts before calling.
24
+ *
25
+ * @param {string} markup — trusted HTML markup
26
+ * @returns {DocumentFragment} parsed fragment
27
+ */
28
+ export function createFragment(markup) {
29
+ return document.createRange().createContextualFragment(markup);
30
+ }
31
+
21
32
  /**
22
33
  * Clamps a numeric value between a minimum and maximum bound.
23
34
  *
@@ -88,6 +88,7 @@ function setAppliedSceneJson(value) {
88
88
 
89
89
  let collabReady = false;
90
90
  let pendingRemoteSceneJson = '';
91
+ let pendingRemoteSceneAuthoritative = false;
91
92
  let pendingCollaborators = null;
92
93
  let activeCollaborators = new Map();
93
94
  let followedSocketId = null;
@@ -432,12 +433,12 @@ function createRoomClient(filePath) {
432
433
 
433
434
  handleRoomConnectionStateChange(event);
434
435
  },
435
- onRemoteSceneJson: (sceneJson) => {
436
+ onRemoteSceneJson: (sceneJson, { authoritative = false } = {}) => {
436
437
  if (generation !== roomClientGeneration) {
437
438
  return;
438
439
  }
439
440
 
440
- applySceneFromJson(sceneJson);
441
+ applySceneFromJson(sceneJson, { authoritative });
441
442
  },
442
443
  syncTimeoutMs: Number.isFinite(syncTimeoutMs) ? syncTimeoutMs : undefined,
443
444
  vaultClient: vaultApiClient,
@@ -1393,14 +1394,18 @@ function flushPendingRemoteScene() {
1393
1394
  }
1394
1395
 
1395
1396
  const sceneJson = pendingRemoteSceneJson;
1397
+ const authoritative = pendingRemoteSceneAuthoritative;
1396
1398
  pendingRemoteSceneJson = '';
1399
+ pendingRemoteSceneAuthoritative = false;
1397
1400
  applySceneFromJson(sceneJson, {
1401
+ authoritative,
1398
1402
  force: true,
1399
1403
  });
1400
1404
  return true;
1401
1405
  }
1402
1406
 
1403
1407
  function applySceneFromJson(rawJson, {
1408
+ authoritative = false,
1404
1409
  force = false,
1405
1410
  } = {}) {
1406
1411
  const scene = parseSceneJson(rawJson);
@@ -1414,15 +1419,18 @@ function applySceneFromJson(rawJson, {
1414
1419
 
1415
1420
  if (!getMountedExcalidrawAPI() || !collabReady) {
1416
1421
  pendingRemoteSceneJson = normalizedJson;
1422
+ pendingRemoteSceneAuthoritative ||= authoritative;
1417
1423
  return;
1418
1424
  }
1419
1425
 
1420
1426
  if (!force && isEditingTextElement()) {
1421
1427
  pendingRemoteSceneJson = normalizedJson;
1428
+ pendingRemoteSceneAuthoritative ||= authoritative;
1422
1429
  return;
1423
1430
  }
1424
1431
 
1425
- updateApiScene(scene);
1432
+ pendingRemoteSceneAuthoritative = false;
1433
+ updateApiScene(scene, { authoritative });
1426
1434
  }
1427
1435
 
1428
1436
  function releaseViewportBroadcastSuppressionAfterPaint() {
@@ -1440,6 +1448,7 @@ function releaseViewportBroadcastSuppressionAfterPaint() {
1440
1448
  function buildApiSceneUpdate(scene, {
1441
1449
  appStateOverrides = {},
1442
1450
  api = getMountedExcalidrawAPI(),
1451
+ authoritative = false,
1443
1452
  } = {}) {
1444
1453
  if (!api) {
1445
1454
  return null;
@@ -1450,6 +1459,7 @@ function buildApiSceneUpdate(scene, {
1450
1459
 
1451
1460
  return buildReconciledExcalidrawSceneUpdate({
1452
1461
  appStateOverrides,
1462
+ authoritative,
1453
1463
  currentAppState,
1454
1464
  currentElements,
1455
1465
  documentViewState: getDocumentViewState(),
@@ -1500,6 +1510,7 @@ function requestEditorRemount(scene) {
1500
1510
 
1501
1511
  function applySceneToMountedApi(scene, {
1502
1512
  appStateOverrides = {},
1513
+ authoritative = false,
1503
1514
  captureUpdate = CaptureUpdateAction.NEVER,
1504
1515
  trackedSharedSnapshot = false,
1505
1516
  } = {}) {
@@ -1511,6 +1522,7 @@ function applySceneToMountedApi(scene, {
1511
1522
  const nextSceneUpdate = buildApiSceneUpdate(scene, {
1512
1523
  appStateOverrides,
1513
1524
  api,
1525
+ authoritative,
1514
1526
  });
1515
1527
  let applyResult;
1516
1528
 
@@ -1545,11 +1557,13 @@ function applySceneToMountedApi(scene, {
1545
1557
 
1546
1558
  function updateApiScene(scene, {
1547
1559
  appStateOverrides = {},
1560
+ authoritative = false,
1548
1561
  captureUpdate = CaptureUpdateAction.NEVER,
1549
1562
  trackedSharedSnapshot = true,
1550
1563
  } = {}) {
1551
1564
  applySceneToMountedApi(scene, {
1552
1565
  appStateOverrides,
1566
+ authoritative,
1553
1567
  captureUpdate,
1554
1568
  trackedSharedSnapshot,
1555
1569
  });
@@ -2176,10 +2190,12 @@ function initializeEditor(api) {
2176
2190
  }));
2177
2191
 
2178
2192
  const sceneJson = pendingRemoteSceneJson || roomClient?.getLastSceneJson?.() || '';
2193
+ const authoritative = pendingRemoteSceneAuthoritative;
2179
2194
  const initialScene = parseSceneJson(sceneJson);
2180
2195
  pendingRemoteSceneJson = '';
2196
+ pendingRemoteSceneAuthoritative = false;
2181
2197
  setAppliedSceneJson(JSON.stringify(initialScene));
2182
- updateApiScene(initialScene);
2198
+ updateApiScene(initialScene, { authoritative });
2183
2199
 
2184
2200
  if (pendingCollaborators) {
2185
2201
  const renderableCollaborators = buildRenderableCollaboratorsMap(pendingCollaborators);
@@ -1,5 +1,3 @@
1
- import '../styles/features/auth-gate.css';
2
-
3
1
  import { getHashParamsFromRaw } from '../domain/hash-routes.js';
4
2
  import { parseApiResponse } from './api-client-utils.js';
5
3
  import { getRuntimeConfig } from './runtime-config.js';
@@ -255,6 +253,7 @@ export async function ensureClientAuthenticated() {
255
253
  return { authenticated: true, auth: config };
256
254
  }
257
255
 
256
+ await import('../styles/features/auth-gate.css');
258
257
  const { card, overlay } = createOverlayShell();
259
258
  document.body.append(overlay);
260
259
  let pendingOidcError = consumeHashParam('auth_error');
@@ -23,6 +23,7 @@ export class BrowserPreferencesPort {
23
23
  lineWrappingKey,
24
24
  recentFilesKey = 'collabmd-recent-files',
25
25
  vimModeKey = 'collabmd-editor-vim-mode',
26
+ viewModeKey = 'collabmd-editor-view-mode',
26
27
  sidebarVisibleKey,
27
28
  userNameKey,
28
29
  storage = globalThis.localStorage,
@@ -33,6 +34,7 @@ export class BrowserPreferencesPort {
33
34
  this.sidebarVisibleKey = sidebarVisibleKey;
34
35
  this.storage = storage;
35
36
  this.userNameKey = userNameKey;
37
+ this.viewModeKey = viewModeKey;
36
38
  this.vimModeKey = vimModeKey;
37
39
  }
38
40
 
@@ -68,6 +70,20 @@ export class BrowserPreferencesPort {
68
70
  writeStorage(this.storage, this.vimModeKey, String(enabled));
69
71
  }
70
72
 
73
+ getViewMode() {
74
+ const value = readStorage(this.storage, this.viewModeKey, null);
75
+ if (value === 'editor' || value === 'preview' || value === 'split') {
76
+ return value;
77
+ }
78
+ return null;
79
+ }
80
+
81
+ setViewMode(view) {
82
+ if (view === 'editor' || view === 'preview' || view === 'split') {
83
+ writeStorage(this.storage, this.viewModeKey, view);
84
+ }
85
+ }
86
+
71
87
  getRecentFiles() {
72
88
  const stored = readStorage(this.storage, this.recentFilesKey, '[]');
73
89
  try {
@@ -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,
@@ -60,8 +59,20 @@ import { plantUmlLanguage, plantUmlLanguageDescription } from '../domain/plantum
60
59
  import { structurizrLanguage, structurizrLanguageDescription } from '../domain/structurizr-language.js';
61
60
  import { handleImagePasteEvent } from './editor-paste-utils.js';
62
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
+
63
74
  const markdownCodeLanguages = [
64
- ...languages,
75
+ ...languages.filter(isMarkdownCodeLanguage),
65
76
  mermaidLanguageDescription,
66
77
  plantUmlLanguageDescription,
67
78
  structurizrLanguageDescription,
@@ -501,7 +512,7 @@ export class EditorViewAdapter {
501
512
  highlightActiveLine(),
502
513
  highlightSelectionMatches(),
503
514
  createSearchNavigationListener(),
504
- this.vimModeCompartment.of(!readOnly && this.vimModeEnabled ? vim({ status: true }) : []),
515
+ this.vimModeCompartment.of([]),
505
516
  keymap.of([
506
517
  ...closeBracketsKeymap,
507
518
  ...defaultKeymap,
@@ -585,6 +596,10 @@ export class EditorViewAdapter {
585
596
  this.onSelectionChanged?.(this.editorView.state);
586
597
  this.emitViewportChange();
587
598
 
599
+ if (this.vimModeEnabled && editorMode !== 'provisional') {
600
+ void this.applyVimExtension();
601
+ }
602
+
588
603
  if (preserveScrollTop > 0) {
589
604
  requestAnimationFrame(() => {
590
605
  if (this.editorView?.scrollDOM) {
@@ -676,6 +691,21 @@ export class EditorViewAdapter {
676
691
  return this.vimModeEnabled;
677
692
  }
678
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
+
679
709
  setVimMode(enabled) {
680
710
  const nextEnabled = Boolean(enabled);
681
711
  if (nextEnabled === this.vimModeEnabled) {
@@ -687,12 +717,17 @@ export class EditorViewAdapter {
687
717
  return nextEnabled;
688
718
  }
689
719
 
690
- this.editorView.dispatch({
691
- effects: this.vimModeCompartment.reconfigure(
692
- nextEnabled ? vim({ status: true }) : [],
693
- ),
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();
694
730
  });
695
- this.editorView.focus();
696
731
  return nextEnabled;
697
732
  }
698
733
 
@@ -11,6 +11,7 @@ import {
11
11
  buildExcalidrawRoomScene,
12
12
  ensureExcalidrawRoomSchema,
13
13
  isExcalidrawRoomDocStructured,
14
+ readExcalidrawReplaceGeneration,
14
15
  readLegacyExcalidrawRoomScene,
15
16
  replaceExcalidrawRoomScene,
16
17
  } from '../../domain/excalidraw-room-codec.js';
@@ -174,6 +175,7 @@ export class ExcalidrawRoomClient {
174
175
  this.handleProviderSync = null;
175
176
  this.handleProviderStatus = null;
176
177
  this.lastSceneJson = '';
178
+ this.lastReplaceGeneration = null;
177
179
  this.sceneSyncTimer = null;
178
180
  this.sceneSyncDueAt = 0;
179
181
  this.lastSceneSyncAt = 0;
@@ -217,6 +219,11 @@ export class ExcalidrawRoomClient {
217
219
  return;
218
220
  }
219
221
 
222
+ const prevReplaceGeneration = this.lastReplaceGeneration;
223
+ this.lastReplaceGeneration = readExcalidrawReplaceGeneration(this.ydoc);
224
+ const authoritative = prevReplaceGeneration !== null
225
+ && this.lastReplaceGeneration > prevReplaceGeneration;
226
+
220
227
  const remoteJson = this.getStructuredSceneJson();
221
228
  if (!remoteJson || remoteJson === this.lastSceneJson) {
222
229
  return;
@@ -224,7 +231,7 @@ export class ExcalidrawRoomClient {
224
231
 
225
232
  this.pendingEmptySceneCandidate = null;
226
233
  this.lastSceneJson = JSON.stringify(parseSceneJson(remoteJson));
227
- this.onRemoteSceneJson(this.lastSceneJson);
234
+ this.onRemoteSceneJson(this.lastSceneJson, { authoritative });
228
235
  };
229
236
  }
230
237
 
@@ -1071,5 +1078,6 @@ export class ExcalidrawRoomClient {
1071
1078
  this.setConnectionState(EXCALIDRAW_ROOM_CONNECTION_STATE.CLOSED);
1072
1079
  this.applyingSharedSnapshotDepth = 0;
1073
1080
  this.suppressStructuredSceneUpdateDepth = 0;
1081
+ this.lastReplaceGeneration = null;
1074
1082
  }
1075
1083
  }
@@ -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 ?? '')
@@ -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() {
@@ -213,7 +213,7 @@ export class WebMcpToolRegistry {
213
213
  try {
214
214
  const tools = listWebMcpToolDefinitions().map((definition) => ({
215
215
  annotations: {
216
- readOnlyHint: definition.annotations.readOnlyHint,
216
+ ...definition.annotations,
217
217
  untrustedContentHint: Boolean(definition.untrustedContentHint),
218
218
  },
219
219
  description: getWebMcpDescription(definition),
@@ -228,7 +228,21 @@ export class WebMcpToolRegistry {
228
228
  });
229
229
  throwIfAborted(signal);
230
230
  }
231
- const serverResult = await this.callTool(definition.name, input, { signal });
231
+ let serverResult;
232
+ try {
233
+ serverResult = await this.callTool(definition.name, input, { signal });
234
+ } catch (error) {
235
+ throwIfAborted(signal);
236
+ const body = error?.body;
237
+ if (
238
+ typeof body?.code === 'string'
239
+ && body.code.startsWith('AGENT_')
240
+ && body.code !== 'AGENT_REQUEST_FAILED'
241
+ ) {
242
+ return { ...body, isError: true };
243
+ }
244
+ throw error;
245
+ }
232
246
  let result = await replaceSnapshotRendering(
233
247
  serverResult,
234
248
  this.renderExcalidrawScene,
@@ -1,5 +1,4 @@
1
1
  import markdownIt from 'markdown-it';
2
- import hljs from 'highlight.js';
3
2
 
4
3
  import { escapeHtml } from '../domain/vault-utils.js';
5
4
 
@@ -15,19 +14,8 @@ function renderPlainTextCommentHtml(text = '') {
15
14
  function createCommentMarkdownRenderer() {
16
15
  const markdown = markdownIt({
17
16
  breaks: true,
18
- highlight(source, language) {
19
- try {
20
- if (language && hljs.getLanguage(language)) {
21
- return hljs.highlight(source, {
22
- ignoreIllegals: true,
23
- language,
24
- }).value;
25
- }
26
-
27
- return hljs.highlightAuto(source).value;
28
- } catch {
29
- return escapeHtml(source);
30
- }
17
+ highlight(source) {
18
+ return escapeHtml(source);
31
19
  },
32
20
  html: false,
33
21
  linkify: true,
@@ -105,12 +105,11 @@ export class CommentOverviewController {
105
105
  }
106
106
 
107
107
  render() {
108
- if (!this.panel) {
108
+ if (!this.panel || this.panel.classList.contains('hidden')) {
109
109
  return;
110
110
  }
111
111
 
112
112
  this.panel.replaceChildren();
113
-
114
113
  if (this.errorMessage) {
115
114
  const error = createOverviewState({
116
115
  copy: this.errorMessage,
@@ -4,7 +4,6 @@ import {
4
4
  normalizeCommentQuoteForComparison,
5
5
  } from '../../../domain/comment-threads.js';
6
6
  import { clamp } from '../../domain/vault-utils.js';
7
- import { renderCommentMarkdownToHtml } from '../comment-markdown-renderer.js';
8
7
 
9
8
  export { COMMENT_BODY_MAX_LENGTH, clamp };
10
9
 
@@ -112,7 +111,11 @@ export function getLatestGroupMessage(group) {
112
111
  export function createRenderedCommentBody(body, className = 'comment-markdown') {
113
112
  const container = document.createElement('div');
114
113
  container.className = className;
115
- container.innerHTML = renderCommentMarkdownToHtml(body);
114
+ const markdownText = String(body ?? '');
115
+ container.textContent = markdownText;
116
+ void import('../comment-markdown-renderer.js').then(({ renderCommentMarkdownToHtml }) => {
117
+ container.innerHTML = renderCommentMarkdownToHtml(markdownText);
118
+ });
116
119
  return container;
117
120
  }
118
121
 
@@ -14,6 +14,7 @@ export class FileExplorerController {
14
14
  showFileExtensions = false,
15
15
  toastController,
16
16
  vaultClient,
17
+ vaultSwitcher = null,
17
18
  }) {
18
19
  this.onFileSelect = onFileSelect;
19
20
  this.onFileDelete = onFileDelete;
@@ -21,6 +22,7 @@ export class FileExplorerController {
21
22
  this.onShowFileExtensionsChange = onShowFileExtensionsChange;
22
23
  this.toastController = toastController;
23
24
  this.vaultClient = vaultClient;
25
+ this.vaultSwitcher = vaultSwitcher;
24
26
  this.state = new FileTreeState();
25
27
  this.showFileExtensions = Boolean(showFileExtensions);
26
28
  this.threadCounts = new Map();
@@ -78,6 +80,7 @@ export class FileExplorerController {
78
80
 
79
81
  initialize() {
80
82
  this.view.initialize();
83
+ this.view.renderVaultSwitcher(this.vaultSwitcher);
81
84
  this.actionController.initialize();
82
85
  }
83
86