collabmd 0.1.27 → 0.1.30

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 (469) hide show
  1. package/README.md +5 -0
  2. package/dist/client/assets/{CodeMirrorEditor-UCMRAMCV-C5yVpm45.js → CodeMirrorEditor-UCMRAMCV-tj0_ycIx.js} +1 -1
  3. package/dist/client/assets/{_basePickBy-Dr0N-hVE.js → _basePickBy-B6kIfhzj.js} +1 -1
  4. package/dist/client/assets/{_baseUniq-BddJc3B1.js → _baseUniq-Bbn0_sHS.js} +1 -1
  5. package/dist/client/assets/actions-XO29hEzr.css +1 -0
  6. package/dist/client/assets/{ar-SA-NXDWD63E-C3GLfrYV.js → ar-SA-NXDWD63E-BWO5oYxe.js} +1 -1
  7. package/dist/client/assets/{arc-fx_D7wYg.js → arc-BIqum3oD.js} +1 -1
  8. package/dist/client/assets/architecture-PBZL5I3N-iRyVT2GQ.js +1 -0
  9. package/dist/client/assets/architectureDiagram-2XIMDMQ5-BPG5b65m.js +36 -0
  10. package/dist/client/assets/{az-AZ-MXSORGZV-BJ2t-y-C.js → az-AZ-MXSORGZV-Cfw6Z5oY.js} +1 -1
  11. package/dist/client/assets/base-CaIEJUF9.css +1 -0
  12. package/dist/client/assets/base-h1uscjTi.js +1 -0
  13. package/dist/client/assets/{bg-BG-O6MV2KSF-Cd3kEZI-.js → bg-BG-O6MV2KSF-CQmG3YpD.js} +1 -1
  14. package/dist/client/assets/{blockDiagram-WCTKOSBZ-BivLpsk_.js → blockDiagram-WCTKOSBZ-F38TRzI3.js} +1 -1
  15. package/dist/client/assets/{bn-IN-MMW2ORAC-Dn9W9dUT.js → bn-BD-T2VJNT7N-C4S6DZ6o.js} +1 -1
  16. package/dist/client/assets/{bn-BD-T2VJNT7N-BFCx9nbZ.js → bn-IN-MMW2ORAC-DZKVshfk.js} +1 -1
  17. package/dist/client/assets/{c4Diagram-IC4MRINW-nVzPTZmV.js → c4Diagram-IC4MRINW-DHwxcDlQ.js} +1 -1
  18. package/dist/client/assets/{ca-ES-MKBCGNOG-D_BNlrmg.js → ca-ES-MKBCGNOG-Do3aMgyu.js} +1 -1
  19. package/dist/client/assets/channel-s0w88EQN.js +1 -0
  20. package/dist/client/assets/{chunk-4BX2VUAB-n_yl-toC.js → chunk-4BX2VUAB-BqEY6cCE.js} +1 -1
  21. package/dist/client/assets/{chunk-55IACEB6-CJ9i_5Da.js → chunk-55IACEB6-039iVf6v.js} +1 -1
  22. package/dist/client/assets/{chunk-7E7YKBS2-CebEBDsj.js → chunk-7E7YKBS2-BreG0gYL.js} +1 -1
  23. package/dist/client/assets/{chunk-7R4GIKGN-BXNhzFkP.js → chunk-7R4GIKGN-BMrp52Pk.js} +2 -2
  24. package/dist/client/assets/{chunk-ETSVUAFD-C8C1JDu2.js → chunk-AXZTUZBK-Cxfm7hmm.js} +1 -1
  25. package/dist/client/assets/{chunk-C72U2L5F-Cck8MvGP.js → chunk-C72U2L5F-BLB26v5d.js} +1 -1
  26. package/dist/client/assets/{chunk-EGIJ26TM-BDQ7tRV-.js → chunk-EGIJ26TM-fG-0Yh0k.js} +1 -1
  27. package/dist/client/assets/{chunk-FMBD7UC4-DAcjCJR-.js → chunk-FMBD7UC4-EWK5Pt4D.js} +1 -1
  28. package/dist/client/assets/{chunk-GEFDOKGD-CYSNVsp-.js → chunk-GEFDOKGD-DYHmaq-c.js} +1 -1
  29. package/dist/client/assets/chunk-GLR3WWYH-CQ1LryrI.js +2 -0
  30. package/dist/client/assets/chunk-HHEYEP7N-DOQ0PCdH.js +1 -0
  31. package/dist/client/assets/{chunk-JSJVCQXG-CLgStmEI.js → chunk-JSJVCQXG-B69YGtcQ.js} +1 -1
  32. package/dist/client/assets/{chunk-KX2RTZJC-B__vUl1o.js → chunk-KX2RTZJC-tuEC7hg1.js} +1 -1
  33. package/dist/client/assets/{chunk-KYZI473N-BpfobHkp.js → chunk-KYZI473N-D4r5eMJZ.js} +1 -1
  34. package/dist/client/assets/{chunk-L3YUKLVL-B7jdwbRL.js → chunk-L3YUKLVL-CD9nJYL8.js} +1 -1
  35. package/dist/client/assets/{chunk-MX3YWQON-DNcuP5dS.js → chunk-MX3YWQON-DqN0TF5Q.js} +1 -1
  36. package/dist/client/assets/{chunk-NQ4KR5QH-oaq5iS2W.js → chunk-NQ4KR5QH-BBX89uUa.js} +1 -1
  37. package/dist/client/assets/chunk-NU2UP6EN-CGeKI3BV.js +35 -0
  38. package/dist/client/assets/{chunk-O4XLMI2P-NI4OcSZ6.js → chunk-O4XLMI2P-DaS3COAu.js} +1 -1
  39. package/dist/client/assets/{chunk-OZEHJAEY-BevHLeQ0.js → chunk-OZEHJAEY-BaBXI-8x.js} +1 -1
  40. package/dist/client/assets/{chunk-PQ6SQG4A-fQ_Oml5n.js → chunk-PQ6SQG4A-BY9_Srs_.js} +1 -1
  41. package/dist/client/assets/{chunk-PU5JKC2W-Bp4H-mwZ.js → chunk-PU5JKC2W-t0zUh6E3.js} +1 -1
  42. package/dist/client/assets/chunk-QZHKN3VN-B0v4d-CS.js +1 -0
  43. package/dist/client/assets/{chunk-R5LLSJPH-CZzZlfdI.js → chunk-R5LLSJPH-BjSMFnTi.js} +1 -1
  44. package/dist/client/assets/{chunk-SRAX5OIU-CtUYAya6.js → chunk-SRAX5OIU-CC2mobFL.js} +1 -1
  45. package/dist/client/assets/{chunk-WL4C6EOR-DnV9nMco.js → chunk-WL4C6EOR-zSV-8h7F.js} +1 -1
  46. package/dist/client/assets/{chunk-XIRO2GV7-BnkmoLpc.js → chunk-XIRO2GV7-2tirYN5A.js} +1 -1
  47. package/dist/client/assets/{chunk-XPW4576I-DOk6pMat.js → chunk-XPW4576I-C0GpOUHf.js} +1 -1
  48. package/dist/client/assets/{chunk-XZSTWKYB-DZzfqgVn.js → chunk-XZSTWKYB-DDkpyNVE.js} +1 -1
  49. package/dist/client/assets/{chunk-YBOYWFTD-CrI5WFnC.js → chunk-YBOYWFTD-CzyyfGQX.js} +1 -1
  50. package/dist/client/assets/{chunk-Z5NKEFVG-EGvolisB.js → chunk-Z5NKEFVG-Dgem5v98.js} +1 -1
  51. package/dist/client/assets/classDiagram-VBA2DB6C-BQqG4q1b.js +1 -0
  52. package/dist/client/assets/classDiagram-v2-RAHNMMFH-BUKbprX1.js +1 -0
  53. package/dist/client/assets/clone-C-n46MFF.js +1 -0
  54. package/dist/client/assets/controls-CLpueX2m.css +1 -0
  55. package/dist/client/assets/{cose-bilkent-S5V4N54A-PcMOD_rX.js → cose-bilkent-S5V4N54A-jZzFUguD.js} +1 -1
  56. package/dist/client/assets/{cs-CZ-V77HGUP7-gpioT6mv.js → cs-CZ-V77HGUP7-DmZRJ2UO.js} +1 -1
  57. package/dist/client/assets/{da-DK-I5RFNTM4-CVv-_qu9.js → da-DK-I5RFNTM4-CRIiLQ-G.js} +1 -1
  58. package/dist/client/assets/dagre-KLK3FWXG-CAG8WeES.js +4 -0
  59. package/dist/client/assets/{dagre-BD9xHP_z.js → dagre-fvYjRtTE.js} +1 -1
  60. package/dist/client/assets/{de-CH-WLRDEVBV-CL0gsFEp.js → de-CH-WLRDEVBV-k728UA4j.js} +1 -1
  61. package/dist/client/assets/{de-DE-DTI4WUSC-BQO1SHIK.js → de-DE-DTI4WUSC-MFge9MC3.js} +1 -1
  62. package/dist/client/assets/diagram-E7M64L7V-Bm5FD0I5.js +24 -0
  63. package/dist/client/assets/diagram-IFDJBPK2-pqicH-av.js +43 -0
  64. package/dist/client/assets/diagram-P4PSJMXO-DwIXO27H.js +24 -0
  65. package/dist/client/assets/dist-3bQB_we3.js +1 -0
  66. package/dist/client/assets/dist-3uAMa5w5.js +1 -0
  67. package/dist/client/assets/{dist-Q6uG0wie.js → dist-B-02vKOA.js} +1 -1
  68. package/dist/client/assets/{dist-DzArd_Bk.js → dist-BLAlZer_.js} +1 -1
  69. package/dist/client/assets/dist-BVB8rn7o.js +1 -0
  70. package/dist/client/assets/{dist-DrNF924C.js → dist-Bc2ND6i3.js} +1 -1
  71. package/dist/client/assets/{dist-lbtQBzLu.js → dist-BqQjnEWr.js} +1 -1
  72. package/dist/client/assets/{dist-BQhICHxD.js → dist-BtnXjRx0.js} +1 -1
  73. package/dist/client/assets/{dist-Ciw3BJA2.js → dist-BzbYwa8m.js} +1 -1
  74. package/dist/client/assets/{dist-fkQ6urpt.js → dist-BzpfHRaE.js} +1 -1
  75. package/dist/client/assets/{dist-DhzldYic.js → dist-CGV1S_as.js} +1 -1
  76. package/dist/client/assets/dist-CL-jjdvG.js +1 -0
  77. package/dist/client/assets/{dist-WrbPKwPQ.js → dist-CXpKYW9s.js} +1 -1
  78. package/dist/client/assets/{dist-60g3bzYH.js → dist-CjII8VDS.js} +1 -1
  79. package/dist/client/assets/{dist-BiFbHWxc.js → dist-CsYRf4AV.js} +1 -1
  80. package/dist/client/assets/{dist-U9MIFRLF.js → dist-CxfohGIV.js} +1 -1
  81. package/dist/client/assets/{dist-D2m8lD1h.js → dist-D5QOYy7y.js} +1 -1
  82. package/dist/client/assets/{dist-CvMToPSN.js → dist-DIi0uqLJ.js} +1 -1
  83. package/dist/client/assets/dist-DJ16N7ol.js +1 -0
  84. package/dist/client/assets/dist-DUvaQ-Bj.js +1 -0
  85. package/dist/client/assets/{dist-yRVuIDKu.js → dist-DWJL3_bF.js} +6 -6
  86. package/dist/client/assets/dist-DsL7sqZR.js +1 -0
  87. package/dist/client/assets/{dist-DAwSRqIJ.js → dist-Dyt7n5Ui.js} +1 -1
  88. package/dist/client/assets/{dist-B2pRSR5A.js → dist-E_jPb93e.js} +1 -1
  89. package/dist/client/assets/{dist-EPRNBXHp.js → dist-O1z0Ayg0.js} +1 -1
  90. package/dist/client/assets/dist-OQE68wIX.js +1 -0
  91. package/dist/client/assets/dist-k47-Io7D.js +1 -0
  92. package/dist/client/assets/{dist-2HWwyMLA.js → dist-lDhnP-K1.js} +1 -1
  93. package/dist/client/assets/{dist-BZc5d15t.js → dist-rMhng5DK.js} +1 -1
  94. package/dist/client/assets/dist-xO1ImhKz.js +1 -0
  95. package/dist/client/assets/{dockerfile-Ci0-ApQC.js → dockerfile-C0qQqxf9.js} +1 -1
  96. package/dist/client/assets/drawio-editor-CTZtMo1J.js +9 -0
  97. package/dist/client/assets/drawio-editor-UQQ8XHou.css +1 -0
  98. package/dist/client/assets/drawioEditor-keSJVTcv.js +2 -0
  99. package/dist/client/assets/editor-session-C9l9XwVg.js +16 -0
  100. package/dist/client/assets/{el-GR-ZXDJ2OS4-DGa9DqWI.js → el-GR-ZXDJ2OS4-Bbz93mrG.js} +1 -1
  101. package/dist/client/assets/embedded-editor-base-DgmRcsR8.css +1 -0
  102. package/dist/client/assets/{en-CTDJDZ6K-DC-4I8h8.js → en-IQZW2TQM-CZeIyvu2.js} +1 -1
  103. package/dist/client/assets/{erDiagram-INFDFZHY-Dnub3poK.js → erDiagram-INFDFZHY-DlhPv4az.js} +1 -1
  104. package/dist/client/assets/{es-ES-DYQHAD43-Cox3GUnj.js → es-ES-DYQHAD43-CReXU-Nn.js} +1 -1
  105. package/dist/client/assets/{eu-ES-QDSYU5Y3-DrPM2uSX.js → eu-ES-QDSYU5Y3-jRpcaWwz.js} +1 -1
  106. package/dist/client/assets/excalidraw-editor-CBEWfuhb.js +9 -0
  107. package/dist/client/assets/excalidraw-editor-Dj3i59LW.css +1 -0
  108. package/dist/client/assets/{excalidraw-mermaid-stub-LpuTrLnr.js → excalidraw-mermaid-stub-efoh2lJm.js} +1 -1
  109. package/dist/client/assets/excalidraw-scene-BL-OtvCd.js +176 -0
  110. package/dist/client/assets/excalidrawEditor-Ws-fwGOc.js +2 -0
  111. package/dist/client/assets/export-page-B6xYnwy7.js +39 -0
  112. package/dist/client/assets/exportDocument-8JBw0p8O.js +2 -0
  113. package/dist/client/assets/exportDocument-CtX_4PSk.css +1 -0
  114. package/dist/client/assets/{fa-IR-26LZG4PM-ViTdxAWX.js → fa-IR-26LZG4PM-DP8pJ8e3.js} +1 -1
  115. package/dist/client/assets/{factor-DMvifS-k.js → factor-2uy-lXe_.js} +1 -1
  116. package/dist/client/assets/{fi-FI-6YS4KDE4-BTBRGd69.js → fi-FI-6YS4KDE4-BLUDpNOj.js} +1 -1
  117. package/dist/client/assets/{flowDiagram-PKNHOUZH-DF4dDV_8.js → flowDiagram-PKNHOUZH-BU4MOSq8.js} +1 -1
  118. package/dist/client/assets/{fr-FR-BRLLPTZC-z-POHcHJ.js → fr-FR-BRLLPTZC-BoZz3Pi8.js} +1 -1
  119. package/dist/client/assets/ganttDiagram-A5KZAMGK-CbX67lZu.js +292 -0
  120. package/dist/client/assets/gitGraph-HDMCJU4V-kkuqHGSM.js +1 -0
  121. package/dist/client/assets/gitGraphDiagram-K3NZZRJ6-DhyvWcW1.js +65 -0
  122. package/dist/client/assets/{gl-ES-OKUZTLYG-BQtfDFNk.js → gl-ES-OKUZTLYG-CaEvhjDi.js} +1 -1
  123. package/dist/client/assets/{graphlib-B7v-yqry.js → graphlib-DSzYgMXB.js} +1 -1
  124. package/dist/client/assets/{he-IL-26MGYIU7-Dyw-xS4W.js → he-IL-26MGYIU7-DYOchgy9.js} +1 -1
  125. package/dist/client/assets/{hi-IN-Q4ZOGTP2-BqENUkZA.js → hi-IN-Q4ZOGTP2-yRs8g46n.js} +1 -1
  126. package/dist/client/assets/{hu-HU-P2OXPSN5-D1HGK0_M.js → hu-HU-P2OXPSN5-1skPmtgc.js} +1 -1
  127. package/dist/client/assets/{id-ID-2EIKXYN6-BEjyfllL.js → id-ID-2EIKXYN6-iUugQJd9.js} +1 -1
  128. package/dist/client/assets/image-XLNPCCAD-B4wZgh-Y.js +1 -0
  129. package/dist/client/assets/index-CywRKxsk.js +2 -0
  130. package/dist/client/assets/index-R4OArFku.css +1 -0
  131. package/dist/client/assets/info-3K5VOQVL-DPN78whf.js +1 -0
  132. package/dist/client/assets/infoDiagram-LFFYTUFH-Bap6MyHX.js +2 -0
  133. package/dist/client/assets/{isEmpty-CLDc0Kt_.js → isEmpty-C7iPDOO3.js} +1 -1
  134. package/dist/client/assets/{ishikawaDiagram-PHBUUO56-CmO_FyHY.js → ishikawaDiagram-PHBUUO56-DbftskqN.js} +1 -1
  135. package/dist/client/assets/{it-IT-4CFKVXI2-C24G-VcQ.js → it-IT-4CFKVXI2-a5DFhzuI.js} +1 -1
  136. package/dist/client/assets/{ja-JP-MAND2Z4V-DLhvsdYk.js → ja-JP-MAND2Z4V-DwogHVKd.js} +1 -1
  137. package/dist/client/assets/javascript-8DvdgifH.js +1 -0
  138. package/dist/client/assets/{journeyDiagram-4ABVD52K-DF4HAYLk.js → journeyDiagram-4ABVD52K-165YoX6B.js} +1 -1
  139. package/dist/client/assets/{jsx-runtime-DJkgQklN.js → jsx-runtime-DiaMmmG6.js} +1 -1
  140. package/dist/client/assets/{kaa-HQRTCXTJ-DC8l3BuJ.js → kaa-HQRTCXTJ-p81XNRfH.js} +1 -1
  141. package/dist/client/assets/{kab-KAB-JKIKKTGH-DVFog4hd.js → kab-KAB-JKIKKTGH-mV5VzQZc.js} +1 -1
  142. package/dist/client/assets/{kanban-definition-K7BYSVSG-nQoJJABn.js → kanban-definition-K7BYSVSG-MlixoNyx.js} +1 -1
  143. package/dist/client/assets/{kk-KZ-HXQ63ZFC-CULUfwMg.js → kk-KZ-HXQ63ZFC-IIPX0GQv.js} +1 -1
  144. package/dist/client/assets/{km-KH-PKL3LSGX-CnLlEv7i.js → km-KH-PKL3LSGX-D7WQFJuZ.js} +1 -1
  145. package/dist/client/assets/{ko-KR-KXLREZX3-DNKXAYCx.js → ko-KR-KXLREZX3-Bs1oLtJs.js} +1 -1
  146. package/dist/client/assets/{ku-TR-MJ4IER3X-DLUiMa4h.js → ku-TR-MJ4IER3X-DlxOs6aZ.js} +1 -1
  147. package/dist/client/assets/{line-DvLjT0Gv.js → line-D57TbKb7.js} +1 -1
  148. package/dist/client/assets/{linear-CEb8O7zv.js → linear-BIf852wI.js} +1 -1
  149. package/dist/client/assets/{lt-LT-H6WFQ6FJ-CoFiurzb.js → lt-LT-H6WFQ6FJ-xuo-3zKH.js} +1 -1
  150. package/dist/client/assets/{lv-LV-GOCK6SJW-DzeEvHxX.js → lv-LV-GOCK6SJW-C7S3M1nr.js} +1 -1
  151. package/dist/client/assets/main-CB97rY6B.js +1213 -0
  152. package/dist/client/assets/mermaid-parser.core-lf87rdG-.js +4 -0
  153. package/dist/client/assets/{mermaid-runtime-DbCLD8Ih.js → mermaid-runtime-C4a7TrTS.js} +3 -3
  154. package/dist/client/assets/{mindmap-definition-YRQLILUH-DaMULsE9.js → mindmap-definition-YRQLILUH-_YbQSc4Q.js} +1 -1
  155. package/dist/client/assets/{mr-IN-IXVLDMEQ-C5i5R9H5.js → mr-IN-IXVLDMEQ-BsoowyZT.js} +1 -1
  156. package/dist/client/assets/{my-MM-YG6MYTTD-DvwceqO-.js → my-MM-YG6MYTTD-DCqwN_K_.js} +1 -1
  157. package/dist/client/assets/navigation-Du6CLhvs.css +1 -0
  158. package/dist/client/assets/{nb-NO-XGWJISD2-BUhX8hX0.js → nb-NO-XGWJISD2-CZ5ytLgj.js} +1 -1
  159. package/dist/client/assets/{nl-NL-XVDVCPNC-BV6Y0-Q0.js → nl-NL-XVDVCPNC-wADsdb-h.js} +1 -1
  160. package/dist/client/assets/{nn-NO-EMX5MJX5-CF_bB9Jq.js → nn-NO-EMX5MJX5-D9zIKTL2.js} +1 -1
  161. package/dist/client/assets/{nsis-42hkxqLx.js → nsis-CUd4RnvJ.js} +1 -1
  162. package/dist/client/assets/{oc-FR-ROEINTVO-CiNI8fg8.js → oc-FR-ROEINTVO-BSbBugJB.js} +1 -1
  163. package/dist/client/assets/{ordinal-fW5lWpNM.js → ordinal-B0PAtOQ6.js} +1 -1
  164. package/dist/client/assets/{pa-IN-ZYN6SUDY-CsbIU150.js → pa-IN-ZYN6SUDY-1pFA_3Pb.js} +1 -1
  165. package/dist/client/assets/packet-RMMSAZCW-BymvQ5cQ.js +1 -0
  166. package/dist/client/assets/percentages-5DKR754L-CiI2D7zA.js +1 -0
  167. package/dist/client/assets/{pica-BbcTjVoI.js → pica-By-YDy_B.js} +1 -1
  168. package/dist/client/assets/pie-UPGHQEXC-MmzJzWOE.js +1 -0
  169. package/dist/client/assets/pieDiagram-SKSYHLDU-CqCgXFom.js +30 -0
  170. package/dist/client/assets/{pl-PL-6VTG7PHC-D1Nnx7R3.js → pl-PL-6VTG7PHC-DyYw0u_z.js} +1 -1
  171. package/dist/client/assets/preview-diagram-utils-Dc83ucbv.js +1 -0
  172. package/dist/client/assets/preview-render-compiler-TmHpBDlh.js +1 -0
  173. package/dist/client/assets/preview-render-compiler-aYpnXmNm.js +35 -0
  174. package/dist/client/assets/{preview-render-profile-DQsam_Ol.js → preview-render-profile-DPzmho7I.js} +1 -1
  175. package/dist/client/assets/preview-render-worker-BVbVXXPS.js +59 -0
  176. package/dist/client/assets/{pt-BR-5YFKRR5G-DEDTeWEP.js → pt-BR-5YFKRR5G-DJCCBBDl.js} +1 -1
  177. package/dist/client/assets/{pt-PT-GEIXXZ67-BpqPVZom.js → pt-PT-GEIXXZ67-BPJd09Ax.js} +1 -1
  178. package/dist/client/assets/{pug-BANqyQJ9.js → pug-BqBF8qF7.js} +1 -1
  179. package/dist/client/assets/{quadrantDiagram-337W2JSQ-DjPGrcJM.js → quadrantDiagram-337W2JSQ-B8eMuhg4.js} +1 -1
  180. package/dist/client/assets/{quick-switcher-controller-n6Jhu3Z9.js → quick-switcher-controller-DplOTsT3.js} +1 -1
  181. package/dist/client/assets/radar-KQ55EAFF-CCohASSY.js +1 -0
  182. package/dist/client/assets/{requirementDiagram-Z7DCOOCP-BmiYAMKV.js → requirementDiagram-Z7DCOOCP-B6POvqz4.js} +1 -1
  183. package/dist/client/assets/{ro-RO-E2P6TFZI-4vRM1jVT.js → ro-RO-E2P6TFZI-DWVyTV7V.js} +1 -1
  184. package/dist/client/assets/{room-DyhEnogt.js → room-COWSP--i.js} +1 -1
  185. package/dist/client/assets/{ru-RU-YBIIY43T-Cfbhz4Ew.js → ru-RU-YBIIY43T-Dyar7CYM.js} +1 -1
  186. package/dist/client/assets/runtime-config-CqX_f_Q4.js +1 -0
  187. package/dist/client/assets/{sankeyDiagram-WA2Y5GQK-BEoPAlcC.js → sankeyDiagram-WA2Y5GQK-CXRga6Op.js} +1 -1
  188. package/dist/client/assets/{sequenceDiagram-2WXFIKYE-BXqojuDS.js → sequenceDiagram-2WXFIKYE-CeSFlFx5.js} +1 -1
  189. package/dist/client/assets/{si-LK-673C2CI2-0muNkOEn.js → si-LK-673C2CI2-C61aLrIy.js} +1 -1
  190. package/dist/client/assets/{sk-SK-CKZHQ4AP-EnLgxyJL.js → sk-SK-CKZHQ4AP-BlFwOxRD.js} +1 -1
  191. package/dist/client/assets/{sl-SI-557H2GWM-BN6npqVj.js → sl-SI-557H2GWM-DcAVW-_t.js} +1 -1
  192. package/dist/client/assets/{src-DUDi_GeV.js → src-E3c2cohN.js} +1 -1
  193. package/dist/client/assets/stateDiagram-RAJIS63D-DbewhqwJ.js +1 -0
  194. package/dist/client/assets/stateDiagram-v2-FVOUBMTO-DbW-jVkS.js +1 -0
  195. package/dist/client/assets/states-P2LsGDDn.css +1 -0
  196. package/dist/client/assets/subset-shared.chunk-CC_u8ICU.js +1 -0
  197. package/dist/client/assets/{subset-worker.chunk-1FoL7eL0.js → subset-worker.chunk-DVGT6bvR.js} +1 -1
  198. package/dist/client/assets/{sv-SE-XOPKKDWS-D3VSs2SQ.js → sv-SE-XOPKKDWS-BkhfOHzh.js} +1 -1
  199. package/dist/client/assets/{ta-IN-XBH7DQI3-BKR1mqfo.js → ta-IN-XBH7DQI3-BIfwglZa.js} +1 -1
  200. package/dist/client/assets/{th-TH-TOCWH3R4-Bek1dQcW.js → th-TH-TOCWH3R4-CkrxqVkf.js} +1 -1
  201. package/dist/client/assets/{timeline-definition-YZTLITO2-BP09qqIh.js → timeline-definition-YZTLITO2-BXBHNWLQ.js} +1 -1
  202. package/dist/client/assets/{tr-TR-GXW6CYY5-xdLb7Dgi.js → tr-TR-GXW6CYY5-CDdvG9rD.js} +1 -1
  203. package/dist/client/assets/treemap-KZPCXAKY-9kxB0uNY.js +1 -0
  204. package/dist/client/assets/{uk-UA-IJKTNUDG-Cd0AhTti.js → uk-UA-IJKTNUDG-DRHp0lWp.js} +1 -1
  205. package/dist/client/assets/{uz-UZ-TBZZEA4V-DQH4e-QC.js → uz-UZ-TBZZEA4V-BIn-VE3Y.js} +1 -1
  206. package/dist/client/assets/vault-api-client-DIaCC56H.js +1 -0
  207. package/dist/client/assets/vault-api-client-De7kMvrE.css +1 -0
  208. package/dist/client/assets/{vennDiagram-LZ73GAT5-BvSlhnT0.js → vennDiagram-LZ73GAT5-C1hrSbf2.js} +1 -1
  209. package/dist/client/assets/{vi-VN-MULSGNVB-BYDcPrAo.js → vi-VN-MULSGNVB-Du7t5I0v.js} +1 -1
  210. package/dist/client/assets/{xychartDiagram-JWTSCODW-BvZ78F0j.js → xychartDiagram-JWTSCODW-DhpWp8LV.js} +1 -1
  211. package/dist/client/assets/yjs-provider-reset-guard-DWGhQClh.js +4 -0
  212. package/dist/client/assets/{zh-CN-MVX3E32U-BqZQ-18-.js → zh-CN-MVX3E32U-RcjS3rjt.js} +1 -1
  213. package/dist/client/assets/{zh-HK-JNU5RLIE-CbF8Agwa.js → zh-HK-JNU5RLIE-g8UeEw5v.js} +1 -1
  214. package/dist/client/assets/{zh-TW-LENVCA6T-CepoVycx.js → zh-TW-LENVCA6T-DwV25BqC.js} +1 -1
  215. package/dist/client/drawio-editor.html +4 -26
  216. package/dist/client/excalidraw-editor.html +4 -19
  217. package/dist/client/export-document.html +29 -0
  218. package/dist/client/index.html +7 -445
  219. package/docker-compose.yml +1 -0
  220. package/package.json +26 -22
  221. package/src/client/app/drawio-editor.html +1 -23
  222. package/src/client/app/excalidraw-editor.html +1 -16
  223. package/src/client/app/export-document-entry.js +25 -0
  224. package/src/client/app/export-document.html +24 -0
  225. package/src/client/app/index.html +1 -441
  226. package/src/client/app/main-entry.js +2 -0
  227. package/src/client/application/app-shell/export-feature.js +39 -0
  228. package/src/client/application/app-shell/ui-feature-shell.js +112 -17
  229. package/src/client/application/app-shell/ui-feature-toolbar.js +26 -4
  230. package/src/client/application/app-shell/workspace-feature.js +31 -3
  231. package/src/client/application/app-shell-elements.js +5 -0
  232. package/src/client/application/diagram-preview-hydrator.js +1 -1
  233. package/src/client/application/markdown-frontmatter.js +152 -0
  234. package/src/client/application/preview-render-compiler.js +16 -4
  235. package/src/client/application/preview-render-executor.js +8 -1
  236. package/src/client/application/preview-render-worker.js +4 -0
  237. package/src/client/application/preview-renderer.js +51 -1
  238. package/src/client/application/workspace-chrome-controller.js +3 -1
  239. package/src/client/application/workspace-coordinator.js +8 -1
  240. package/src/client/application/workspace-preview-controller.js +9 -3
  241. package/src/client/application/workspace-state-store.js +1 -0
  242. package/src/client/bootstrap/collabmd-app-shell.js +13 -1
  243. package/src/client/domain/markdown-formatting.js +1 -1
  244. package/src/client/domain/markdown-toolbar-actions.js +36 -0
  245. package/src/client/drawio-editor.js +4 -1
  246. package/src/client/excalidraw-editor.js +8 -0
  247. package/src/client/export/export-host.js +193 -0
  248. package/src/client/export/export-page.js +60 -0
  249. package/src/client/export/export-pipeline.js +1412 -0
  250. package/src/client/export/export-print-layout.js +50 -0
  251. package/src/client/infrastructure/auth-client.js +2 -203
  252. package/src/client/infrastructure/editor-session.js +12 -0
  253. package/src/client/infrastructure/editor-view-adapter.js +70 -2
  254. package/src/client/infrastructure/excalidraw-room-client.js +12 -4
  255. package/src/client/presentation/app-shell-renderer.js +13 -0
  256. package/src/client/presentation/app-shell-template.js +605 -0
  257. package/src/client/presentation/comment-ui/comment-ui-card.js +32 -10
  258. package/src/client/presentation/comments-panel.js +5 -3
  259. package/src/client/presentation/components/ui/badge.js +24 -0
  260. package/src/client/presentation/components/ui/button.js +78 -0
  261. package/src/client/presentation/components/ui/class-names.js +30 -0
  262. package/src/client/presentation/components/ui/ensure-ui-component-styles.js +18 -0
  263. package/src/client/presentation/components/ui/input.js +9 -0
  264. package/src/client/presentation/components/ui/segmented-control.js +31 -0
  265. package/src/client/presentation/create-menu-presenter.js +10 -2
  266. package/src/client/presentation/file-action-controller.js +5 -6
  267. package/src/client/presentation/file-explorer-view.js +9 -2
  268. package/src/client/presentation/file-history-view-controller.js +4 -3
  269. package/src/client/presentation/git-diff-view-controller.js +9 -11
  270. package/src/client/presentation/git-panel-controller.js +10 -8
  271. package/src/client/presentation/layout-controller.js +34 -4
  272. package/src/client/styles/base.css +5 -0
  273. package/src/client/styles/components/actions.css +6 -0
  274. package/src/client/styles/components/navigation.css +1 -0
  275. package/src/client/styles/export-document.css +250 -0
  276. package/src/client/styles/features/auth-gate.css +182 -0
  277. package/src/client/styles/features/git-branch.css +30 -2
  278. package/src/client/styles/features/preview-markdown.css +145 -4
  279. package/src/client/styles/layout/editor-page.css +101 -3
  280. package/src/client/styles/layout/responsive.css +97 -7
  281. package/src/client/styles/layout/shell.css +6 -0
  282. package/src/client/styles/layout/sidebar.css +1 -1
  283. package/src/client/styles/overrides/codemirror.css +74 -0
  284. package/src/client/styles/primitives/controls.css +22 -31
  285. package/src/client/styles/style.css +0 -4
  286. package/src/client/styles/surfaces/drawio-editor.css +104 -0
  287. package/src/client/styles/surfaces/embedded-editor-base.css +23 -0
  288. package/src/client/styles/surfaces/excalidraw-editor.css +16 -0
  289. package/src/server/auth/create-auth-service.js +32 -6
  290. package/src/server/config/env.js +27 -0
  291. package/src/server/config/perf-logging.js +39 -0
  292. package/src/server/create-app-server.js +105 -5
  293. package/src/server/domain/backlink-index.js +31 -7
  294. package/src/server/domain/collaboration/collaboration-room.js +28 -5
  295. package/src/server/domain/docx-exporter.js +62 -0
  296. package/src/server/infrastructure/git/history-service.js +1 -1
  297. package/src/server/infrastructure/http/create-request-handler.js +2 -0
  298. package/src/server/infrastructure/http/create-vault-api-command-handler.js +59 -1
  299. package/src/server/infrastructure/http/create-vault-api-handler.js +2 -0
  300. package/src/server/infrastructure/http/request-body.js +2 -2
  301. package/src/server/infrastructure/persistence/pull-backup-store.js +1 -1
  302. package/src/server/infrastructure/persistence/vault-file-store.js +74 -31
  303. package/src/server/infrastructure/workspace/file-system-sync-service.js +46 -12
  304. package/src/server/infrastructure/workspace/workspace-mutation-coordinator.js +32 -7
  305. package/src/server/shared/async-utils.js +25 -0
  306. package/dist/client/assets/architecture-PBZL5I3N-C1Yv7agI.js +0 -1
  307. package/dist/client/assets/architectureDiagram-2XIMDMQ5-T__yxKk2.js +0 -36
  308. package/dist/client/assets/channel-DBZin7O0.js +0 -1
  309. package/dist/client/assets/chunk-27N2SPOM-CyIruM79.js +0 -34
  310. package/dist/client/assets/chunk-GLR3WWYH-FplqAopN.js +0 -2
  311. package/dist/client/assets/chunk-HHEYEP7N-Bv_FKHmu.js +0 -1
  312. package/dist/client/assets/chunk-QZHKN3VN-Blawx8vd.js +0 -1
  313. package/dist/client/assets/classDiagram-VBA2DB6C-CreQafQu.js +0 -1
  314. package/dist/client/assets/classDiagram-v2-RAHNMMFH-BIYHzbiv.js +0 -1
  315. package/dist/client/assets/clone-C3ajWNce.js +0 -1
  316. package/dist/client/assets/dagre-KLK3FWXG-Ct1xwvCC.js +0 -4
  317. package/dist/client/assets/diagram-E7M64L7V-DkHzt94k.js +0 -24
  318. package/dist/client/assets/diagram-IFDJBPK2-D4g8afpU.js +0 -43
  319. package/dist/client/assets/diagram-P4PSJMXO-DVwwx6ED.js +0 -24
  320. package/dist/client/assets/dist-BS6yAJ9F.js +0 -1
  321. package/dist/client/assets/dist-BUnp4fHW.js +0 -1
  322. package/dist/client/assets/dist-BWEDjv8G.js +0 -1
  323. package/dist/client/assets/dist-BdtPRC1F.js +0 -1
  324. package/dist/client/assets/dist-BlhsMbAl.js +0 -1
  325. package/dist/client/assets/dist-CLsz2DCg.js +0 -1
  326. package/dist/client/assets/dist-DZD5y4h6.js +0 -1
  327. package/dist/client/assets/dist-_L_gn5XE.js +0 -1
  328. package/dist/client/assets/dist-a6bFAbQd.js +0 -1
  329. package/dist/client/assets/dist-naAaVPPS.js +0 -1
  330. package/dist/client/assets/drawio-editor-BW2z4NH2.js +0 -9
  331. package/dist/client/assets/drawioEditor-DgoA4Zqi.js +0 -2
  332. package/dist/client/assets/editor-session-xPvmulmt.js +0 -16
  333. package/dist/client/assets/excalidraw-editor-BAYca95w.js +0 -182
  334. package/dist/client/assets/excalidraw-editor-D8O7A69r.css +0 -1
  335. package/dist/client/assets/excalidrawEditor-BY5rq_Bn.js +0 -2
  336. package/dist/client/assets/ganttDiagram-A5KZAMGK-CwrN53Gu.js +0 -292
  337. package/dist/client/assets/gitGraph-HDMCJU4V-DbS2XnWK.js +0 -1
  338. package/dist/client/assets/gitGraphDiagram-K3NZZRJ6-BV9w0K-N.js +0 -65
  339. package/dist/client/assets/image-32MOCVDX-BBXPyAeU.js +0 -1
  340. package/dist/client/assets/index-D4FS-o13.js +0 -2
  341. package/dist/client/assets/index-DRgeOr4A.css +0 -1
  342. package/dist/client/assets/info-3K5VOQVL-Bre4VStM.js +0 -1
  343. package/dist/client/assets/infoDiagram-LFFYTUFH-CuUbZqrG.js +0 -2
  344. package/dist/client/assets/javascript-DdEc60Aj.js +0 -1
  345. package/dist/client/assets/main-Q1xvhoqP.js +0 -600
  346. package/dist/client/assets/mermaid-parser.core-DllATXd7.js +0 -4
  347. package/dist/client/assets/packet-RMMSAZCW-B7lnOkip.js +0 -1
  348. package/dist/client/assets/percentages-5DKR754L-Dp1vwDEq.js +0 -1
  349. package/dist/client/assets/pie-UPGHQEXC-D0gHdMgb.js +0 -1
  350. package/dist/client/assets/pieDiagram-SKSYHLDU-BPFp1WBd.js +0 -30
  351. package/dist/client/assets/preview-render-compiler-BYiRMsPq.js +0 -1
  352. package/dist/client/assets/preview-render-worker-CcASh3y3.js +0 -23
  353. package/dist/client/assets/radar-KQ55EAFF-D48du2CB.js +0 -1
  354. package/dist/client/assets/stateDiagram-RAJIS63D-DTR2sQs8.js +0 -1
  355. package/dist/client/assets/stateDiagram-v2-FVOUBMTO-BwVII-kJ.js +0 -1
  356. package/dist/client/assets/subset-shared.chunk-C6pUl_Oh.js +0 -1
  357. package/dist/client/assets/treemap-KZPCXAKY-BBRObSiT.js +0 -1
  358. package/dist/client/assets/vault-api-client-fFJfUVXM.js +0 -188
  359. package/dist/client/assets/yjs-provider-reset-guard-Cj00kgyM.js +0 -4
  360. /package/dist/client/assets/{apl-CJPt5sW7.js → apl-QJCYYBkj.js} +0 -0
  361. /package/dist/client/assets/{array-e43ctQmx.js → array-DwdVlTkF.js} +0 -0
  362. /package/dist/client/assets/{asciiarmor-D0oCypDs.js → asciiarmor-DNy0UPqh.js} +0 -0
  363. /package/dist/client/assets/{asn1-8xgVfRoq.js → asn1-CNPXj-s7.js} +0 -0
  364. /package/dist/client/assets/{asterisk-B5kv5AQp.js → asterisk-BwMdLpT2.js} +0 -0
  365. /package/dist/client/assets/{brainfuck-Dh7M1Ucz.js → brainfuck-C2gHT8aA.js} +0 -0
  366. /package/dist/client/assets/{chunk-3PELD44J-D4qJ8fq7.js → chunk-3PELD44J-CL87tpFo.js} +0 -0
  367. /package/dist/client/assets/{chunk-A66AFZZU-CJuwmF1m.js → chunk-A66AFZZU-DuceaGnc.js} +0 -0
  368. /package/dist/client/assets/{chunk-D-fkvfCP.js → chunk-DpHwWhuW.js} +0 -0
  369. /package/dist/client/assets/{clike-zYz_LEkw.js → clike-D5X7HJpo.js} +0 -0
  370. /package/dist/client/assets/{clojure-CdWlIeQh.js → clojure-BEDKZv_5.js} +0 -0
  371. /package/dist/client/assets/{cmake-wWuF5ifR.js → cmake-Y3shE7av.js} +0 -0
  372. /package/dist/client/assets/{cobol-D3WLbLVy.js → cobol-f-3TLk62.js} +0 -0
  373. /package/dist/client/assets/{coffeescript-DRtt-5a2.js → coffeescript-C0XA9-xa.js} +0 -0
  374. /package/dist/client/assets/{commonlisp-DJV75lsU.js → commonlisp-BOB6sIEu.js} +0 -0
  375. /package/dist/client/assets/{crystal-C7mEw92C.js → crystal-ByNgE_My.js} +0 -0
  376. /package/dist/client/assets/{css-_6KgQwpu.js → css-eaI-ENiR.js} +0 -0
  377. /package/dist/client/assets/{cypher-B3uWx7jm.js → cypher-CQ-dGGSi.js} +0 -0
  378. /package/dist/client/assets/{cytoscape.esm-BbbuX1pV.js → cytoscape.esm-DBDRhUia.js} +0 -0
  379. /package/dist/client/assets/{d-D3kOh3JF.js → d-D9pnu4Cr.js} +0 -0
  380. /package/dist/client/assets/{defaultLocale-DTn6RiRA.js → defaultLocale-BWgun1yJ.js} +0 -0
  381. /package/dist/client/assets/{diff-CoamybWh.js → diff-z9q33Lo6.js} +0 -0
  382. /package/dist/client/assets/{drawio-room-D6352KkV.js → drawio-room-C592VDk7.js} +0 -0
  383. /package/dist/client/assets/{dtd-BjGQwMWL.js → dtd-BDizf_te.js} +0 -0
  384. /package/dist/client/assets/{dylan-B9W3X2GI.js → dylan-Bk__XCKW.js} +0 -0
  385. /package/dist/client/assets/{ebnf-d5D0otVn.js → ebnf-SzN4Kxtp.js} +0 -0
  386. /package/dist/client/assets/{ecl-C5Q_IBPt.js → ecl-5ulxiKbt.js} +0 -0
  387. /package/dist/client/assets/{eiffel-BQA_6I3b.js → eiffel-Bhoaqbb6.js} +0 -0
  388. /package/dist/client/assets/{elm-unPS17vB.js → elm-C3je846J.js} +0 -0
  389. /package/dist/client/assets/{erlang-R8nOsUTx.js → erlang-Cgk9SIAz.js} +0 -0
  390. /package/dist/client/assets/{excalidraw-mermaid-stub-BJq3n7pR.js → excalidraw-mermaid-stub-B_2dv3Ll.js} +0 -0
  391. /package/dist/client/assets/{fcl-CVAfW9wK.js → fcl-dvkZwp9p.js} +0 -0
  392. /package/dist/client/assets/{forth-DHbsK8X8.js → forth-DmfSa3jN.js} +0 -0
  393. /package/dist/client/assets/{fortran-4jMwxW9-.js → fortran-BsZAiNnN.js} +0 -0
  394. /package/dist/client/assets/{gas-zC_XGrQT.js → gas-DBpKE9ut.js} +0 -0
  395. /package/dist/client/assets/{gherkin-CPBQou3u.js → gherkin-CceEbBs7.js} +0 -0
  396. /package/dist/client/assets/{groovy-Cqopym0q.js → groovy-CxJnDvES.js} +0 -0
  397. /package/dist/client/assets/{haskell-imzbNPgF.js → haskell-CUSb34Xy.js} +0 -0
  398. /package/dist/client/assets/{haxe-Doh225Ku.js → haxe-6EHO_h-N.js} +0 -0
  399. /package/dist/client/assets/{http-j4R5uEso.js → http-C3qcBpvG.js} +0 -0
  400. /package/dist/client/assets/{idl-l9d1__Hj.js → idl-C95wIO2I.js} +0 -0
  401. /package/dist/client/assets/{image-blob-reduce.esm-CQfEe3_g.js → image-blob-reduce.esm-BaW4gpT9.js} +0 -0
  402. /package/dist/client/assets/{init-207s1ipc.js → init-Bjj5fg68.js} +0 -0
  403. /package/dist/client/assets/{isArrayLikeObject-ZCMZRndo.js → isArrayLikeObject-Cmt1CYnI.js} +0 -0
  404. /package/dist/client/assets/{javascript-9dQYqEHJ.js → javascript-aWB87b1w.js} +0 -0
  405. /package/dist/client/assets/{julia-ByGjwiLn.js → julia-DF9PPAXG.js} +0 -0
  406. /package/dist/client/assets/{katex-XOVNa2d9.js → katex-BPsFnA3D.js} +0 -0
  407. /package/dist/client/assets/{livescript-B8l2m7xO.js → livescript-CnOyWwUY.js} +0 -0
  408. /package/dist/client/assets/{lua-DrfAKnQQ.js → lua-a0rEq19C.js} +0 -0
  409. /package/dist/client/assets/{math-BlD6rf4Z.js → math-BaavbII8.js} +0 -0
  410. /package/dist/client/assets/{mathematica-DYk_2Ik_.js → mathematica-CKUq0Ojc.js} +0 -0
  411. /package/dist/client/assets/{mbox-BOzVHzVt.js → mbox-a-u2PLog.js} +0 -0
  412. /package/dist/client/assets/{mirc-DStbUCmv.js → mirc-BOd43sOX.js} +0 -0
  413. /package/dist/client/assets/{mllike-BmhQglqS.js → mllike-fHruGivh.js} +0 -0
  414. /package/dist/client/assets/{modelica-ZElxtbqD.js → modelica-B0NJqf1C.js} +0 -0
  415. /package/dist/client/assets/{mscgen-f-YxHPr0.js → mscgen-DJZ33SrF.js} +0 -0
  416. /package/dist/client/assets/{mumps-B79RJJhR.js → mumps-DvMvHTxU.js} +0 -0
  417. /package/dist/client/assets/{nginx-c--axfuP.js → nginx-BVAs8laz.js} +0 -0
  418. /package/dist/client/assets/{ntriples-CgD4YZZC.js → ntriples-DrdyAZU1.js} +0 -0
  419. /package/dist/client/assets/{octave-BQk-bCrp.js → octave-_YqJ0g7E.js} +0 -0
  420. /package/dist/client/assets/{oz-DPCSPrx5.js → oz-k7T3LoMr.js} +0 -0
  421. /package/dist/client/assets/{pascal-C1iGzZ53.js → pascal-CftsTvte.js} +0 -0
  422. /package/dist/client/assets/{path-CDSE7Nw0.js → path-BUmMWM1-.js} +0 -0
  423. /package/dist/client/assets/{perl-DQ3L8ffg.js → perl-CbsLFc7A.js} +0 -0
  424. /package/dist/client/assets/{pig-B4S8acys.js → pig-C-jTwMS-.js} +0 -0
  425. /package/dist/client/assets/{powershell-BhSVdaeY.js → powershell-DqXLgSHX.js} +0 -0
  426. /package/dist/client/assets/{preload-helper-I1wKxk_B.js → preload-helper-Bo9GmnuQ.js} +0 -0
  427. /package/dist/client/assets/{properties-B2nfdtxE.js → properties-05jaw55P.js} +0 -0
  428. /package/dist/client/assets/{protobuf-BFW_iwVN.js → protobuf-DThTsZQN.js} +0 -0
  429. /package/dist/client/assets/{puppet-C1-CkyhQ.js → puppet-DuHxMpoj.js} +0 -0
  430. /package/dist/client/assets/{python-CYXPDD4I.js → python-BiE2VHJI.js} +0 -0
  431. /package/dist/client/assets/{q-Bub5Xmxm.js → q-DH46YfNw.js} +0 -0
  432. /package/dist/client/assets/{r-C59ONZO2.js → r-DmEm46kJ.js} +0 -0
  433. /package/dist/client/assets/{rough.esm-xhKrnp4d.js → rough.esm-jZQkcmER.js} +0 -0
  434. /package/dist/client/assets/{roundRect-CTz-kxJH.js → roundRect-CI6UmGg6.js} +0 -0
  435. /package/dist/client/assets/{rpm-DiM-R-wd.js → rpm-DILIIbRB.js} +0 -0
  436. /package/dist/client/assets/{ruby-DTqG95KX.js → ruby-2LcnHEMS.js} +0 -0
  437. /package/dist/client/assets/{runtime-config-loader-DwWsKc1-.js → runtime-config-loader-_D2KZKn-.js} +0 -0
  438. /package/dist/client/assets/{sas-BjdhmGHX.js → sas-Bn81MKuB.js} +0 -0
  439. /package/dist/client/assets/{scheme-CWNdoI17.js → scheme-B8kPNbgd.js} +0 -0
  440. /package/dist/client/assets/{shell-iaorleRB.js → shell-CGj6v8kb.js} +0 -0
  441. /package/dist/client/assets/{sieve-D8m9Etmd.js → sieve-CfVNFN1K.js} +0 -0
  442. /package/dist/client/assets/{simple-mode-kdHrpFjq.js → simple-mode-_FSHdiXs.js} +0 -0
  443. /package/dist/client/assets/{smalltalk-28WS1mUj.js → smalltalk-BpIFyCPt.js} +0 -0
  444. /package/dist/client/assets/{solr-x8qQ6eAP.js → solr-B7iFaetn.js} +0 -0
  445. /package/dist/client/assets/{sparql-BvLmi7B6.js → sparql-COhgMTFK.js} +0 -0
  446. /package/dist/client/assets/{spreadsheet-BuqSwScP.js → spreadsheet-BzuffEeg.js} +0 -0
  447. /package/dist/client/assets/{sql-B8tBavZM.js → sql-13lT5zDl.js} +0 -0
  448. /package/dist/client/assets/{stex-Bx4bLPxI.js → stex-BRSfZZYG.js} +0 -0
  449. /package/dist/client/assets/{stylus-CMEhEjuV.js → stylus-fFo0QRk_.js} +0 -0
  450. /package/dist/client/assets/{swift-wY9II8hY.js → swift-wb5gyb6a.js} +0 -0
  451. /package/dist/client/assets/{tcl-BGywDEsi.js → tcl-BJA7GgWY.js} +0 -0
  452. /package/dist/client/assets/{textile-K_mvsehZ.js → textile-BQjiYu-x.js} +0 -0
  453. /package/dist/client/assets/{tiddlywiki-BrpeQ34q.js → tiddlywiki-D2vUXB6n.js} +0 -0
  454. /package/dist/client/assets/{tiki-z2eQQPgI.js → tiki-BFhpdznG.js} +0 -0
  455. /package/dist/client/assets/{toml-Dcu7S7XA.js → toml-DN06iQUw.js} +0 -0
  456. /package/dist/client/assets/{troff-Djlumm7T.js → troff-DuQfjhPH.js} +0 -0
  457. /package/dist/client/assets/{ttcn-XqU6tthJ.js → ttcn-BCTy6d50.js} +0 -0
  458. /package/dist/client/assets/{ttcn-cfg-BzD0wr3i.js → ttcn-cfg-BYnZQqGa.js} +0 -0
  459. /package/dist/client/assets/{turtle-DcjXkx6M.js → turtle-BvN-Me9x.js} +0 -0
  460. /package/dist/client/assets/{vault-utils-BM4i-Ofm.js → vault-utils-BW53lKl1.js} +0 -0
  461. /package/dist/client/assets/{vb-DV4y2QrD.js → vb-DYk3wW9u.js} +0 -0
  462. /package/dist/client/assets/{vbscript-BS8DsYJ_.js → vbscript-BKI61VS6.js} +0 -0
  463. /package/dist/client/assets/{velocity-CS6Ly2yV.js → velocity-BrtitHHA.js} +0 -0
  464. /package/dist/client/assets/{verilog-DbEC7ose.js → verilog-CjUx3yiL.js} +0 -0
  465. /package/dist/client/assets/{vhdl-DBLrW9bF.js → vhdl-CPWwYF4V.js} +0 -0
  466. /package/dist/client/assets/{webidl-CnE8KY-y.js → webidl-PiVOzma8.js} +0 -0
  467. /package/dist/client/assets/{xquery--K5Za5EW.js → xquery-CiTzM_oK.js} +0 -0
  468. /package/dist/client/assets/{yacas-ClQfYBmX.js → yacas-4QS9CntY.js} +0 -0
  469. /package/dist/client/assets/{z80-Dr2oR3X2.js → z80-BxidrTKR.js} +0 -0
@@ -168,8 +168,7 @@ function readAuthenticatedOidcSession(sessionCookieManager, req) {
168
168
  return null;
169
169
  }
170
170
 
171
- const expiresAt = Number(session.expiresAt);
172
- if (Number.isFinite(expiresAt) && expiresAt <= Date.now()) {
171
+ if (hasExpiredSession(session)) {
173
172
  return null;
174
173
  }
175
174
 
@@ -185,6 +184,29 @@ function readAuthenticatedOidcSession(sessionCookieManager, req) {
185
184
  };
186
185
  }
187
186
 
187
+ function hasExpiredSession(session) {
188
+ const expiresAt = Number(session?.expiresAt);
189
+ return Number.isFinite(expiresAt) && expiresAt <= Date.now();
190
+ }
191
+
192
+ function resolveSessionExpiresAt(sessionMaxAgeMs, fallbackExpiresAt = null) {
193
+ if (Number.isFinite(sessionMaxAgeMs) && sessionMaxAgeMs > 0) {
194
+ return Date.now() + sessionMaxAgeMs;
195
+ }
196
+
197
+ return Number.isFinite(fallbackExpiresAt) ? fallbackExpiresAt : null;
198
+ }
199
+
200
+ function createSessionCookieOptions(expiresAt) {
201
+ if (!Number.isFinite(expiresAt)) {
202
+ return {};
203
+ }
204
+
205
+ return {
206
+ expires: new Date(expiresAt),
207
+ };
208
+ }
209
+
188
210
  function buildClientConfig(authConfig, { basePath = '' } = {}) {
189
211
  const loginEndpoint = prependBasePath(basePath, '/api/auth/oidc/login');
190
212
  const sessionEndpoint = prependBasePath(basePath, '/api/auth/session');
@@ -232,7 +254,7 @@ function createPasswordStrategy(authConfig, sessionCookieManager, clientConfig)
232
254
 
233
255
  function hasValidSession(req) {
234
256
  const session = sessionCookieManager.readSession(req);
235
- return session?.strategy === AUTH_STRATEGY_PASSWORD;
257
+ return session?.strategy === AUTH_STRATEGY_PASSWORD && !hasExpiredSession(session);
236
258
  }
237
259
 
238
260
  return {
@@ -260,6 +282,8 @@ function createPasswordStrategy(authConfig, sessionCookieManager, clientConfig)
260
282
  }, { kind: 'invalid_credentials' });
261
283
  }
262
284
 
285
+ const expiresAt = resolveSessionExpiresAt(authConfig.sessionMaxAgeMs);
286
+
263
287
  return createResponse(200, {
264
288
  auth: clientConfig,
265
289
  authenticated: true,
@@ -269,8 +293,9 @@ function createPasswordStrategy(authConfig, sessionCookieManager, clientConfig)
269
293
  kind: 'session_created',
270
294
  setCookie: sessionCookieManager.createSessionCookie(req, {
271
295
  authenticatedAt: Date.now(),
296
+ ...(Number.isFinite(expiresAt) ? { expiresAt } : {}),
272
297
  strategy: AUTH_STRATEGY_PASSWORD,
273
- }),
298
+ }, createSessionCookieOptions(expiresAt)),
274
299
  });
275
300
  },
276
301
 
@@ -456,9 +481,10 @@ function createOidcStrategy(authConfig, sessionCookieManager, flowCookieManager,
456
481
  return createErrorRedirect(req, accessDecision.error, flowPayload);
457
482
  }
458
483
 
459
- const expiresAt = Number.isFinite(claims.exp)
484
+ const tokenExpiresAt = Number.isFinite(claims.exp)
460
485
  ? claims.exp * 1000
461
486
  : Date.now() + (Math.max(Number(tokens.expires_in) || 3600, 1) * 1000);
487
+ const expiresAt = resolveSessionExpiresAt(authConfig.sessionMaxAgeMs, tokenExpiresAt);
462
488
  const returnTo = sanitizeReturnTo(flowPayload.returnTo, {
463
489
  basePath,
464
490
  publicBaseUrl: authConfig.oidc.publicBaseUrl,
@@ -480,7 +506,7 @@ function createOidcStrategy(authConfig, sessionCookieManager, flowCookieManager,
480
506
  expiresAt,
481
507
  strategy: AUTH_STRATEGY_OIDC,
482
508
  user,
483
- }),
509
+ }, createSessionCookieOptions(expiresAt)),
484
510
  flowCookieManager.clear(req),
485
511
  ],
486
512
  });
@@ -10,12 +10,34 @@ import {
10
10
  createRandomSessionSecret,
11
11
  } from '../auth/create-auth-service.js';
12
12
  import { loadBuildInfo } from './build-info.js';
13
+ import { isPerfLoggingEnabled } from './perf-logging.js';
13
14
 
14
15
  function parsePositiveInt(rawValue, fallbackValue) {
15
16
  const parsed = Number.parseInt(rawValue ?? '', 10);
16
17
  return Number.isInteger(parsed) && parsed > 0 ? parsed : fallbackValue;
17
18
  }
18
19
 
20
+ function parseOptionalPositiveInt(rawValue, {
21
+ fallbackValue = null,
22
+ variableName = 'value',
23
+ } = {}) {
24
+ const normalized = String(rawValue ?? '').trim();
25
+ if (!normalized) {
26
+ return fallbackValue;
27
+ }
28
+
29
+ if (!/^[1-9]\d*$/u.test(normalized)) {
30
+ throw new Error(`${variableName} must be a positive integer.`);
31
+ }
32
+
33
+ const parsed = Number(normalized);
34
+ if (Number.isSafeInteger(parsed) && parsed > 0) {
35
+ return parsed;
36
+ }
37
+
38
+ throw new Error(`${variableName} must be a positive integer.`);
39
+ }
40
+
19
41
  function parsePort(rawPort, fallbackPort) {
20
42
  return parsePositiveInt(rawPort, fallbackPort);
21
43
  }
@@ -284,6 +306,10 @@ export function loadConfig(overrides = {}) {
284
306
  password,
285
307
  passwordWasGenerated,
286
308
  sessionCookieName: authOverrides.sessionCookieName || process.env.AUTH_SESSION_COOKIE_NAME || 'collabmd_auth',
309
+ sessionMaxAgeMs: parseOptionalPositiveInt(
310
+ authOverrides.sessionMaxAgeMs ?? process.env.AUTH_SESSION_MAX_AGE_MS,
311
+ { variableName: 'AUTH_SESSION_MAX_AGE_MS' },
312
+ ),
287
313
  sessionSecret: authOverrides.sessionSecret || process.env.AUTH_SESSION_SECRET || createRandomSessionSecret(),
288
314
  strategy: authStrategy,
289
315
  },
@@ -296,6 +322,7 @@ export function loadConfig(overrides = {}) {
296
322
  httpRequestTimeoutMs: parsePositiveInt(process.env.HTTP_REQUEST_TIMEOUT_MS, 30_000),
297
323
  git,
298
324
  gitEnabled: git.enabled,
325
+ perfLoggingEnabled: overrides.perfLoggingEnabled ?? isPerfLoggingEnabled(process.env.COLLABMD_PERF_LOGGING),
299
326
  port: parsePort(process.env.PORT, 1234),
300
327
  nodeEnv,
301
328
  plantumlServerUrl: process.env.PLANTUML_SERVER_URL || 'https://www.plantuml.com/plantuml',
@@ -0,0 +1,39 @@
1
+ function formatPerfValue(value) {
2
+ if (typeof value === 'number' && Number.isFinite(value)) {
3
+ return Number.isInteger(value) ? String(value) : value.toFixed(3).replace(/\.?0+$/u, '');
4
+ }
5
+
6
+ if (typeof value === 'string') {
7
+ return /[\s=]/u.test(value) ? JSON.stringify(value) : value;
8
+ }
9
+
10
+ if (typeof value === 'boolean') {
11
+ return value ? 'true' : 'false';
12
+ }
13
+
14
+ return JSON.stringify(value);
15
+ }
16
+
17
+ export function isPerfLoggingEnabled(value = '') {
18
+ if (typeof value === 'boolean') {
19
+ return value;
20
+ }
21
+
22
+ const normalized = String(value ?? '').trim().toLowerCase();
23
+ return normalized === '1'
24
+ || normalized === 'true'
25
+ || normalized === 'yes'
26
+ || normalized === 'on';
27
+ }
28
+
29
+ export function logPerfEvent(enabled, scope, fields = {}) {
30
+ if (!enabled) {
31
+ return;
32
+ }
33
+
34
+ const formattedFields = Object.entries(fields)
35
+ .filter(([, value]) => value !== undefined && value !== null && value !== '')
36
+ .map(([key, value]) => `${key}=${formatPerfValue(value)}`);
37
+ const suffix = formattedFields.length > 0 ? ` ${formattedFields.join(' ')}` : '';
38
+ console.info(`[perf][${scope}]${suffix}`);
39
+ }
@@ -2,9 +2,11 @@ import { createServer } from 'http';
2
2
 
3
3
  import { loadConfig } from './config/env.js';
4
4
  import { createAuthService } from './auth/create-auth-service.js';
5
+ import { logPerfEvent } from './config/perf-logging.js';
5
6
  import { BacklinkIndex } from './domain/backlink-index.js';
6
7
  import { CollaborationDocumentStore } from './domain/collaboration/collaboration-document-store.js';
7
8
  import { CollaborationRoom } from './domain/collaboration/collaboration-room.js';
9
+ import { DocxExporter } from './domain/docx-exporter.js';
8
10
  import { GitService } from './infrastructure/git/git-service.js';
9
11
  import { PlantUmlRenderer } from './infrastructure/plantuml/plantuml-renderer.js';
10
12
  import { RoomRegistry } from './domain/collaboration/room-registry.js';
@@ -37,10 +39,41 @@ function closeHttpServer(httpServer) {
37
39
  });
38
40
  }
39
41
 
42
+ function workspaceStateMetadataEqual(left = null, right = null) {
43
+ const leftMetadata = left?.metadata;
44
+ const rightMetadata = right?.metadata;
45
+ if (!(leftMetadata instanceof Map) || !(rightMetadata instanceof Map)) {
46
+ return false;
47
+ }
48
+
49
+ if (leftMetadata.size !== rightMetadata.size) {
50
+ return false;
51
+ }
52
+
53
+ for (const [pathValue, leftEntry] of leftMetadata.entries()) {
54
+ const rightEntry = rightMetadata.get(pathValue);
55
+ if (!rightEntry) {
56
+ return false;
57
+ }
58
+
59
+ if (
60
+ leftEntry.type !== rightEntry.type
61
+ || leftEntry.size !== rightEntry.size
62
+ || leftEntry.inode !== rightEntry.inode
63
+ || leftEntry.mtimeMs !== rightEntry.mtimeMs
64
+ ) {
65
+ return false;
66
+ }
67
+ }
68
+
69
+ return true;
70
+ }
71
+
40
72
  export function createAppServer(config = loadConfig()) {
41
73
  const authService = createAuthService(config);
42
74
  const vaultFileStore = new VaultFileStore({ vaultDir: config.vaultDir });
43
75
  const backlinkIndex = new BacklinkIndex({ vaultFileStore });
76
+ const docxExporter = new DocxExporter();
44
77
  const plantUmlRenderer = new PlantUmlRenderer({
45
78
  serverUrl: config.plantumlServerUrl,
46
79
  });
@@ -67,6 +100,7 @@ export function createAppServer(config = loadConfig()) {
67
100
  maxBufferedAmountBytes: config.wsMaxBufferedAmountBytes,
68
101
  name,
69
102
  onEmpty,
103
+ perfLoggingEnabled: config.perfLoggingEnabled,
70
104
  });
71
105
 
72
106
  if (name === WORKSPACE_ROOM_NAME && workspaceMutationCoordinator?.workspaceState) {
@@ -86,6 +120,7 @@ export function createAppServer(config = loadConfig()) {
86
120
  vaultFileStore.setManagedWriteTracker(workspaceMutationCoordinator);
87
121
  const fileSystemSyncService = new FileSystemSyncService({
88
122
  mutationCoordinator: workspaceMutationCoordinator,
123
+ perfLoggingEnabled: config.perfLoggingEnabled,
89
124
  vaultFileStore,
90
125
  });
91
126
  const requestHandler = createRequestHandler(
@@ -93,6 +128,7 @@ export function createAppServer(config = loadConfig()) {
93
128
  authService,
94
129
  vaultFileStore,
95
130
  backlinkIndex,
131
+ docxExporter,
96
132
  roomRegistry,
97
133
  plantUmlRenderer,
98
134
  gitService,
@@ -126,21 +162,84 @@ export function createAppServer(config = loadConfig()) {
126
162
  let vaultFileCount = 0;
127
163
 
128
164
  async function listen() {
129
- vaultFileCount = await vaultFileStore.countVaultFiles();
130
- await backlinkIndex.build();
131
- await workspaceMutationCoordinator.initialize();
132
- await fileSystemSyncService.start();
165
+ const startupStartedAt = Date.now();
166
+
167
+ const initialWorkspaceScanStartedAt = Date.now();
168
+ const initialWorkspaceSnapshot = await vaultFileStore.scanWorkspaceState();
169
+ vaultFileCount = initialWorkspaceSnapshot.vaultFileCount ?? 0;
170
+ logPerfEvent(config.perfLoggingEnabled, 'startup', {
171
+ durationMs: Date.now() - initialWorkspaceScanStartedAt,
172
+ phase: 'workspace-scan',
173
+ vaultFileCount,
174
+ });
175
+
176
+ const backlinkBuildStartedAt = Date.now();
177
+ await backlinkIndex.build({ workspaceState: initialWorkspaceSnapshot });
178
+ logPerfEvent(config.perfLoggingEnabled, 'startup', {
179
+ durationMs: Date.now() - backlinkBuildStartedAt,
180
+ markdownFileCount: initialWorkspaceSnapshot.markdownPaths?.length ?? 0,
181
+ phase: 'backlink-build',
182
+ });
183
+
184
+ const liveWorkspaceScanStartedAt = Date.now();
185
+ const liveWorkspaceSnapshot = await vaultFileStore.scanWorkspaceState();
186
+ const workspaceChangedDuringStartup = !workspaceStateMetadataEqual(initialWorkspaceSnapshot, liveWorkspaceSnapshot);
187
+ vaultFileCount = liveWorkspaceSnapshot.vaultFileCount ?? vaultFileCount;
188
+ logPerfEvent(config.perfLoggingEnabled, 'startup', {
189
+ changedDuringStartup: workspaceChangedDuringStartup,
190
+ durationMs: Date.now() - liveWorkspaceScanStartedAt,
191
+ phase: 'workspace-rescan',
192
+ vaultFileCount,
193
+ });
194
+
195
+ if (workspaceChangedDuringStartup) {
196
+ const backlinkRebuildStartedAt = Date.now();
197
+ await backlinkIndex.build({ workspaceState: liveWorkspaceSnapshot });
198
+ logPerfEvent(config.perfLoggingEnabled, 'startup', {
199
+ durationMs: Date.now() - backlinkRebuildStartedAt,
200
+ markdownFileCount: liveWorkspaceSnapshot.markdownPaths?.length ?? 0,
201
+ phase: 'backlink-rebuild',
202
+ });
203
+ }
204
+
205
+ const workspaceInitStartedAt = Date.now();
206
+ await workspaceMutationCoordinator.initialize({ snapshot: liveWorkspaceSnapshot });
207
+ logPerfEvent(config.perfLoggingEnabled, 'startup', {
208
+ durationMs: Date.now() - workspaceInitStartedAt,
209
+ phase: 'workspace-init',
210
+ });
211
+
212
+ const watcherStartStartedAt = Date.now();
213
+ await fileSystemSyncService.start({ snapshot: liveWorkspaceSnapshot });
214
+ logPerfEvent(config.perfLoggingEnabled, 'startup', {
215
+ durationMs: Date.now() - watcherStartStartedAt,
216
+ phase: 'watcher-start',
217
+ });
133
218
 
134
219
  return new Promise((resolve, reject) => {
220
+ const listenStartedAt = Date.now();
135
221
  httpServer.once('error', reject);
136
222
  httpServer.listen(config.port, config.host, () => {
137
223
  httpServer.off('error', reject);
138
224
  const address = httpServer.address();
139
- resolve({
225
+ const result = {
140
226
  address,
141
227
  host: getDisplayHost(config.host),
142
228
  port: typeof address === 'object' && address ? address.port : config.port,
143
229
  wsPath: `${config.basePath || ''}${config.wsBasePath}/:file`,
230
+ };
231
+ logPerfEvent(config.perfLoggingEnabled, 'startup', {
232
+ durationMs: Date.now() - listenStartedAt,
233
+ phase: 'listen',
234
+ port: result.port,
235
+ });
236
+ logPerfEvent(config.perfLoggingEnabled, 'startup-total', {
237
+ durationMs: Date.now() - startupStartedAt,
238
+ markdownFileCount: liveWorkspaceSnapshot.markdownPaths?.length ?? 0,
239
+ vaultFileCount,
240
+ });
241
+ resolve({
242
+ ...result,
144
243
  });
145
244
  });
146
245
  });
@@ -173,6 +272,7 @@ export function createAppServer(config = loadConfig()) {
173
272
  roomRegistry,
174
273
  workspaceMutationCoordinator,
175
274
  authService,
275
+ backlinkIndex,
176
276
  fileSystemSyncService,
177
277
  gitService,
178
278
  setTestHydrateDelayMs(delayMs = 0) {
@@ -11,8 +11,10 @@
11
11
  */
12
12
 
13
13
  import { createWikiTargetIndex, resolveWikiTargetWithIndex } from '../../domain/wiki-link-resolver.js';
14
+ import { mapWithConcurrency } from '../shared/async-utils.js';
14
15
 
15
16
  const WIKI_LINK_RE = /\[\[([^\]|]+)(?:\|[^\]]+)?\]\]/g;
17
+ const BACKLINK_BUILD_CONCURRENCY = 8;
16
18
 
17
19
  function createDeferred() {
18
20
  let resolve;
@@ -58,13 +60,15 @@ export class BacklinkIndex {
58
60
  * Build the full index by scanning every markdown file in the vault.
59
61
  * Called once at server startup.
60
62
  */
61
- async build() {
63
+ async build({ workspaceState = null } = {}) {
62
64
  this._requestedBuildVersion += 1;
65
+ this._latestRequestedWorkspaceState = workspaceState;
63
66
  return this.flushScheduledBuild();
64
67
  }
65
68
 
66
69
  scheduleBuild({ delayMs = this.rebuildDelayMs } = {}) {
67
70
  this._requestedBuildVersion += 1;
71
+ this._latestRequestedWorkspaceState = null;
68
72
  if (!this._scheduledBuildDeferred) {
69
73
  this._scheduledBuildDeferred = createDeferred();
70
74
  }
@@ -116,8 +120,9 @@ export class BacklinkIndex {
116
120
  }
117
121
 
118
122
  const targetVersion = this._requestedBuildVersion;
123
+ const workspaceState = this._latestRequestedWorkspaceState;
119
124
  this._buildPromise = (async () => {
120
- await this._performBuild();
125
+ await this._performBuild(workspaceState);
121
126
  this._completedBuildVersion = Math.max(this._completedBuildVersion, targetVersion);
122
127
  })().finally(() => {
123
128
  this._buildPromise = null;
@@ -126,18 +131,26 @@ export class BacklinkIndex {
126
131
  return this._buildPromise;
127
132
  }
128
133
 
129
- async _performBuild() {
134
+ async _performBuild(workspaceState = null) {
130
135
  this.forward.clear();
131
136
  this.reverse.clear();
132
137
  this.contextsBySource.clear();
133
138
 
134
- const tree = await this.vaultFileStore.tree();
135
- this._fileList = flattenTree(tree);
139
+ const snapshot = workspaceState ?? await this._resolveWorkspaceState();
140
+ this._fileList = Array.from(snapshot?.markdownPaths ?? []);
136
141
  this._fileSet = new Set(this._fileList);
137
142
  this._refreshWikiTargetIndex();
138
143
 
139
- for (const filePath of this._fileList) {
140
- const content = await this.vaultFileStore.readMarkdownFile(filePath);
144
+ const fileContents = await mapWithConcurrency(
145
+ this._fileList,
146
+ BACKLINK_BUILD_CONCURRENCY,
147
+ async (filePath) => ({
148
+ content: await this.vaultFileStore.readMarkdownFile(filePath),
149
+ filePath,
150
+ }),
151
+ );
152
+
153
+ for (const { content, filePath } of fileContents) {
141
154
  if (content !== null) {
142
155
  this._indexFile(filePath, content);
143
156
  }
@@ -147,6 +160,17 @@ export class BacklinkIndex {
147
160
  console.log(`[backlinks] Index built: ${this._fileList.length} files, ${this.reverse.size} targets with backlinks`);
148
161
  }
149
162
 
163
+ async _resolveWorkspaceState() {
164
+ if (typeof this.vaultFileStore.scanWorkspaceState === 'function') {
165
+ return this.vaultFileStore.scanWorkspaceState();
166
+ }
167
+
168
+ const tree = await this.vaultFileStore.tree();
169
+ return {
170
+ markdownPaths: flattenTree(tree),
171
+ };
172
+ }
173
+
150
174
  /**
151
175
  * Incrementally update the index when a file's content changes.
152
176
  * Call this after every persist / write.
@@ -8,6 +8,7 @@ import { MSG_AWARENESS, MSG_SYNC } from './protocol.js';
8
8
  import { CollaborationDocumentStore } from './collaboration-document-store.js';
9
9
  import { RoomClientStateStore } from './room-client-state-store.js';
10
10
  import { RoomPersistenceController } from './room-persistence-controller.js';
11
+ import { logPerfEvent } from '../../config/perf-logging.js';
11
12
  import { populateCommentThreads, serializeCommentThreads } from '../../../domain/comment-threads.js';
12
13
  import {
13
14
  isExcalidrawRoomDocStructured,
@@ -131,6 +132,7 @@ export class CollaborationRoom {
131
132
  name,
132
133
  idleGraceMs = 0,
133
134
  maxBufferedAmountBytes,
135
+ perfLoggingEnabled = false,
134
136
  vaultFileStore,
135
137
  backlinkIndex,
136
138
  onEmpty,
@@ -138,6 +140,7 @@ export class CollaborationRoom {
138
140
  this.name = name;
139
141
  this.idleGraceMs = idleGraceMs;
140
142
  this.maxBufferedAmountBytes = maxBufferedAmountBytes;
143
+ this.perfLoggingEnabled = perfLoggingEnabled;
141
144
  this.documentStore = documentStore ?? new CollaborationDocumentStore({
142
145
  backlinkIndex,
143
146
  name,
@@ -187,6 +190,8 @@ export class CollaborationRoom {
187
190
  let snapshotExists = false;
188
191
  let snapshotValid = false;
189
192
  let commentThreadCount = 0;
193
+ let snapshotReadDurationMs = 0;
194
+ let contentFallbackDurationMs = 0;
190
195
  const hydrateDelayMs = Math.max(0, Number(this.getHydrateDelayMs?.() || 0));
191
196
 
192
197
  try {
@@ -195,7 +200,9 @@ export class CollaborationRoom {
195
200
  }
196
201
 
197
202
  if (this.documentStore?.hasPersistence()) {
203
+ const snapshotReadStartedAt = Date.now();
198
204
  const snapshot = await this.documentStore.readSnapshot();
205
+ snapshotReadDurationMs = Date.now() - snapshotReadStartedAt;
199
206
  if (snapshot) {
200
207
  snapshotExists = true;
201
208
  try {
@@ -227,10 +234,12 @@ export class CollaborationRoom {
227
234
  }
228
235
  }
229
236
 
237
+ const fallbackStartedAt = Date.now();
230
238
  const [content, commentThreads] = await Promise.all([
231
239
  this.documentStore.readContent(),
232
240
  this.documentStore.readCommentThreads(),
233
241
  ]);
242
+ contentFallbackDurationMs = Date.now() - fallbackStartedAt;
234
243
  commentThreadCount = commentThreads.length;
235
244
  if (content !== null || commentThreads.length > 0) {
236
245
  hydrateSource = 'content';
@@ -262,14 +271,23 @@ export class CollaborationRoom {
262
271
  this.debugMetrics.hydrateCount += 1;
263
272
  this.debugMetrics.lastHydrate = {
264
273
  commentThreadCount,
274
+ contentFallbackDurationMs,
265
275
  durationMs: Date.now() - startedAt,
276
+ snapshotReadDurationMs,
266
277
  snapshotExists,
267
278
  snapshotValid,
268
279
  source: hydrateSource,
269
280
  };
270
- console.info(
271
- `[perf][room:${this.name}] hydrate durationMs=${this.debugMetrics.lastHydrate.durationMs} source=${this.debugMetrics.lastHydrate.source} snapshotExists=${this.debugMetrics.lastHydrate.snapshotExists} snapshotValid=${this.debugMetrics.lastHydrate.snapshotValid} commentThreads=${this.debugMetrics.lastHydrate.commentThreadCount}`,
272
- );
281
+ logPerfEvent(this.perfLoggingEnabled, `room:${this.name}`, {
282
+ commentThreads: this.debugMetrics.lastHydrate.commentThreadCount,
283
+ contentFallbackDurationMs: this.debugMetrics.lastHydrate.contentFallbackDurationMs,
284
+ durationMs: this.debugMetrics.lastHydrate.durationMs,
285
+ event: 'hydrate',
286
+ snapshotExists: this.debugMetrics.lastHydrate.snapshotExists,
287
+ snapshotReadDurationMs: this.debugMetrics.lastHydrate.snapshotReadDurationMs,
288
+ snapshotValid: this.debugMetrics.lastHydrate.snapshotValid,
289
+ source: this.debugMetrics.lastHydrate.source,
290
+ });
273
291
  }
274
292
  }
275
293
  })().catch((error) => {
@@ -522,8 +540,13 @@ export class CollaborationRoom {
522
540
  sendInitialSync(ws) {
523
541
  this.debugMetrics.initialSyncCount += 1;
524
542
  this.debugMetrics.lastInitialSyncAt = Date.now();
525
- console.info(`[perf][room:${this.name}] send-initial-sync count=${this.debugMetrics.initialSyncCount}`);
526
- return sendMessage.call(this, ws, this.getInitialSyncMessage(), this);
543
+ const initialSyncMessage = this.getInitialSyncMessage();
544
+ logPerfEvent(this.perfLoggingEnabled, `room:${this.name}`, {
545
+ bytes: initialSyncMessage.byteLength,
546
+ count: this.debugMetrics.initialSyncCount,
547
+ event: 'initial-sync',
548
+ });
549
+ return sendMessage.call(this, ws, initialSyncMessage, this);
527
550
  }
528
551
 
529
552
  async addClient(ws, { sendInitialSync: shouldSendInitialSync = true } = {}) {
@@ -0,0 +1,62 @@
1
+ const DOCX_EXPORTER_CREATOR = 'CollabMD';
2
+
3
+ function normalizeDocxBuffer(result) {
4
+ if (Buffer.isBuffer(result)) {
5
+ return result;
6
+ }
7
+
8
+ if (result instanceof ArrayBuffer) {
9
+ return Buffer.from(result);
10
+ }
11
+
12
+ if (ArrayBuffer.isView(result)) {
13
+ return Buffer.from(result.buffer, result.byteOffset, result.byteLength);
14
+ }
15
+
16
+ throw new Error('DOCX exporter returned an unsupported payload');
17
+ }
18
+
19
+ export class DocxExporter {
20
+ constructor({
21
+ loadConverter = () => import('@turbodocx/html-to-docx'),
22
+ } = {}) {
23
+ this.loadConverter = loadConverter;
24
+ this.converterPromise = null;
25
+ }
26
+
27
+ async ensureConverter() {
28
+ if (this.converterPromise) {
29
+ return this.converterPromise;
30
+ }
31
+
32
+ this.converterPromise = this.loadConverter().then((module) => {
33
+ const converter = module?.default ?? module?.HTMLToDOCX ?? module;
34
+ if (typeof converter !== 'function') {
35
+ throw new Error('DOCX converter failed to load');
36
+ }
37
+ return converter;
38
+ });
39
+ return this.converterPromise;
40
+ }
41
+
42
+ async render({
43
+ html,
44
+ title = '',
45
+ } = {}) {
46
+ const converter = await this.ensureConverter();
47
+ const result = await converter(String(html ?? ''), null, {
48
+ creator: DOCX_EXPORTER_CREATOR,
49
+ font: 'Arial',
50
+ footer: false,
51
+ pageNumber: false,
52
+ table: {
53
+ row: {
54
+ cantSplit: true,
55
+ },
56
+ },
57
+ title: String(title ?? ''),
58
+ });
59
+
60
+ return normalizeDocxBuffer(result);
61
+ }
62
+ }
@@ -430,7 +430,7 @@ export class GitHistoryService {
430
430
  }
431
431
 
432
432
  return this.runRequest(cacheKey, async () => {
433
- let content = '';
433
+ let content;
434
434
  try {
435
435
  content = await this.commandRunner.execGit(['show', `${normalizedHash}:${normalizedPath}`]);
436
436
  } catch {
@@ -40,6 +40,7 @@ export function createRequestHandler(
40
40
  authService,
41
41
  vaultFileStore,
42
42
  backlinkIndex,
43
+ docxExporter = null,
43
44
  roomRegistry = null,
44
45
  plantUmlRenderer = null,
45
46
  gitService = null,
@@ -60,6 +61,7 @@ export function createRequestHandler(
60
61
  });
61
62
  const handleVaultApi = createVaultApiHandler({
62
63
  backlinkIndex,
64
+ docxExporter,
63
65
  plantUmlRenderer,
64
66
  roomRegistry,
65
67
  vaultFileStore,