collabmd 0.1.48 → 0.1.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (482) hide show
  1. package/README.md +15 -608
  2. package/bin/collabmd.js +39 -20
  3. package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-Crf9Y3Q6.js +1 -0
  4. package/dist/client/assets/abnfDiagram-VCTEODGH-PuinKbSQ.js +1 -0
  5. package/dist/client/assets/ar-SA-5WIASEJP-Di7OimCN.js +10 -0
  6. package/dist/client/assets/{architectureDiagram-5GKGNRK7-I39sYjHI.js → architectureDiagram-5GKGNRK7-46hPkrZv.js} +3 -3
  7. package/dist/client/assets/az-AZ-V5EUQD6C-C19OGTT_.js +1 -0
  8. package/dist/client/assets/bg-BG-EXASCMTR-BIt0xWyb.js +5 -0
  9. package/dist/client/assets/{blockDiagram-NRAW4CY4-C6DtJy5Y.js → blockDiagram-I7D4REHJ-C1S5Bzf8.js} +4 -4
  10. package/dist/client/assets/bn-BD-U4SYNFCO-CdNaPy4Q.js +3 -0
  11. package/dist/client/assets/bn-IN-HKDJIITE-CdNaPy4Q.js +3 -0
  12. package/dist/client/assets/{browser-BKLM0ThC-IxjwuOIz-BBqQnUEb.js → browser-BKLM0ThC-IxjwuOIz-DyJcVMFR.js} +1 -1
  13. package/dist/client/assets/browser-utils-DbXSMI-6.js +1 -0
  14. package/dist/client/assets/{c4Diagram-UCG6FXSJ-CtWtxS9_.js → c4Diagram-7LVT6UL2-VAk1HPmz.js} +1 -1
  15. package/dist/client/assets/ca-ES-2KGUU5XB-C9t-c0cH.js +8 -0
  16. package/dist/client/assets/channel-jwdhnPiV.js +1 -0
  17. package/dist/client/assets/chunk-2E4U76K2-Ba8Wf22k.js +1 -0
  18. package/dist/client/assets/{chunk-TEH6E4GO-DVayPj-q.js → chunk-4HAMMTFA-Ht-73lsT.js} +20 -20
  19. package/dist/client/assets/chunk-5XKZK2GL-D4UAZSOJ.js +1 -0
  20. package/dist/client/assets/{chunk-75Z2AOVW-CdFSaPjz.js → chunk-75Z2AOVW-B2cZexqK.js} +1 -1
  21. package/dist/client/assets/{chunk-CLGD4ZFX-DQLgbQrv.js → chunk-CLGD4ZFX-Cmtx89ht.js} +1 -1
  22. package/dist/client/assets/chunk-DU6HZSFF-C6d6PJfE.js +127 -0
  23. package/dist/client/assets/{chunk-F27PBJKO-CNHIFhjo.js → chunk-F27PBJKO-Dg3H6KLL.js} +1 -1
  24. package/dist/client/assets/{chunk-GMAD6QVW-CbcBqPM5.js → chunk-GMAD6QVW-DUfjx_d5.js} +1 -1
  25. package/dist/client/assets/{chunk-OBVCFTLP-BJR7u1jh.js → chunk-GVQU2GXP-D1l7oRGR.js} +1 -1
  26. package/dist/client/assets/{chunk-G27WJ6UU-D9-eg537.js → chunk-IMKFNOWR-3F6NhHUP.js} +2 -2
  27. package/dist/client/assets/{chunk-JQ64N6SF-DSFNH4bh.js → chunk-L3NEJ4N5-BmCVn4y-.js} +1 -1
  28. package/dist/client/assets/chunk-OSK3NFVY-CWHXAmfx.js +10 -0
  29. package/dist/client/assets/{chunk-P2QGCYS3-BRpqY32H.js → chunk-P2QGCYS3-Du8EtwOa.js} +1 -1
  30. package/dist/client/assets/{chunk-POPQ4Y6H-Cb4SlVZF.js → chunk-POPQ4Y6H-B5yJIrZE.js} +1 -1
  31. package/dist/client/assets/{chunk-PWAF6VOD-Cz8IwBB5.js → chunk-PWAF6VOD-B3gML4ps.js} +1 -1
  32. package/dist/client/assets/{chunk-RHFEMEQ7-CWY8cf4H.js → chunk-SHT3W25Y-BKaI8jZO.js} +5 -5
  33. package/dist/client/assets/{chunk-SVP7TREG-CyHOmcac.js → chunk-SVP7TREG-XlsB_ZMZ.js} +1 -1
  34. package/dist/client/assets/{chunk-LCL6LL3I-DmDkVukh.js → chunk-TICWLB2K-Cpp2z8yK.js} +4 -4
  35. package/dist/client/assets/chunk-TLUHSLCS-Yl7B0Vrz.js +1 -0
  36. package/dist/client/assets/chunk-ZNVOA63L-BmCQjhx-.js +40 -0
  37. package/dist/client/assets/{chunk-FLYJHZSQ-Be7lKF17.js → chunk-ZPMXAHWN-Dt0TxJa6.js} +2 -2
  38. package/dist/client/assets/classDiagram-ZZMXUADV-BRw9vo8U.js +1 -0
  39. package/dist/client/assets/classDiagram-v2-VYDZK3BY-BRw9vo8U.js +1 -0
  40. package/dist/client/assets/comment-markdown-renderer-B9_vPc3F.js +1 -0
  41. package/dist/client/assets/comment-thread-store-NNHqRVsX.js +1 -0
  42. package/dist/client/assets/comment-threads-nJhK1yfc.js +4 -0
  43. package/dist/client/assets/cs-CZ-VUCGPRML-BfCoYAgj.js +7 -0
  44. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-CdTPi2yO.js → cynefinDiagram-5FMLGOSQ-BRoCEoZM.js} +1 -1
  45. package/dist/client/assets/da-DK-NNDP2IVP-DBw9ZNTR.js +2 -0
  46. package/dist/client/assets/{dagre-3AP2YEHR-5gtJtd0O.js → dagre-GXQ25YYZ-BSfKCfy7.js} +2 -2
  47. package/dist/client/assets/de-CH-I7RAVIZN-DYW18Vsr.js +11 -0
  48. package/dist/client/assets/de-DE-WBQ3DQLR-DYW18Vsr.js +11 -0
  49. package/dist/client/assets/deferred-collab-rBe4nuQ2.css +1 -0
  50. package/dist/client/assets/deferred-git-BHKtkFYi.css +1 -0
  51. package/dist/client/assets/deferred-preview-pe7Iwwx3.css +1 -0
  52. package/dist/client/assets/{diagram-S7CK7UJ4-BudWz9WU.js → diagram-S7CK7UJ4-D7KaM9yj.js} +2 -2
  53. package/dist/client/assets/{diagram-UQ7AKVKN-3v4rbH-s.js → diagram-UQ7AKVKN-JevUZuYi.js} +1 -1
  54. package/dist/client/assets/diagram-VSXAHHWV-B3-U-Q2E.js +3 -0
  55. package/dist/client/assets/{diagram-VX7I27RA-C_-rj0sw.js → diagram-VX7I27RA-pSD4HMh1.js} +1 -1
  56. package/dist/client/assets/{diagram-Z3DM3KII-B4yxavgj.js → diagram-Z3DM3KII-D8r1_CIb.js} +1 -1
  57. package/dist/client/assets/{direct-engine-DdrQKpgq-CtKfQzCt.js → direct-engine-DdrQKpgq-B5zIoeQw.js} +1 -1
  58. package/dist/client/assets/dist-B3HdUPsK.js +1 -0
  59. package/dist/client/assets/{dist-Tw-Fxpeb.js → dist-B7XMN9AT.js} +1 -1
  60. package/dist/client/assets/dist-BIRygGYH.js +1 -0
  61. package/dist/client/assets/dist-BPyOlNLY.js +2 -0
  62. package/dist/client/assets/{dist-D5wCC32z.js → dist-BR81yxMt.js} +1 -1
  63. package/dist/client/assets/{dist-Bw3VIE_v.js → dist-B_B4XLmq.js} +1 -1
  64. package/dist/client/assets/dist-Bdy9ZRzd.js +9 -0
  65. package/dist/client/assets/{dist-netZOQtD.js → dist-Bfxzlnrf.js} +1 -1
  66. package/dist/client/assets/{dist-CietwTVS.js → dist-Bx3QkS-3.js} +1 -1
  67. package/dist/client/assets/{dist-mj2Ht75J.js → dist-By7ieqAf.js} +1 -1
  68. package/dist/client/assets/dist-ByhQbe-x.js +1 -0
  69. package/dist/client/assets/{dist-CdmKGRGr.js → dist-BzFSJM0U.js} +1 -1
  70. package/dist/client/assets/dist-C5NkYKAa.js +1 -0
  71. package/dist/client/assets/{dist-D3fehAZ2.js → dist-CELhfKzh.js} +1 -1
  72. package/dist/client/assets/dist-CEirJSxk.js +1 -0
  73. package/dist/client/assets/dist-CO0-4CuV.js +39 -0
  74. package/dist/client/assets/dist-CRnJ0D9h.js +1 -0
  75. package/dist/client/assets/{dist-DDUn5zTz.js → dist-CbDyXgCo.js} +1 -1
  76. package/dist/client/assets/{dist-BeajGMhO.js → dist-CqXVyYoH.js} +1 -1
  77. package/dist/client/assets/{dist-LQ4kDCKz.js → dist-CrWzIWEE.js} +1 -1
  78. package/dist/client/assets/dist-CyNrloSI.js +1 -0
  79. package/dist/client/assets/dist-D60_kdpQ.js +1 -0
  80. package/dist/client/assets/{dist-DuH3ZrHo.js → dist-DCpIH3-_.js} +1 -1
  81. package/dist/client/assets/{dist-BPHLJ09L.js → dist-DJAMplZI.js} +2 -2
  82. package/dist/client/assets/{dist-DGEbEfw4.js → dist-DVXzbeDx.js} +1 -1
  83. package/dist/client/assets/{dist-C5NgpdG5.js → dist-Drv_wZYC.js} +1 -1
  84. package/dist/client/assets/{dist-DVy5woUy.js → dist-EWJYvBK1.js} +1 -1
  85. package/dist/client/assets/dist-Hdhj3L3t.js +1 -0
  86. package/dist/client/assets/{dist-B_yQaEv_.js → dist-gRRhmB-2.js} +3 -3
  87. package/dist/client/assets/dist-kWb2d1CH.js +1 -0
  88. package/dist/client/assets/dist-kiD2GIsD.js +13 -0
  89. package/dist/client/assets/dist-l-56SowH.js +19 -0
  90. package/dist/client/assets/{dist-BK9QvQrc.js → dist-nxQErAaK.js} +2 -2
  91. package/dist/client/assets/dist-sLzRQQk7.js +1 -0
  92. package/dist/client/assets/{document-formatter-Dxl_a8XO.js → document-formatter-Qdiq9uJs.js} +1 -2
  93. package/dist/client/assets/drawioEditor-CHf1vtdQ.js +9 -0
  94. package/dist/client/assets/ebnfDiagram-PWID7BFC-UJ0Fz5ci.js +1 -0
  95. package/dist/client/assets/editor-session-4Bn81iWm.js +14 -0
  96. package/dist/client/assets/el-GR-TYQHVGXW-Dx82YYAS.js +7 -0
  97. package/dist/client/assets/embedded-editor-base-jK221GC8.css +1 -0
  98. package/dist/client/assets/{embedpdf-DA4bA119-BPqZxwjc.js → embedpdf-DA4bA119-E8wZ11J2.js} +2 -3
  99. package/dist/client/assets/{embedpdf-BmE13ZZ0.js → embedpdf-LUXDBD3-.js} +1 -1
  100. package/dist/client/assets/{en-SJ2YIMFF-CJBL3nkq.js → en-2RFA324Y-BsuNJTcL.js} +1 -1
  101. package/dist/client/assets/{erDiagram-SSCWMZ5O-C-iy6VkX.js → erDiagram-RLTQ6QDP-CWrH1UJ9.js} +2 -2
  102. package/dist/client/assets/es-ES-JEUOREKJ-Rx0NUQDl.js +12 -0
  103. package/dist/client/assets/eu-ES-SO5DEEAN-CDYm-BcK.js +8 -0
  104. package/dist/client/assets/excalidraw-element-link-iA6zo0_f.js +7 -0
  105. package/dist/client/assets/{excalidraw-scene-BOben2gr.js → excalidraw-scene-6uROebca.js} +1 -1
  106. package/dist/client/assets/{excalidraw-editor-BbSbI80a.css → excalidrawEditor-DDE0n1Pk.css} +1 -1
  107. package/dist/client/assets/excalidrawEditor-WIuguTz7.js +9 -0
  108. package/dist/client/assets/export-page-AN-wI5p4.js +56 -0
  109. package/dist/client/assets/exportDocument-B7IagJhQ.css +1 -0
  110. package/dist/client/assets/exportDocument-B9xNKpQe.js +2 -0
  111. package/dist/client/assets/fa-IR-FIYUE2GQ-C865Nx3X.js +9 -0
  112. package/dist/client/assets/fi-FI-REAEF6HQ-BIpjJqIb.js +6 -0
  113. package/dist/client/assets/flowDiagram-HODETNUW-kb1lUSBo.js +1 -0
  114. package/dist/client/assets/fr-FR-SUCL7J6B-DGAKE8jH.js +12 -0
  115. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-DtKHAbez.js → ganttDiagram-EL5Y4UJY-BBNzDfaV.js} +1 -1
  116. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-oue8fQ5o.js → gitGraphDiagram-WWUBYQGX-Csf0Dm_1.js} +1 -1
  117. package/dist/client/assets/gl-ES-KHCSOGVH-DWKh0CMu.js +6 -0
  118. package/dist/client/assets/he-IL-JYXVXV2Q-zqbcM-4g.js +9 -0
  119. package/dist/client/assets/hi-IN-BU52H3BO-CY8v6eG9.js +3 -0
  120. package/dist/client/assets/highlight-theme-CzNkO-IJ.js +1 -0
  121. package/dist/client/assets/hu-HU-OWADXDQ3-CEl6Udfh.js +3 -0
  122. package/dist/client/assets/id-ID-EOMR5R3I-CGQwUjoL.js +8 -0
  123. package/dist/client/assets/image-2QKV3NAF-BUbX0y5Y.js +1 -0
  124. package/dist/client/assets/index-BAmZnTFV.css +1 -0
  125. package/dist/client/assets/index-mWiw418b.js +1111 -0
  126. package/dist/client/assets/{infoDiagram-RXCK75RN-BMzo6KIn.js → infoDiagram-27XIBGKW-Bzy6kCbb.js} +1 -1
  127. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-BIM3h287.js → ishikawaDiagram-5VMMS53U-CRy9vIS5.js} +1 -1
  128. package/dist/client/assets/it-IT-FC2VTM3L-KTijNcUe.js +12 -0
  129. package/dist/client/assets/ja-JP-JBNTKYP4-BflWlGhw.js +12 -0
  130. package/dist/client/assets/{journeyDiagram-EYS64GPL-mF6Lh8O-.js → journeyDiagram-3NMN7TZE-D4ZR_s9J.js} +2 -2
  131. package/dist/client/assets/kaa-TC3VIB7V-B-xtZfy0.js +1 -0
  132. package/dist/client/assets/kab-KAB-UOUDSQKM-BmO0O4Y4.js +4 -0
  133. package/dist/client/assets/{kanban-definition-3QL26DDD-DLN2NyoR.js → kanban-definition-UXKFOSKX-CIDTmu5g.js} +4 -4
  134. package/dist/client/assets/kk-KZ-P5H2X7YS-CSQFB8IN.js +1 -0
  135. package/dist/client/assets/{km-KH-PCWDKPHP-DSmy5shj.js → km-KH-IHMV2US7-BxrjuEzr.js} +4 -4
  136. package/dist/client/assets/ko-KR-ZTMANIDF-BnNRXd5J.js +5 -0
  137. package/dist/client/assets/ku-TR-GPJTRB5G-BZM7f2aT.js +6 -0
  138. package/dist/client/assets/{line-BfTWJmgf.js → line-DSWLHgpx.js} +1 -1
  139. package/dist/client/assets/lobby-presence-Rdjnc0_0.js +1 -0
  140. package/dist/client/assets/lt-LT-V3XDOK3P-MVQBOHmF.js +3 -0
  141. package/dist/client/assets/lv-LV-DVQ3FADO-CrenwAhS.js +4 -0
  142. package/dist/client/assets/markdown-it-CocJWnjv.js +13 -0
  143. package/dist/client/assets/mermaid-parser.core-DrdLA3p0.js +3 -0
  144. package/dist/client/assets/mermaid.core-C_FK-7n4.js +1 -0
  145. package/dist/client/assets/mermaid.core-D0cMM4Rl.js +10 -0
  146. package/dist/client/assets/{mindmap-definition-FBJOCRG2-CRyHaHTk.js → mindmap-definition-YA3MSWOX-DO8NB9VH.js} +8 -8
  147. package/dist/client/assets/mr-IN-VZ6HH5FE-B-PHPglH.js +9 -0
  148. package/dist/client/assets/my-MM-XYKWHRK6-Be5sYp5q.js +1 -0
  149. package/dist/client/assets/nb-NO-UNO2GGZJ-BvSKGdja.js +8 -0
  150. package/dist/client/assets/nl-NL-76EFHT4P-C2yNx1Cj.js +13 -0
  151. package/dist/client/assets/nn-NO-CFKD7ABE-4NsqlDRP.js +4 -0
  152. package/dist/client/assets/oc-FR-YBJTCJ3J-B4OTQsWW.js +4 -0
  153. package/dist/client/assets/pa-IN-SNOXSMRV-CKj_sOG7.js +4 -0
  154. package/dist/client/assets/pegDiagram-XKGWAZYB-DS6Ab21R.js +1 -0
  155. package/dist/client/assets/percentages-Q7USCRWZ-DWE6uvTs.js +1 -0
  156. package/dist/client/assets/{pieDiagram-E7YTZNPT-B5OZPb88.js → pieDiagram-E7YTZNPT-BbFe6Tgs.js} +1 -1
  157. package/dist/client/assets/pl-PL-BSY6YFZ3-CFuzA6L0.js +12 -0
  158. package/dist/client/assets/preload-helper-CtT0-S4g.js +1 -0
  159. package/dist/client/assets/preview-render-compiler-C_7J7eia.js +43 -0
  160. package/dist/client/assets/preview-render-compiler-DzJ1KR_M.js +1 -0
  161. package/dist/client/assets/preview-render-worker-1DoIDllV.js +59 -0
  162. package/dist/client/assets/prod-D5TxmmoB.js +1 -0
  163. package/dist/client/assets/prod-pbFU4TaM.js +145 -0
  164. package/dist/client/assets/pt-BR-CZDV62R3-CkPMtyNx.js +10 -0
  165. package/dist/client/assets/pt-PT-JO57XJJW-CBSnfGtF.js +12 -0
  166. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-Drrw14YH.js → quadrantDiagram-AXDQQJYC-fJE7iAxt.js} +1 -1
  167. package/dist/client/assets/quick-switcher-De4PjZFC.css +1 -0
  168. package/dist/client/assets/quick-switcher-controller-CUajuy78.js +1 -0
  169. package/dist/client/assets/railroadDiagram-O6MQD6OU-CUQKqbCK.js +1 -0
  170. package/dist/client/assets/{requirementDiagram-EFPCY7ZU-CRZG6mRB.js → requirementDiagram-BXWQKSXE-Balm0WW8.js} +2 -2
  171. package/dist/client/assets/ro-RO-UZ5ICYYN-BOuntc_r.js +12 -0
  172. package/dist/client/assets/room-DX7lIfnu.js +1 -0
  173. package/dist/client/assets/ru-RU-AN7JPREC-D-ow3SNR.js +10 -0
  174. package/dist/client/assets/runtime-config-BFVdhnJu.js +1 -0
  175. package/dist/client/assets/runtime-paths-Cn0snt_9.js +1 -0
  176. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-DvarEJpo.js → sankeyDiagram-P5KCCOFB-CcbMqrlQ.js} +1 -1
  177. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-B4oWlb-w.js → sequenceDiagram-WJ2MYXX4-BL1j3Sn-.js} +6 -6
  178. package/dist/client/assets/si-LK-7CBLD6QQ-c91EepX0.js +1 -0
  179. package/dist/client/assets/sk-SK-SWR6DKBI-D5vFMIL6.js +7 -0
  180. package/dist/client/assets/sl-SI-JRML4FIH-D53L_0S2.js +6 -0
  181. package/dist/client/assets/{stateDiagram-HBIQ2CUA-qbHIIqRZ.js → stateDiagram-D77RDMKH-DNi924hh.js} +1 -1
  182. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-C62JEwak.js +1 -0
  183. package/dist/client/assets/sv-SE-4ZPKFFXF-DT-G7RCI.js +12 -0
  184. package/dist/client/assets/{swimlanes-XN3QIQJK-xB6CtUGj.js → swimlanes-42K2YHIH-ColgjSH4.js} +1 -1
  185. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-B9UZhEj4.js +8 -0
  186. package/dist/client/assets/ta-IN-V6NHHU6Z-D5jy7_AE.js +6 -0
  187. package/dist/client/assets/th-TH-P7CTMGDK-6sy0NO7K.js +1 -0
  188. package/dist/client/assets/{timeline-definition-24CTP7MA-Lj_yTNlY.js → timeline-definition-24CTP7MA-7pch5JAr.js} +1 -1
  189. package/dist/client/assets/tr-TR-GUFYG22B-ClVaf8h1.js +4 -0
  190. package/dist/client/assets/uk-UA-K6SV5NFQ-BLTTtyNB.js +6 -0
  191. package/dist/client/assets/uz-UZ-TVKTZO2G-Bm02Eg3D.js +1 -0
  192. package/dist/client/assets/vault-api-client-QjZ_T03l.js +7 -0
  193. package/dist/client/assets/vault-utils-Bct69Xw2.js +1 -0
  194. package/dist/client/assets/{vennDiagram-4TSXK5OY-BekRp5Y0.js → vennDiagram-4TSXK5OY-C5taziCX.js} +1 -1
  195. package/dist/client/assets/vi-VN-7FKFXJNO-CL3WPhmG.js +7 -0
  196. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-kdnV_Hdm.js → wardleyDiagram-VM6X3IG4-BbSlUwuM.js} +1 -1
  197. package/dist/client/assets/wiki-link-resolver-C2P_WmTV.js +1 -0
  198. package/dist/client/assets/{worker-engine-m0rlHn8R-S8mpn_O0.js → worker-engine-m0rlHn8R-eSDcDGEI.js} +1 -1
  199. package/dist/client/assets/workspace-change-CVA9dVmy.js +1 -0
  200. package/dist/client/assets/workspace-sync-client-D4nblH_2.js +1 -0
  201. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-DufGwNSB.js → xychartDiagram-S5SC5T6Z-D06X1arY.js} +1 -1
  202. package/dist/client/assets/yjs-B41tM6Sz.js +4 -0
  203. package/dist/client/assets/yjs-provider-reset-guard-R43MnLNc.js +1 -0
  204. package/dist/client/assets/zh-CN-AOKVLNNK-DGidDH2b.js +11 -0
  205. package/dist/client/assets/zh-HK-CDKPF5DC-CRcNR3rk.js +1 -0
  206. package/dist/client/assets/zh-TW-ZVGYESGW-C7Qji1y6.js +13 -0
  207. package/dist/client/drawio-editor.html +12 -5
  208. package/dist/client/excalidraw-editor.html +46 -5
  209. package/dist/client/export-document.html +6 -8
  210. package/dist/client/index.html +79 -43
  211. package/package.json +39 -36
  212. package/src/client/app/drawio-editor.html +3 -3
  213. package/src/client/app/excalidraw-editor.html +3 -3
  214. package/src/client/app/export-document.html +2 -2
  215. package/src/client/app/index.html +77 -37
  216. package/src/client/app/main-entry.js +13 -17
  217. package/src/client/application/app-shell/chat-feature.js +7 -22
  218. package/src/client/application/app-shell/comments-feature.js +6 -0
  219. package/src/client/application/app-shell/git-feature.js +23 -5
  220. package/src/client/application/app-shell/presence-feature.js +8 -25
  221. package/src/client/application/app-shell/ui-feature-shell.js +172 -149
  222. package/src/client/application/app-shell/ui-feature-sidebar.js +43 -7
  223. package/src/client/application/app-shell/ui-feature-tab-activity.js +27 -9
  224. package/src/client/application/app-shell/ui-feature-toolbar.js +16 -129
  225. package/src/client/application/app-shell-elements.js +9 -0
  226. package/src/client/application/highlight-theme.js +16 -0
  227. package/src/client/application/preview-render-compiler.js +44 -107
  228. package/src/client/application/preview-render-executor.js +0 -26
  229. package/src/client/application/preview-render-scheduler.js +8 -24
  230. package/src/client/application/preview-renderer.js +26 -9
  231. package/src/client/application/webmcp-diagram-renderer.js +47 -0
  232. package/src/client/application/workspace-coordinator.js +23 -22
  233. package/src/client/application/workspace-route-controller.js +7 -0
  234. package/src/client/bootstrap/collabmd-app-shell.js +148 -35
  235. package/src/client/bootstrap/lazy-collab-clients.js +90 -0
  236. package/src/client/domain/excalidraw-element-link.js +73 -0
  237. package/src/client/domain/excalidraw-scene-reconcile.js +5 -2
  238. package/src/client/domain/excalidraw-scene.js +21 -0
  239. package/src/client/domain/hash-routes.js +13 -0
  240. package/src/client/domain/highlight-runtime.js +47 -0
  241. package/src/client/domain/lobby-chat.js +2 -0
  242. package/src/client/domain/room.js +1 -5
  243. package/src/client/domain/runtime-paths.js +61 -7
  244. package/src/client/domain/vault-utils.js +11 -0
  245. package/src/client/excalidraw-editor.js +155 -14
  246. package/src/client/export/export-host.js +3 -1
  247. package/src/client/export/export-pipeline.js +4 -17
  248. package/src/client/infrastructure/agent-connection-api-client.js +23 -0
  249. package/src/client/infrastructure/auth-client.js +4 -15
  250. package/src/client/infrastructure/browser-preferences-port.js +16 -0
  251. package/src/client/infrastructure/editor-session.js +11 -0
  252. package/src/client/infrastructure/editor-view-adapter.js +56 -8
  253. package/src/client/infrastructure/excalidraw-room-client.js +89 -2
  254. package/src/client/infrastructure/git-api-client.js +39 -33
  255. package/src/client/infrastructure/hosted-api-client.js +60 -0
  256. package/src/client/infrastructure/lobby-presence.js +4 -7
  257. package/src/client/infrastructure/runtime-config.js +14 -2
  258. package/src/client/infrastructure/tab-activity-lock.js +2 -5
  259. package/src/client/infrastructure/vault-api-client.js +33 -26
  260. package/src/client/infrastructure/webmcp-tool-registry.js +297 -0
  261. package/src/client/infrastructure/workspace-sync-client.js +6 -4
  262. package/src/client/presentation/agent-connection-controller.js +255 -0
  263. package/src/client/presentation/backlinks-panel.js +3 -0
  264. package/src/client/presentation/bases-preview-controller.js +27 -18
  265. package/src/client/presentation/comment-markdown-renderer.js +2 -14
  266. package/src/client/presentation/comment-overview-controller.js +1 -2
  267. package/src/client/presentation/comment-ui/comment-ui-card.js +4 -2
  268. package/src/client/presentation/comment-ui/comment-ui-shared.js +5 -2
  269. package/src/client/presentation/create-menu-presenter.js +19 -16
  270. package/src/client/presentation/excalidraw-embed-controller.js +164 -4
  271. package/src/client/presentation/file-explorer-controller.js +3 -0
  272. package/src/client/presentation/file-explorer-view.js +338 -182
  273. package/src/client/presentation/file-history-view-controller.js +13 -11
  274. package/src/client/presentation/git-diff-view-controller.js +35 -43
  275. package/src/client/presentation/git-panel-controller.js +78 -28
  276. package/src/client/presentation/hosted-workspace-gate-controller.js +180 -0
  277. package/src/client/presentation/image-lightbox-controller.js +20 -16
  278. package/src/client/presentation/layout-controller.js +13 -2
  279. package/src/client/presentation/quick-switcher-controller.js +20 -78
  280. package/src/client/presentation/quick-switcher-text-search.js +10 -14
  281. package/src/client/presentation/team-settings-controller.js +228 -0
  282. package/src/client/styles/components/navigation.css +1 -2
  283. package/src/client/styles/deferred-collab.css +5 -0
  284. package/src/client/styles/deferred-git.css +7 -0
  285. package/src/client/styles/deferred-preview.css +6 -0
  286. package/src/client/styles/features/agent-connection.css +202 -0
  287. package/src/client/styles/features/collaboration-chat.css +8 -1
  288. package/src/client/styles/features/collaboration-dialogs.css +16 -1
  289. package/src/client/styles/features/collaboration-presence.css +17 -4
  290. package/src/client/styles/features/diagram-preview.css +0 -15
  291. package/src/client/styles/features/diff-toolbar.css +1 -1
  292. package/src/client/styles/features/media-lightbox.css +12 -3
  293. package/src/client/styles/features/outline.css +4 -2
  294. package/src/client/styles/features/preview-markdown.css +25 -11
  295. package/src/client/styles/features/quick-switcher.css +20 -11
  296. package/src/client/styles/features/team-settings.css +162 -0
  297. package/src/client/styles/foundation/themes.css +2 -0
  298. package/src/client/styles/foundation/tokens.css +2 -2
  299. package/src/client/styles/layout/editor-page.css +25 -24
  300. package/src/client/styles/layout/overlays.css +16 -0
  301. package/src/client/styles/layout/responsive.css +7 -25
  302. package/src/client/styles/layout/shell.css +21 -1
  303. package/src/client/styles/layout/sidebar.css +99 -7
  304. package/src/client/styles/primitives/controls.css +21 -54
  305. package/src/client/styles/style.css +4 -19
  306. package/src/domain/agent-tool-definitions.js +872 -0
  307. package/src/domain/collabmd-content-capabilities.js +149 -0
  308. package/src/domain/collaboration-protocol.js +2 -0
  309. package/src/domain/comment-threads.js +3 -5
  310. package/src/domain/diagram-source.js +50 -0
  311. package/src/domain/editable-content-revision.js +10 -0
  312. package/src/domain/editable-text.js +3 -0
  313. package/src/domain/exact-text-edits.js +69 -0
  314. package/src/domain/excalidraw-agent-scene.js +624 -0
  315. package/src/domain/excalidraw-agent-verification.js +554 -0
  316. package/src/domain/excalidraw-room-codec.js +13 -6
  317. package/src/domain/literal-text-search.js +13 -0
  318. package/src/domain/video-embed.js +76 -0
  319. package/src/server/application/agent-connection-service.js +178 -0
  320. package/src/server/application/agent-content-service.js +841 -0
  321. package/src/server/application/workspace-reconciliation.js +5 -7
  322. package/src/server/config/env.js +147 -6
  323. package/src/server/create-app-server.js +47 -141
  324. package/src/server/domain/bases/base-query-service.js +1 -5
  325. package/src/server/domain/collaboration/collaboration-room.js +121 -25
  326. package/src/server/domain/collaboration/protocol.js +4 -0
  327. package/src/server/domain/hosted-workspace.js +31 -1
  328. package/src/server/domain/markdown-reference-extractor.js +15 -1
  329. package/src/server/domain/ripgrep-search-service.js +68 -21
  330. package/src/server/infrastructure/git/git-service.js +19 -1
  331. package/src/server/infrastructure/git/history-service.js +1 -1
  332. package/src/server/infrastructure/git/local-exclude.js +37 -0
  333. package/src/server/infrastructure/git/parsers.js +19 -17
  334. package/src/server/infrastructure/git/path-utils.js +0 -16
  335. package/src/server/infrastructure/git/status-service.js +1 -1
  336. package/src/server/infrastructure/git/untracked-files.js +12 -21
  337. package/src/server/infrastructure/http/create-agent-api-handler.js +171 -0
  338. package/src/server/infrastructure/http/create-git-api-command-handler.js +32 -0
  339. package/src/server/infrastructure/http/create-hosted-api-handler.js +5 -0
  340. package/src/server/infrastructure/http/create-request-handler.js +123 -26
  341. package/src/server/infrastructure/http/create-static-handler.js +9 -0
  342. package/src/server/infrastructure/http/create-vault-api-query-handler.js +15 -2
  343. package/src/server/infrastructure/mcp/create-agent-mcp-handler.js +200 -0
  344. package/src/server/infrastructure/persistence/agent-connection-store.js +120 -0
  345. package/src/server/infrastructure/persistence/pull-backup-store.js +2 -27
  346. package/src/server/infrastructure/persistence/sidecar-store.js +12 -5
  347. package/src/server/infrastructure/persistence/vault-file-store.js +11 -5
  348. package/src/server/infrastructure/websocket/attach-collaboration-gateway.js +48 -22
  349. package/src/server/shared/agent-tool-image.js +22 -0
  350. package/src/server/shared/agent-tool-rate-limiter.js +27 -0
  351. package/src/server/startup/git-remote-bootstrap.js +58 -79
  352. package/src/server/vault-registry.js +251 -0
  353. package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-BPH4FJkv.js +0 -1
  354. package/dist/client/assets/abnfDiagram-VCTEODGH-BNDLzJ7L.js +0 -1
  355. package/dist/client/assets/ar-SA-PQUY64WN-xjXgbW6d.js +0 -10
  356. package/dist/client/assets/az-AZ-OXJXL76K-4JkO4Pca.js +0 -1
  357. package/dist/client/assets/base-CaIEJUF9.css +0 -1
  358. package/dist/client/assets/bg-BG-W2GKIJDF-DnkH_o81.js +0 -5
  359. package/dist/client/assets/bn-BD-TGL7M4PJ-CG4JkmtP.js +0 -3
  360. package/dist/client/assets/bn-IN-BKETKYEH-CG4JkmtP.js +0 -3
  361. package/dist/client/assets/browser-utils--H_DkyEF.js +0 -1
  362. package/dist/client/assets/ca-ES-LD5SCRVV-U6_TVMX9.js +0 -8
  363. package/dist/client/assets/channel-CaoKA_We.js +0 -1
  364. package/dist/client/assets/chunk-7XWMRXBY-CfMzEq80.js +0 -1
  365. package/dist/client/assets/chunk-CKBBP62Z-DG26UiBv.js +0 -2
  366. package/dist/client/assets/chunk-DSNCTWBM-8xkug7fQ.js +0 -2
  367. package/dist/client/assets/chunk-DU6HZSFF-COXDzJK1.js +0 -127
  368. package/dist/client/assets/chunk-R7TYR2AO-CTd0Yj98.js +0 -10
  369. package/dist/client/assets/chunk-RM4UPSZO-CWRwxNWJ.js +0 -41
  370. package/dist/client/assets/classDiagram-DTDB5LWJ-7fEmn0zV.js +0 -1
  371. package/dist/client/assets/classDiagram-v2-JRS7N3AN-7fEmn0zV.js +0 -1
  372. package/dist/client/assets/comment-thread-store-CdcwrObc.js +0 -1
  373. package/dist/client/assets/comment-threads-9J6Em-_y.js +0 -4
  374. package/dist/client/assets/comment-ui-shared-DuoyznXW.js +0 -7
  375. package/dist/client/assets/cs-CZ-OFPU5DBV-BmFAIhqX.js +0 -7
  376. package/dist/client/assets/da-DK-FRDJFYWF-H387Jw8B.js +0 -2
  377. package/dist/client/assets/de-CH-ZG7H3QK3-C_groygo.js +0 -11
  378. package/dist/client/assets/de-DE-SIJYH4IH-C_groygo.js +0 -11
  379. package/dist/client/assets/diagram-VSXAHHWV-CQRVEZR7.js +0 -3
  380. package/dist/client/assets/dist-73RPdcyU.js +0 -1
  381. package/dist/client/assets/dist-BJ1bJs33.js +0 -1
  382. package/dist/client/assets/dist-ByrG2qBA.js +0 -1
  383. package/dist/client/assets/dist-CH-sQu3r.js +0 -1
  384. package/dist/client/assets/dist-CKS_-are.js +0 -1
  385. package/dist/client/assets/dist-D37Hyu3h.js +0 -9
  386. package/dist/client/assets/dist-DZAAWTG-.js +0 -1
  387. package/dist/client/assets/dist-Dir5dDKZ.js +0 -1
  388. package/dist/client/assets/dist-Dl_tpDSr.js +0 -1
  389. package/dist/client/assets/dist-DutPuFmC.js +0 -1
  390. package/dist/client/assets/dist-RKBTaQMb.js +0 -13
  391. package/dist/client/assets/dist-eBx8q6Sy.js +0 -1
  392. package/dist/client/assets/drawio-editor-BVaNNtYp.js +0 -9
  393. package/dist/client/assets/drawioEditor-BkIBlXx0.js +0 -2
  394. package/dist/client/assets/ebnfDiagram-PWID7BFC-OXa8VEp1.js +0 -1
  395. package/dist/client/assets/editor-session-DMyVdHLj.js +0 -54
  396. package/dist/client/assets/el-GR-IEE2CGI2-BkT6YT54.js +0 -7
  397. package/dist/client/assets/embedded-editor-base-B3l6Xy65.css +0 -1
  398. package/dist/client/assets/es-ES-TVVPWKV5-CpPKJXTM.js +0 -12
  399. package/dist/client/assets/eu-ES-CGBMFQDT-Bu3N2493.js +0 -8
  400. package/dist/client/assets/excalidraw-editor-BjYaNEMY.js +0 -9
  401. package/dist/client/assets/excalidraw-mermaid-stub-BNckbX2n.js +0 -1
  402. package/dist/client/assets/excalidraw-mermaid-stub-DE5FTiZB.js +0 -1
  403. package/dist/client/assets/excalidrawEditor-ChqF_d82.js +0 -2
  404. package/dist/client/assets/export-page-Dyu0XCbu.js +0 -57
  405. package/dist/client/assets/exportDocument-CJBx4Xjx.css +0 -1
  406. package/dist/client/assets/exportDocument-Dgvfa2Sd.js +0 -2
  407. package/dist/client/assets/fa-IR-IE6XAPR4-BEvLCORD.js +0 -9
  408. package/dist/client/assets/fi-FI-P7TKNHRM-DI0q8iSX.js +0 -6
  409. package/dist/client/assets/file-icon-svg-Y_kpF957.js +0 -1
  410. package/dist/client/assets/flowDiagram-A5DVABFB-CiW1eN8C.js +0 -1
  411. package/dist/client/assets/fr-FR-QI2XZNT7-y8kXd8LA.js +0 -12
  412. package/dist/client/assets/gl-ES-TLYCNOZZ-Br-Fhff-.js +0 -6
  413. package/dist/client/assets/he-IL-ZX43XLGP-qKQq6V9X.js +0 -9
  414. package/dist/client/assets/hi-IN-UTYRMTUF-DOUcwrDO.js +0 -3
  415. package/dist/client/assets/hu-HU-AJOSEBW6-FqTyvHlD.js +0 -3
  416. package/dist/client/assets/id-ID-ETLTVG6C-CQqh3CLS.js +0 -8
  417. package/dist/client/assets/image-ZVKINSPA-0zXSnE7M.js +0 -1
  418. package/dist/client/assets/index-CSNIMyOP.css +0 -1
  419. package/dist/client/assets/index-DG3N2Ps-.js +0 -2
  420. package/dist/client/assets/it-IT-B4B6TP6L-V-yK3SZz.js +0 -12
  421. package/dist/client/assets/ja-JP-IYKVURR5-BQKBXRpX.js +0 -12
  422. package/dist/client/assets/kaa-SE2BUIKX-CZ5kfwPg.js +0 -1
  423. package/dist/client/assets/kab-KAB-Y3GLKXLR-Do7GWfuN.js +0 -4
  424. package/dist/client/assets/kk-KZ-ABWUFVOH-BpqVciQz.js +0 -1
  425. package/dist/client/assets/ko-KR-7JQDXKGM-N42lep78.js +0 -5
  426. package/dist/client/assets/ku-TR-NAH2Q5B7-K8LLl9fk.js +0 -6
  427. package/dist/client/assets/lt-LT-VQFYRSNQ-BmOd0ALn.js +0 -3
  428. package/dist/client/assets/lv-LV-T62VSYUM-B22WdPhp.js +0 -4
  429. package/dist/client/assets/main-D0wCxpVn.js +0 -903
  430. package/dist/client/assets/mermaid-parser.core-Bl0efOMt.js +0 -4
  431. package/dist/client/assets/mermaid.core-BJRLUQZE.js +0 -11
  432. package/dist/client/assets/modulepreload-polyfill-P2Xu9kJm.js +0 -1
  433. package/dist/client/assets/mr-IN-V4FHLCJE-XX069tpm.js +0 -9
  434. package/dist/client/assets/my-MM-E3SQ6E54-cst_-5SB.js +0 -1
  435. package/dist/client/assets/nb-NO-MLNOFN5H-Bu2URWko.js +0 -8
  436. package/dist/client/assets/nl-NL-D5L3ZV4M-BqrV0btt.js +0 -13
  437. package/dist/client/assets/nn-NO-NNHDGPKB-DK-xZaWM.js +0 -4
  438. package/dist/client/assets/oc-FR-DWCRF55G-BZ5Po5R6.js +0 -4
  439. package/dist/client/assets/pa-IN-3JSAY44M-BZQSjKrS.js +0 -4
  440. package/dist/client/assets/pegDiagram-XKGWAZYB-B31fKPR2.js +0 -1
  441. package/dist/client/assets/percentages-ETZPVQEE-DFxFqXgH.js +0 -1
  442. package/dist/client/assets/pl-PL-ACURYKP3-qcEOSfCk.js +0 -12
  443. package/dist/client/assets/preload-helper-HclGiUj8.js +0 -1
  444. package/dist/client/assets/preview-render-compiler-CrJIooVD.js +0 -35
  445. package/dist/client/assets/preview-render-compiler-O0JxBVNF.js +0 -1
  446. package/dist/client/assets/preview-render-profile-B4RWYWHt.js +0 -1
  447. package/dist/client/assets/preview-render-worker-_QTxqKvP.js +0 -60
  448. package/dist/client/assets/prod-BiYPMR1i.js +0 -177
  449. package/dist/client/assets/prod-VxdGZ5Ly.js +0 -1
  450. package/dist/client/assets/pt-BR-LOX7MLGD-DLueHSyZ.js +0 -10
  451. package/dist/client/assets/pt-PT-CZ2U2RFQ-BJ-GAEm6.js +0 -12
  452. package/dist/client/assets/quick-switcher-controller-CaEjEtq_.js +0 -1
  453. package/dist/client/assets/railroadDiagram-O6MQD6OU-BPifP0MB.js +0 -1
  454. package/dist/client/assets/ro-RO-2HECL2X6-CJUvKAf0.js +0 -12
  455. package/dist/client/assets/ru-RU-HAYNXO46-BWSlvTrt.js +0 -10
  456. package/dist/client/assets/runtime-config-BLrEKVO1.js +0 -1
  457. package/dist/client/assets/si-LK-W5KNS4H6-DGGCsn7k.js +0 -1
  458. package/dist/client/assets/sk-SK-7K2CFGDV-CY4uTYgQ.js +0 -7
  459. package/dist/client/assets/sl-SI-OXV2QZWW-2-weqaBY.js +0 -6
  460. package/dist/client/assets/stateDiagram-v2-4QOOHH4V-B--gjrit.js +0 -1
  461. package/dist/client/assets/sv-SE-JTOBZRGL-9-IUtVkO.js +0 -12
  462. package/dist/client/assets/swimlanesDiagram-VK2B7HYN-DO8XNXEg.js +0 -8
  463. package/dist/client/assets/ta-IN-KFAVKXGT-gHO6Q_DH.js +0 -6
  464. package/dist/client/assets/th-TH-VDMSCPDL-BvJuw6PJ.js +0 -1
  465. package/dist/client/assets/tr-TR-CEZ6GX45-CG6UU3Su.js +0 -4
  466. package/dist/client/assets/uk-UA-Q3H3OXQC-CSuIg_DY.js +0 -6
  467. package/dist/client/assets/uz-UZ-NGCSWWPX-mom7rxSP.js +0 -1
  468. package/dist/client/assets/vault-api-client-BkwdFjx0.js +0 -6
  469. package/dist/client/assets/vault-utils-DvoSftJT.js +0 -22
  470. package/dist/client/assets/vi-VN-P3NDEVPS-BB0Fu9ck.js +0 -7
  471. package/dist/client/assets/yjs-provider-reset-guard-DE0vINDP.js +0 -4
  472. package/dist/client/assets/zh-CN-SS3O57GA-Bj8wsiMe.js +0 -11
  473. package/dist/client/assets/zh-HK-LWJT3VCF-DOTquTCh.js +0 -1
  474. package/dist/client/assets/zh-TW-VJXC72RT-B48PRo-l.js +0 -13
  475. package/src/client/app/drawio-editor-entry.js +0 -1
  476. package/src/client/app/excalidraw-editor-entry.js +0 -1
  477. package/src/client/excalidraw-mermaid-stub.js +0 -7
  478. package/src/client/main.js +0 -16
  479. /package/dist/client/assets/{vault-api-client-C3mlS_4N.css → auth-gate-C3mlS_4N.css} +0 -0
  480. /package/dist/client/assets/{drawio-editor-UQQ8XHou.css → drawioEditor-UQQ8XHou.css} +0 -0
  481. /package/dist/client/assets/{base-BYODPHdS.js → github.min-DBihDoic.js} +0 -0
  482. /package/dist/client/assets/{sizeCapture-X5ZJPWSS-B0uUizjq.js → sizeCapture-INFHLROL-B0uUizjq.js} +0 -0
@@ -544,12 +544,14 @@ export class FileHistoryViewController {
544
544
  this.actionsDivider?.classList.add('hidden');
545
545
  this.editorActionsGroup?.classList.remove('hidden');
546
546
  this.modeButtons.forEach((button) => {
547
+ const active = button.getAttribute('data-diff-mode') === this.diffMode;
547
548
  button.classList.toggle('hidden', !hasSelection);
548
- button.classList.toggle('active', button.getAttribute('data-diff-mode') === this.diffMode);
549
+ button.classList.toggle('active', active);
550
+ button.setAttribute?.('aria-pressed', String(active));
549
551
  });
550
552
  this.openEditorButton?.toggleAttribute('disabled', !this.currentFilePath);
551
553
  if (this.openEditorButton) {
552
- this.openEditorButton.textContent = 'Open File';
554
+ this.openEditorButton.textContent = 'Open file';
553
555
  }
554
556
  this.primaryActionButton?.toggleAttribute('disabled', true);
555
557
  this.commitButton?.toggleAttribute('disabled', true);
@@ -562,13 +564,13 @@ export class FileHistoryViewController {
562
564
  this.page?.classList.remove('hidden');
563
565
  if (this.content) {
564
566
  this.content.classList.add('diff-content--history');
565
- this.content.innerHTML = '<div class="git-panel-empty">Loading file history...</div>';
567
+ this.content.innerHTML = '<div class="git-panel-empty" role="status" aria-live="polite">Loading file history…</div>';
566
568
  }
567
569
  this.historyListElement = null;
568
570
  this.syncToolbar();
569
571
  }
570
572
 
571
- renderEmpty(message) {
573
+ renderEmpty(message, { alert = false } = {}) {
572
574
  if (!this.isActive) {
573
575
  return;
574
576
  }
@@ -576,7 +578,7 @@ export class FileHistoryViewController {
576
578
  if (this.content) {
577
579
  this.content.classList.add('diff-content--history');
578
580
  // pi-lens-ignore: no-inner-html-js
579
- this.content.innerHTML = `<div class="git-panel-empty">${escapeHtml(message)}</div>`;
581
+ this.content.innerHTML = `<div class="git-panel-empty"${alert ? ' role="alert"' : ''}>${escapeHtml(message)}</div>`;
580
582
  }
581
583
  this.historyListElement = null;
582
584
  this.syncToolbar();
@@ -691,7 +693,7 @@ export class FileHistoryViewController {
691
693
  type="button"
692
694
  data-file-history-open-selected-diff
693
695
  >
694
- Open Standalone Diff
696
+ Open standalone diff
695
697
  </button>
696
698
  ${entry.type === 'commit' ? `
697
699
  <button
@@ -699,7 +701,7 @@ export class FileHistoryViewController {
699
701
  type="button"
700
702
  data-file-history-open-selected-preview
701
703
  >
702
- Preview File
704
+ Preview file
703
705
  </button>
704
706
  ` : ''}
705
707
  </div>
@@ -719,7 +721,7 @@ export class FileHistoryViewController {
719
721
  <div class="diff-file-header">
720
722
  <span class="diff-file-path">${escapeHtml(entry.pathAtCommit || this.currentFilePath || '')}</span>
721
723
  </div>
722
- <div class="diff-empty-state">Loading diff...</div>
724
+ <div class="diff-empty-state" role="status" aria-live="polite">Loading diff…</div>
723
725
  </section>
724
726
  `;
725
727
  }
@@ -728,7 +730,7 @@ export class FileHistoryViewController {
728
730
  return `
729
731
  <section class="diff-file-block file-history-diff-block">
730
732
  ${this.renderDiffFileHeader({ path: entry.pathAtCommit || this.currentFilePath || '' })}
731
- <div class="diff-empty-state">${escapeHtml(selection.error)}</div>
733
+ <div class="diff-empty-state" role="alert">${escapeHtml(selection.error)}</div>
732
734
  </section>
733
735
  `;
734
736
  }
@@ -764,7 +766,7 @@ export class FileHistoryViewController {
764
766
 
765
767
  const hasRows = Boolean(this.localChanges) || (this.history.commits?.length ?? 0) > 0;
766
768
  if (!hasRows) {
767
- this.renderEmpty(this.history.error || 'No history found for this file.');
769
+ this.renderEmpty(this.history.error || 'No history found for this file.', { alert: Boolean(this.history.error) });
768
770
  return;
769
771
  }
770
772
 
@@ -794,7 +796,7 @@ export class FileHistoryViewController {
794
796
  data-file-history-load-more
795
797
  ${this.history.loadingMore ? 'disabled' : ''}
796
798
  >
797
- ${this.history.loadingMore ? 'Loading...' : 'Load More'}
799
+ ${this.history.loadingMore ? 'Loading' : 'Load more'}
798
800
  </button>
799
801
  </div>
800
802
  ` : ''}
@@ -1,3 +1,4 @@
1
+ import { createExcalidrawExportOptions } from '../domain/excalidraw-scene.js';
1
2
  import { escapeHtml } from '../domain/vault-utils.js';
2
3
  import { commitButtonLabel } from '../domain/git-labels.js';
3
4
  import { getVaultPathLeaf, getVaultPathParent } from '../domain/vault-paths.js';
@@ -200,29 +201,25 @@ function getDrawioSourcePair(detail = {}) {
200
201
  };
201
202
  }
202
203
 
203
- function decodeXmlAttribute(value) {
204
- return String(value ?? '')
205
- .replace(/&quot;/gu, '"')
206
- .replace(/&apos;/gu, "'")
207
- .replace(/&amp;/gu, '&')
208
- .replace(/&lt;/gu, '<')
209
- .replace(/&gt;/gu, '>');
210
- }
211
-
212
204
  function getDrawioCellMap(source) {
213
205
  const cells = new Map();
214
- const cellPattern = /<mxCell\b([^>]*?)(?:\/|>([\s\S]*?)<\/mxCell\s*)>/giu;
215
- let match;
206
+ if (typeof DOMParser === 'undefined' || typeof XMLSerializer === 'undefined') {
207
+ return cells;
208
+ }
216
209
 
217
- while ((match = cellPattern.exec(String(source ?? ''))) !== null) {
218
- const idMatch = match[1].match(/\bid\s*=\s*(['"])(.*?)\1/iu);
219
- const id = decodeXmlAttribute(idMatch?.[2] || '');
210
+ const documentNode = new DOMParser().parseFromString(String(source ?? ''), 'application/xml');
211
+ if (documentNode.querySelector('parsererror')) {
212
+ return cells;
213
+ }
214
+
215
+ const serializer = new XMLSerializer();
216
+ for (const cell of documentNode.getElementsByTagName('mxCell')) {
217
+ const id = cell.getAttribute('id');
220
218
  if (!id || id === '0' || id === '1') {
221
219
  continue;
222
220
  }
223
221
 
224
- const signature = `${match[1]}${match[2] || ''}`.replace(/\s+/gu, ' ').trim();
225
- cells.set(id, signature);
222
+ cells.set(id, serializer.serializeToString(cell).replace(/\s+/gu, ' ').trim());
226
223
  }
227
224
 
228
225
  return cells;
@@ -647,7 +644,7 @@ export class GitDiffViewController {
647
644
  this.excalidrawPreviewPayloads.clear();
648
645
  this.drawioPreviewPayloads.clear();
649
646
  this.requestScope = scope;
650
- this.renderLoading('Loading diff summary...');
647
+ this.renderLoading('Loading diff summary');
651
648
 
652
649
  try {
653
650
  const data = await this.gitApiClient.readDiff({
@@ -677,7 +674,7 @@ export class GitDiffViewController {
677
674
  source: 'workspace',
678
675
  summary: { additions: 0, deletions: 0, filesChanged: 0 },
679
676
  };
680
- this.renderEmpty('Failed to load git diff');
677
+ this.renderEmpty('Failed to load git diff', { alert: true });
681
678
  return this.data;
682
679
  }
683
680
  }
@@ -700,7 +697,7 @@ export class GitDiffViewController {
700
697
  this.excalidrawPreviewPayloads.clear();
701
698
  this.drawioPreviewPayloads.clear();
702
699
  this.requestScope = 'all';
703
- this.renderLoading('Loading commit summary...');
700
+ this.renderLoading('Loading commit summary');
704
701
 
705
702
  try {
706
703
  const data = await this.gitApiClient.readCommit({
@@ -741,7 +738,7 @@ export class GitDiffViewController {
741
738
  summary: { additions: 0, deletions: 0, filesChanged: 0 },
742
739
  };
743
740
  this.commitMeta = null;
744
- this.renderEmpty('Failed to load git commit');
741
+ this.renderEmpty('Failed to load git commit', { alert: true });
745
742
  return this.data;
746
743
  }
747
744
  }
@@ -790,27 +787,27 @@ export class GitDiffViewController {
790
787
  void this.loadCurrentFile();
791
788
  }
792
789
 
793
- renderLoading(message = 'Loading git diff...') {
790
+ renderLoading(message = 'Loading git diff') {
794
791
  if (!this.isActive) {
795
792
  return;
796
793
  }
797
794
  this.page?.classList.remove('hidden');
798
795
  if (this.content) {
799
796
  // pi-lens-ignore: ast-grep:no-inner-html-js
800
- this.content.innerHTML = `<div class="diff-empty-state">${escapeHtml(message)}</div>`;
797
+ this.content.innerHTML = `<div class="diff-empty-state" role="status" aria-live="polite">${escapeHtml(message)}</div>`;
801
798
  }
802
799
  this.data = null;
803
800
  this.syncToolbar();
804
801
  }
805
802
 
806
- renderEmpty(message) {
803
+ renderEmpty(message, { alert = false } = {}) {
807
804
  if (!this.isActive) {
808
805
  return;
809
806
  }
810
807
  this.page?.classList.remove('hidden');
811
808
  if (this.content) {
812
809
  // pi-lens-ignore: ast-grep:no-inner-html-js
813
- this.content.innerHTML = `<div class="diff-empty-state">${escapeHtml(message)}</div>`;
810
+ this.content.innerHTML = `<div class="diff-empty-state"${alert ? ' role="alert"' : ''}>${escapeHtml(message)}</div>`;
814
811
  }
815
812
  this.syncToolbar();
816
813
  }
@@ -1194,16 +1191,7 @@ export class GitDiffViewController {
1194
1191
  }
1195
1192
 
1196
1193
  try {
1197
- const svg = await exportToSvg({
1198
- appState: {
1199
- exportBackground: true,
1200
- exportWithDarkMode: false,
1201
- viewBackgroundColor: scene.appState?.viewBackgroundColor || '#ffffff',
1202
- },
1203
- elements: getVisibleSceneElements(scene),
1204
- exportPadding: 24,
1205
- files: scene.files || null,
1206
- });
1194
+ const svg = await exportToSvg(createExcalidrawExportOptions(scene));
1207
1195
  preview.replaceChildren(svg);
1208
1196
  preview.classList.add('is-ready');
1209
1197
  } catch (error) {
@@ -1345,7 +1333,7 @@ export class GitDiffViewController {
1345
1333
  return `
1346
1334
  <section class="diff-file-block">
1347
1335
  ${this.renderFileHeader(currentFile)}
1348
- <div class="diff-empty-state">Loading file diff...</div>
1336
+ <div class="diff-empty-state" role="status" aria-live="polite">Loading file diff…</div>
1349
1337
  </section>
1350
1338
  `;
1351
1339
  }
@@ -1355,7 +1343,7 @@ export class GitDiffViewController {
1355
1343
  return `
1356
1344
  <section class="diff-file-block">
1357
1345
  ${this.renderFileHeader(currentFile)}
1358
- <div class="diff-empty-state">${escapeHtml(errorMessage)}</div>
1346
+ <div class="diff-empty-state" role="alert">${escapeHtml(errorMessage)}</div>
1359
1347
  </section>
1360
1348
  `;
1361
1349
  }
@@ -1435,9 +1423,9 @@ export class GitDiffViewController {
1435
1423
  const bodyMarkup = isCollapsed
1436
1424
  ? ''
1437
1425
  : isLoading
1438
- ? '<div class="diff-empty-state">Loading file diff...</div>'
1426
+ ? '<div class="diff-empty-state" role="status" aria-live="polite">Loading file diff…</div>'
1439
1427
  : errorMessage
1440
- ? `<div class="diff-empty-state">${escapeHtml(errorMessage)}</div>`
1428
+ ? `<div class="diff-empty-state" role="alert">${escapeHtml(errorMessage)}</div>`
1441
1429
  : this.renderDiffDetail(detail, index, { includeHeader: false });
1442
1430
 
1443
1431
  return `
@@ -1877,11 +1865,15 @@ export class GitDiffViewController {
1877
1865
  }
1878
1866
 
1879
1867
  this.modeButtons.forEach((button) => {
1868
+ const active = button.getAttribute('data-diff-mode') === this.mode;
1880
1869
  button.classList.remove('hidden');
1881
- button.classList.toggle('active', button.getAttribute('data-diff-mode') === this.mode);
1870
+ button.classList.toggle('active', active);
1871
+ button.setAttribute?.('aria-pressed', String(active));
1882
1872
  });
1883
1873
  this.layoutButtons.forEach((button) => {
1884
- button.classList.toggle('active', button.getAttribute('data-diff-layout') === this.layoutMode);
1874
+ const active = button.getAttribute('data-diff-layout') === this.layoutMode;
1875
+ button.classList.toggle('active', active);
1876
+ button.setAttribute?.('aria-pressed', String(active));
1885
1877
  });
1886
1878
 
1887
1879
  const hasCurrentFile = Boolean(this.getCurrentFile()?.path);
@@ -1906,8 +1898,8 @@ export class GitDiffViewController {
1906
1898
  this.primaryActionButton.classList.toggle('ui-button--primary', emphasizeInclude);
1907
1899
  this.primaryActionButton.classList.toggle('ui-button--secondary', !emphasizeInclude);
1908
1900
  this.primaryActionButton.classList.toggle('ui-button--surface', !emphasizeInclude);
1909
- this.primaryActionButton.textContent = this.pendingAction === primaryAction
1910
- ? 'Working...'
1901
+ this.primaryActionButton.textContent = this.pendingAction && this.pendingAction === primaryAction
1902
+ ? 'Working'
1911
1903
  : primaryAction === 'unstage'
1912
1904
  ? 'Remove'
1913
1905
  : 'Include in commit';
@@ -1918,7 +1910,7 @@ export class GitDiffViewController {
1918
1910
  }
1919
1911
  if (this.commitButton) {
1920
1912
  this.commitButton.textContent = this.pendingAction === 'commit'
1921
- ? 'Working...'
1913
+ ? 'Working'
1922
1914
  : commitButtonLabel(includedFileCount);
1923
1915
  }
1924
1916
  this.commitButton?.classList.toggle(
@@ -94,7 +94,9 @@ export class GitPanelController {
94
94
  onResetFile = () => {},
95
95
  onSelectCommit = () => {},
96
96
  onSelectDiff = () => {},
97
+ onStageAll = () => {},
97
98
  onStageFile = () => {},
99
+ onUnstageAll = () => {},
98
100
  onUnstageFile = () => {},
99
101
  onViewAllDiff = () => {},
100
102
  searchInput = null,
@@ -110,7 +112,9 @@ export class GitPanelController {
110
112
  this.onResetFile = onResetFile;
111
113
  this.onSelectCommit = onSelectCommit;
112
114
  this.onSelectDiff = onSelectDiff;
115
+ this.onStageAll = onStageAll;
113
116
  this.onStageFile = onStageFile;
117
+ this.onUnstageAll = onUnstageAll;
114
118
  this.onUnstageFile = onUnstageFile;
115
119
  this.onViewAllDiff = onViewAllDiff;
116
120
  this.searchInput = searchInput;
@@ -118,6 +122,7 @@ export class GitPanelController {
118
122
  this.panel = document.getElementById('gitPanel');
119
123
  this.pullBackups = [];
120
124
  this.status = null;
125
+ this.statusError = '';
121
126
  this.active = false;
122
127
  this.refreshTimer = null;
123
128
  this.searchQuery = '';
@@ -236,6 +241,17 @@ export class GitPanelController {
236
241
 
237
242
  if (this._handleFileActionClick(event)) return;
238
243
 
244
+ const bulkActionButton = event.target instanceof Element
245
+ ? event.target.closest('[data-git-bulk-action]')
246
+ : null;
247
+ if (bulkActionButton) {
248
+ const action = bulkActionButton.getAttribute('data-git-bulk-action');
249
+ if (action === 'stage-all' || action === 'unstage-all') {
250
+ void this.handleBulkAction(action);
251
+ }
252
+ return;
253
+ }
254
+
239
255
  if (event.target instanceof Element && event.target.closest('[data-git-view-all]')) {
240
256
  this.onViewAllDiff();
241
257
  return;
@@ -280,8 +296,8 @@ export class GitPanelController {
280
296
  this.stopStatusPolling();
281
297
  return;
282
298
  }
283
-
284
299
  this.syncSearchUi();
300
+ void import('../styles/deferred-git.css');
285
301
  void this.refresh({ force: false, includeHistory: this.panelMode === 'history' });
286
302
  if (this.panelMode === 'changes') {
287
303
  this.ensureStatusPolling();
@@ -377,7 +393,7 @@ export class GitPanelController {
377
393
 
378
394
  async refresh({ force = false, includeHistory = this.panelMode === 'history' } = {}) {
379
395
  const status = await this.refreshStatus({ force });
380
- if (includeHistory && status.isGitRepo) {
396
+ if (includeHistory && status?.isGitRepo) {
381
397
  await this.refreshHistory({ force });
382
398
  }
383
399
  return status;
@@ -385,6 +401,7 @@ export class GitPanelController {
385
401
 
386
402
  async refreshStatus({ force = false } = {}) {
387
403
  if (!this.enabled) {
404
+ this.statusError = '';
388
405
  this.status = {
389
406
  isGitRepo: false,
390
407
  sections: [],
@@ -409,6 +426,7 @@ export class GitPanelController {
409
426
  try {
410
427
  const data = await this.gitApiClient.readStatus({ force });
411
428
  this.status = data;
429
+ this.statusError = '';
412
430
  this.pullBackups = [];
413
431
  if (data.isGitRepo) {
414
432
  try {
@@ -435,25 +453,9 @@ export class GitPanelController {
435
453
  } catch (error) {
436
454
  console.error('[git-panel] Failed to load git status:', error);
437
455
  this.toastController?.show('Failed to load git status');
438
- this.status = {
439
- isGitRepo: false,
440
- sections: [],
441
- summary: { changedFiles: 0 },
442
- };
443
- this.pullBackups = [];
444
- this.history = {
445
- ...this.history,
446
- commits: [],
447
- error: '',
448
- hasMore: false,
449
- loaded: false,
450
- loading: false,
451
- loadingMore: false,
452
- offset: 0,
453
- };
454
- this.onRepoChange(false, this.status);
456
+ this.statusError = 'Failed to load Git status. Try again.';
455
457
  this.render();
456
- return this.status;
458
+ return null;
457
459
  }
458
460
  }
459
461
 
@@ -615,6 +617,22 @@ export class GitPanelController {
615
617
  }
616
618
  }
617
619
 
620
+ async handleBulkAction(action) {
621
+ if (this.pendingActionKey) {
622
+ return;
623
+ }
624
+
625
+ this.pendingActionKey = action;
626
+ this.render();
627
+
628
+ try {
629
+ await (action === 'stage-all' ? this.onStageAll() : this.onUnstageAll());
630
+ } finally {
631
+ this.pendingActionKey = null;
632
+ this.render();
633
+ }
634
+ }
635
+
618
636
  async handleCommitStaged() {
619
637
  const actionKey = 'commit-staged';
620
638
  if (this.pendingActionKey === actionKey) {
@@ -835,11 +853,11 @@ export class GitPanelController {
835
853
  const commits = this.filterCommits(this.history.commits);
836
854
 
837
855
  if (this.history.loading && !this.history.loaded) {
838
- return '<div class="git-panel-empty">Loading git history...</div>';
856
+ return '<div class="git-panel-empty" role="status" aria-live="polite">Loading git history…</div>';
839
857
  }
840
858
 
841
859
  if (this.history.error && !this.history.loaded) {
842
- return `<div class="git-panel-empty">${escapeHtml(this.history.error)}</div>`;
860
+ return `<div class="git-panel-empty" role="alert">${escapeHtml(this.history.error)}</div>`;
843
861
  }
844
862
 
845
863
  if (this.history.loaded && commits.length === 0 && this.history.commits.length === 0) {
@@ -862,7 +880,7 @@ export class GitPanelController {
862
880
  data-git-history-load-more
863
881
  ${this.history.loadingMore ? 'disabled' : ''}
864
882
  >
865
- ${this.history.loadingMore ? 'Loading...' : 'Load More'}
883
+ ${this.history.loadingMore ? 'Loading' : 'Load more'}
866
884
  </button>
867
885
  </div>
868
886
  ` : ''}
@@ -877,6 +895,8 @@ export class GitPanelController {
877
895
  .join('');
878
896
  const hasChanges = Boolean(this.status.summary?.changedFiles);
879
897
  const includedFileCount = Number(this.status.summary?.staged || 0);
898
+ const excludedFileCount = Number(this.status.summary?.workingTree || 0)
899
+ + Number(this.status.summary?.untracked || 0);
880
900
  const isCommitPending = this.pendingActionKey === 'commit-staged';
881
901
 
882
902
  return `
@@ -885,9 +905,29 @@ export class GitPanelController {
885
905
  ${hasChanges ? `
886
906
  <div class="git-panel-footer">
887
907
  <div class="git-panel-footer-actions">
908
+ ${excludedFileCount > 0 ? `
909
+ <button
910
+ class="${buttonClassNames({ variant: 'secondary', size: 'compact', action: true, surface: true })}"
911
+ type="button"
912
+ data-git-bulk-action="stage-all"
913
+ ${this.pendingActionKey ? 'disabled' : ''}
914
+ >
915
+ ${this.pendingActionKey === 'stage-all' ? 'Working...' : 'Include all changes'}
916
+ </button>
917
+ ` : ''}
918
+ ${includedFileCount > 0 ? `
919
+ <button
920
+ class="${buttonClassNames({ variant: 'secondary', size: 'compact', action: true, surface: true })}"
921
+ type="button"
922
+ data-git-bulk-action="unstage-all"
923
+ ${this.pendingActionKey ? 'disabled' : ''}
924
+ >
925
+ ${this.pendingActionKey === 'unstage-all' ? 'Working...' : 'Remove all from commit'}
926
+ </button>
927
+ ` : ''}
888
928
  <button class="${buttonClassNames({ variant: 'secondary', size: 'compact', action: true, surface: true })}" type="button" data-git-view-all>
889
929
  <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M2 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg>
890
- View Full Diff
930
+ View full diff
891
931
  </button>
892
932
  <button
893
933
  class="${buttonClassNames({ variant: 'primary', action: true, wide: true, extra: 'git-footer-commit-btn' })}"
@@ -895,7 +935,7 @@ export class GitPanelController {
895
935
  data-git-commit-staged
896
936
  ${includedFileCount === 0 || isCommitPending ? 'disabled' : ''}
897
937
  >
898
- ${isCommitPending ? 'Working...' : commitButtonLabel(includedFileCount)}
938
+ ${isCommitPending ? 'Working' : commitButtonLabel(includedFileCount)}
899
939
  </button>
900
940
  </div>
901
941
  </div>
@@ -903,14 +943,19 @@ export class GitPanelController {
903
943
  `;
904
944
  }
905
945
 
906
- renderEmpty(message) {
946
+ renderEmpty(message, { alert = false, status = false } = {}) {
907
947
  if (!this.panel) {
908
948
  return;
909
949
  }
910
950
 
951
+ const semantics = alert
952
+ ? ' role="alert"'
953
+ : status
954
+ ? ' role="status" aria-live="polite"'
955
+ : '';
911
956
  // pi-lens-ignore: ast-grep:no-inner-html-js
912
957
  this.panel.innerHTML = `
913
- <div class="git-panel-empty ui-empty-state ui-empty-state--compact">
958
+ <div class="git-panel-empty ui-empty-state ui-empty-state--compact"${semantics}>
914
959
  <p class="ui-empty-state-copy">${escapeHtml(message)}</p>
915
960
  </div>
916
961
  `;
@@ -921,8 +966,13 @@ export class GitPanelController {
921
966
  return;
922
967
  }
923
968
 
969
+ if (this.statusError) {
970
+ this.renderEmpty(this.statusError, { alert: true });
971
+ return;
972
+ }
973
+
924
974
  if (!this.status) {
925
- this.renderEmpty('Loading git status...');
975
+ this.renderEmpty('Loading git status', { status: true });
926
976
  return;
927
977
  }
928
978