collabmd 0.1.51 → 0.1.52

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 (584) hide show
  1. package/README.md +1 -1
  2. package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-BEz2BKN1.js +1 -0
  3. package/dist/client/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  4. package/dist/client/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  5. package/dist/client/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  6. package/dist/client/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  7. package/dist/client/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  8. package/dist/client/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  9. package/dist/client/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  10. package/dist/client/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  11. package/dist/client/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  12. package/dist/client/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  13. package/dist/client/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  14. package/dist/client/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  15. package/dist/client/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  16. package/dist/client/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  17. package/dist/client/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  18. package/dist/client/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  19. package/dist/client/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  20. package/dist/client/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  21. package/dist/client/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  22. package/dist/client/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  23. package/dist/client/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  24. package/dist/client/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  25. package/dist/client/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  26. package/dist/client/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  27. package/dist/client/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  28. package/dist/client/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  29. package/dist/client/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  30. package/dist/client/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  31. package/dist/client/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  32. package/dist/client/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  33. package/dist/client/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  34. package/dist/client/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  35. package/dist/client/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  36. package/dist/client/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  37. package/dist/client/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  38. package/dist/client/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  39. package/dist/client/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  40. package/dist/client/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  41. package/dist/client/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  42. package/dist/client/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  43. package/dist/client/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  44. package/dist/client/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  45. package/dist/client/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  46. package/dist/client/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  47. package/dist/client/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  48. package/dist/client/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  49. package/dist/client/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  50. package/dist/client/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  51. package/dist/client/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  52. package/dist/client/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  53. package/dist/client/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  54. package/dist/client/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  55. package/dist/client/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  56. package/dist/client/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  57. package/dist/client/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  58. package/dist/client/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  59. package/dist/client/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  60. package/dist/client/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  61. package/dist/client/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  62. package/dist/client/assets/Middleware-DUgFSleI.js +1 -0
  63. package/dist/client/assets/_basePickBy-QJXUw_pr.js +1 -0
  64. package/dist/client/assets/_baseUniq-DR4vVjyC.js +1 -0
  65. package/dist/client/assets/abnfDiagram-O67JEVCF-Dwt6a0Ds.js +1 -0
  66. package/dist/client/assets/abnfDiagram-VCTEODGH-DxNxad6-.js +1 -0
  67. package/dist/client/assets/architecture-7GRP2DOG-BBwRXFv3.js +1 -0
  68. package/dist/client/assets/architecture-7GRP2DOG-DJVtYNt-.js +1 -0
  69. package/dist/client/assets/architectureDiagram-5GKGNRK7-C1uvg5id.js +36 -0
  70. package/dist/client/assets/architectureDiagram-NJMV4G6O-D5CGiX3G.js +36 -0
  71. package/dist/client/assets/{babel-CY5KOv-I.js → babel-Bi_28hhi.js} +1 -1
  72. package/dist/client/assets/band-D-Cum8PO.js +1 -0
  73. package/dist/client/assets/blockDiagram-BEXU5L5S-BgTM0var.js +140 -0
  74. package/dist/client/assets/blockDiagram-I7D4REHJ-B2YonsoG.js +129 -0
  75. package/dist/client/assets/{browser-BKLM0ThC-IxjwuOIz-DyJcVMFR.js → browser-BKLM0ThC-IxjwuOIz-C0mP17s1.js} +1 -1
  76. package/dist/client/assets/{browser-utils-DbXSMI-6.js → browser-utils-vlHL9goC.js} +1 -1
  77. package/dist/client/assets/{c4Diagram-7LVT6UL2-VAk1HPmz.js → c4Diagram-7LVT6UL2-r4IwomZm.js} +2 -2
  78. package/dist/client/assets/c4Diagram-YGBWAQC7-_xZPrNkB.js +38 -0
  79. package/dist/client/assets/channel-CgcHBnmr.js +1 -0
  80. package/dist/client/assets/chunk-2E4U76K2-CIQUuV9n.js +1 -0
  81. package/dist/client/assets/chunk-2Q5K7J3B-BMFG3ur0.js +1 -0
  82. package/dist/client/assets/{chunk-2ZTRR5NV-C2qZJila.js → chunk-2ZTRR5NV-CnDP55cn.js} +1 -1
  83. package/dist/client/assets/chunk-2ZTRR5NV-DcPRfelM.js +2 -0
  84. package/dist/client/assets/chunk-3FUC2YCW-8tZlhTGX.js +1 -0
  85. package/dist/client/assets/{chunk-3Z5EZCMW-DMniOlPd.js → chunk-3Z5EZCMW-BAnA6eQ7.js} +1 -1
  86. package/dist/client/assets/chunk-3Z5EZCMW-Yx4Q5AcN.js +1 -0
  87. package/dist/client/assets/chunk-4HAMMTFA-q0ldNVvr.js +62 -0
  88. package/dist/client/assets/chunk-4SOEAONT-C3fufoVl.js +40 -0
  89. package/dist/client/assets/chunk-5DYCD2WN-BKWCKnK-.js +1 -0
  90. package/dist/client/assets/{chunk-5V3GS4D5-i-ZDOEnP.js → chunk-5V3GS4D5-B5uC2oxu.js} +1 -1
  91. package/dist/client/assets/chunk-5V3GS4D5-BR7kgIgJ.js +1 -0
  92. package/dist/client/assets/chunk-5VM5RSS4-hE9rU_bl.js +15 -0
  93. package/dist/client/assets/chunk-6AEJRKK7-DTVZj5bY.js +1 -0
  94. package/dist/client/assets/{chunk-6AZGARVD-BB6FqMl-.js → chunk-6AZGARVD--pTGpDnx.js} +1 -1
  95. package/dist/client/assets/chunk-6AZGARVD-CnZDr4Cj.js +1 -0
  96. package/dist/client/assets/{chunk-6EIED4P4-DdUJkP0f.js → chunk-6EIED4P4-Bp8dpTvX.js} +1 -1
  97. package/dist/client/assets/chunk-6EIED4P4-DBVWq7Tz.js +1 -0
  98. package/dist/client/assets/{chunk-6K3QC6MW-CqVsVn-y.js → chunk-6K3QC6MW-DGVRzL6v.js} +1 -1
  99. package/dist/client/assets/chunk-6K3QC6MW-JnuvEGV4.js +1 -0
  100. package/dist/client/assets/{chunk-6TQVIW2G-DKlLbNIP.js → chunk-6TQVIW2G-BSj0l_pu.js} +1 -1
  101. package/dist/client/assets/chunk-6TQVIW2G-DgBX-Pv0.js +1 -0
  102. package/dist/client/assets/chunk-742MDFTN-D1nh6vNv.js +1 -0
  103. package/dist/client/assets/{chunk-747NJXEK-BFkZPlab.js → chunk-747NJXEK-BjqqAsS9.js} +1 -1
  104. package/dist/client/assets/chunk-747NJXEK-Cur1aosP.js +2 -0
  105. package/dist/client/assets/chunk-75Z2AOVW-DitkSoSG.js +2 -0
  106. package/dist/client/assets/chunk-7INBJB4K-CDmiHbaX.js +62 -0
  107. package/dist/client/assets/chunk-7M6MHVWA-BDakkknV.js +213 -0
  108. package/dist/client/assets/chunk-7PRAP22T-9uTvtc_-.js +1 -0
  109. package/dist/client/assets/{chunk-CLGD4ZFX-Cmtx89ht.js → chunk-CLGD4ZFX-BfYJtJm1.js} +1 -1
  110. package/dist/client/assets/chunk-DU6HZSFF-CWlP1Dk_.js +125 -0
  111. package/dist/client/assets/chunk-DUW6YSOI-Dgx8z5s3.js +1 -0
  112. package/dist/client/assets/chunk-DYU5D34O-DN0WQZBm.js +1 -0
  113. package/dist/client/assets/{chunk-F27PBJKO-Dg3H6KLL.js → chunk-F27PBJKO-DPcsPcEs.js} +1 -1
  114. package/dist/client/assets/{chunk-FOHPRMQF-DHwB1DNv.js → chunk-FOHPRMQF-Dmmo5Kak.js} +9 -9
  115. package/dist/client/assets/chunk-FOHPRMQF-DzxwRta7.js +161 -0
  116. package/dist/client/assets/chunk-GMAD6QVW-Bgk8qnty.js +8 -0
  117. package/dist/client/assets/chunk-GNY47TPC-CTrH5O5R.js +1 -0
  118. package/dist/client/assets/{chunk-SVP7TREG-XlsB_ZMZ.js → chunk-GTNCS2PH-ChgkzEIi.js} +1 -1
  119. package/dist/client/assets/chunk-GVQU2GXP-CQ8cl-Uu.js +1 -0
  120. package/dist/client/assets/chunk-GWA4HPMP-CGmv2yIq.js +1 -0
  121. package/dist/client/assets/{chunk-I5DQTOEV-Hm2LfiYI.js → chunk-I5DQTOEV-B98XA8VK.js} +1 -1
  122. package/dist/client/assets/chunk-I5DQTOEV-aBZooNp1.js +1 -0
  123. package/dist/client/assets/{chunk-ICYGCRZG-749o-pGJ.js → chunk-ICYGCRZG-D97UeqJs.js} +1 -1
  124. package/dist/client/assets/chunk-ICYGCRZG-odvlDZyA.js +1 -0
  125. package/dist/client/assets/{chunk-IH6LHLGP-CC6I9F3i.js → chunk-IH6LHLGP-BNevEHZK.js} +1 -1
  126. package/dist/client/assets/chunk-IH6LHLGP-CvXe34hB.js +1 -0
  127. package/dist/client/assets/{chunk-IMKFNOWR-3F6NhHUP.js → chunk-IMKFNOWR-CBqxfpcP.js} +2 -2
  128. package/dist/client/assets/chunk-J5ZVWO5B-oDCd-gWO.js +1 -0
  129. package/dist/client/assets/chunk-JWPE2WC7-GDilnS5Y.js +1 -0
  130. package/dist/client/assets/{chunk-KI3K4JFJ-Rma-0k_M.js → chunk-KI3K4JFJ-D5XCPRZv.js} +1 -1
  131. package/dist/client/assets/chunk-KI3K4JFJ-FTtDwx3-.js +1 -0
  132. package/dist/client/assets/chunk-L3NEJ4N5-BflzkdTI.js +1 -0
  133. package/dist/client/assets/{chunk-LNGE3PJU-DWpGwHrW.js → chunk-LNGE3PJU-5-SxdO55.js} +1 -1
  134. package/dist/client/assets/chunk-LNGE3PJU-5nWSl6jJ.js +34 -0
  135. package/dist/client/assets/chunk-MBY4JIJT-DTJ4UcAm.js +8 -0
  136. package/dist/client/assets/chunk-NETBCI7D-CmUwDWUZ.js +1 -0
  137. package/dist/client/assets/chunk-O7XYJQB3-D0_ZY2za.js +126 -0
  138. package/dist/client/assets/chunk-OSK3NFVY-DqeKV_pg.js +10 -0
  139. package/dist/client/assets/{chunk-OUJLGHUK-D0j2JRSg.js → chunk-OUJLGHUK-75UXlPjl.js} +1 -1
  140. package/dist/client/assets/chunk-OUJLGHUK-DA95-S9B.js +2 -0
  141. package/dist/client/assets/{chunk-P2QGCYS3-Du8EtwOa.js → chunk-P2QGCYS3-BA--DhpW.js} +1 -1
  142. package/dist/client/assets/chunk-POPQ4Y6H-V_NEc45n.js +1 -0
  143. package/dist/client/assets/chunk-PWAF6VOD-D_kLse-N.js +1 -0
  144. package/dist/client/assets/{chunk-ZPMXAHWN-Dt0TxJa6.js → chunk-RUX4WMZV-BGnd3s_C.js} +4 -4
  145. package/dist/client/assets/{chunk-SHT3W25Y-BKaI8jZO.js → chunk-SHT3W25Y-YM3S-A_M.js} +5 -5
  146. package/dist/client/assets/chunk-SVP7TREG-DdNhDOmW.js +88 -0
  147. package/dist/client/assets/{chunk-TICWLB2K-Cpp2z8yK.js → chunk-TICWLB2K-BGGgCr4x.js} +3 -3
  148. package/dist/client/assets/chunk-TLUHSLCS-DCZhIDYA.js +1 -0
  149. package/dist/client/assets/chunk-UA2S7LBM-DicYDjDM.js +1 -0
  150. package/dist/client/assets/{chunk-UY3FDG6J-CnmaAkG5.js → chunk-UY3FDG6J-DqSM_0FB.js} +1 -1
  151. package/dist/client/assets/chunk-UY3FDG6J-QT-rkt0y.js +1 -0
  152. package/dist/client/assets/chunk-WEXAMYUT-DDlVNp8J.js +1 -0
  153. package/dist/client/assets/chunk-X3CZISLH-BixgQztF.js +1 -0
  154. package/dist/client/assets/chunk-X3CZISLH-DwWpRaN8.js +1 -0
  155. package/dist/client/assets/{chunk-XHIXRSVI-BFQ6B8BE.js → chunk-XHIXRSVI-BSN7JlfK.js} +1 -1
  156. package/dist/client/assets/chunk-XHIXRSVI-DN_fEwws.js +1 -0
  157. package/dist/client/assets/chunk-XXDRQBXY-C7hQHDmQ.js +1 -0
  158. package/dist/client/assets/{chunk-XXDRQBXY-BvKO0v-W.js → chunk-XXDRQBXY-CdRN9Akd.js} +1 -1
  159. package/dist/client/assets/chunk-Y2CYZVJY-BbRBGnmc.js +1 -0
  160. package/dist/client/assets/chunk-Z7XXMR3K-P4Vaq8hD.js +10 -0
  161. package/dist/client/assets/chunk-ZIGJFQKS-b8OUHKK5.js +2 -0
  162. package/dist/client/assets/classDiagram-ZZMXUADV-QLbh_Nkf.js +1 -0
  163. package/dist/client/assets/classDiagram-v2-NBCMYWYE-3TQORq33.js +217 -0
  164. package/dist/client/assets/classDiagram-v2-VYDZK3BY-QLbh_Nkf.js +1 -0
  165. package/dist/client/assets/clone-C1hp9FUh.js +1 -0
  166. package/dist/client/assets/comment-markdown-renderer-Bxi_JRSR.js +1 -0
  167. package/dist/client/assets/comment-thread-store-CHvy8GF8.js +1 -0
  168. package/dist/client/assets/cose-bilkent-JH36ORCC-Czr0rwGr.js +1 -0
  169. package/dist/client/assets/cose-bilkent-JH36ORCC-DLmEf9HS.js +1 -0
  170. package/dist/client/assets/cynefin-OW5HDTMX-CF3N9j1_.js +1 -0
  171. package/dist/client/assets/cynefin-OW5HDTMX-e-Quc9Yl.js +1 -0
  172. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-DTnLZaO7.js +62 -0
  173. package/dist/client/assets/cynefinDiagram-VND7K2PF-DwfMZ3vk.js +62 -0
  174. package/dist/client/assets/cytoscape-cose-bilkent-NdTYBUiT.js +1 -0
  175. package/dist/client/assets/cytoscape-fcose-DE9_QRG_.js +1 -0
  176. package/dist/client/assets/cytoscape.esm-EK2DW5Qr.js +321 -0
  177. package/dist/client/assets/dagre-6A5THRUB-DewyAGK6.js +4 -0
  178. package/dist/client/assets/dagre-D7FiCLLP.js +1 -0
  179. package/dist/client/assets/{dagre-GXQ25YYZ-BSfKCfy7.js → dagre-GXQ25YYZ-Vtyx08Qh.js} +2 -2
  180. package/dist/client/assets/deferred-collab-D4cxEdad.css +1 -0
  181. package/dist/client/assets/deferred-preview-BAXYgf4T.css +1 -0
  182. package/dist/client/assets/diagram-22UHCM2B-DbZirFfl.js +200 -0
  183. package/dist/client/assets/diagram-3UASUU5V-DmhdYv6_.js +24 -0
  184. package/dist/client/assets/diagram-ATOU4E4O-B5uX-jVO.js +3 -0
  185. package/dist/client/assets/diagram-CDSNMT55-D_qyS11R.js +30 -0
  186. package/dist/client/assets/diagram-MLGK6HIB-DIBG6Ivu.js +24 -0
  187. package/dist/client/assets/diagram-MPIPVDR6-D9XsALDV.js +41 -0
  188. package/dist/client/assets/{diagram-S7CK7UJ4-D7KaM9yj.js → diagram-S7CK7UJ4-CGTzfo2f.js} +3 -3
  189. package/dist/client/assets/diagram-UQ7AKVKN-CWZS8QtB.js +41 -0
  190. package/dist/client/assets/{diagram-VSXAHHWV-B3-U-Q2E.js → diagram-VSXAHHWV-DaO1nOZF.js} +3 -3
  191. package/dist/client/assets/diagram-VX7I27RA-B54P6Cyf.js +24 -0
  192. package/dist/client/assets/diagram-Z3DM3KII-Cl2EXiXp.js +24 -0
  193. package/dist/client/assets/direct-engine-DdrQKpgq-4QysbH_V.js +5 -0
  194. package/dist/client/assets/dist-B7fBbwrO.js +1 -0
  195. package/dist/client/assets/{dist-DVXzbeDx.js → dist-BVCNc-Es.js} +1 -1
  196. package/dist/client/assets/dist-BYBF4LtZ.js +1 -0
  197. package/dist/client/assets/{dist-B_B4XLmq.js → dist-B_1hMrc6.js} +1 -1
  198. package/dist/client/assets/{dist-EWJYvBK1.js → dist-BfpAc922.js} +1 -1
  199. package/dist/client/assets/dist-BnVaoRgZ.js +1 -0
  200. package/dist/client/assets/{dist-kiD2GIsD.js → dist-Bog8M5U3.js} +6 -6
  201. package/dist/client/assets/dist-CAG5sIOj.js +1 -0
  202. package/dist/client/assets/{dist-CrWzIWEE.js → dist-CKf7LlAo.js} +1 -1
  203. package/dist/client/assets/{dist-CqXVyYoH.js → dist-CUsXdnU4.js} +1 -1
  204. package/dist/client/assets/{dist-B7XMN9AT.js → dist-CXOUa90Q.js} +1 -1
  205. package/dist/client/assets/dist-CYMCikZo.js +1 -0
  206. package/dist/client/assets/dist-CYfPeupF.js +1 -0
  207. package/dist/client/assets/dist-Ch6Sr9KF.js +28 -0
  208. package/dist/client/assets/dist-Ck-B8onw.js +2 -0
  209. package/dist/client/assets/dist-CrkYYcOU.js +1 -0
  210. package/dist/client/assets/{dist-BR81yxMt.js → dist-CsQTfQFi.js} +1 -1
  211. package/dist/client/assets/dist-Cu5Ze2cs.js +6 -0
  212. package/dist/client/assets/{dist-Drv_wZYC.js → dist-CvVoyTRF.js} +1 -1
  213. package/dist/client/assets/{dist-CbDyXgCo.js → dist-D4kDR0g8.js} +1 -1
  214. package/dist/client/assets/dist-D8LnhZzy.js +1 -0
  215. package/dist/client/assets/{dist-CELhfKzh.js → dist-DGa-2MNX.js} +2 -2
  216. package/dist/client/assets/{dist-CO0-4CuV.js → dist-DI6c02Da.js} +8 -8
  217. package/dist/client/assets/{dist-DJAMplZI.js → dist-DNONgI1P.js} +2 -2
  218. package/dist/client/assets/dist-DVBYH83t.js +1 -0
  219. package/dist/client/assets/dist-DX6qtdxv.js +1 -0
  220. package/dist/client/assets/{dist-Bx3QkS-3.js → dist-Da-jLrCf.js} +1 -1
  221. package/dist/client/assets/dist-DofvCYzJ.js +1 -0
  222. package/dist/client/assets/{dist-BzFSJM0U.js → dist-Dx37MHWs.js} +1 -1
  223. package/dist/client/assets/{dist-Bdy9ZRzd.js → dist-GTGhtpyW.js} +1 -1
  224. package/dist/client/assets/{dist-nxQErAaK.js → dist-W0FoeIxk.js} +9 -9
  225. package/dist/client/assets/{dist-By7ieqAf.js → dist-Y6zYRI-A.js} +1 -1
  226. package/dist/client/assets/{dist-Bfxzlnrf.js → dist-jVKfryIL.js} +1 -1
  227. package/dist/client/assets/{dist-DCpIH3-_.js → dist-zHDLm1oE.js} +1 -1
  228. package/dist/client/assets/{document-formatter-Qdiq9uJs.js → document-formatter-gO8qM2qY.js} +1 -1
  229. package/dist/client/assets/{drawioEditor-CHf1vtdQ.js → drawioEditor-DCkWweiy.js} +2 -2
  230. package/dist/client/assets/duration-BiuFXtXd.js +1 -0
  231. package/dist/client/assets/ebnfDiagram-PWID7BFC-PfC84FyI.js +1 -0
  232. package/dist/client/assets/ebnfDiagram-ZINNZB2B-DYvm_QtE.js +1 -0
  233. package/dist/client/assets/editor-session-DxRyr4EM.js +14 -0
  234. package/dist/client/assets/elk-276RUBZZ-B8LB3Pac.js +27 -0
  235. package/dist/client/assets/embedded-editor-base-elU0Avik.css +1 -0
  236. package/dist/client/assets/{embedpdf-DA4bA119-E8wZ11J2.js → embedpdf-DA4bA119-DsoNiPlQ.js} +4 -4
  237. package/dist/client/assets/{embedpdf-LUXDBD3-.js → embedpdf-DyOonRvx.js} +1 -1
  238. package/dist/client/assets/{en-2RFA324Y-BsuNJTcL.js → en-GNC3RJIS-CEy_oGTd.js} +1 -1
  239. package/dist/client/assets/erDiagram-OPXOYQCR-o8GRv8A_.js +99 -0
  240. package/dist/client/assets/{erDiagram-RLTQ6QDP-CWrH1UJ9.js → erDiagram-RLTQ6QDP-C9cJl5NB.js} +2 -2
  241. package/dist/client/assets/esm-BzZ1JFVo.js +65 -0
  242. package/dist/client/assets/{estree-CuT_pB8K.js → estree-DCT3Jm65.js} +4 -4
  243. package/dist/client/assets/eventmodeling-NTZA5JFV-CDy1bN6j.js +1 -0
  244. package/dist/client/assets/eventmodeling-NTZA5JFV-Dxtv5D-P.js +1 -0
  245. package/dist/client/assets/{excalidraw-element-link-iA6zo0_f.js → excalidraw-element-link-CGZ5934B.js} +1 -1
  246. package/dist/client/assets/{excalidrawEditor-DDE0n1Pk.css → excalidrawEditor-BCTFp_CV.css} +1 -1
  247. package/dist/client/assets/excalidrawEditor-BVfSxjSO.js +9 -0
  248. package/dist/client/assets/export-page-BCo_e15t.js +46 -0
  249. package/dist/client/assets/exportDocument-Ba-n1X4U.css +1 -0
  250. package/dist/client/assets/exportDocument-DP6oE_or.js +2 -0
  251. package/dist/client/assets/{fa-IR-FIYUE2GQ-C865Nx3X.js → fa-IR-I4JNTJHK-CFtHZqoT.js} +1 -1
  252. package/dist/client/assets/file-search-3hYF4cYa.js +1 -0
  253. package/dist/client/assets/flowDiagram-HODETNUW-Bq4470NR.js +1 -0
  254. package/dist/client/assets/flowDiagram-KWPJA3E3-DQG9qGiU.js +1 -0
  255. package/dist/client/assets/forth-D6RzAl64.js +1 -0
  256. package/dist/client/assets/ganttDiagram-EL5Y4UJY-x40PW0Ah.js +292 -0
  257. package/dist/client/assets/ganttDiagram-FUAMR5RP-BQpsI7gQ.js +292 -0
  258. package/dist/client/assets/gitGraph-4MIJSDKK-B-rpDYbz.js +1 -0
  259. package/dist/client/assets/gitGraph-4MIJSDKK-ZaBIE4Lb.js +1 -0
  260. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-ahsNaZsp.js +106 -0
  261. package/dist/client/assets/gitGraphDiagram-X574FWY7-wbs_2m9f.js +106 -0
  262. package/dist/client/assets/graphlib-C9Tl7QrK.js +1 -0
  263. package/dist/client/assets/{html-Cdnr2qzU.js → html-CBXMuS97.js} +2 -2
  264. package/dist/client/assets/html-DTuc_pxj.js +1 -0
  265. package/dist/client/assets/{id-ID-EOMR5R3I-CGQwUjoL.js → id-ID-2WY7E4VX-CCAeQpPr.js} +2 -2
  266. package/dist/client/assets/image-EJJKRVD3-BQfi5nWJ.js +1 -0
  267. package/dist/client/assets/{image-blob-reduce.esm-Dj7YBvMv.js → image-blob-reduce.esm-BFq-Mx5V.js} +2 -2
  268. package/dist/client/assets/index-BxAuGDoN.css +1 -0
  269. package/dist/client/assets/index-uw9O0z1c.js +1112 -0
  270. package/dist/client/assets/info-A6RAGUB7-BcGxhjED.js +1 -0
  271. package/dist/client/assets/info-A6RAGUB7-BlutK7BT.js +1 -0
  272. package/dist/client/assets/infoDiagram-27XIBGKW-MrZyptIy.js +2 -0
  273. package/dist/client/assets/infoDiagram-VRGFBTTK-KkUjDRAQ.js +2 -0
  274. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-CRy9vIS5.js → ishikawaDiagram-5VMMS53U-Bnt9yM0O.js} +2 -2
  275. package/dist/client/assets/ishikawaDiagram-OU5B5YK6-Di9BcpOY.js +70 -0
  276. package/dist/client/assets/{it-IT-FC2VTM3L-KTijNcUe.js → it-IT-INVHSAJF-DytAgndh.js} +1 -1
  277. package/dist/client/assets/javascript-B9I2pbsP.js +1 -0
  278. package/dist/client/assets/javascript-DctB8BJo.js +1 -0
  279. package/dist/client/assets/{journeyDiagram-3NMN7TZE-D4ZR_s9J.js → journeyDiagram-3NMN7TZE-Bl0abK1r.js} +1 -1
  280. package/dist/client/assets/journeyDiagram-ZHPQQLJL-J-sGrs9e.js +139 -0
  281. package/dist/client/assets/jsx-runtime-DKj5X9O4.js +1 -0
  282. package/dist/client/assets/kanban-definition-PNTS6WVX-5ZDV_yIa.js +89 -0
  283. package/dist/client/assets/{kanban-definition-UXKFOSKX-CIDTmu5g.js → kanban-definition-UXKFOSKX-DMgUfNt0.js} +10 -10
  284. package/dist/client/assets/{katex-CXMH3UgJ.js → katex-9NBMfU68.js} +2 -2
  285. package/dist/client/assets/katex-ZlcWpGUi.js +257 -0
  286. package/dist/client/assets/line-DEbP8Ok6.js +1 -0
  287. package/dist/client/assets/linear-DExL6ILt.js +1 -0
  288. package/dist/client/assets/{lobby-presence-Rdjnc0_0.js → lobby-presence-Cz5jGOPg.js} +1 -1
  289. package/dist/client/assets/{lua-CL1SqxuB.js → lua-zbJo2mq3.js} +1 -1
  290. package/dist/client/assets/{markdown-CByV-4CU.js → markdown-Bo71X2X2.js} +8 -8
  291. package/dist/client/assets/markdown-it-DpvIRaVq.js +13 -0
  292. package/dist/client/assets/markdown-math-CyyBVuDO.js +517 -0
  293. package/dist/client/assets/merge-CALoRt3l.js +1 -0
  294. package/dist/client/assets/{mermaid-parser.core-DrdLA3p0.js → mermaid-parser.core-Bpogunsh.js} +1 -1
  295. package/dist/client/assets/mermaid-parser.core-DBy--Jc0.js +3 -0
  296. package/dist/client/assets/mermaid.core-BeOUPE3Q.js +10 -0
  297. package/dist/client/assets/mindmap-definition-NLK3R4M7-ByVb-0vj.js +96 -0
  298. package/dist/client/assets/{mindmap-definition-YA3MSWOX-DO8NB9VH.js → mindmap-definition-YA3MSWOX-DBZN5_GH.js} +29 -29
  299. package/dist/client/assets/{nginx-BMaDbqW3.js → nginx-8H7HVH4w.js} +1 -1
  300. package/dist/client/assets/packet-AYTQ26CC-CqpSjTWl.js +1 -0
  301. package/dist/client/assets/packet-AYTQ26CC-DvbY8dI6.js +1 -0
  302. package/dist/client/assets/pegDiagram-GJSIUBJH-aost1sSO.js +1 -0
  303. package/dist/client/assets/pegDiagram-XKGWAZYB-DRo8CZu3.js +1 -0
  304. package/dist/client/assets/percentages-LWOC67ZH-VhvllE7L.js +1 -0
  305. package/dist/client/assets/{pica-xkWDouSg.js → pica-BPrp-GK1.js} +1 -1
  306. package/dist/client/assets/pie-DzWLGKAD.js +1 -0
  307. package/dist/client/assets/pie-WAS4IAKB-Bg2eCNl5.js +1 -0
  308. package/dist/client/assets/pie-WAS4IAKB-DWSm9SSD.js +1 -0
  309. package/dist/client/assets/pieDiagram-5QR66LMP-BICdpEuz.js +39 -0
  310. package/dist/client/assets/pieDiagram-E7YTZNPT-CZThaHsc.js +39 -0
  311. package/dist/client/assets/{preload-helper-CtT0-S4g.js → preload-helper-BAlEavIC.js} +1 -1
  312. package/dist/client/assets/preview-render-compiler-ktU0SXxY.js +43 -0
  313. package/dist/client/assets/preview-render-profile-D652PAjA.js +1 -0
  314. package/dist/client/assets/preview-render-worker-BI2bFVqM.js +575 -0
  315. package/dist/client/assets/prod-DU-0VfI7.js +145 -0
  316. package/dist/client/assets/prod-cXUNdmYV.js +1 -0
  317. package/dist/client/assets/{pug-Wky5Dnfy.js → pug-CqqUmdG7.js} +1 -1
  318. package/dist/client/assets/purify.es-go7v6Te-.js +3 -0
  319. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-fJE7iAxt.js → quadrantDiagram-AXDQQJYC-C5iowkl_.js} +3 -3
  320. package/dist/client/assets/quadrantDiagram-O4NWA36T-Bgx5bF97.js +7 -0
  321. package/dist/client/assets/quick-switcher-controller-DSlOwOsU.js +1 -0
  322. package/dist/client/assets/radar-RG4KPBEZ-BfNQUEQy.js +1 -0
  323. package/dist/client/assets/radar-RG4KPBEZ-DxExotg6.js +1 -0
  324. package/dist/client/assets/railroad-74A4TZTK-BaQ6U6eJ.js +1 -0
  325. package/dist/client/assets/railroad-74A4TZTK-FfHmeIQk.js +1 -0
  326. package/dist/client/assets/railroad-abnf-HS5TGJTU-BJ3KZw7J.js +1 -0
  327. package/dist/client/assets/railroad-abnf-HS5TGJTU-CLkdDRsJ.js +1 -0
  328. package/dist/client/assets/railroad-ebnf-LZEXJU2U-B162zvcG.js +1 -0
  329. package/dist/client/assets/railroad-ebnf-LZEXJU2U-DA0sEq7w.js +1 -0
  330. package/dist/client/assets/railroad-peg-WCYAUIDC-CGs5GeJ5.js +1 -0
  331. package/dist/client/assets/railroad-peg-WCYAUIDC-DCmlICzO.js +1 -0
  332. package/dist/client/assets/railroadDiagram-O6MQD6OU-BTt_rKjT.js +1 -0
  333. package/dist/client/assets/railroadDiagram-XR7U4H2S-DbVoNgSz.js +1 -0
  334. package/dist/client/assets/{requirementDiagram-BXWQKSXE-Balm0WW8.js → requirementDiagram-BXWQKSXE-BkvazG7r.js} +1 -1
  335. package/dist/client/assets/requirementDiagram-PLB6GJNP-BT0j9C40.js +84 -0
  336. package/dist/client/assets/sankeyDiagram-IPEJSGJF-X1BCUIrf.js +40 -0
  337. package/dist/client/assets/sankeyDiagram-P5KCCOFB-C_IemB9h.js +40 -0
  338. package/dist/client/assets/sankeyLinkHorizontal-usjP1-Cg.js +1 -0
  339. package/dist/client/assets/sequenceDiagram-PO4LG4MO-B-2QfXhV.js +169 -0
  340. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-BL1j3Sn-.js → sequenceDiagram-WJ2MYXX4-CxFBgLGd.js} +3 -3
  341. package/dist/client/assets/{sieve-BAxa3IjF.js → sieve-tLWDfEkZ.js} +1 -1
  342. package/dist/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -1
  343. package/dist/client/assets/sizeCapture-INFHLROL-DrzwYt5z.js +1 -0
  344. package/dist/client/assets/sl-SI-QY5KCFGA-RZhwMpQL.js +8 -0
  345. package/dist/client/assets/solr-B78wSQJQ.js +1 -0
  346. package/dist/client/assets/src-XiVvaevx.js +1 -0
  347. package/dist/client/assets/stateDiagram-D77RDMKH-BaSQ6Owj.js +1 -0
  348. package/dist/client/assets/stateDiagram-v2-GCMORJYK-CsVcfwVp.js +291 -0
  349. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CLlwrdvU.js +1 -0
  350. package/dist/client/assets/sv-SE-O3OFCY3J-DnS86_7q.js +12 -0
  351. package/dist/client/assets/swimlanes-2SLR337P-CnYTVqRX.js +1 -0
  352. package/dist/client/assets/swimlanes-42K2YHIH-CALFEmiS.js +1 -0
  353. package/dist/client/assets/swimlanesDiagram-TC7HE7FX-Bh4tmz27.js +8 -0
  354. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-xhehUG9e.js +8 -0
  355. package/dist/client/assets/th-TH-WLSZUSBX-DHehoYR2.js +1 -0
  356. package/dist/client/assets/{timeline-definition-24CTP7MA-7pch5JAr.js → timeline-definition-24CTP7MA-zse-5Dbm.js} +5 -5
  357. package/dist/client/assets/timeline-definition-EJHVYXUP-BhqPlKkN.js +120 -0
  358. package/dist/client/assets/treeView-Q6P3EWNA-BvHOzbu9.js +1 -0
  359. package/dist/client/assets/treeView-Q6P3EWNA-Cccy0ngL.js +1 -0
  360. package/dist/client/assets/treemap-CxZTjHiH.js +1 -0
  361. package/dist/client/assets/treemap-WGGIJYW6-oety7paS.js +1 -0
  362. package/dist/client/assets/treemap-WGGIJYW6-sMRCjCtX.js +1 -0
  363. package/dist/client/assets/usecaseDiagram-POWQR4AR-DR2LHQYs.js +328 -0
  364. package/dist/client/assets/v4-DDdyfk2q.js +1 -0
  365. package/dist/client/assets/{vault-api-client-QjZ_T03l.js → vault-api-client-BQxLVPeF.js} +1 -1
  366. package/dist/client/assets/vault-paths-BT-6nztu.js +1 -0
  367. package/dist/client/assets/venn.esm-C5rDfA9t.js +7 -0
  368. package/dist/client/assets/vennDiagram-4TSXK5OY-DgHr6cJD.js +28 -0
  369. package/dist/client/assets/vennDiagram-UO4OBE2U-BRwLn2Q1.js +28 -0
  370. package/dist/client/assets/{verilog-7LoJAqYT.js → verilog-CjI9Y6RI.js} +1 -1
  371. package/dist/client/assets/wardley-WFR3VGLG-BdwDpX_I.js +1 -0
  372. package/dist/client/assets/wardley-WFR3VGLG-Y7xty_3m.js +1 -0
  373. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-BbSlUwuM.js → wardleyDiagram-VM6X3IG4-9A60XZis.js} +3 -3
  374. package/dist/client/assets/wardleyDiagram-VNRHLVJA-B_tMcVFG.js +78 -0
  375. package/dist/client/assets/wiki-link-resolver-Dch88erO.js +1 -0
  376. package/dist/client/assets/{worker-engine-m0rlHn8R-eSDcDGEI.js → worker-engine-m0rlHn8R-5h66k403.js} +1 -1
  377. package/dist/client/assets/{workspace-sync-client-D4nblH_2.js → workspace-sync-client-C2pdaQUN.js} +1 -1
  378. package/dist/client/assets/xychartDiagram-PMCCYNJV-fRpZ1MA5.js +7 -0
  379. package/dist/client/assets/xychartDiagram-S5SC5T6Z-D00iy-wB.js +7 -0
  380. package/dist/client/assets/{yaml-9ltHPDNO.js → yaml-BcZaqAz8.js} +1 -1
  381. package/dist/client/assets/{yjs-provider-reset-guard-R43MnLNc.js → yjs-provider-reset-guard-DpntzUDR.js} +1 -1
  382. package/dist/client/drawio-editor.html +6 -5
  383. package/dist/client/excalidraw-editor.html +39 -32
  384. package/dist/client/export-document.html +4 -3
  385. package/dist/client/index.html +21 -14
  386. package/package.json +12 -9
  387. package/src/client/app/drawio-editor.html +1 -0
  388. package/src/client/app/excalidraw-editor.html +1 -0
  389. package/src/client/app/export-document-entry.js +1 -0
  390. package/src/client/app/export-document.html +1 -0
  391. package/src/client/app/index.html +19 -12
  392. package/src/client/application/app-shell/ui-feature-shell.js +20 -1
  393. package/src/client/application/app-shell-elements.js +2 -0
  394. package/src/client/application/diagram-preview-hydrator.js +7 -0
  395. package/src/client/application/mermaid-preview-hydrator.js +89 -3
  396. package/src/client/application/preview-diagram-utils.js +1 -0
  397. package/src/client/application/preview-render-compiler.js +2 -0
  398. package/src/client/application/preview-render-executor.js +4 -1
  399. package/src/client/application/preview-render-profile.js +8 -12
  400. package/src/client/application/preview-renderer.js +3 -0
  401. package/src/client/bootstrap/collabmd-app-shell.js +16 -7
  402. package/src/client/browser-utils.js +1 -1
  403. package/src/client/domain/excalidraw-scene.js +0 -11
  404. package/src/client/domain/file-search.js +1 -0
  405. package/src/client/domain/highlight-runtime.js +30 -3
  406. package/src/client/domain/markdown-math.js +14 -0
  407. package/src/client/export/export-host.js +3 -7
  408. package/src/client/export/export-pipeline.js +208 -21
  409. package/src/client/infrastructure/browser-preferences-port.js +8 -0
  410. package/src/client/infrastructure/editor-session.js +20 -0
  411. package/src/client/infrastructure/editor-view-adapter.js +8 -7
  412. package/src/client/infrastructure/excalidraw-room-client.js +2 -45
  413. package/src/client/infrastructure/git-api-client.js +5 -0
  414. package/src/client/infrastructure/tab-activity-lock.js +8 -4
  415. package/src/client/infrastructure/webmcp-tool-registry.js +12 -5
  416. package/src/client/presentation/bases-preview-controller.js +2 -1
  417. package/src/client/presentation/comment-markdown-renderer.js +2 -0
  418. package/src/client/presentation/comment-ui-controller.js +21 -30
  419. package/src/client/presentation/create-menu-presenter.js +16 -18
  420. package/src/client/presentation/drawio-embed-controller.js +55 -7
  421. package/src/client/presentation/excalidraw-embed-controller.js +11 -3
  422. package/src/client/presentation/file-explorer-controller.js +1 -0
  423. package/src/client/presentation/file-explorer-view.js +32 -2
  424. package/src/client/presentation/file-history-view-controller.js +6 -0
  425. package/src/client/presentation/git-diff-view-controller.js +3 -2
  426. package/src/client/presentation/git-panel-controller.js +6 -5
  427. package/src/client/presentation/image-lightbox-controller.js +7 -6
  428. package/src/client/presentation/outline-controller.js +0 -86
  429. package/src/client/presentation/quick-switcher-controller.js +50 -13
  430. package/src/client/presentation/scroll-sync-controller.js +69 -21
  431. package/src/client/styles/components/navigation.css +2 -2
  432. package/src/client/styles/deferred-collab.css +1 -0
  433. package/src/client/styles/deferred-preview.css +1 -0
  434. package/src/client/styles/features/diagram-preview.css +1 -0
  435. package/src/client/styles/features/preview-markdown.css +4 -4
  436. package/src/client/styles/foundation/themes.css +56 -271
  437. package/src/client/styles/layout/editor-page.css +0 -1
  438. package/src/client/styles/layout/shell.css +6 -0
  439. package/src/client/styles/layout/sidebar.css +3 -0
  440. package/src/client/styles/surfaces/landing-page.css +260 -0
  441. package/src/domain/agent-tool-definitions.js +45 -13
  442. package/src/domain/collabmd-content-capabilities.js +59 -4
  443. package/src/domain/collaboration-protocol.js +2 -0
  444. package/src/domain/markdown-outline.js +35 -0
  445. package/src/server/application/agent-connection-service.js +6 -2
  446. package/src/server/application/agent-content-service.js +124 -56
  447. package/src/server/auth/create-auth-service.js +40 -12
  448. package/src/server/auth/session-cookie.js +49 -38
  449. package/src/server/config/env.js +1 -1
  450. package/src/server/domain/backlink-index.js +1 -11
  451. package/src/server/domain/bases/base-query-results.js +7 -3
  452. package/src/server/domain/bases/base-query-service.js +2 -7
  453. package/src/server/domain/collaboration/collaboration-room.js +54 -16
  454. package/src/server/domain/docx-exporter.js +256 -2
  455. package/src/server/domain/hosted-workspace-contract.js +7 -0
  456. package/src/server/domain/hosted-workspace.js +29 -62
  457. package/src/server/domain/ripgrep-search-service.js +44 -28
  458. package/src/server/infrastructure/git/diff-service.js +15 -11
  459. package/src/server/infrastructure/git/git-service.js +4 -0
  460. package/src/server/infrastructure/git/image-mime.js +4 -3
  461. package/src/server/infrastructure/git/status-service.js +10 -6
  462. package/src/server/infrastructure/http/create-git-api-query-handler.js +25 -0
  463. package/src/server/infrastructure/http/create-vault-api-query-handler.js +13 -53
  464. package/src/server/infrastructure/http/http-response.js +2 -0
  465. package/src/server/infrastructure/persistence/hosted-metadata-store.js +42 -5
  466. package/src/server/infrastructure/persistence/path-utils.js +23 -3
  467. package/src/server/infrastructure/persistence/pull-backup-store.js +52 -42
  468. package/src/server/infrastructure/persistence/sidecar-store.js +7 -4
  469. package/src/server/infrastructure/persistence/vault-file-store.js +55 -168
  470. package/src/server/infrastructure/plantuml/plantuml-renderer.js +33 -0
  471. package/src/server/infrastructure/structurizr/structurizr-workspace-service.js +24 -10
  472. package/src/server/infrastructure/websocket/attach-collaboration-gateway.js +7 -3
  473. package/src/server/infrastructure/websocket/client-socket-session.js +32 -4
  474. package/src/server/infrastructure/workspace/file-system-sync-service.js +4 -2
  475. package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-Crf9Y3Q6.js +0 -1
  476. package/dist/client/assets/abnfDiagram-VCTEODGH-PuinKbSQ.js +0 -1
  477. package/dist/client/assets/architecture-7GRP2DOG-BMOPAkUC.js +0 -1
  478. package/dist/client/assets/architectureDiagram-5GKGNRK7-46hPkrZv.js +0 -36
  479. package/dist/client/assets/blockDiagram-I7D4REHJ-C1S5Bzf8.js +0 -129
  480. package/dist/client/assets/channel-jwdhnPiV.js +0 -1
  481. package/dist/client/assets/chunk-2E4U76K2-Ba8Wf22k.js +0 -1
  482. package/dist/client/assets/chunk-4HAMMTFA-Ht-73lsT.js +0 -62
  483. package/dist/client/assets/chunk-5XKZK2GL-D4UAZSOJ.js +0 -1
  484. package/dist/client/assets/chunk-75Z2AOVW-B2cZexqK.js +0 -2
  485. package/dist/client/assets/chunk-DU6HZSFF-C6d6PJfE.js +0 -127
  486. package/dist/client/assets/chunk-GMAD6QVW-DUfjx_d5.js +0 -72
  487. package/dist/client/assets/chunk-GVQU2GXP-D1l7oRGR.js +0 -1
  488. package/dist/client/assets/chunk-L3NEJ4N5-BmCVn4y-.js +0 -1
  489. package/dist/client/assets/chunk-OSK3NFVY-CWHXAmfx.js +0 -10
  490. package/dist/client/assets/chunk-POPQ4Y6H-B5yJIrZE.js +0 -1
  491. package/dist/client/assets/chunk-PWAF6VOD-B3gML4ps.js +0 -1
  492. package/dist/client/assets/chunk-TLUHSLCS-Yl7B0Vrz.js +0 -1
  493. package/dist/client/assets/chunk-ZNVOA63L-BmCQjhx-.js +0 -40
  494. package/dist/client/assets/classDiagram-ZZMXUADV-BRw9vo8U.js +0 -1
  495. package/dist/client/assets/classDiagram-v2-VYDZK3BY-BRw9vo8U.js +0 -1
  496. package/dist/client/assets/comment-markdown-renderer-B9_vPc3F.js +0 -1
  497. package/dist/client/assets/comment-thread-store-NNHqRVsX.js +0 -1
  498. package/dist/client/assets/cose-bilkent-JH36ORCC-Cm_QF_yb.js +0 -1
  499. package/dist/client/assets/cynefin-OW5HDTMX-7tP7QfM3.js +0 -1
  500. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-BRoCEoZM.js +0 -62
  501. package/dist/client/assets/cytoscape.esm-B-NFISlW.js +0 -321
  502. package/dist/client/assets/dagre-PrKaheQc.js +0 -1
  503. package/dist/client/assets/deferred-collab-rBe4nuQ2.css +0 -1
  504. package/dist/client/assets/deferred-preview-pe7Iwwx3.css +0 -1
  505. package/dist/client/assets/diagram-UQ7AKVKN-JevUZuYi.js +0 -41
  506. package/dist/client/assets/diagram-VX7I27RA-pSD4HMh1.js +0 -24
  507. package/dist/client/assets/diagram-Z3DM3KII-D8r1_CIb.js +0 -24
  508. package/dist/client/assets/direct-engine-DdrQKpgq-B5zIoeQw.js +0 -5
  509. package/dist/client/assets/dist-B3HdUPsK.js +0 -1
  510. package/dist/client/assets/dist-BIRygGYH.js +0 -1
  511. package/dist/client/assets/dist-BPyOlNLY.js +0 -2
  512. package/dist/client/assets/dist-ByhQbe-x.js +0 -1
  513. package/dist/client/assets/dist-C5NkYKAa.js +0 -1
  514. package/dist/client/assets/dist-CEirJSxk.js +0 -1
  515. package/dist/client/assets/dist-CRnJ0D9h.js +0 -1
  516. package/dist/client/assets/dist-CyNrloSI.js +0 -1
  517. package/dist/client/assets/dist-D60_kdpQ.js +0 -1
  518. package/dist/client/assets/dist-Hdhj3L3t.js +0 -1
  519. package/dist/client/assets/dist-gRRhmB-2.js +0 -6
  520. package/dist/client/assets/dist-kWb2d1CH.js +0 -1
  521. package/dist/client/assets/dist-l-56SowH.js +0 -19
  522. package/dist/client/assets/dist-sLzRQQk7.js +0 -1
  523. package/dist/client/assets/ebnfDiagram-PWID7BFC-UJ0Fz5ci.js +0 -1
  524. package/dist/client/assets/editor-session-4Bn81iWm.js +0 -14
  525. package/dist/client/assets/embedded-editor-base-jK221GC8.css +0 -1
  526. package/dist/client/assets/eventmodeling-NTZA5JFV-BR2FzK4R.js +0 -1
  527. package/dist/client/assets/excalidrawEditor-WIuguTz7.js +0 -9
  528. package/dist/client/assets/export-page-AN-wI5p4.js +0 -56
  529. package/dist/client/assets/exportDocument-B7IagJhQ.css +0 -1
  530. package/dist/client/assets/exportDocument-B9xNKpQe.js +0 -2
  531. package/dist/client/assets/file-search-DDLyyLDU.js +0 -1
  532. package/dist/client/assets/flowDiagram-HODETNUW-kb1lUSBo.js +0 -1
  533. package/dist/client/assets/forth-Cezjo90N.js +0 -1
  534. package/dist/client/assets/ganttDiagram-EL5Y4UJY-BBNzDfaV.js +0 -292
  535. package/dist/client/assets/gitGraph-4MIJSDKK-DYlXv_yJ.js +0 -1
  536. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-Csf0Dm_1.js +0 -106
  537. package/dist/client/assets/graphlib-DS17s2tU.js +0 -1
  538. package/dist/client/assets/image-2QKV3NAF-BUbX0y5Y.js +0 -1
  539. package/dist/client/assets/index-BAmZnTFV.css +0 -1
  540. package/dist/client/assets/index-mWiw418b.js +0 -1111
  541. package/dist/client/assets/info-A6RAGUB7-BlU-8_xu.js +0 -1
  542. package/dist/client/assets/infoDiagram-27XIBGKW-Bzy6kCbb.js +0 -2
  543. package/dist/client/assets/javascript-BWjar7HY.js +0 -1
  544. package/dist/client/assets/javascript-D-FtdkNC.js +0 -1
  545. package/dist/client/assets/jsx-runtime-BpzPEenQ.js +0 -1
  546. package/dist/client/assets/line-DSWLHgpx.js +0 -1
  547. package/dist/client/assets/linear-n-3HSMUF.js +0 -1
  548. package/dist/client/assets/markdown-it-CocJWnjv.js +0 -13
  549. package/dist/client/assets/mermaid.core-C_FK-7n4.js +0 -1
  550. package/dist/client/assets/mermaid.core-D0cMM4Rl.js +0 -10
  551. package/dist/client/assets/packet-AYTQ26CC-BSJEH9Lb.js +0 -1
  552. package/dist/client/assets/pegDiagram-XKGWAZYB-DS6Ab21R.js +0 -1
  553. package/dist/client/assets/percentages-Q7USCRWZ-DWE6uvTs.js +0 -1
  554. package/dist/client/assets/pie-WAS4IAKB-qxv01Y8W.js +0 -1
  555. package/dist/client/assets/pieDiagram-E7YTZNPT-BbFe6Tgs.js +0 -39
  556. package/dist/client/assets/preview-render-compiler-C_7J7eia.js +0 -43
  557. package/dist/client/assets/preview-render-compiler-DzJ1KR_M.js +0 -1
  558. package/dist/client/assets/preview-render-worker-1DoIDllV.js +0 -59
  559. package/dist/client/assets/prod-D5TxmmoB.js +0 -1
  560. package/dist/client/assets/prod-pbFU4TaM.js +0 -145
  561. package/dist/client/assets/quick-switcher-controller-CUajuy78.js +0 -1
  562. package/dist/client/assets/radar-RG4KPBEZ-B6h6pWOs.js +0 -1
  563. package/dist/client/assets/railroad-74A4TZTK-CGtTWdGc.js +0 -1
  564. package/dist/client/assets/railroad-abnf-HS5TGJTU-Cq7y22IA.js +0 -1
  565. package/dist/client/assets/railroad-ebnf-LZEXJU2U-V0aQVv9m.js +0 -1
  566. package/dist/client/assets/railroad-peg-WCYAUIDC-BQiIsX_p.js +0 -1
  567. package/dist/client/assets/railroadDiagram-O6MQD6OU-CUQKqbCK.js +0 -1
  568. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CcbMqrlQ.js +0 -40
  569. package/dist/client/assets/sl-SI-JRML4FIH-D53L_0S2.js +0 -6
  570. package/dist/client/assets/solr-BBopId9w.js +0 -1
  571. package/dist/client/assets/src-oBChb5qS.js +0 -1
  572. package/dist/client/assets/stateDiagram-D77RDMKH-DNi924hh.js +0 -1
  573. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-C62JEwak.js +0 -1
  574. package/dist/client/assets/sv-SE-4ZPKFFXF-DT-G7RCI.js +0 -12
  575. package/dist/client/assets/swimlanes-42K2YHIH-ColgjSH4.js +0 -1
  576. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-B9UZhEj4.js +0 -8
  577. package/dist/client/assets/th-TH-P7CTMGDK-6sy0NO7K.js +0 -1
  578. package/dist/client/assets/treeView-Q6P3EWNA-BTTYcvrF.js +0 -1
  579. package/dist/client/assets/treemap-WGGIJYW6-Cg7tyfH8.js +0 -1
  580. package/dist/client/assets/vennDiagram-4TSXK5OY-C5taziCX.js +0 -34
  581. package/dist/client/assets/wardley-WFR3VGLG-C6N1rULY.js +0 -1
  582. package/dist/client/assets/wiki-link-resolver-C2P_WmTV.js +0 -1
  583. package/dist/client/assets/xychartDiagram-S5SC5T6Z-D06X1arY.js +0 -7
  584. package/src/server/domain/collaboration/protocol.js +0 -6
@@ -3,13 +3,14 @@ import * as awarenessProtocol from 'y-protocols/awareness';
3
3
  import * as syncProtocol from 'y-protocols/sync';
4
4
  import * as encoding from 'lib0/encoding';
5
5
  import * as decoding from 'lib0/decoding';
6
+ import { setTimeout as delay } from 'node:timers/promises';
6
7
 
7
8
  import {
8
9
  MSG_AGENT_FLUSH,
9
10
  MSG_AGENT_FLUSH_ACK,
10
11
  MSG_AWARENESS,
11
12
  MSG_SYNC,
12
- } from './protocol.js';
13
+ } from '../../../domain/collaboration-protocol.js';
13
14
  import { CollaborationDocumentStore } from './collaboration-document-store.js';
14
15
  import { logPerfEvent } from '../../config/perf-logging.js';
15
16
  import { populateCommentThreads, serializeCommentThreads } from '../../../domain/comment-threads.js';
@@ -31,6 +32,10 @@ import { normalizeEditableText } from '../../../domain/editable-text.js';
31
32
  import { normalizeWorkspaceEvent } from '../../../domain/workspace-change.js';
32
33
  import { WORKSPACE_EVENT_MAX_MESSAGES, WORKSPACE_ROOM_NAME } from '../../../domain/workspace-room.js';
33
34
 
35
+ // Coalesce scroll-driven awareness bursts (cursor/viewport) into one broadcast.
36
+ // Awareness updates are last-write-wins, so flushing the latest state is safe.
37
+ const AWARENESS_BROADCAST_DEBOUNCE_MS = 30;
38
+
34
39
  function closeSlowClient(ws, clientState, { maxBufferedAmountBytes, name }) {
35
40
  if (!clientState || clientState.backpressureCloseIssued) {
36
41
  return false;
@@ -248,6 +253,8 @@ export class CollaborationRoom {
248
253
  };
249
254
  this.persistTimer = null;
250
255
  this.destroyTimer = null;
256
+ this.awarenessBroadcastTimer = null;
257
+ this.pendingAwarenessClientIds = new Set();
251
258
  this.finalizePromise = null;
252
259
  this.shutdownGeneration = 0;
253
260
 
@@ -275,7 +282,7 @@ export class CollaborationRoom {
275
282
 
276
283
  try {
277
284
  if (hydrateDelayMs > 0) {
278
- await new Promise((resolve) => setTimeout(resolve, hydrateDelayMs));
285
+ await delay(hydrateDelayMs);
279
286
  }
280
287
 
281
288
  if (this.documentStore?.hasPersistence()) {
@@ -393,6 +400,10 @@ export class CollaborationRoom {
393
400
  this.schedulePersist();
394
401
  }
395
402
 
403
+ if (this.clients.size === 0) {
404
+ return;
405
+ }
406
+
396
407
  const encoder = encoding.createEncoder();
397
408
  encoding.writeVarUint(encoder, MSG_SYNC);
398
409
  syncProtocol.writeUpdate(encoder, update);
@@ -402,31 +413,53 @@ export class CollaborationRoom {
402
413
  });
403
414
 
404
415
  this.awareness.on('update', ({ added, updated, removed }) => {
405
- const changedClientIds = added.concat(updated, removed);
416
+ for (const clientId of added.concat(updated, removed)) {
417
+ this.pendingAwarenessClientIds.add(clientId);
418
+ }
406
419
 
407
- if (changedClientIds.length === 0) {
420
+ if (this.pendingAwarenessClientIds.size === 0 || this.awarenessBroadcastTimer) {
408
421
  return;
409
422
  }
410
423
 
411
- const encoder = encoding.createEncoder();
412
- encoding.writeVarUint(encoder, MSG_AWARENESS);
413
- encoding.writeVarUint8Array(
414
- encoder,
415
- awarenessProtocol.encodeAwarenessUpdate(this.awareness, changedClientIds),
416
- );
417
- const message = encoding.toUint8Array(encoder);
418
-
419
- this.broadcastToClients(message, { failureLabel: 'awareness update' });
424
+ this.awarenessBroadcastTimer = setTimeout(() => {
425
+ this.flushAwarenessBroadcast();
426
+ }, AWARENESS_BROADCAST_DEBOUNCE_MS);
427
+ this.awarenessBroadcastTimer.unref?.();
420
428
  });
421
429
  }
422
430
 
431
+ flushAwarenessBroadcast() {
432
+ clearTimeout(this.awarenessBroadcastTimer);
433
+ this.awarenessBroadcastTimer = null;
434
+
435
+ if (this.pendingAwarenessClientIds.size === 0 || this.destroyed || this.clients.size === 0) {
436
+ this.pendingAwarenessClientIds.clear();
437
+ return;
438
+ }
439
+
440
+ const changedClientIds = Array.from(this.pendingAwarenessClientIds);
441
+ this.pendingAwarenessClientIds.clear();
442
+
443
+ const encoder = encoding.createEncoder();
444
+ encoding.writeVarUint(encoder, MSG_AWARENESS);
445
+ encoding.writeVarUint8Array(
446
+ encoder,
447
+ awarenessProtocol.encodeAwarenessUpdate(this.awareness, changedClientIds),
448
+ );
449
+
450
+ this.broadcastToClients(encoding.toUint8Array(encoder), { failureLabel: 'awareness update' });
451
+ }
452
+
423
453
  registerContentDirtyListeners() {
424
454
  const markFromTransaction = (transaction) => {
425
455
  if (isContentCleanOrigin(transaction?.origin)) {
426
456
  return;
427
457
  }
428
458
 
429
- this.refreshContentDirty();
459
+ // Fast path: observed content changed, so mark dirty without
460
+ // re-serializing the whole document per keystroke. persist() still
461
+ // compares against the baseline, so edit-then-undo stays clean.
462
+ this.contentDirty = true;
430
463
  };
431
464
 
432
465
  if (isExcalidrawRoom(this.name)) {
@@ -527,7 +560,10 @@ export class CollaborationRoom {
527
560
  console.warn(`[room:${this.name}] Skipping persist because the Excalidraw scene is invalid`);
528
561
  return;
529
562
  }
530
- const includeContent = this.refreshContentDirty();
563
+ // Compare inline: refreshContentDirty() would serialize the document
564
+ // a second time for the same check.
565
+ const includeContent = content !== this.persistedContentBaseline;
566
+ this.contentDirty = includeContent;
531
567
  const commentThreads = serializeCommentThreads(this.doc.getArray('comments'));
532
568
  await this.documentStore.persistState({
533
569
  commentThreads,
@@ -537,7 +573,7 @@ export class CollaborationRoom {
537
573
  });
538
574
  if (includeContent) {
539
575
  this.persistedContentBaseline = content;
540
- this.refreshContentDirty();
576
+ this.contentDirty = false;
541
577
  }
542
578
  })();
543
579
 
@@ -662,8 +698,10 @@ export class CollaborationRoom {
662
698
  this.shutdownGeneration += 1;
663
699
  clearTimeout(this.persistTimer);
664
700
  clearTimeout(this.destroyTimer);
701
+ clearTimeout(this.awarenessBroadcastTimer);
665
702
  this.persistTimer = null;
666
703
  this.destroyTimer = null;
704
+ this.awarenessBroadcastTimer = null;
667
705
  }
668
706
 
669
707
  markDeleted() {
@@ -1,6 +1,40 @@
1
+ import { createRequire } from 'node:module';
2
+
3
+ import { mml2omml } from 'mathml2omml';
4
+
5
+ // Use the converter's own parser dependency so both sides interpret HTML alike.
6
+ const converterRequire = createRequire(import.meta.resolve('@turbodocx/html-to-docx'));
7
+ const { Parser } = converterRequire('htmlparser2');
8
+ const JSZip = converterRequire('jszip');
9
+ const EMBEDDED_IMAGE_PATTERN = /^data:image\/(?:png|jpeg|gif|webp|svg\+xml);base64,[a-z0-9+/]+={0,2}$/i;
10
+ const DOCX_MATH_KEY_PATTERN = /^COLLABMD-MATH-\d+$/;
11
+ const MATHML_ANNOTATION_PATTERN = /<annotation\b[^>]*>[\s\S]*?<\/annotation>/g;
12
+ // mpadded is purely presentational padding with no OMML equivalent; unwrap it
13
+ // and let the supported children through instead of dropping the subtree.
14
+ const MATHML_PADDED_PATTERN = /<mpadded\b[^>]*>([\s\S]*?)<\/mpadded>/g;
1
15
  const DOCX_EXPORTER_CREATOR = 'CollabMD';
2
16
  let converterPromise = null;
3
17
 
18
+ function validateEmbeddedImages(html) {
19
+ let name = '';
20
+ const parser = new Parser({
21
+ onopentagname(tagName) {
22
+ name = tagName;
23
+ },
24
+ onattribute(attribute, value) {
25
+ // Inspect duplicates too: the converter preserves attribute case.
26
+ const isImageReference = attribute === 'src'
27
+ || ((name === 'image' || name === 'use') && (attribute === 'href' || attribute === 'xlink:href'));
28
+ if (isImageReference && !EMBEDDED_IMAGE_PATTERN.test(value) && !(name === 'use' && value.startsWith('#'))) {
29
+ const error = new Error('DOCX images must be embedded data URLs');
30
+ error.statusCode = 400;
31
+ throw error;
32
+ }
33
+ },
34
+ }, { decodeEntities: true });
35
+ parser.end(html);
36
+ }
37
+
4
38
  function normalizeDocxBuffer(result) {
5
39
  if (Buffer.isBuffer(result)) {
6
40
  return result;
@@ -31,16 +65,230 @@ async function ensureConverter() {
31
65
  return converterPromise;
32
66
  }
33
67
 
68
+ function collectDocxMath(html) {
69
+ // Markers are generated markup holding only text, so a flat open/text/close
70
+ // walk is enough; anything unexpected simply fails the key check below.
71
+ const equations = [];
72
+ let current = null;
73
+ const parser = new Parser({
74
+ onopentag(name, attribs = {}) {
75
+ if (current || name !== 'span') {
76
+ return;
77
+ }
78
+
79
+ const classes = String(attribs.class ?? '').split(/\s+/);
80
+ if (!classes.includes('export-math') || !attribs['data-mml']) {
81
+ return;
82
+ }
83
+
84
+ try {
85
+ const mml = decodeURIComponent(attribs['data-mml']);
86
+ if (mml.includes('<math')) {
87
+ current = { key: '', mml };
88
+ }
89
+ } catch {
90
+ current = null;
91
+ }
92
+ },
93
+ ontext(text) {
94
+ if (current) {
95
+ current.key += text;
96
+ }
97
+ },
98
+ onclosetag(name) {
99
+ if (name !== 'span' || !current) {
100
+ return;
101
+ }
102
+
103
+ const key = current.key.trim();
104
+ if (DOCX_MATH_KEY_PATTERN.test(key)) {
105
+ equations.push({ key, mml: current.mml });
106
+ }
107
+ current = null;
108
+ },
109
+ }, { decodeEntities: true });
110
+ parser.end(String(html ?? ''));
111
+ return equations;
112
+ }
113
+
114
+ function escapeDocxXml(text) {
115
+ return String(text ?? '')
116
+ .replace(/&/g, '&amp;')
117
+ .replace(/</g, '&lt;')
118
+ .replace(/>/g, '&gt;')
119
+ .replace(/"/g, '&quot;');
120
+ }
121
+
122
+ // The OMML converter copies text content verbatim, so raw &/</> and HTML-only
123
+ // entities such as &nbsp; would reach document.xml unescaped and break Word's
124
+ // XML parsing. OMML output only uses m:/w: prefixed tags, so any other <
125
+ // starts text.
126
+ const OMML_TEXT_RUN_PATTERN = />([^<]*(?:<(?!\/?[A-Za-z][\w]*:)[^<]*)*)/g;
127
+
128
+ function escapeOmmlTextContent(omml) {
129
+ return String(omml ?? '').replace(OMML_TEXT_RUN_PATTERN, (_match, text) => `>${
130
+ String(text ?? '')
131
+ .replace(/&(?!(?:amp|lt|gt|quot|apos|nbsp);|#\d+;|#x[\da-fA-F]+;)/g, '&amp;')
132
+ .replace(/&nbsp;/g, '&#160;')
133
+ .replace(/</g, '&lt;')
134
+ }`);
135
+ }
136
+
137
+ function extractMathmlAnnotation(mml) {
138
+ const match = String(mml ?? '').match(/<annotation\b[^>]*>([\s\S]*?)<\/annotation>/);
139
+ return match?.[1]?.trim() ?? '';
140
+ }
141
+
142
+ function deduplicateOmmlArgPr(omml) {
143
+ // The converter emits one m:argPr per transparent ancestor (mstyle, mrow),
144
+ // but OOXML allows at most one per argument. Adjacent duplicates are never
145
+ // legitimate, so collapse them; Word drops content after invalid markup.
146
+ // Both elements must be self-contained (self-closing or self-closing
147
+ // children only) so the match can never span a run or close tag.
148
+ const simpleArgPr = '<m:argPr\\b(?![^>]*\\/>)[^>]*>(?:<m:[a-zA-Z]+\\b[^>]*\\/>\\s*)*<\\/m:argPr>|<m:argPr\\b[^>]*\\/>';
149
+ const duplicatePattern = new RegExp(`(${simpleArgPr})\\s*(${simpleArgPr})`, 'g');
150
+ let previous = null;
151
+ let output = omml;
152
+ while (output !== previous) {
153
+ previous = output;
154
+ output = output.replace(duplicatePattern, '$1');
155
+ }
156
+ return output;
157
+ }
158
+
159
+ function convertMathmlToOmml(mml) {
160
+ try {
161
+ return escapeOmmlTextContent(deduplicateOmmlArgPr(mml2omml(
162
+ String(mml ?? '')
163
+ .replace(MATHML_ANNOTATION_PATTERN, '')
164
+ .replace(MATHML_PADDED_PATTERN, (_match, inner) => inner),
165
+ )));
166
+ } catch {
167
+ return null;
168
+ }
169
+ }
170
+
171
+ function findDocxParagraphStart(documentXml, index) {
172
+ // Plain lastIndexOf('<w:p') also matches <w:pPr> and <w:pStyle, so the
173
+ // character after the prefix must end the tag name.
174
+ let start = documentXml.lastIndexOf('<w:p', index);
175
+ while (start !== -1 && !/^[\s>/]/.test(documentXml[start + 4] ?? '')) {
176
+ start = documentXml.lastIndexOf('<w:p', start - 1);
177
+ }
178
+ return start;
179
+ }
180
+
181
+ function enclosingDocxParagraph(documentXml, index) {
182
+ const start = findDocxParagraphStart(documentXml, index);
183
+ if (start === -1) {
184
+ return null;
185
+ }
186
+
187
+ if (documentXml.lastIndexOf('</w:p>', index) > start) {
188
+ return null;
189
+ }
190
+
191
+ const end = documentXml.indexOf('</w:p>', index);
192
+ if (end === -1) {
193
+ return null;
194
+ }
195
+
196
+ const close = end + '</w:p>'.length;
197
+ return { end: close, start, xml: documentXml.slice(start, close) };
198
+ }
199
+
200
+ function isSoleMarkerParagraph(paragraphXml, key) {
201
+ const texts = [...paragraphXml.matchAll(/<w:t\b[^>]*>([^<]*)<\/w:t>/g)]
202
+ .map((match) => match[1])
203
+ .join('');
204
+ return texts === key;
205
+ }
206
+
207
+ // Display equations render as centered paragraphs: inline oMath shows in
208
+ // Word, Docs, and Pages, while oMathPara blocks are dropped by several
209
+ // renderers. The justification goes before run/section properties per the
210
+ // OOXML paragraph-property order.
211
+ const DOCX_CENTER_JUSTIFICATION = '<w:jc w:val="center"/>';
212
+
213
+ function centerDocxParagraph(paragraphXml) {
214
+ if (/<w:jc\b/.test(paragraphXml)) {
215
+ return paragraphXml;
216
+ }
217
+
218
+ if (/<w:pPr\b[^>]*>/.test(paragraphXml)) {
219
+ return paragraphXml.replace(
220
+ /(<w:pPr\b[^>]*>)([\s\S]*?)(<(?:w:rPr|w:sectPr|w:pPrChange)\b|<\/w:pPr>)/,
221
+ `$1$2${DOCX_CENTER_JUSTIFICATION}$3`,
222
+ );
223
+ }
224
+
225
+ return paragraphXml.replace(/<w:p\b[^>]*>/, (match) => `${match}<w:pPr>${DOCX_CENTER_JUSTIFICATION}</w:pPr>`);
226
+ }
227
+
228
+ function replaceDocxMathMarker(documentXml, { fallbackTex, key, omml }) {
229
+ const fallbackRun = `<w:r><w:t xml:space="preserve">${escapeDocxXml(fallbackTex || key)}</w:t></w:r>`;
230
+ const runPattern = new RegExp(`<w:r\\b[^>]*>\\s*(?:<w:rPr\\b(?:/>|>[\\s\\S]*?</w:rPr>)\\s*)?<w:t\\b[^>]*>${key}</w:t>\\s*</w:r>`);
231
+ const runMatch = runPattern.exec(documentXml);
232
+
233
+ if (runMatch) {
234
+ const paragraph = enclosingDocxParagraph(documentXml, runMatch.index);
235
+ if (
236
+ omml
237
+ && paragraph
238
+ && !/<w:numPr\b/.test(paragraph.xml)
239
+ && isSoleMarkerParagraph(paragraph.xml, key)
240
+ ) {
241
+ const centered = centerDocxParagraph(paragraph.xml);
242
+ const innerMatch = runPattern.exec(centered);
243
+ const withMath = innerMatch
244
+ ? centered.slice(0, innerMatch.index) + omml + centered.slice(innerMatch.index + innerMatch[0].length)
245
+ : centered;
246
+ return documentXml.slice(0, paragraph.start) + withMath + documentXml.slice(paragraph.end);
247
+ }
248
+
249
+ const replacement = omml ?? fallbackRun;
250
+ return documentXml.slice(0, runMatch.index) + replacement + documentXml.slice(runMatch.index + runMatch[0].length);
251
+ }
252
+
253
+ return documentXml.split(key).join(escapeDocxXml(fallbackTex || key));
254
+ }
255
+
256
+ async function injectDocxMathEquations(docxBuffer, equations) {
257
+ const conversions = equations.map((equation) => ({
258
+ fallbackTex: extractMathmlAnnotation(equation.mml),
259
+ key: equation.key,
260
+ omml: convertMathmlToOmml(equation.mml),
261
+ }));
262
+
263
+ const zip = await JSZip.loadAsync(docxBuffer);
264
+ const documentFile = zip.file('word/document.xml');
265
+ if (!documentFile) {
266
+ return docxBuffer;
267
+ }
268
+
269
+ let documentXml = await documentFile.async('string');
270
+ for (const conversion of conversions) {
271
+ documentXml = replaceDocxMathMarker(documentXml, conversion);
272
+ }
273
+ zip.file('word/document.xml', documentXml);
274
+ const regenerated = await zip.generateAsync({ compression: 'DEFLATE', type: 'nodebuffer' });
275
+ return Buffer.from(regenerated);
276
+ }
277
+
34
278
  export async function renderDocx({
35
279
  html,
36
280
  title = '',
37
281
  } = {}) {
282
+ const content = String(html ?? '');
283
+ validateEmbeddedImages(content);
38
284
  const converter = await ensureConverter();
39
- const result = await converter(String(html ?? ''), null, {
285
+ const result = await converter(content, null, {
40
286
  creator: DOCX_EXPORTER_CREATOR,
41
287
  font: 'Arial',
42
288
  footer: false,
43
289
  pageNumber: false,
290
+ // Avoid a second HTML/CSS preprocessing pass after validation.
291
+ preprocessing: { skipHTMLMinify: true },
44
292
  table: {
45
293
  row: {
46
294
  cantSplit: true,
@@ -49,5 +297,11 @@ export async function renderDocx({
49
297
  title: String(title ?? ''),
50
298
  });
51
299
 
52
- return normalizeDocxBuffer(result);
300
+ const docxBuffer = normalizeDocxBuffer(result);
301
+ const equations = collectDocxMath(content);
302
+ if (equations.length === 0) {
303
+ return docxBuffer;
304
+ }
305
+
306
+ return injectDocxMathEquations(docxBuffer, equations);
53
307
  }
@@ -5,6 +5,13 @@ export const HOSTED_ROLE_COLLABORATOR = 'collaborator';
5
5
 
6
6
  const SUPPORTED_ROLES = new Set([HOSTED_ROLE_ADMIN, HOSTED_ROLE_COLLABORATOR]);
7
7
 
8
+ export function createHostedError(statusCode, message, code) {
9
+ const error = new Error(message);
10
+ error.statusCode = statusCode;
11
+ error.code = code;
12
+ return error;
13
+ }
14
+
8
15
  export function normalizeHostedEmail(value) {
9
16
  return normalizeEmailAddress(value);
10
17
  }
@@ -3,6 +3,7 @@ import { randomUUID, timingSafeEqual, createHash } from 'node:crypto';
3
3
  import {
4
4
  HOSTED_ROLE_ADMIN,
5
5
  HOSTED_ROLE_COLLABORATOR,
6
+ createHostedError,
6
7
  normalizeHostedEmail,
7
8
  normalizeHostedRole,
8
9
  } from './hosted-workspace-contract.js';
@@ -31,13 +32,6 @@ function safeEqualHash(left, right) {
31
32
  return leftBuffer.length === rightBuffer.length && timingSafeEqual(leftBuffer, rightBuffer);
32
33
  }
33
34
 
34
- function createHostedError(statusCode, message, code) {
35
- const error = new Error(message);
36
- error.statusCode = statusCode;
37
- error.code = code;
38
- return error;
39
- }
40
-
41
35
  function createAuditEvent({
42
36
  actor,
43
37
  metadata = {},
@@ -663,53 +657,33 @@ export class HostedWorkspaceService {
663
657
  throw createHostedError(400, 'Invalid membership role.', 'HOSTED_INVALID_ROLE');
664
658
  }
665
659
 
666
- const membership = await this.store.getMembershipById(membershipId);
667
- if (!membership) {
668
- throw createHostedError(404, 'Membership was not found.', 'HOSTED_MEMBERSHIP_NOT_FOUND');
669
- }
670
-
671
- if (membership.role === HOSTED_ROLE_ADMIN && normalizedRole !== HOSTED_ROLE_ADMIN) {
672
- await this.assertAnotherAdmin(membership.email);
673
- }
674
-
675
660
  const timestamp = nowMs();
676
- const updated = {
677
- ...membership,
661
+ const updated = await this.store.changeMembership({
662
+ actorId: admin.id,
663
+ membershipId,
678
664
  role: normalizedRole,
679
- updatedAt: timestamp,
680
- };
681
- await this.store.updateMembership(updated);
682
- await this.store.createAuditEvent(createAuditEvent({
683
- actor: admin,
684
- targetEmail: updated.email,
685
- targetRole: normalizedRole,
686
- timestamp,
687
- type: 'membership_role_changed',
688
- }));
665
+ auditEvent: createAuditEvent({
666
+ actor: admin,
667
+ timestamp,
668
+ type: 'membership_role_changed',
669
+ }),
670
+ });
689
671
  this.emitAccessChanged(updated.email);
690
672
  return publicMembership(updated);
691
673
  }
692
674
 
693
675
  async removeMembership({ membershipId, user }) {
694
676
  const admin = await this.requireAdmin(user);
695
- const membership = await this.store.getMembershipById(membershipId);
696
- if (!membership) {
697
- throw createHostedError(404, 'Membership was not found.', 'HOSTED_MEMBERSHIP_NOT_FOUND');
698
- }
699
-
700
- if (membership.role === HOSTED_ROLE_ADMIN) {
701
- await this.assertAnotherAdmin(membership.email);
702
- }
703
-
704
677
  const timestamp = nowMs();
705
- await this.store.deleteMembership(membership.id);
706
- await this.store.createAuditEvent(createAuditEvent({
707
- actor: admin,
708
- targetEmail: membership.email,
709
- targetRole: membership.role,
710
- timestamp,
711
- type: 'membership_removed',
712
- }));
678
+ const membership = await this.store.changeMembership({
679
+ actorId: admin.id,
680
+ membershipId,
681
+ auditEvent: createAuditEvent({
682
+ actor: admin,
683
+ timestamp,
684
+ type: 'membership_removed',
685
+ }),
686
+ });
713
687
  this.emitAccessChanged(membership.email);
714
688
  return { ok: true };
715
689
  }
@@ -724,17 +698,17 @@ export class HostedWorkspaceService {
724
698
  }
725
699
 
726
700
  const membership = access.membership;
727
- if (membership.role === HOSTED_ROLE_ADMIN) {
728
- await this.assertAnotherAdmin(membership.email);
729
- }
730
-
731
701
  const timestamp = nowMs();
732
- await this.store.deleteMembership(membership.id);
733
- await this.store.createAuditEvent(createAuditEvent({
734
- actor: membership,
735
- timestamp,
736
- type: 'membership_left',
737
- }));
702
+ await this.store.changeMembership({
703
+ actorId: membership.id,
704
+ membershipId: membership.id,
705
+ requireAdmin: false,
706
+ auditEvent: createAuditEvent({
707
+ actor: membership,
708
+ timestamp,
709
+ type: 'membership_left',
710
+ }),
711
+ });
738
712
  this.emitAccessChanged(membership.email);
739
713
  return { ok: true };
740
714
  }
@@ -764,11 +738,4 @@ export class HostedWorkspaceService {
764
738
  await this.requireAdmin(user);
765
739
  return (await this.store.listAuditEvents()).map(publicAuditEvent);
766
740
  }
767
-
768
- async assertAnotherAdmin(email) {
769
- const adminCount = await this.store.countAdminsExcept(normalizeHostedEmail(email));
770
- if (adminCount < 1) {
771
- throw createHostedError(409, 'A team must always have at least one Team Admin.', 'HOSTED_LAST_ADMIN');
772
- }
773
- }
774
741
  }