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,5 +1,7 @@
1
1
  import { PdfPreviewController } from '../application/pdf-preview-controller.js';
2
+ import { analyzeMarkdownComplexity, isLargeDocumentStats } from '../application/preview-render-profile.js';
2
3
  import { PreviewRenderer } from '../application/preview-renderer.js';
4
+ import { renderWebMcpDiagram } from '../application/webmcp-diagram-renderer.js';
3
5
  import { ensureQuickSwitcherInstance, toggleQuickSwitcherInstance } from '../application/quick-switcher-loader.js';
4
6
  import { WorkspaceRouteController } from '../application/workspace-route-controller.js';
5
7
  import { WikiLinkFileController } from '../application/wiki-link-file-controller.js';
@@ -18,14 +20,18 @@ import { uiFeatureSidebarMethods } from '../application/app-shell/ui-feature-sid
18
20
  import { uiFeatureTabActivityMethods } from '../application/app-shell/ui-feature-tab-activity.js';
19
21
  import { uiFeatureToolbarMethods } from '../application/app-shell/ui-feature-toolbar.js';
20
22
  import { workspaceFeature } from '../application/app-shell/workspace-feature.js';
21
- import { LOBBY_CHAT_MESSAGE_MAX_LENGTH, LobbyPresence } from '../infrastructure/lobby-presence.js';
23
+ import { LOBBY_CHAT_MESSAGE_MAX_LENGTH } from '../domain/lobby-chat.js';
24
+ import { agentConnectionApiClient } from '../infrastructure/agent-connection-api-client.js';
22
25
  import { BrowserPreferencesPort } from '../infrastructure/browser-preferences-port.js';
26
+ import { hostedApiClient } from '../infrastructure/hosted-api-client.js';
23
27
  import { BrowserNotificationPort } from '../infrastructure/browser-notification-port.js';
24
28
  import { AppVersionMonitor } from '../infrastructure/app-version-monitor.js';
25
29
  import { gitApiClient } from '../infrastructure/git-api-client.js';
26
30
  import {
31
+ getActiveVaultId,
27
32
  getHashRoute,
28
33
  getRuntimeConfig,
34
+ setActiveVaultId,
29
35
  navigateToFile,
30
36
  navigateToGitCommit,
31
37
  navigateToGitDiff,
@@ -35,8 +41,12 @@ import {
35
41
  } from '../infrastructure/runtime-config.js';
36
42
  import { TabActivityLock } from '../infrastructure/tab-activity-lock.js';
37
43
  import { vaultApiClient } from '../infrastructure/vault-api-client.js';
38
- import { WorkspaceSyncClient } from '../infrastructure/workspace-sync-client.js';
44
+ import { WebMcpToolRegistry } from '../infrastructure/webmcp-tool-registry.js';
45
+ import { createLazyLobbyPresence, createLazyWorkspaceSyncClient } from './lazy-collab-clients.js';
46
+ import { AgentConnectionController } from '../presentation/agent-connection-controller.js';
39
47
  import { BacklinksPanel } from '../presentation/backlinks-panel.js';
48
+ import { HostedWorkspaceGateController } from '../presentation/hosted-workspace-gate-controller.js';
49
+ import { TeamSettingsController } from '../presentation/team-settings-controller.js';
40
50
  import { CommentOverviewController } from '../presentation/comment-overview-controller.js';
41
51
  import { CommentUiController } from '../presentation/comment-ui-controller.js';
42
52
  import { FileExplorerController } from '../presentation/file-explorer-controller.js';
@@ -148,12 +158,12 @@ export class CollabMdAppShell {
148
158
  runtimeConfig: this.runtimeConfig,
149
159
  });
150
160
 
151
- this.lobby = new LobbyPresence({
161
+ this.lobby = createLazyLobbyPresence({
152
162
  preferredUserName: this.getStoredUserName(),
153
163
  onChange: (users) => this.updateGlobalUsers(users),
154
164
  onChatChange: (messages, meta) => this.updateChatMessages(messages, meta),
155
165
  });
156
- this.workspaceSync = new WorkspaceSyncClient({
166
+ this.workspaceSync = createLazyWorkspaceSyncClient({
157
167
  onTreeChange: (tree, metadata = {}) => {
158
168
  this.fileExplorer.setTree(tree, metadata);
159
169
  this.handleCommentOverviewWorkspaceTreeChange?.();
@@ -166,6 +176,80 @@ export class CollabMdAppShell {
166
176
 
167
177
  this.toastController = new ToastController(this.elements.toastContainer);
168
178
  this.chatToastController = new ToastController(this.elements.chatToastContainer);
179
+ this.agentConnectionController = new AgentConnectionController({
180
+ apiClient: agentConnectionApiClient,
181
+ closeToolbarMenu: () => this.closeToolbarOverflowMenu(),
182
+ content: this.elements.agentConnectionContent,
183
+ dialog: this.elements.agentConnectionDialog,
184
+ runtimeConfig: this.runtimeConfig,
185
+ toastController: this.toastController,
186
+ trigger: this.elements.connectAgentButton,
187
+ });
188
+ this.teamSettingsController = new TeamSettingsController({
189
+ apiClient: hostedApiClient,
190
+ closeToolbarMenu: () => this.closeToolbarOverflowMenu(),
191
+ content: this.elements.teamSettingsContent,
192
+ dialog: this.elements.teamSettingsDialog,
193
+ toastController: this.toastController,
194
+ trigger: this.elements.teamSettingsButton,
195
+ });
196
+ this.hostedGateController = new HostedWorkspaceGateController({
197
+ apiClient: hostedApiClient,
198
+ appRoot: this.elements.appShell,
199
+ gate: this.elements.hostedGate,
200
+ runtimeConfig: this.runtimeConfig,
201
+ teamSettingsController: this.teamSettingsController,
202
+ });
203
+ const callAgentTool = (...args) => this.vaultApiClient.callAgentTool(...args);
204
+ this.webMcpTools = new WebMcpToolRegistry({
205
+ acknowledgeToolCall: ({ input, name, preparation, result, signal }) => {
206
+ if (
207
+ name !== 'edit_excalidraw'
208
+ || input.path !== this.currentFilePath
209
+ ) {
210
+ return null;
211
+ }
212
+ return this.excalidrawEmbed?.waitForAgentPaint(input.path, result.revision, {
213
+ afterRevision: preparation?.revision,
214
+ signal,
215
+ });
216
+ },
217
+ callTool: (name, input, options) => name === 'render_diagram'
218
+ ? renderWebMcpDiagram(input, {
219
+ callTool: callAgentTool,
220
+ getMermaid: () => this.previewRenderer.mermaidHydrator.ensureMermaid(),
221
+ signal: options?.signal,
222
+ })
223
+ : callAgentTool(name, input, options),
224
+ getActiveContext: () => ({
225
+ activeDiagramPath: this.isExcalidrawFile(this.currentFilePath)
226
+ ? this.currentFilePath
227
+ : null,
228
+ activePath: this.currentFilePath,
229
+ }),
230
+ getIsTabActive: () => this.isTabActive,
231
+ onDidMutate: () => {
232
+ this.toastController.show('Agent-assisted Vault change applied. Review it before committing.');
233
+ },
234
+ prepareToolCall: async ({ input, name, signal }) => {
235
+ if (
236
+ ![
237
+ 'edit_excalidraw',
238
+ 'inspect_excalidraw',
239
+ 'read_document',
240
+ 'verify_excalidraw',
241
+ ].includes(name)
242
+ || input.path !== this.currentFilePath
243
+ ) {
244
+ return null;
245
+ }
246
+ const preparation = await this.excalidrawEmbed?.flushPendingAgentWrites(input.path, { signal });
247
+ if (['timeout', 'unavailable'].includes(preparation?.status)) {
248
+ throw new Error('The active Excalidraw editor did not confirm its latest collaboration update');
249
+ }
250
+ return preparation;
251
+ },
252
+ });
169
253
  this.fileExplorer = new FileExplorerController({
170
254
  mobileBreakpointQuery: this.mobileBreakpointQuery,
171
255
  onDirectoryExport: (directoryPath, format) => this.handleDirectoryExportRequest(directoryPath, format),
@@ -180,6 +264,18 @@ export class CollabMdAppShell {
180
264
  showFileExtensions: this.preferences.getFileTreeShowExtensions(),
181
265
  toastController: this.toastController,
182
266
  vaultClient: this.vaultApiClient,
267
+ // ponytail: reload keeps the file hash, so the same path reopens in the new vault
268
+ vaultSwitcher: {
269
+ activeVaultId: getActiveVaultId(this.runtimeConfig),
270
+ vaults: this.runtimeConfig.vaults ?? [],
271
+ onVaultSelect: (vaultId) => {
272
+ if (!vaultId || vaultId === getActiveVaultId(this.runtimeConfig)) {
273
+ return;
274
+ }
275
+ setActiveVaultId(vaultId);
276
+ window.location.reload();
277
+ },
278
+ },
183
279
  });
184
280
  this.commentsOverview = new CommentOverviewController({
185
281
  onOverviewChange: (_overview, { threadCounts }) => {
@@ -201,7 +297,9 @@ export class CollabMdAppShell {
201
297
  onResetFile: (filePath, { scope }) => this.openGitResetDialog(filePath, { scope }),
202
298
  onSelectCommit: (hash, { path }) => this.handleGitCommitSelection(hash, { closeSidebarOnMobile: true, path }),
203
299
  onSelectDiff: (filePath, { scope }) => this.handleGitDiffSelection(filePath, { closeSidebarOnMobile: true, scope }),
300
+ onStageAll: () => this.stageAllGitFiles(),
204
301
  onStageFile: (filePath, { scope }) => this.stageGitFile(filePath, { scope }),
302
+ onUnstageAll: () => this.unstageAllGitFiles(),
205
303
  onUnstageFile: (filePath, { scope }) => this.unstageGitFile(filePath, { scope }),
206
304
  onViewAllDiff: () => this.handleGitDiffSelection(null, { closeSidebarOnMobile: true, scope: 'all' }),
207
305
  searchInput: this.elements.gitSearchInput,
@@ -242,6 +340,11 @@ export class CollabMdAppShell {
242
340
  this.previewRenderer = new PreviewRenderer({
243
341
  getContent: () => this.getPreviewSource(),
244
342
  getFileList: () => this.fileExplorer.flatDocumentFiles,
343
+ getPreviewVisible: () => (
344
+ Boolean(this._staticPreviewDocument)
345
+ || this.layoutController?.currentView !== 'editor'
346
+ ),
347
+ getTheme: () => this.themeController?.getTheme?.() ?? 'dark',
245
348
  getWikiLinkAutoCreate: () => this.runtimeConfig.wikiLinkAutoCreate !== false,
246
349
  loadFileSource: async (filePath) => {
247
350
  const payload = await this.vaultApiClient.readFile(filePath);
@@ -258,10 +361,10 @@ export class CollabMdAppShell {
258
361
  this.drawioEmbed.reconcileEmbeds(this.elements.previewContent);
259
362
  this.excalidrawEmbed.reconcileEmbeds(this.elements.previewContent, { isLargeDocument: stats.isLargeDocument });
260
363
  this.scrollSyncController.setLargeDocumentMode(stats.isLargeDocument);
261
- this.syncPreviewCodeCopyButtons();
262
364
  this.syncPreviewHeadingFoldButtons();
263
365
  this.syncPreviewHeadingLinkButtons();
264
366
  this.applyPendingPreviewRouteAnchor({ behavior: 'auto', clearMissing: true });
367
+
265
368
  this.schedulePreviewLayoutSync({ delayMs: 0 });
266
369
  this.refreshCommentUiLayout();
267
370
  },
@@ -276,11 +379,6 @@ export class CollabMdAppShell {
276
379
  this.schedulePreviewLayoutSync({ delayMs: 0 });
277
380
  this.refreshCommentUiLayout();
278
381
  },
279
- onRenderComplete: () => {
280
- this.applyPendingPreviewRouteAnchor({ allowExpired: true, behavior: 'auto', clearMissing: true });
281
- this.schedulePreviewLayoutSync({ delayMs: 0 });
282
- this.refreshCommentUiLayout();
283
- },
284
382
  outlineController: this.outlineController,
285
383
  plantUmlRenderClient: this.vaultApiClient,
286
384
  previewContainer: this.elements.previewContainer,
@@ -289,8 +387,16 @@ export class CollabMdAppShell {
289
387
  });
290
388
  this.themeController = new ThemeController({ onChange: (theme) => this.handleThemeChange(theme) });
291
389
  this.layoutController = new LayoutController({
390
+ preferredView: this.preferences.getViewMode() || 'split',
292
391
  mobileBreakpointQuery: this.mobileBreakpointQuery,
293
392
  onMeasureEditor: () => this.session?.requestMeasure(),
393
+ onPreferredViewChange: (view) => this.preferences.setViewMode(view),
394
+ onViewChange: () => {
395
+ if (!this.currentFilePath && !this._staticPreviewDocument) {
396
+ return;
397
+ }
398
+ this.previewRenderer.queueRender();
399
+ },
294
400
  onViewRequest: (view) => this.handleLayoutViewRequest(view),
295
401
  });
296
402
  this.scrollSyncController = new ScrollSyncController({
@@ -307,6 +413,7 @@ export class CollabMdAppShell {
307
413
  headerPanelElement: this.elements.backlinksHeaderPanel,
308
414
  inlinePanelElement: this.elements.backlinksInlinePanel,
309
415
  loadBacklinks: (filePath, options = {}) => this.vaultApiClient.readBacklinks(filePath, options),
416
+ onBeforeToggle: () => this.scrollSyncController.suspendSync(250),
310
417
  onFileSelect: (filePath) => this.workspaceRouteController.handleFileSelection(filePath, {
311
418
  closeSidebarOnMobile: true,
312
419
  }),
@@ -315,6 +422,11 @@ export class CollabMdAppShell {
315
422
  this.excalidrawEmbed = new ExcalidrawEmbedController({
316
423
  getLocalUser: () => this.lobby.getLocalUser(),
317
424
  getTheme: () => this.themeController.getTheme(),
425
+ onOpenElement: ({ elementId, elementType, filePath } = {}) => {
426
+ if (filePath && elementId) {
427
+ this.navigation.navigateToFile(filePath, { elementId, elementType });
428
+ }
429
+ },
318
430
  onOpenFile: (filePath) => filePath && this.navigation.navigateToFile(filePath),
319
431
  onStopFollowing: () => this.stopFollowingUser(),
320
432
  onToggleQuickSwitcher: () => {
@@ -344,7 +456,10 @@ export class CollabMdAppShell {
344
456
  commentsDrawerList: this.elements.commentsDrawerList,
345
457
  commentsToggleButton: this.elements.commentsToggleButton,
346
458
  editorContainer: this.elements.editorContainer,
347
- onWillOpenDrawer: () => this.outlineController.close(),
459
+ onWillOpenDrawer: () => {
460
+ this._deferredCollabStylesPromise ??= import('../styles/deferred-collab.css');
461
+ this.outlineController.close();
462
+ },
348
463
  previewContainer: this.elements.previewContainer,
349
464
  previewElement: this.elements.previewContent,
350
465
  onCreateThread: ({ anchor, body }) => this.createCommentThread({ anchor, body }),
@@ -473,6 +588,7 @@ export class CollabMdAppShell {
473
588
  }),
474
589
  getDisplayName: (filePath) => this.getDisplayName(filePath),
475
590
  getFileList: () => this.fileExplorer.flatDocumentFiles,
591
+ getVaultFileList: () => this.fileExplorer.flatFiles,
476
592
  getLineWrappingEnabled: () => this.getStoredLineWrapping(),
477
593
  getVimModeEnabled: () => this.getStoredVimMode(),
478
594
  getLocalUser: () => this.lobby.getLocalUser(),
@@ -496,6 +612,7 @@ export class CollabMdAppShell {
496
612
  onBeforeFileOpen: () => {
497
613
  clearTimeout(this._basePreviewRenderTimer);
498
614
  this._basePreviewRenderTimer = null;
615
+ this.connectWorkspaceSync?.();
499
616
  this.session = null;
500
617
  this.commentUi.attachSession(null);
501
618
  this.layoutController.reset();
@@ -506,7 +623,8 @@ export class CollabMdAppShell {
506
623
  this.clearInitialFileBootstrap();
507
624
  },
508
625
  onConnectionChange: (state) => this.handleConnectionChange(state),
509
- onContentChange: ({ isBase, isHtml, isMermaid, isPlantUml, isStructurizrWorkspace }) => {
626
+ onContentChange: ({ isBase, isHtml, isStructurizrWorkspace }) => {
627
+ void this.webMcpTools.refresh();
510
628
  this.handleCommentEditorContentChange();
511
629
  if (isHtml) {
512
630
  this.workspacePreviewController.renderHtmlFilePreview({
@@ -530,10 +648,16 @@ export class CollabMdAppShell {
530
648
  return;
531
649
  }
532
650
 
533
- this.previewRenderer.queueRender();
534
- if (!isMermaid && !isPlantUml) {
535
- this.scheduleBacklinkRefresh();
651
+ const markdownText = this.session?.getText?.() ?? '';
652
+ if (
653
+ !this.preferences.getViewMode()
654
+ && this.layoutController.currentView === 'split'
655
+ && isLargeDocumentStats(analyzeMarkdownComplexity(markdownText))
656
+ ) {
657
+ this.layoutController.setView('editor', { persist: false });
536
658
  }
659
+
660
+ this.previewRenderer.queueRender();
537
661
  },
538
662
  onCommentsChange: (threads) => this.handleCommentThreadsChange(threads),
539
663
  onFileAwarenessChange: (users) => this.updateFileAwareness(users),
@@ -642,7 +766,10 @@ export class CollabMdAppShell {
642
766
  }
643
767
 
644
768
  get session() { return this._session; }
645
- set session(value) { this._session = value; }
769
+ set session(value) {
770
+ this._session = value;
771
+ void this.webMcpTools?.refresh();
772
+ }
646
773
 
647
774
  publishFileOpenPerf() {
648
775
  if (typeof window === 'undefined') {
@@ -705,29 +832,15 @@ export class CollabMdAppShell {
705
832
  return this._editorSessionModulePromise;
706
833
  }
707
834
 
708
- scheduleEditorSessionPrewarm({ timeout = 1500 } = {}) {
709
- if (this._editorSessionModulePromise || this._editorSessionPrewarmHandle) {
710
- return;
711
- }
712
-
713
- const runPrewarm = () => {
714
- this._editorSessionPrewarmHandle = null;
715
- void this.loadEditorSessionClass();
716
- };
717
-
718
- if (typeof window.requestIdleCallback === 'function') {
719
- this._editorSessionPrewarmHandle = window.requestIdleCallback(runPrewarm, { timeout });
720
- return;
721
- }
722
-
723
- this._editorSessionPrewarmHandle = window.setTimeout(runPrewarm, 0);
724
- }
725
835
 
726
836
  loadQuickSwitcherController() {
727
- return import('../presentation/quick-switcher-controller.js')
728
- .then((module) => module.QuickSwitcherController);
837
+ return Promise.all([
838
+ import('../presentation/quick-switcher-controller.js'),
839
+ import('../styles/features/quick-switcher.css'),
840
+ ]).then(([module]) => module.QuickSwitcherController);
729
841
  }
730
842
 
843
+
731
844
  async ensureQuickSwitcher() {
732
845
  return ensureQuickSwitcherInstance(this);
733
846
  }
@@ -0,0 +1,90 @@
1
+ import { createRandomUser } from '../domain/room.js';
2
+
3
+ function createLazyClient(load) {
4
+ let impl = null;
5
+ let loadPromise = null;
6
+
7
+ function ensure() {
8
+ loadPromise ??= Promise.resolve().then(load).then((created) => {
9
+ impl = created;
10
+ return created;
11
+ });
12
+ return loadPromise;
13
+ }
14
+
15
+ return {
16
+ ensure,
17
+ getImpl: () => impl,
18
+ get provider() {
19
+ return impl?.provider ?? null;
20
+ },
21
+ connect() {
22
+ void ensure().then((client) => {
23
+ client.connect();
24
+ });
25
+ },
26
+ disconnect() {
27
+ impl?.disconnect();
28
+ },
29
+ destroy() {
30
+ impl?.destroy();
31
+ },
32
+ };
33
+ }
34
+
35
+ export function createLazyLobbyPresence(options = {}) {
36
+ let currentFile = null;
37
+ let localUser = createRandomUser(options.preferredUserName);
38
+ const client = createLazyClient(async () => {
39
+ const { LobbyPresence } = await import('../infrastructure/lobby-presence.js');
40
+ const impl = new LobbyPresence({
41
+ ...options,
42
+ preferredUserName: localUser.name,
43
+ });
44
+ impl.localUser = localUser;
45
+ if (currentFile) {
46
+ impl.setCurrentFile(currentFile);
47
+ }
48
+ return impl;
49
+ });
50
+
51
+ return {
52
+ get provider() {
53
+ return client.provider;
54
+ },
55
+ connect: () => client.connect(),
56
+ disconnect: () => client.disconnect(),
57
+ destroy: () => client.destroy(),
58
+ getConnectionState() {
59
+ return client.getImpl()?.getConnectionState?.()
60
+ ?? { status: 'connecting', unreachable: false };
61
+ },
62
+ setCurrentFile(filePath) {
63
+ currentFile = filePath;
64
+ client.getImpl()?.setCurrentFile(filePath);
65
+ },
66
+ setUserName(name) {
67
+ if (!name) {
68
+ return;
69
+ }
70
+ localUser = { ...localUser, name };
71
+ client.getImpl()?.setUserName(name);
72
+ },
73
+ getLocalUser() {
74
+ return client.getImpl()?.getLocalUser() ?? localUser;
75
+ },
76
+ sendChatMessage(text) {
77
+ return client.getImpl()?.sendChatMessage(text) ?? null;
78
+ },
79
+ sendWorkspaceEvent(payload) {
80
+ return client.getImpl()?.sendWorkspaceEvent(payload);
81
+ },
82
+ };
83
+ }
84
+
85
+ export function createLazyWorkspaceSyncClient(options = {}) {
86
+ return createLazyClient(async () => {
87
+ const { WorkspaceSyncClient } = await import('../infrastructure/workspace-sync-client.js');
88
+ return new WorkspaceSyncClient(options);
89
+ });
90
+ }
@@ -0,0 +1,73 @@
1
+ import { createFileRouteHash, getHashParamsFromRaw } from './hash-routes.js';
2
+ import { normalizeVaultPathInput } from './vault-paths.js';
3
+
4
+ const MAX_ELEMENT_ID_LENGTH = 256;
5
+ const ELEMENT_ID_PATTERN = /^[A-Za-z0-9_-]+$/u;
6
+
7
+ function normalizeElementId(value) {
8
+ const normalized = String(value ?? '').trim();
9
+ return normalized.length <= MAX_ELEMENT_ID_LENGTH && ELEMENT_ID_PATTERN.test(normalized)
10
+ ? normalized
11
+ : '';
12
+ }
13
+
14
+ function normalizeUrlPath(value) {
15
+ const normalized = String(value ?? '').trim().replace(/\/+$/u, '');
16
+ return normalized || '/';
17
+ }
18
+
19
+ export function createExcalidrawElementLink(filePath, elementId, {
20
+ appUrl,
21
+ elementType = 'element',
22
+ } = {}) {
23
+ const normalizedFilePath = normalizeVaultPathInput(filePath);
24
+ const normalizedElementId = normalizeElementId(elementId);
25
+ if (!normalizedFilePath || !normalizedElementId || !appUrl) {
26
+ return '';
27
+ }
28
+
29
+ let url;
30
+ try {
31
+ url = new URL(appUrl);
32
+ } catch {
33
+ return '';
34
+ }
35
+
36
+ url.hash = createFileRouteHash(normalizedFilePath, {
37
+ elementId: normalizedElementId,
38
+ elementType,
39
+ });
40
+ return url.toString();
41
+ }
42
+
43
+ export function parseExcalidrawElementLink(link, {
44
+ appPath = '/',
45
+ origin = '',
46
+ } = {}) {
47
+ let url;
48
+ try {
49
+ url = new URL(String(link ?? ''), origin || 'http://collabmd.invalid');
50
+ } catch {
51
+ return null;
52
+ }
53
+
54
+ if (origin && url.origin !== origin) {
55
+ return null;
56
+ }
57
+ if (normalizeUrlPath(url.pathname) !== normalizeUrlPath(appPath)) {
58
+ return null;
59
+ }
60
+
61
+ const params = getHashParamsFromRaw(url.hash);
62
+ const filePath = normalizeVaultPathInput(params.get('file'));
63
+ const elementId = normalizeElementId(params.get('element'));
64
+ if (!filePath || !elementId) {
65
+ return null;
66
+ }
67
+
68
+ return {
69
+ elementId,
70
+ elementType: params.get('elementType') === 'group' ? 'group' : 'element',
71
+ filePath,
72
+ };
73
+ }
@@ -1,5 +1,6 @@
1
1
  export function buildReconciledExcalidrawSceneUpdate({
2
2
  appStateOverrides = {},
3
+ authoritative = false,
3
4
  currentAppState,
4
5
  currentElements = [],
5
6
  documentViewState = {},
@@ -10,7 +11,7 @@ export function buildReconciledExcalidrawSceneUpdate({
10
11
  scene,
11
12
  theme = 'dark',
12
13
  } = {}) {
13
- const restoredElements = restoreElementsFn(scene?.elements || [], currentElements, {
14
+ const restoredElements = restoreElementsFn(scene?.elements || [], authoritative ? [] : currentElements, {
14
15
  repairBindings: true,
15
16
  });
16
17
  const restoredAppState = restoreAppStateFn(scene?.appState || {}, currentAppState);
@@ -27,7 +28,9 @@ export function buildReconciledExcalidrawSceneUpdate({
27
28
  )),
28
29
  );
29
30
  const update = {
30
- elements: reconcileElementsFn(currentElements, restoredElements, currentAppState),
31
+ elements: authoritative
32
+ ? restoredElements
33
+ : reconcileElementsFn(currentElements, restoredElements, currentAppState),
31
34
  };
32
35
 
33
36
  if (Object.keys(appStateUpdate).length > 0) {
@@ -63,6 +63,27 @@ export function sceneToInitialData(parsedScene, { theme = 'dark' } = {}) {
63
63
  };
64
64
  }
65
65
 
66
+ export function createExcalidrawExportOptions(scene, {
67
+ padding = 24,
68
+ scale = 1,
69
+ } = {}) {
70
+ return {
71
+ appState: {
72
+ exportBackground: true,
73
+ exportScale: scale,
74
+ exportWithDarkMode: false,
75
+ gridSize: scene.appState?.gridSize ?? null,
76
+ theme: 'light',
77
+ viewBackgroundColor: scene.appState?.viewBackgroundColor ?? '#ffffff',
78
+ },
79
+ elements: Array.isArray(scene.elements)
80
+ ? scene.elements.filter((element) => element && !element.isDeleted)
81
+ : [],
82
+ exportPadding: padding,
83
+ files: scene.files || null,
84
+ };
85
+ }
86
+
66
87
  export function buildStoredScene(elements, appState, files) {
67
88
  return normalizeScene({
68
89
  elements: elements.filter((element) => !element.isDeleted),
@@ -9,6 +9,11 @@ export const HASH_ROUTE_KEYS = Object.freeze({
9
9
  gitHistory: 'git-history',
10
10
  });
11
11
 
12
+ export function isGitHashRouteType(type) {
13
+ return String(type ?? '').startsWith('git-');
14
+ }
15
+
16
+
12
17
  export function getHashParamsFromRaw(hash = '') {
13
18
  const rawHash = String(hash ?? '');
14
19
  const normalizedHash = rawHash.startsWith('#')
@@ -38,6 +43,8 @@ export function createFileRouteHash(filePath, {
38
43
  anchor = null,
39
44
  column = null,
40
45
  drawioMode = null,
46
+ elementId = null,
47
+ elementType = null,
41
48
  line = null,
42
49
  matchLength = null,
43
50
  } = {}) {
@@ -51,6 +58,12 @@ export function createFileRouteHash(filePath, {
51
58
  if (anchor) {
52
59
  params.set('anchor', String(anchor).trim());
53
60
  }
61
+ if (elementId) {
62
+ params.set('element', String(elementId).trim());
63
+ }
64
+ if (elementType === 'group') {
65
+ params.set('elementType', 'group');
66
+ }
54
67
  if (line != null) {
55
68
  params.set('line', String(Math.max(1, Math.round(Number(line) || 1))));
56
69
  }
@@ -0,0 +1,47 @@
1
+ import hljs from 'highlight.js/lib/core';
2
+ import bash from 'highlight.js/lib/languages/bash';
3
+ import css from 'highlight.js/lib/languages/css';
4
+ import javascript from 'highlight.js/lib/languages/javascript';
5
+ import json from 'highlight.js/lib/languages/json';
6
+ import markdown from 'highlight.js/lib/languages/markdown';
7
+ import python from 'highlight.js/lib/languages/python';
8
+ import sql from 'highlight.js/lib/languages/sql';
9
+ import typescript from 'highlight.js/lib/languages/typescript';
10
+ import xml from 'highlight.js/lib/languages/xml';
11
+ import yaml from 'highlight.js/lib/languages/yaml';
12
+
13
+ export const AUTO_HIGHLIGHT_LANGUAGES = [
14
+ 'bash',
15
+ 'css',
16
+ 'javascript',
17
+ 'json',
18
+ 'markdown',
19
+ 'python',
20
+ 'sql',
21
+ 'typescript',
22
+ 'xml',
23
+ 'yaml',
24
+ ];
25
+
26
+ hljs.registerLanguage('bash', bash);
27
+ hljs.registerLanguage('css', css);
28
+ hljs.registerLanguage('javascript', javascript);
29
+ hljs.registerLanguage('json', json);
30
+ hljs.registerLanguage('markdown', markdown);
31
+ hljs.registerLanguage('python', python);
32
+ hljs.registerLanguage('sql', sql);
33
+ hljs.registerLanguage('typescript', typescript);
34
+ hljs.registerLanguage('xml', xml);
35
+ hljs.registerLanguage('yaml', yaml);
36
+ hljs.registerAliases(['cql', 'mariadb', 'mssql', 'mysql', 'plsql', 'sqlite'], { languageName: 'sql' });
37
+ hljs.registerAliases(['ecmascript', 'node'], { languageName: 'javascript' });
38
+
39
+ export { hljs };
40
+
41
+ export function highlightFence(source, language, { ignoreIllegals = false } = {}) {
42
+ if (language && hljs.getLanguage(language)) {
43
+ return hljs.highlight(source, { ignoreIllegals, language }).value;
44
+ }
45
+
46
+ return hljs.highlightAuto(source, AUTO_HIGHLIGHT_LANGUAGES).value;
47
+ }
@@ -0,0 +1,2 @@
1
+ export const LOBBY_CHAT_MESSAGE_MAX_LENGTH = 280;
2
+ export const LOBBY_CHAT_MAX_MESSAGES = 40;
@@ -47,11 +47,7 @@ export function generatePeerId() {
47
47
  }
48
48
 
49
49
  function generateUserId() {
50
- if (globalThis.crypto?.randomUUID) {
51
- return globalThis.crypto.randomUUID();
52
- }
53
-
54
- return `${generatePeerId()}-${Date.now().toString(36)}`;
50
+ return globalThis.crypto?.randomUUID?.() ?? `${generatePeerId()}-${Date.now().toString(36)}`;
55
51
  }
56
52
 
57
53
  // A stable peer ID for this browser tab, shared across lobby and per-file sessions.