collabmd 0.1.52 → 0.1.55
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.
- package/bin/collabmd.js +22 -40
- package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-cMeDxAEL.js +1 -0
- package/dist/client/assets/{abnfDiagram-VCTEODGH-DxNxad6-.js → abnfDiagram-VCTEODGH-D2UdmYvj.js} +1 -1
- package/dist/client/assets/{abnfDiagram-O67JEVCF-Dwt6a0Ds.js → abnfDiagram-YUKMZFIV-DbmU4Q-X.js} +1 -1
- package/dist/client/assets/api-client-utils-C5ESDKMG.js +1 -0
- package/dist/client/assets/architecture-7GRP2DOG-BBwRXFv3.js +1 -1
- package/dist/client/assets/architecture-WOLXFQ4H-C0NxYiG7.js +1 -0
- package/dist/client/assets/{architectureDiagram-NJMV4G6O-D5CGiX3G.js → architectureDiagram-47P4ROYG-C7OjXK9S.js} +3 -3
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-C1uvg5id.js → architectureDiagram-5GKGNRK7-CSiUzzeN.js} +1 -1
- package/dist/client/assets/base-CaIEJUF9.css +1 -0
- package/dist/client/assets/{blockDiagram-BEXU5L5S-BgTM0var.js → blockDiagram-E7TT5TSB-DMG-YlZw.js} +3 -3
- package/dist/client/assets/{blockDiagram-I7D4REHJ-B2YonsoG.js → blockDiagram-I7D4REHJ-sXfAgK2w.js} +1 -1
- package/dist/client/assets/{browser-BKLM0ThC-IxjwuOIz-C0mP17s1.js → browser-BKLM0ThC-BCLQGPD6-CcMAHZXi.js} +1 -1
- package/dist/client/assets/{c4Diagram-7LVT6UL2-r4IwomZm.js → c4Diagram-7LVT6UL2-C88V_K-8.js} +1 -1
- package/dist/client/assets/{c4Diagram-YGBWAQC7-_xZPrNkB.js → c4Diagram-CRA5TL53-D3F9ElJv.js} +2 -2
- package/dist/client/assets/canvasEditor-BJkwGzO1.css +1 -0
- package/dist/client/assets/canvasEditor-sBK7KfrD.js +1 -0
- package/dist/client/assets/{chunk-6AZGARVD--pTGpDnx.js → chunk-24IY7LWP-flnn6SWX.js} +1 -1
- package/dist/client/assets/chunk-2BW5OAIV-CNFO1U_e.js +10 -0
- package/dist/client/assets/{chunk-2E4U76K2-CIQUuV9n.js → chunk-2E4U76K2-DEnS5IbF.js} +1 -1
- package/dist/client/assets/{chunk-5V3GS4D5-B5uC2oxu.js → chunk-3M4EKCLJ-D-sZGCtO.js} +1 -1
- package/dist/client/assets/chunk-3YJQHVM4-Ctp__8EK.js +2 -0
- package/dist/client/assets/{chunk-7PRAP22T-9uTvtc_-.js → chunk-4EA7E6EY-bU4wRJot.js} +1 -1
- package/dist/client/assets/{chunk-4HAMMTFA-q0ldNVvr.js → chunk-4HAMMTFA-CQy6Skzw.js} +1 -1
- package/dist/client/assets/{chunk-6K3QC6MW-JnuvEGV4.js → chunk-4S7OKTRW-BpUW13a3.js} +1 -1
- package/dist/client/assets/{chunk-ICYGCRZG-odvlDZyA.js → chunk-53FOQ5SW-5lPdGYP4.js} +1 -1
- package/dist/client/assets/{chunk-75Z2AOVW-DitkSoSG.js → chunk-75Z2AOVW-BRdhvVTZ.js} +1 -1
- package/dist/client/assets/{chunk-GWA4HPMP-CGmv2yIq.js → chunk-7TKQ45FW-rA2u-WUl.js} +1 -1
- package/dist/client/assets/{chunk-GTNCS2PH-ChgkzEIi.js → chunk-AW2ZBBNX-DL0KGAdi.js} +3 -3
- package/dist/client/assets/{chunk-747NJXEK-BjqqAsS9.js → chunk-BP2KR52E-DAQ1pzDV.js} +1 -1
- package/dist/client/assets/{chunk-CLGD4ZFX-BfYJtJm1.js → chunk-CLGD4ZFX-DJiSE0gD.js} +1 -1
- package/dist/client/assets/{chunk-5DYCD2WN-BKWCKnK-.js → chunk-DBDB3WZW-CXleNlok.js} +1 -1
- package/dist/client/assets/{chunk-DU6HZSFF-CWlP1Dk_.js → chunk-DU6HZSFF-C-18UZkS.js} +1 -1
- package/dist/client/assets/{chunk-MBY4JIJT-DTJ4UcAm.js → chunk-E2ZNV5FY-D_07zfWd.js} +3 -3
- package/dist/client/assets/chunk-EU5HNXII-CETVNUXF.js +213 -0
- package/dist/client/assets/{chunk-F27PBJKO-DPcsPcEs.js → chunk-F27PBJKO-_beIJos4.js} +1 -1
- package/dist/client/assets/{chunk-2ZTRR5NV-DcPRfelM.js → chunk-F6S3BTY2-DVWKCAHp.js} +1 -1
- package/dist/client/assets/{chunk-RUX4WMZV-BGnd3s_C.js → chunk-FLFP27SU-CydzbSsY.js} +2 -2
- package/dist/client/assets/chunk-FVRAUYC3-C7b9SJ81.js +1 -0
- package/dist/client/assets/{chunk-GMAD6QVW-Bgk8qnty.js → chunk-GMAD6QVW-DnZH7DxV.js} +1 -1
- package/dist/client/assets/{chunk-GVQU2GXP-CQ8cl-Uu.js → chunk-GVQU2GXP-B0Vm415C.js} +1 -1
- package/dist/client/assets/chunk-H5A3YXKD-ChP7mNJq.js +41 -0
- package/dist/client/assets/{chunk-742MDFTN-D1nh6vNv.js → chunk-HJ2JQQFS-DQX7RePR.js} +1 -1
- package/dist/client/assets/{chunk-NETBCI7D-CmUwDWUZ.js → chunk-HTAEGDNF-C0PA_N-c.js} +1 -1
- package/dist/client/assets/{chunk-IMKFNOWR-CBqxfpcP.js → chunk-IMKFNOWR-DoO8IHzF.js} +1 -1
- package/dist/client/assets/{chunk-IH6LHLGP-BNevEHZK.js → chunk-KPI5JJXK-B2ld5-w4.js} +1 -1
- package/dist/client/assets/{chunk-WEXAMYUT-DDlVNp8J.js → chunk-KQW6MTUR-OQ4MyMr_.js} +1 -1
- package/dist/client/assets/{chunk-L3NEJ4N5-BflzkdTI.js → chunk-L3NEJ4N5-CvHossEU.js} +1 -1
- package/dist/client/assets/chunk-NGNAAXSQ-DqoPQk1a.js +136 -0
- package/dist/client/assets/{chunk-UA2S7LBM-DicYDjDM.js → chunk-NTY3LDVX-CVWLK_fh.js} +1 -1
- package/dist/client/assets/{chunk-UY3FDG6J-QT-rkt0y.js → chunk-OD3NTWWA-Dz9nCUGX.js} +1 -1
- package/dist/client/assets/{chunk-OSK3NFVY-DqeKV_pg.js → chunk-OSK3NFVY-C3JOcBao.js} +1 -1
- package/dist/client/assets/{chunk-P2QGCYS3-BA--DhpW.js → chunk-P2QGCYS3-Bfo8qS8r.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-V_NEc45n.js → chunk-POPQ4Y6H-sv6rCftH.js} +1 -1
- package/dist/client/assets/{chunk-PWAF6VOD-D_kLse-N.js → chunk-PWAF6VOD-B-AT-L2H.js} +1 -1
- package/dist/client/assets/{chunk-3Z5EZCMW-BAnA6eQ7.js → chunk-QNH66VMT-Cb9xxTwQ.js} +1 -1
- package/dist/client/assets/{chunk-SHT3W25Y-YM3S-A_M.js → chunk-SHT3W25Y-C1lu518T.js} +1 -1
- package/dist/client/assets/{chunk-GNY47TPC-CTrH5O5R.js → chunk-SVEVUXB4-BnM-LXop.js} +1 -1
- package/dist/client/assets/{chunk-SVP7TREG-DdNhDOmW.js → chunk-SVP7TREG-CKqt0syj.js} +1 -1
- package/dist/client/assets/{chunk-TICWLB2K-BGGgCr4x.js → chunk-TICWLB2K-D2ZnWAfF.js} +1 -1
- package/dist/client/assets/{chunk-TLUHSLCS-DCZhIDYA.js → chunk-TLUHSLCS-BMIhqv1X.js} +1 -1
- package/dist/client/assets/{chunk-6EIED4P4-DBVWq7Tz.js → chunk-TPMEZKFX-DIPHIqGb.js} +1 -1
- package/dist/client/assets/{chunk-6TQVIW2G-BSj0l_pu.js → chunk-VPELOWWC-DXayM28-.js} +1 -1
- package/dist/client/assets/chunk-VPRB5NB3-BqaJfj_v.js +127 -0
- package/dist/client/assets/{chunk-I5DQTOEV-aBZooNp1.js → chunk-VTWWFHGB-SZnJiyWY.js} +1 -1
- package/dist/client/assets/{chunk-KI3K4JFJ-FTtDwx3-.js → chunk-VZTHESGH-eHyXmK8W.js} +1 -1
- package/dist/client/assets/{chunk-7INBJB4K-CDmiHbaX.js → chunk-XC4XBNZT-D9oehSn8.js} +20 -20
- package/dist/client/assets/{chunk-XHIXRSVI-DN_fEwws.js → chunk-YK26KJH5-DVy3MGMd.js} +1 -1
- package/dist/client/assets/{chunk-6AEJRKK7-DTVZj5bY.js → chunk-Z6ETV63D-DOcrnz-P.js} +1 -1
- package/dist/client/assets/{chunk-OUJLGHUK-75UXlPjl.js → chunk-ZO67DCNQ-BAOMIkLF.js} +1 -1
- package/dist/client/assets/classDiagram-ZZMXUADV-BmETdFmC.js +1 -0
- package/dist/client/assets/{classDiagram-v2-NBCMYWYE-3TQORq33.js → classDiagram-v2-K4WV4PDN-eaadfJDB.js} +3 -3
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-BmETdFmC.js +1 -0
- package/dist/client/assets/{comment-markdown-renderer-Bxi_JRSR.js → comment-markdown-renderer-CpBKaj7H.js} +1 -1
- package/dist/client/assets/comment-thread-store-DUQsWtnu.js +1 -0
- package/dist/client/assets/comment-threads-DnfkLVJA.js +4 -0
- package/dist/client/assets/comment-ui-shared-D_pgPUti.js +7 -0
- package/dist/client/assets/cynefin-EF2NZ3EQ-DVkJeZ8i.js +1 -0
- package/dist/client/assets/cynefin-OW5HDTMX-CF3N9j1_.js +1 -1
- package/dist/client/assets/{cynefinDiagram-VND7K2PF-DwfMZ3vk.js → cynefinDiagram-3GCD6N5R-DjpAsBHC.js} +1 -1
- package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-DTnLZaO7.js → cynefinDiagram-5FMLGOSQ-D2rFQG67.js} +1 -1
- package/dist/client/assets/dagre-C-rnJpZF.js +1 -0
- package/dist/client/assets/{dagre-GXQ25YYZ-Vtyx08Qh.js → dagre-GXQ25YYZ-Cku9eia9.js} +2 -2
- package/dist/client/assets/{dagre-6A5THRUB-DewyAGK6.js → dagre-W4DXFKR2-DOMOIsPd.js} +2 -2
- package/dist/client/assets/deferred-collab-C9aa9cvT.css +1 -0
- package/dist/client/assets/deferred-git-BPQ-UgrN.css +1 -0
- package/dist/client/assets/deferred-preview-B-RebLry.css +1 -0
- package/dist/client/assets/{diagram-22UHCM2B-DbZirFfl.js → diagram-2UJZ2QOL-D8WvnEyx.js} +6 -6
- package/dist/client/assets/{diagram-3UASUU5V-DmhdYv6_.js → diagram-OVF4WLC6-D8_escYE.js} +2 -2
- package/dist/client/assets/{diagram-CDSNMT55-D_qyS11R.js → diagram-PFPMY2P6-B1izZfrN.js} +3 -3
- package/dist/client/assets/{diagram-S7CK7UJ4-CGTzfo2f.js → diagram-S7CK7UJ4-BzicH2t-.js} +1 -1
- package/dist/client/assets/{diagram-MLGK6HIB-DIBG6Ivu.js → diagram-UMYRVEAY-Djf7WDjZ.js} +1 -1
- package/dist/client/assets/{diagram-UQ7AKVKN-CWZS8QtB.js → diagram-UQ7AKVKN-DqX4zTtr.js} +1 -1
- package/dist/client/assets/{diagram-VSXAHHWV-DaO1nOZF.js → diagram-VSXAHHWV-DnVbfI4Y.js} +1 -1
- package/dist/client/assets/{diagram-VX7I27RA-B54P6Cyf.js → diagram-VX7I27RA-D-Dj0TQC.js} +1 -1
- package/dist/client/assets/{diagram-MPIPVDR6-D9XsALDV.js → diagram-YEKJPTXX-B40bP3Yr.js} +2 -2
- package/dist/client/assets/{diagram-Z3DM3KII-Cl2EXiXp.js → diagram-Z3DM3KII-_iT7Uz5p.js} +1 -1
- package/dist/client/assets/diagram-ZIFT7M5P-BUUK0oNw.js +3 -0
- package/dist/client/assets/{direct-engine-DdrQKpgq-4QysbH_V.js → direct-engine-DVLMOJWp-DWtWIifK.js} +1 -1
- package/dist/client/assets/dist-26Ce-5t4.js +1 -0
- package/dist/client/assets/dist-8MLNn-I6.js +1 -0
- package/dist/client/assets/dist-Amm5Pr1C.js +1 -0
- package/dist/client/assets/dist-BXXPaoUV.js +1 -0
- package/dist/client/assets/{dist-zHDLm1oE.js → dist-Bkb-_VdB.js} +1 -1
- package/dist/client/assets/dist-Bl4yuUS9.js +1 -0
- package/dist/client/assets/{dist-CKf7LlAo.js → dist-C2CGvCPd.js} +1 -1
- package/dist/client/assets/dist-C2niyEh0.js +1 -0
- package/dist/client/assets/{dist-Y6zYRI-A.js → dist-CFCSUmJk.js} +1 -1
- package/dist/client/assets/dist-CHUI56fT.js +6 -0
- package/dist/client/assets/dist-CJh3Qrid.js +13 -0
- package/dist/client/assets/{dist-Ch6Sr9KF.js → dist-CKxETpSC.js} +3 -3
- package/dist/client/assets/dist-CSHJthAI.js +2 -0
- package/dist/client/assets/dist-CbKnZGN4.js +1 -0
- package/dist/client/assets/{dist-BVCNc-Es.js → dist-Cik4RJXj.js} +1 -1
- package/dist/client/assets/{dist-DGa-2MNX.js → dist-CqkAY6Ot.js} +2 -2
- package/dist/client/assets/dist-D2ql2LCd.js +1 -0
- package/dist/client/assets/{dist-CvVoyTRF.js → dist-D47MOYFN.js} +1 -1
- package/dist/client/assets/dist-DBhUaexM.js +1 -0
- package/dist/client/assets/dist-DJux6Vc5.js +1 -0
- package/dist/client/assets/{dist-CXOUa90Q.js → dist-DLNdMWPH.js} +1 -1
- package/dist/client/assets/dist-DPJj-Y3l.js +1 -0
- package/dist/client/assets/{dist-DI6c02Da.js → dist-DRYFMufe.js} +6 -6
- package/dist/client/assets/{dist-CUsXdnU4.js → dist-DTGcVSU8.js} +1 -1
- package/dist/client/assets/dist-DlOxjzWi.js +9 -0
- package/dist/client/assets/{dist-BfpAc922.js → dist-DogjjM_B.js} +1 -1
- package/dist/client/assets/dist-Dyv_RvyB.js +23 -0
- package/dist/client/assets/dist-FUFeH5Cx.js +1 -0
- package/dist/client/assets/dist-It70ktCU.js +1 -0
- package/dist/client/assets/dist-QMvcnJHf.js +1 -0
- package/dist/client/assets/dist-QN1K2czv.js +11 -0
- package/dist/client/assets/dist-W8ilOKl3.js +1 -0
- package/dist/client/assets/dist-_17-t9qP.js +1 -0
- package/dist/client/assets/{dist-CsQTfQFi.js → dist-uE774WWs.js} +1 -1
- package/dist/client/assets/document-formatter-DtXmKZcy.js +1 -0
- package/dist/client/assets/drawioEditor-DO6IOaJ1.js +9 -0
- package/dist/client/assets/{ebnfDiagram-PWID7BFC-PfC84FyI.js → ebnfDiagram-PWID7BFC-IemGPf9X.js} +1 -1
- package/dist/client/assets/{ebnfDiagram-ZINNZB2B-DYvm_QtE.js → ebnfDiagram-VR2GEFS7-9fXqy1DI.js} +1 -1
- package/dist/client/assets/editor-session-CPsqXY_A.js +13 -0
- package/dist/client/assets/elk-IJKZMXRS-DsbrbBYg.js +27 -0
- package/dist/client/assets/embedded-editor-base-C44ZcCZv.css +1 -0
- package/dist/client/assets/{embedpdf-DyOonRvx.js → embedpdf-BfUI-3pv.js} +1 -1
- package/dist/client/assets/{embedpdf-DA4bA119-DsoNiPlQ.js → embedpdf-cl9qiF45-CLMxJTMP.js} +3 -3
- package/dist/client/assets/en-7ZVUCEYH-C_VXKxxb.js +1 -0
- package/dist/client/assets/{erDiagram-OPXOYQCR-o8GRv8A_.js → erDiagram-O2IAPWRE-Cdadm-HN.js} +2 -2
- package/dist/client/assets/{erDiagram-RLTQ6QDP-C9cJl5NB.js → erDiagram-RLTQ6QDP-CGGmjm8t.js} +1 -1
- package/dist/client/assets/{estree-DCT3Jm65.js → estree-DGmLqopC.js} +17 -17
- package/dist/client/assets/eventmodeling-K75KTNOO-BWBlZ5cR.js +1 -0
- package/dist/client/assets/eventmodeling-NTZA5JFV-CDy1bN6j.js +1 -1
- package/dist/client/assets/excalidraw-element-link-NQnskRkm.js +1 -0
- package/dist/client/assets/excalidraw-scene-DLlw4jyc.js +1 -0
- package/dist/client/assets/excalidrawEditor-DiKOIudt.css +1 -0
- package/dist/client/assets/excalidrawEditor-W2lZ5Mej.js +9 -0
- package/dist/client/assets/export-page-Bomh9oEr.js +46 -0
- package/dist/client/assets/exportDocument-BFIOECJ3.js +2 -0
- package/dist/client/assets/exportDocument-D0mONgQ4.css +1 -0
- package/dist/client/assets/file-kind-BGxTVHan.js +1 -0
- package/dist/client/assets/{file-search-3hYF4cYa.js → file-search-Dk2O14Vw.js} +1 -1
- package/dist/client/assets/flowDiagram-HODETNUW-DcVVYJUZ.js +1 -0
- package/dist/client/assets/flowDiagram-OXPTDLAJ-Dy6y46oF.js +1 -0
- package/dist/client/assets/{ganttDiagram-EL5Y4UJY-x40PW0Ah.js → ganttDiagram-EL5Y4UJY-Duu4KnsU.js} +1 -1
- package/dist/client/assets/ganttDiagram-R7TSEDQI-BWy52pjn.js +292 -0
- package/dist/client/assets/gitGraph-4MIJSDKK-B-rpDYbz.js +1 -1
- package/dist/client/assets/gitGraph-VSP46ZUC-1499lQAI.js +1 -0
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-ahsNaZsp.js → gitGraphDiagram-WWUBYQGX-CaJ0vC1a.js} +1 -1
- package/dist/client/assets/gitGraphDiagram-XJZIOB7I-DJwp9ilx.js +106 -0
- package/dist/client/assets/graphlib-DS17s2tU.js +1 -0
- package/dist/client/assets/{html-CBXMuS97.js → html-BryNQ_yx.js} +6 -6
- package/dist/client/assets/image-6XY3GD3F-DCWbu6d4.js +1 -0
- package/dist/client/assets/image-lightbox-controller-DAcXEXxT.js +184 -0
- package/dist/client/assets/index-CglpXOg7.css +1 -0
- package/dist/client/assets/index-D3WGkxfI.js +960 -0
- package/dist/client/assets/info-A6RAGUB7-BlutK7BT.js +1 -1
- package/dist/client/assets/info-OHQRW6UA-BDFQOo4H.js +1 -0
- package/dist/client/assets/{infoDiagram-27XIBGKW-MrZyptIy.js → infoDiagram-27XIBGKW-DBJh7QOu.js} +1 -1
- package/dist/client/assets/{infoDiagram-VRGFBTTK-KkUjDRAQ.js → infoDiagram-5W2HQ5XZ-DmWsqJ0w.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-Bnt9yM0O.js → ishikawaDiagram-5VMMS53U-CeEbSJem.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-OU5B5YK6-Di9BcpOY.js → ishikawaDiagram-K3B6WC7H-DH1NI35G.js} +2 -2
- package/dist/client/assets/{journeyDiagram-3NMN7TZE-Bl0abK1r.js → journeyDiagram-3NMN7TZE-BoIEEr6U.js} +1 -1
- package/dist/client/assets/{journeyDiagram-ZHPQQLJL-J-sGrs9e.js → journeyDiagram-COXZFDF6-CnHV2f9V.js} +3 -3
- package/dist/client/assets/{kanban-definition-PNTS6WVX-5ZDV_yIa.js → kanban-definition-P3RFRI5V-Cxvn5ZAG.js} +4 -4
- package/dist/client/assets/{kanban-definition-UXKFOSKX-DMgUfNt0.js → kanban-definition-UXKFOSKX-BY16Tgbr.js} +1 -1
- package/dist/client/assets/keyboard-shortcuts-BWNCBJqw.js +1 -0
- package/dist/client/assets/lobby-presence-DNNXcuwR.js +1 -0
- package/dist/client/assets/{markdown-Bo71X2X2.js → markdown-DU84620G.js} +17 -17
- package/dist/client/assets/markdown-headings-zYEUahfW.js +41 -0
- package/dist/client/assets/{markdown-math-CyyBVuDO.js → markdown-math-B96cnrz1.js} +11 -11
- package/dist/client/assets/{mermaid-parser.core-Bpogunsh.js → mermaid-parser.core-R-uwU5kf.js} +3 -3
- package/dist/client/assets/{mermaid-parser.core-DBy--Jc0.js → mermaid-parser.core-mE6t1qEO.js} +1 -1
- package/dist/client/assets/mermaid.core-D8Z6LN7O.js +10 -0
- package/dist/client/assets/{mindmap-definition-NLK3R4M7-ByVb-0vj.js → mindmap-definition-LZFPQGKD-DVfFenfJ.js} +3 -3
- package/dist/client/assets/{mindmap-definition-YA3MSWOX-DBZN5_GH.js → mindmap-definition-YA3MSWOX-DtiE80UJ.js} +1 -1
- package/dist/client/assets/packet-AYTQ26CC-DvbY8dI6.js +1 -1
- package/dist/client/assets/packet-JDAUHWVQ-DJ9K2MA4.js +1 -0
- package/dist/client/assets/{pdfium-RAgkpwfK.wasm → pdfium-BJ2Yip8Q.wasm} +0 -0
- package/dist/client/assets/{pegDiagram-GJSIUBJH-aost1sSO.js → pegDiagram-BGZESJAR-DxfvEcwv.js} +1 -1
- package/dist/client/assets/{pegDiagram-XKGWAZYB-DRo8CZu3.js → pegDiagram-XKGWAZYB-CyozY-Kt.js} +1 -1
- package/dist/client/assets/pie-WAS4IAKB-DWSm9SSD.js +1 -1
- package/dist/client/assets/pie-XZMESJXO-CQIQasY-.js +1 -0
- package/dist/client/assets/{pieDiagram-5QR66LMP-BICdpEuz.js → pieDiagram-CAPJLFHJ-CRlMcrv3.js} +2 -2
- package/dist/client/assets/{pieDiagram-E7YTZNPT-CZThaHsc.js → pieDiagram-E7YTZNPT-BRdmTkDq.js} +1 -1
- package/dist/client/assets/preload-helper-CYtfOYgs.js +1 -0
- package/dist/client/assets/preview-render-compiler-D_aJv7Ew.js +3 -0
- package/dist/client/assets/{preview-render-worker-BI2bFVqM.js → preview-render-worker-dFNyrVyB.js} +47 -43
- package/dist/client/assets/prod-ItolaHmf.js +145 -0
- package/dist/client/assets/prod-rdly4JJQ.js +1 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-C5iowkl_.js → quadrantDiagram-AXDQQJYC-7QyPIXkF.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-O4NWA36T-Bgx5bF97.js → quadrantDiagram-GDMTTRAM-DE30uqTl.js} +3 -3
- package/dist/client/assets/quick-switcher-controller-DsK70I7K.js +1 -0
- package/dist/client/assets/radar-ABXABTNO-ByfpCXh9.js +1 -0
- package/dist/client/assets/radar-RG4KPBEZ-BfNQUEQy.js +1 -1
- package/dist/client/assets/railroad-74A4TZTK-BaQ6U6eJ.js +1 -1
- package/dist/client/assets/railroad-I3PHUGI6-CTUn9HhI.js +1 -0
- package/dist/client/assets/railroad-abnf-HS5TGJTU-BJ3KZw7J.js +1 -1
- package/dist/client/assets/railroad-abnf-LNEFI6M7-Ct-b-y0F.js +1 -0
- package/dist/client/assets/railroad-ebnf-DWYD2UWJ-BZMYMWOe.js +1 -0
- package/dist/client/assets/railroad-ebnf-LZEXJU2U-DA0sEq7w.js +1 -1
- package/dist/client/assets/railroad-peg-JR7BVNR7-Dj23PxYc.js +1 -0
- package/dist/client/assets/railroad-peg-WCYAUIDC-DCmlICzO.js +1 -1
- package/dist/client/assets/{railroadDiagram-O6MQD6OU-BTt_rKjT.js → railroadDiagram-O6MQD6OU-BPk3RS2D.js} +1 -1
- package/dist/client/assets/{railroadDiagram-XR7U4H2S-DbVoNgSz.js → railroadDiagram-SM67HX2B-CZRXJ647.js} +1 -1
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-BkvazG7r.js → requirementDiagram-BXWQKSXE-BRwfym6z.js} +1 -1
- package/dist/client/assets/{requirementDiagram-PLB6GJNP-BT0j9C40.js → requirementDiagram-X7JNWC4A-BofCuLJA.js} +4 -4
- package/dist/client/assets/runtime-config-CvrkHb0n.js +1 -0
- package/dist/client/assets/runtime-paths-qQGhzNx4.js +1 -0
- package/dist/client/assets/{sankeyDiagram-P5KCCOFB-C_IemB9h.js → sankeyDiagram-P5KCCOFB-D4LcrKpW.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-IPEJSGJF-X1BCUIrf.js → sankeyDiagram-UM26HJRW-CLKMDbej.js} +3 -3
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-CxFBgLGd.js → sequenceDiagram-WJ2MYXX4-DQjtv-Bs.js} +1 -1
- package/dist/client/assets/sequenceDiagram-ZO4K6R2Y-CDP_m6ma.js +169 -0
- package/dist/client/assets/sizeCapture-INFHLROL-3uHXrFqA.js +1 -0
- package/dist/client/assets/sizeCapture-INFHLROL-BMR1ovSU.js +1 -0
- package/dist/client/assets/src-D5mvpivG.js +2 -0
- package/dist/client/assets/{standalone-6z5x8CWe.js → standalone-D_lg5NC9.js} +1 -1
- package/dist/client/assets/{stateDiagram-D77RDMKH-BaSQ6Owj.js → stateDiagram-D77RDMKH-DSMvV-kF.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-ClmOOUsT.js +1 -0
- package/dist/client/assets/{stateDiagram-v2-GCMORJYK-CsVcfwVp.js → stateDiagram-v2-TBUQTH76-Dc5-FKzd.js} +2 -2
- package/dist/client/assets/{swimlanes-42K2YHIH-CALFEmiS.js → swimlanes-42K2YHIH-BUz31lO3.js} +1 -1
- package/dist/client/assets/{swimlanes-2SLR337P-CnYTVqRX.js → swimlanes-N4OXWK64-Dd3dFdPD.js} +1 -1
- package/dist/client/assets/swimlanesDiagram-K3J5GTZL-Bz9gFdls.js +8 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DoDs3zod.js +8 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-zse-5Dbm.js → timeline-definition-24CTP7MA-BvqCvSjy.js} +1 -1
- package/dist/client/assets/{timeline-definition-EJHVYXUP-BhqPlKkN.js → timeline-definition-YOQAKGHF-D2XWPSLs.js} +3 -3
- package/dist/client/assets/treeView-D4JQ5SDB-DcX7Bx0H.js +1 -0
- package/dist/client/assets/treeView-Q6P3EWNA-BvHOzbu9.js +1 -1
- package/dist/client/assets/treemap-SAJKECNS-BcCHmcAX.js +1 -0
- package/dist/client/assets/treemap-WGGIJYW6-oety7paS.js +1 -1
- package/dist/client/assets/usecaseDiagram-VIAY4XPW-CDe-IMjS.js +328 -0
- package/dist/client/assets/vault-api-client-DrRW0QwO.js +7 -0
- package/dist/client/assets/{vennDiagram-4TSXK5OY-DgHr6cJD.js → vennDiagram-4TSXK5OY-BW6Qp12d.js} +1 -1
- package/dist/client/assets/{vennDiagram-UO4OBE2U-BRwLn2Q1.js → vennDiagram-BLWOH2XV-KxIPKpHi.js} +3 -3
- package/dist/client/assets/wardley-7MLQ67FV-DOahSwbZ.js +1 -0
- package/dist/client/assets/wardley-WFR3VGLG-BdwDpX_I.js +1 -1
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-9A60XZis.js → wardleyDiagram-VM6X3IG4-BoCETVsK.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-VNRHLVJA-B_tMcVFG.js → wardleyDiagram-YMQ3BMBF-BNYqEy7M.js} +4 -4
- package/dist/client/assets/{wiki-link-resolver-Dch88erO.js → wiki-link-resolver-BCdGUpdu.js} +1 -1
- package/dist/client/assets/{worker-engine-m0rlHn8R-5h66k403.js → worker-engine-BCCrxWYm-1fphds7O.js} +1 -1
- package/dist/client/assets/workspace-sync-client-C_P9wtjf.js +1 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-D00iy-wB.js → xychartDiagram-S5SC5T6Z-eB5Fu9P7.js} +1 -1
- package/dist/client/assets/xychartDiagram-TAQBALBS-Sv6aaptV.js +7 -0
- package/dist/client/assets/yjs-Jd9fna_Y.js +4 -0
- package/dist/client/assets/yjs-provider-reset-guard-Cqu0Z6xH.js +1 -0
- package/dist/client/canvas-editor.html +16 -0
- package/dist/client/drawio-editor.html +9 -8
- package/dist/client/excalidraw-editor.html +33 -32
- package/dist/client/export-document.html +4 -3
- package/dist/client/index.html +13 -2
- package/package.json +31 -33
- package/scripts/local-compose.mjs +101 -0
- package/src/client/app/canvas-editor.html +13 -0
- package/src/client/app/index.html +11 -0
- package/src/client/app/main-entry.js +30 -4
- package/src/client/application/app-shell/git-feature.js +3 -2
- package/src/client/application/app-shell/ui-feature-identity.js +1 -0
- package/src/client/application/app-shell/ui-feature-shell.js +2 -0
- package/src/client/application/app-shell/ui-feature-tab-activity.js +4 -0
- package/src/client/application/app-shell/workspace-feature.js +8 -34
- package/src/client/application/diagram-chrome.js +8 -11
- package/src/client/application/diagram-preview-hydrator.js +5 -5
- package/src/client/application/mermaid-preview-hydrator.js +3 -2
- package/src/client/application/plantuml-preview-hydrator.js +6 -0
- package/src/client/application/preview-render-compiler.js +34 -98
- package/src/client/application/preview-render-executor.js +3 -0
- package/src/client/application/preview-render-worker.js +2 -0
- package/src/client/application/preview-renderer.js +9 -5
- package/src/client/application/workspace-coordinator.js +18 -10
- package/src/client/application/workspace-preview-controller.js +105 -158
- package/src/client/application/workspace-route-controller.js +29 -54
- package/src/client/bootstrap/canvas-markdown-preview.js +87 -0
- package/src/client/bootstrap/collabmd-app-shell.js +31 -14
- package/src/client/browser-utils.js +21 -0
- package/src/client/canvas-editor.js +143 -0
- package/src/client/domain/canvas-view.js +50 -0
- package/src/client/domain/excalidraw-scene.js +4 -49
- package/src/client/domain/file-search.js +1 -1
- package/src/client/domain/highlight-runtime.js +0 -4
- package/src/client/domain/markdown-formatting.js +12 -94
- package/src/client/domain/markdown-headings.js +98 -0
- package/src/client/domain/runtime-paths.js +4 -0
- package/src/client/domain/wiki-link-completions.js +42 -10
- package/src/client/infrastructure/browser-preferences-port.js +27 -33
- package/src/client/infrastructure/canvas-room-client.js +210 -0
- package/src/client/infrastructure/canvas-text-editor.js +36 -0
- package/src/client/infrastructure/comment-thread-store.js +19 -77
- package/src/client/infrastructure/editor-view-adapter.js +0 -30
- package/src/client/infrastructure/excalidraw-room-client.js +22 -10
- package/src/client/infrastructure/hosted-api-client.js +4 -2
- package/src/client/infrastructure/runtime-config.js +14 -0
- package/src/client/infrastructure/vault-api-client.js +4 -4
- package/src/client/presentation/canvas-editor-view.js +1028 -0
- package/src/client/presentation/canvas-embed-controller.js +116 -0
- package/src/client/presentation/canvas-picker.js +111 -0
- package/src/client/presentation/drawio-embed-controller.js +4 -4
- package/src/client/presentation/excalidraw-embed-controller.js +13 -4
- package/src/client/presentation/file-action-controller.js +58 -1
- package/src/client/presentation/file-explorer-controller.js +1 -2
- package/src/client/presentation/file-explorer-view.js +31 -7
- package/src/client/presentation/file-icon-svg.js +1 -1
- package/src/client/presentation/file-tree-state.js +4 -1
- package/src/client/presentation/image-lightbox-controller.js +1 -5
- package/src/client/presentation/team-settings-controller.js +44 -10
- package/src/client/presentation/vault-dashboard.js +63 -0
- package/src/client/styles/components/actions.css +4 -16
- package/src/client/styles/components/surfaces.css +0 -7
- package/src/client/styles/features/comment-card.css +1 -2
- package/src/client/styles/features/comment-markdown.css +0 -18
- package/src/client/styles/features/diagram-preview.css +0 -18
- package/src/client/styles/features/git-branch.css +0 -4
- package/src/client/styles/foundation/themes.css +6 -0
- package/src/client/styles/foundation/utilities.css +3 -2
- package/src/client/styles/layout/editor-page.css +0 -13
- package/src/client/styles/layout/overlays.css +5 -0
- package/src/client/styles/layout/responsive.css +2 -7
- package/src/client/styles/layout/shell.css +165 -1
- package/src/client/styles/layout/view-modes.css +1 -0
- package/src/client/styles/surfaces/canvas-editor.css +239 -0
- package/src/domain/canvas-room-codec.js +359 -0
- package/src/domain/collabmd-content-capabilities.js +10 -1
- package/src/domain/comment-threads.js +49 -5
- package/src/domain/excalidraw-room-codec.js +23 -73
- package/src/domain/excalidraw-scene.js +48 -0
- package/src/domain/file-kind.js +13 -1
- package/src/server/application/workspace-reconciliation.js +0 -14
- package/src/server/config/env.js +39 -6
- package/src/server/domain/backlink-index.js +1 -36
- package/src/server/domain/bases/base-index-snapshot-store.js +41 -24
- package/src/server/domain/bases/base-query-service.js +1 -47
- package/src/server/domain/collaboration/collaboration-room.js +149 -15
- package/src/server/domain/collaboration/room-registry.js +7 -7
- package/src/server/domain/hosted-workspace.js +29 -2
- package/src/server/domain/plantuml-encoder.js +7 -43
- package/src/server/infrastructure/git/diff-service.js +1 -5
- package/src/server/infrastructure/git/history-service.js +18 -2
- package/src/server/infrastructure/git/untracked-files.js +1 -1
- package/src/server/infrastructure/http/create-git-api-command-handler.js +60 -149
- package/src/server/infrastructure/http/create-hosted-api-handler.js +5 -2
- package/src/server/infrastructure/http/create-static-handler.js +3 -1
- package/src/server/infrastructure/http/create-vault-api-query-handler.js +3 -3
- package/src/server/infrastructure/http/http-response.js +2 -36
- package/src/server/infrastructure/http/request-body.js +14 -49
- package/src/server/infrastructure/persistence/hosted-metadata-store.js +12 -3
- package/src/server/infrastructure/persistence/path-utils.js +8 -2
- package/src/server/infrastructure/persistence/vault-file-store.js +26 -60
- package/src/server/{infrastructure/git → shared}/image-mime.js +2 -2
- package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-BEz2BKN1.js +0 -1
- package/dist/client/assets/_basePickBy-QJXUw_pr.js +0 -1
- package/dist/client/assets/_baseUniq-DR4vVjyC.js +0 -1
- package/dist/client/assets/architecture-7GRP2DOG-DJVtYNt-.js +0 -1
- package/dist/client/assets/browser-utils-vlHL9goC.js +0 -1
- package/dist/client/assets/chunk-3FUC2YCW-8tZlhTGX.js +0 -1
- package/dist/client/assets/chunk-4SOEAONT-C3fufoVl.js +0 -40
- package/dist/client/assets/chunk-7M6MHVWA-BDakkknV.js +0 -213
- package/dist/client/assets/chunk-FOHPRMQF-Dmmo5Kak.js +0 -161
- package/dist/client/assets/chunk-O7XYJQB3-D0_ZY2za.js +0 -126
- package/dist/client/assets/chunk-Z7XXMR3K-P4Vaq8hD.js +0 -10
- package/dist/client/assets/chunk-ZIGJFQKS-b8OUHKK5.js +0 -2
- package/dist/client/assets/classDiagram-ZZMXUADV-QLbh_Nkf.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-QLbh_Nkf.js +0 -1
- package/dist/client/assets/comment-thread-store-CHvy8GF8.js +0 -1
- package/dist/client/assets/comment-threads-nJhK1yfc.js +0 -4
- package/dist/client/assets/cynefin-OW5HDTMX-e-Quc9Yl.js +0 -1
- package/dist/client/assets/dagre-D7FiCLLP.js +0 -1
- package/dist/client/assets/deferred-collab-D4cxEdad.css +0 -1
- package/dist/client/assets/deferred-git-BHKtkFYi.css +0 -1
- package/dist/client/assets/deferred-preview-BAXYgf4T.css +0 -1
- package/dist/client/assets/diagram-ATOU4E4O-B5uX-jVO.js +0 -3
- package/dist/client/assets/dist-B7fBbwrO.js +0 -1
- package/dist/client/assets/dist-BYBF4LtZ.js +0 -1
- package/dist/client/assets/dist-B_1hMrc6.js +0 -1
- package/dist/client/assets/dist-BnVaoRgZ.js +0 -1
- package/dist/client/assets/dist-Bog8M5U3.js +0 -13
- package/dist/client/assets/dist-CAG5sIOj.js +0 -1
- package/dist/client/assets/dist-CYMCikZo.js +0 -1
- package/dist/client/assets/dist-CYfPeupF.js +0 -1
- package/dist/client/assets/dist-Ck-B8onw.js +0 -2
- package/dist/client/assets/dist-CrkYYcOU.js +0 -1
- package/dist/client/assets/dist-Cu5Ze2cs.js +0 -6
- package/dist/client/assets/dist-D4kDR0g8.js +0 -1
- package/dist/client/assets/dist-D8LnhZzy.js +0 -1
- package/dist/client/assets/dist-DNONgI1P.js +0 -11
- package/dist/client/assets/dist-DVBYH83t.js +0 -1
- package/dist/client/assets/dist-DX6qtdxv.js +0 -1
- package/dist/client/assets/dist-Da-jLrCf.js +0 -1
- package/dist/client/assets/dist-DofvCYzJ.js +0 -1
- package/dist/client/assets/dist-Dx37MHWs.js +0 -1
- package/dist/client/assets/dist-GTGhtpyW.js +0 -9
- package/dist/client/assets/dist-W0FoeIxk.js +0 -23
- package/dist/client/assets/dist-jVKfryIL.js +0 -1
- package/dist/client/assets/document-formatter-gO8qM2qY.js +0 -1
- package/dist/client/assets/drawioEditor-DCkWweiy.js +0 -9
- package/dist/client/assets/editor-session-DxRyr4EM.js +0 -14
- package/dist/client/assets/elk-276RUBZZ-B8LB3Pac.js +0 -27
- package/dist/client/assets/embedded-editor-base-elU0Avik.css +0 -1
- package/dist/client/assets/en-GNC3RJIS-CEy_oGTd.js +0 -1
- package/dist/client/assets/eventmodeling-NTZA5JFV-Dxtv5D-P.js +0 -1
- package/dist/client/assets/excalidraw-element-link-CGZ5934B.js +0 -7
- package/dist/client/assets/excalidraw-scene-6uROebca.js +0 -1
- package/dist/client/assets/excalidrawEditor-BCTFp_CV.css +0 -1
- package/dist/client/assets/excalidrawEditor-BVfSxjSO.js +0 -9
- package/dist/client/assets/export-page-BCo_e15t.js +0 -46
- package/dist/client/assets/exportDocument-Ba-n1X4U.css +0 -1
- package/dist/client/assets/exportDocument-DP6oE_or.js +0 -2
- package/dist/client/assets/file-kind-BwMIcZbi.js +0 -1
- package/dist/client/assets/flowDiagram-HODETNUW-Bq4470NR.js +0 -1
- package/dist/client/assets/flowDiagram-KWPJA3E3-DQG9qGiU.js +0 -1
- package/dist/client/assets/ganttDiagram-FUAMR5RP-BQpsI7gQ.js +0 -292
- package/dist/client/assets/gitGraph-4MIJSDKK-ZaBIE4Lb.js +0 -1
- package/dist/client/assets/gitGraphDiagram-X574FWY7-wbs_2m9f.js +0 -106
- package/dist/client/assets/graphlib-C9Tl7QrK.js +0 -1
- package/dist/client/assets/image-EJJKRVD3-BQfi5nWJ.js +0 -1
- package/dist/client/assets/index-BxAuGDoN.css +0 -1
- package/dist/client/assets/index-uw9O0z1c.js +0 -1112
- package/dist/client/assets/info-A6RAGUB7-BcGxhjED.js +0 -1
- package/dist/client/assets/lobby-presence-Cz5jGOPg.js +0 -1
- package/dist/client/assets/mermaid.core-BeOUPE3Q.js +0 -10
- package/dist/client/assets/packet-AYTQ26CC-CqpSjTWl.js +0 -1
- package/dist/client/assets/pie-WAS4IAKB-Bg2eCNl5.js +0 -1
- package/dist/client/assets/preload-helper-BAlEavIC.js +0 -1
- package/dist/client/assets/preview-render-compiler-ktU0SXxY.js +0 -43
- package/dist/client/assets/prod-DU-0VfI7.js +0 -145
- package/dist/client/assets/prod-cXUNdmYV.js +0 -1
- package/dist/client/assets/quick-switcher-controller-DSlOwOsU.js +0 -1
- package/dist/client/assets/radar-RG4KPBEZ-DxExotg6.js +0 -1
- package/dist/client/assets/railroad-74A4TZTK-FfHmeIQk.js +0 -1
- package/dist/client/assets/railroad-abnf-HS5TGJTU-CLkdDRsJ.js +0 -1
- package/dist/client/assets/railroad-ebnf-LZEXJU2U-B162zvcG.js +0 -1
- package/dist/client/assets/railroad-peg-WCYAUIDC-CGs5GeJ5.js +0 -1
- package/dist/client/assets/runtime-config-BFVdhnJu.js +0 -1
- package/dist/client/assets/runtime-paths-Cn0snt_9.js +0 -1
- package/dist/client/assets/sequenceDiagram-PO4LG4MO-B-2QfXhV.js +0 -169
- package/dist/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +0 -1
- package/dist/client/assets/sizeCapture-INFHLROL-DrzwYt5z.js +0 -1
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CLlwrdvU.js +0 -1
- package/dist/client/assets/swimlanesDiagram-TC7HE7FX-Bh4tmz27.js +0 -8
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-xhehUG9e.js +0 -8
- package/dist/client/assets/treeView-Q6P3EWNA-Cccy0ngL.js +0 -1
- package/dist/client/assets/treemap-WGGIJYW6-sMRCjCtX.js +0 -1
- package/dist/client/assets/usecaseDiagram-POWQR4AR-DR2LHQYs.js +0 -328
- package/dist/client/assets/vault-api-client-BQxLVPeF.js +0 -7
- package/dist/client/assets/wardley-WFR3VGLG-Y7xty_3m.js +0 -1
- package/dist/client/assets/workspace-sync-client-C2pdaQUN.js +0 -1
- package/dist/client/assets/xychartDiagram-PMCCYNJV-fRpZ1MA5.js +0 -7
- package/dist/client/assets/yjs-B41tM6Sz.js +0 -4
- package/dist/client/assets/yjs-provider-reset-guard-DpntzUDR.js +0 -1
- package/scripts/local-plantuml-compose.mjs +0 -92
- package/scripts/local-structurizr-compose.mjs +0 -101
|
@@ -56,32 +56,6 @@ function sortRows(rows, sortChain = []) {
|
|
|
56
56
|
});
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
function compareRowsBySortChain(left, right, sortChain = []) {
|
|
60
|
-
for (const sortConfig of sortChain) {
|
|
61
|
-
const delta = compareValues(left.rawCells[sortConfig.property], right.rawCells[sortConfig.property]);
|
|
62
|
-
if (delta !== 0) {
|
|
63
|
-
return sortConfig.direction === 'desc' ? -delta : delta;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
return String(left.file.path ?? '').localeCompare(String(right.file.path ?? ''));
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function insertSortedBounded(rows, row, {
|
|
71
|
-
limit,
|
|
72
|
-
sortChain = [],
|
|
73
|
-
}) {
|
|
74
|
-
let insertIndex = rows.findIndex((existingRow) => compareRowsBySortChain(row, existingRow, sortChain) < 0);
|
|
75
|
-
if (insertIndex === -1) {
|
|
76
|
-
insertIndex = rows.length;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
rows.splice(insertIndex, 0, row);
|
|
80
|
-
if (rows.length > limit) {
|
|
81
|
-
rows.pop();
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
59
|
function pruneFilterNodeForProperty(filterNode, propertyId = '') {
|
|
86
60
|
if (!propertyId || !filterNode) {
|
|
87
61
|
return filterNode;
|
|
@@ -225,21 +199,12 @@ export class BaseQueryService {
|
|
|
225
199
|
columns = [],
|
|
226
200
|
definition,
|
|
227
201
|
evaluatedPropertyIds,
|
|
228
|
-
limit = null,
|
|
229
|
-
maxRows = this.maxResultRows,
|
|
230
202
|
snapshot,
|
|
231
|
-
sortChain = [],
|
|
232
203
|
search = '',
|
|
233
204
|
thisFile,
|
|
234
205
|
}) {
|
|
206
|
+
// ponytail: retain matching rows for one native sort; use bounded selection if heap profiles require it.
|
|
235
207
|
const rows = [];
|
|
236
|
-
const effectiveMaxRows = Number.isInteger(maxRows) && maxRows > 0 ? maxRows : Infinity;
|
|
237
|
-
const effectiveLimit = Number.isInteger(limit) && limit > 0 ? limit : Infinity;
|
|
238
|
-
const canBoundDuringCollection = Number.isFinite(Math.min(effectiveLimit, effectiveMaxRows))
|
|
239
|
-
&& sortChain.length > 0
|
|
240
|
-
&& !activeView.groupBy?.property
|
|
241
|
-
&& (activeView.summaries?.length ?? 0) === 0;
|
|
242
|
-
const hardLimit = Math.min(effectiveLimit, effectiveMaxRows);
|
|
243
208
|
|
|
244
209
|
const filePaths = snapshot.filePaths ?? [];
|
|
245
210
|
for (let chunkStart = 0; chunkStart < filePaths.length; chunkStart += BASE_QUERY_ROW_CHUNK_SIZE) {
|
|
@@ -275,14 +240,6 @@ export class BaseQueryService {
|
|
|
275
240
|
continue;
|
|
276
241
|
}
|
|
277
242
|
|
|
278
|
-
if (canBoundDuringCollection) {
|
|
279
|
-
insertSortedBounded(rows, candidateRow, {
|
|
280
|
-
limit: hardLimit,
|
|
281
|
-
sortChain,
|
|
282
|
-
});
|
|
283
|
-
continue;
|
|
284
|
-
}
|
|
285
|
-
|
|
286
243
|
rows.push(candidateRow);
|
|
287
244
|
}
|
|
288
245
|
|
|
@@ -390,10 +347,7 @@ export class BaseQueryService {
|
|
|
390
347
|
let rows = await this.collectCandidateRows({
|
|
391
348
|
...context,
|
|
392
349
|
astCache,
|
|
393
|
-
limit: requestedLimit,
|
|
394
|
-
maxRows: this.maxResultRows,
|
|
395
350
|
search,
|
|
396
|
-
sortChain,
|
|
397
351
|
});
|
|
398
352
|
rows = sortRows(rows, sortChain);
|
|
399
353
|
|
|
@@ -14,7 +14,21 @@ import {
|
|
|
14
14
|
import { CollaborationDocumentStore } from './collaboration-document-store.js';
|
|
15
15
|
import { logPerfEvent } from '../../config/perf-logging.js';
|
|
16
16
|
import { populateCommentThreads, serializeCommentThreads } from '../../../domain/comment-threads.js';
|
|
17
|
-
import { getVaultFileKind } from '../../../domain/file-kind.js';
|
|
17
|
+
import { getVaultFileKind, isCanvasFilePath } from '../../../domain/file-kind.js';
|
|
18
|
+
import {
|
|
19
|
+
buildCanvasRoomDocument,
|
|
20
|
+
CANVAS_EDGES_KEY,
|
|
21
|
+
CANVAS_EDGE_ORDER_KEY,
|
|
22
|
+
CANVAS_META_KEY,
|
|
23
|
+
CANVAS_NODES_KEY,
|
|
24
|
+
CANVAS_NODE_ORDER_KEY,
|
|
25
|
+
isCanvasRoomDocStructured,
|
|
26
|
+
mergeCanvasDocuments,
|
|
27
|
+
parseCanvasJson,
|
|
28
|
+
replaceCanvasRoomDocument,
|
|
29
|
+
serializeCanvasDocument,
|
|
30
|
+
serializeCanvasRoomDocument,
|
|
31
|
+
} from '../../../domain/canvas-room-codec.js';
|
|
18
32
|
import {
|
|
19
33
|
applySceneDiffToExcalidrawRoom,
|
|
20
34
|
EXCALIDRAW_APP_STATE_KEY,
|
|
@@ -292,7 +306,28 @@ export class CollaborationRoom {
|
|
|
292
306
|
if (snapshot) {
|
|
293
307
|
snapshotExists = true;
|
|
294
308
|
try {
|
|
295
|
-
if (
|
|
309
|
+
if (isCanvasFilePath(this.name)) {
|
|
310
|
+
const validationDoc = new Y.Doc({ gc: true });
|
|
311
|
+
try {
|
|
312
|
+
Y.applyUpdate(validationDoc, snapshot, 'hydrate');
|
|
313
|
+
const stored = serializeCanvasRoomDocument(validationDoc);
|
|
314
|
+
const content = await this.documentStore.readContent();
|
|
315
|
+
const meta = validationDoc.getMap(CANVAS_META_KEY);
|
|
316
|
+
if (meta.has('externalConflict')) {
|
|
317
|
+
let invalid = false;
|
|
318
|
+
try { parseCanvasJson(content); } catch { invalid = true; }
|
|
319
|
+
meta.set('externalConflict', { content, invalid });
|
|
320
|
+
} else {
|
|
321
|
+
const external = parseCanvasJson(content);
|
|
322
|
+
if (stored !== serializeCanvasDocument(external)) {
|
|
323
|
+
replaceCanvasRoomDocument(validationDoc, external);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
Y.applyUpdate(this.doc, Y.encodeStateAsUpdate(validationDoc), 'hydrate');
|
|
327
|
+
} finally {
|
|
328
|
+
validationDoc.destroy();
|
|
329
|
+
}
|
|
330
|
+
} else if (isExcalidrawRoom(this.name)) {
|
|
296
331
|
const validationDoc = new Y.Doc({ gc: true });
|
|
297
332
|
try {
|
|
298
333
|
Y.applyUpdate(validationDoc, snapshot, 'hydrate');
|
|
@@ -332,7 +367,13 @@ export class CollaborationRoom {
|
|
|
332
367
|
const ytext = this.doc.getText('codemirror');
|
|
333
368
|
const comments = this.doc.getArray('comments');
|
|
334
369
|
this.doc.transact(() => {
|
|
335
|
-
if (
|
|
370
|
+
if (isCanvasFilePath(this.name)) {
|
|
371
|
+
try {
|
|
372
|
+
replaceCanvasRoomDocument(this.doc, parseCanvasJson(content));
|
|
373
|
+
} catch {
|
|
374
|
+
this.doc.getMap(CANVAS_META_KEY).set('invalidContent', true);
|
|
375
|
+
}
|
|
376
|
+
} else if (isExcalidrawRoom(this.name)) {
|
|
336
377
|
const parsedScene = tryParseExcalidrawSceneJson(content);
|
|
337
378
|
if (parsedScene) {
|
|
338
379
|
migrateLegacyExcalidrawRoomData(this.doc, parsedScene);
|
|
@@ -346,7 +387,7 @@ export class CollaborationRoom {
|
|
|
346
387
|
}, 'hydrate');
|
|
347
388
|
|
|
348
389
|
const replacementSnapshot = Y.encodeStateAsUpdate(this.doc);
|
|
349
|
-
if (snapshotNeedsReplacement) {
|
|
390
|
+
if (snapshotNeedsReplacement || isCanvasFilePath(this.name)) {
|
|
350
391
|
await this.documentStore.writeSnapshot(replacementSnapshot);
|
|
351
392
|
} else {
|
|
352
393
|
void this.documentStore.writeSnapshot(replacementSnapshot).catch((error) => {
|
|
@@ -462,6 +503,13 @@ export class CollaborationRoom {
|
|
|
462
503
|
this.contentDirty = true;
|
|
463
504
|
};
|
|
464
505
|
|
|
506
|
+
if (isCanvasFilePath(this.name)) {
|
|
507
|
+
for (const key of [CANVAS_NODES_KEY, CANVAS_EDGES_KEY, CANVAS_NODE_ORDER_KEY, CANVAS_EDGE_ORDER_KEY, CANVAS_META_KEY]) {
|
|
508
|
+
this.doc.getMap(key).observeDeep((_events, transaction) => markFromTransaction(transaction));
|
|
509
|
+
}
|
|
510
|
+
return;
|
|
511
|
+
}
|
|
512
|
+
|
|
465
513
|
if (isExcalidrawRoom(this.name)) {
|
|
466
514
|
this.doc.getMap(EXCALIDRAW_ELEMENTS_KEY).observeDeep((_events, transaction) => {
|
|
467
515
|
markFromTransaction(transaction);
|
|
@@ -482,6 +530,12 @@ export class CollaborationRoom {
|
|
|
482
530
|
|
|
483
531
|
resetContentBaseline() {
|
|
484
532
|
this.persistedContentBaseline = this.getPersistedContent();
|
|
533
|
+
if (isCanvasFilePath(this.name)) {
|
|
534
|
+
const conflict = this.doc.getMap(CANVAS_META_KEY).get('externalConflict');
|
|
535
|
+
if (conflict) {
|
|
536
|
+
this.persistedContentBaseline = conflict.invalid ? null : serializeCanvasDocument(parseCanvasJson(conflict.content));
|
|
537
|
+
}
|
|
538
|
+
}
|
|
485
539
|
this.contentDirty = false;
|
|
486
540
|
}
|
|
487
541
|
|
|
@@ -555,15 +609,38 @@ export class CollaborationRoom {
|
|
|
555
609
|
return;
|
|
556
610
|
}
|
|
557
611
|
|
|
558
|
-
|
|
612
|
+
let content = this.getPersistedContent();
|
|
559
613
|
if (content === null) {
|
|
560
|
-
console.warn(`[room:${this.name}] Skipping persist because the
|
|
614
|
+
console.warn(`[room:${this.name}] Skipping persist because the document is invalid`);
|
|
561
615
|
return;
|
|
562
616
|
}
|
|
617
|
+
if (isCanvasFilePath(this.name) && content !== this.persistedContentBaseline && !this.doc.getMap(CANVAS_META_KEY).has('externalConflict')) {
|
|
618
|
+
const externalContent = await this.documentStore.readContent();
|
|
619
|
+
if (this.deleted || this.destroyed) return;
|
|
620
|
+
if (externalContent === null) {
|
|
621
|
+
this.markDeleted();
|
|
622
|
+
return;
|
|
623
|
+
}
|
|
624
|
+
let externalBaseline = null;
|
|
625
|
+
let invalid = false;
|
|
626
|
+
try { externalBaseline = serializeCanvasDocument(parseCanvasJson(externalContent)); } catch { invalid = true; }
|
|
627
|
+
content = this.getPersistedContent();
|
|
628
|
+
if (content === null) return;
|
|
629
|
+
// A filesystem observation may still be queued when the save timer fires.
|
|
630
|
+
if (externalBaseline !== this.persistedContentBaseline) {
|
|
631
|
+
this.persistedContentBaseline = externalBaseline;
|
|
632
|
+
if (externalBaseline !== content) {
|
|
633
|
+
this.doc.transact(() => {
|
|
634
|
+
this.doc.getMap(CANVAS_META_KEY).set('externalConflict', { content: externalContent, invalid });
|
|
635
|
+
}, 'workspace-reconcile');
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
}
|
|
563
639
|
// Compare inline: refreshContentDirty() would serialize the document
|
|
564
640
|
// a second time for the same check.
|
|
565
|
-
const
|
|
566
|
-
this.contentDirty =
|
|
641
|
+
const conflict = isCanvasFilePath(this.name) && this.doc.getMap(CANVAS_META_KEY).has('externalConflict');
|
|
642
|
+
this.contentDirty = content !== this.persistedContentBaseline;
|
|
643
|
+
const includeContent = this.contentDirty && !conflict;
|
|
567
644
|
const commentThreads = serializeCommentThreads(this.doc.getArray('comments'));
|
|
568
645
|
await this.documentStore.persistState({
|
|
569
646
|
commentThreads,
|
|
@@ -616,6 +693,46 @@ export class CollaborationRoom {
|
|
|
616
693
|
}
|
|
617
694
|
|
|
618
695
|
const comments = this.doc.getArray('comments');
|
|
696
|
+
if (isCanvasFilePath(this.name)) {
|
|
697
|
+
let external;
|
|
698
|
+
try {
|
|
699
|
+
external = parseCanvasJson(content);
|
|
700
|
+
} catch {
|
|
701
|
+
this.doc.transact(() => {
|
|
702
|
+
this.doc.getMap(CANVAS_META_KEY).set('externalConflict', { content, invalid: true });
|
|
703
|
+
}, 'workspace-reconcile');
|
|
704
|
+
this.persistedContentBaseline = null;
|
|
705
|
+
// Preserve the pending document in a sidecar while the invalid file remains untouched.
|
|
706
|
+
await this.persist();
|
|
707
|
+
return { ok: false, reason: 'invalid-canvas' };
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
const meta = this.doc.getMap(CANVAS_META_KEY);
|
|
711
|
+
const current = this.getPersistedContent();
|
|
712
|
+
const hasPendingChanges = current !== null && current !== this.persistedContentBaseline;
|
|
713
|
+
const reconciliation = hasPendingChanges && this.persistedContentBaseline !== null
|
|
714
|
+
? mergeCanvasDocuments(parseCanvasJson(this.persistedContentBaseline), buildCanvasRoomDocument(this.doc), external)
|
|
715
|
+
: { conflict: hasPendingChanges, document: external };
|
|
716
|
+
const hadConflict = meta.has('externalConflict');
|
|
717
|
+
this.doc.transact(() => {
|
|
718
|
+
if (reconciliation.conflict || hadConflict) {
|
|
719
|
+
meta.set('externalConflict', { content, invalid: false });
|
|
720
|
+
} else {
|
|
721
|
+
replaceCanvasRoomDocument(this.doc, reconciliation.document);
|
|
722
|
+
meta.delete('invalidContent');
|
|
723
|
+
}
|
|
724
|
+
if (replaceCommentThreads) {
|
|
725
|
+
if (comments.length > 0) comments.delete(0, comments.length);
|
|
726
|
+
populateCommentThreads(comments, commentThreads);
|
|
727
|
+
}
|
|
728
|
+
}, 'workspace-reconcile');
|
|
729
|
+
this.persistedContentBaseline = serializeCanvasDocument(external);
|
|
730
|
+
this.refreshContentDirty();
|
|
731
|
+
if (this.contentDirty && !meta.has('externalConflict')) this.schedulePersist();
|
|
732
|
+
else await this.persist();
|
|
733
|
+
return { ok: true, highlightRange: null, conflict: meta.has('externalConflict') };
|
|
734
|
+
}
|
|
735
|
+
|
|
619
736
|
if (isExcalidrawRoom(this.name)) {
|
|
620
737
|
const parsedExcalidrawScene = tryParseExcalidrawSceneJson(content);
|
|
621
738
|
if (!parsedExcalidrawScene) {
|
|
@@ -712,10 +829,6 @@ export class CollaborationRoom {
|
|
|
712
829
|
}
|
|
713
830
|
}
|
|
714
831
|
|
|
715
|
-
unmarkDeleted() {
|
|
716
|
-
this.deleted = false;
|
|
717
|
-
}
|
|
718
|
-
|
|
719
832
|
isDeleted() {
|
|
720
833
|
return this.deleted;
|
|
721
834
|
}
|
|
@@ -917,14 +1030,14 @@ export class CollaborationRoom {
|
|
|
917
1030
|
}
|
|
918
1031
|
|
|
919
1032
|
readEditableContent() {
|
|
920
|
-
if (!this.hydrated || this.deleted || this.destroyed || isExcalidrawRoom(this.name)) {
|
|
1033
|
+
if (!this.hydrated || this.deleted || this.destroyed || isExcalidrawRoom(this.name) || isCanvasFilePath(this.name)) {
|
|
921
1034
|
return null;
|
|
922
1035
|
}
|
|
923
1036
|
return this.doc.getText('codemirror').toString();
|
|
924
1037
|
}
|
|
925
1038
|
|
|
926
1039
|
applyExactTextChanges(changes, { origin = 'agent' } = {}) {
|
|
927
|
-
if (!this.hydrated || this.deleted || this.destroyed || isExcalidrawRoom(this.name)) {
|
|
1040
|
+
if (!this.hydrated || this.deleted || this.destroyed || isExcalidrawRoom(this.name) || isCanvasFilePath(this.name)) {
|
|
928
1041
|
throw new Error('The collaborative document is unavailable');
|
|
929
1042
|
}
|
|
930
1043
|
const ytext = this.doc.getText('codemirror');
|
|
@@ -962,6 +1075,14 @@ export class CollaborationRoom {
|
|
|
962
1075
|
return null;
|
|
963
1076
|
}
|
|
964
1077
|
|
|
1078
|
+
if (isCanvasFilePath(this.name)) {
|
|
1079
|
+
try {
|
|
1080
|
+
return isCanvasRoomDocStructured(this.doc) ? serializeCanvasRoomDocument(this.doc) : null;
|
|
1081
|
+
} catch {
|
|
1082
|
+
return null;
|
|
1083
|
+
}
|
|
1084
|
+
}
|
|
1085
|
+
|
|
965
1086
|
if (!isExcalidrawRoom(this.name)) {
|
|
966
1087
|
return this.doc.getText('codemirror').toString();
|
|
967
1088
|
}
|
|
@@ -1027,7 +1148,20 @@ export class CollaborationRoom {
|
|
|
1027
1148
|
const encoder = encoding.createEncoder();
|
|
1028
1149
|
encoding.writeVarUint(encoder, MSG_AGENT_FLUSH_ACK);
|
|
1029
1150
|
encoding.writeVarString(encoder, requestId);
|
|
1030
|
-
sendMessage.call(this, ws, encoding.toUint8Array(encoder), this);
|
|
1151
|
+
const acknowledge = () => sendMessage.call(this, ws, encoding.toUint8Array(encoder), this);
|
|
1152
|
+
if (isCanvasFilePath(this.name)) {
|
|
1153
|
+
const available = () => this.hydrated && !this.deleted && !this.destroyed
|
|
1154
|
+
&& this.documentStore?.hasPersistence() && this.getPersistedContent() !== null;
|
|
1155
|
+
if (available()) {
|
|
1156
|
+
void this.persist().then(() => {
|
|
1157
|
+
if (available()) acknowledge();
|
|
1158
|
+
}).catch((error) => {
|
|
1159
|
+
console.error(`[room:${this.name}] Failed to persist canvas before flush acknowledgement:`, error.message);
|
|
1160
|
+
});
|
|
1161
|
+
}
|
|
1162
|
+
} else {
|
|
1163
|
+
acknowledge();
|
|
1164
|
+
}
|
|
1031
1165
|
break;
|
|
1032
1166
|
}
|
|
1033
1167
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { getVaultFileKind } from '../../../domain/file-kind.js';
|
|
2
|
+
|
|
1
3
|
export class RoomRegistry {
|
|
2
4
|
constructor({ createRoom }) {
|
|
3
5
|
this.createRoom = createRoom;
|
|
@@ -31,6 +33,10 @@ export class RoomRegistry {
|
|
|
31
33
|
return false;
|
|
32
34
|
}
|
|
33
35
|
|
|
36
|
+
const oldKind = getVaultFileKind(oldName);
|
|
37
|
+
const newKind = getVaultFileKind(newName);
|
|
38
|
+
if (oldKind !== newKind && [oldKind, newKind].includes('canvas')) return false;
|
|
39
|
+
|
|
34
40
|
const room = this.rooms.get(oldName);
|
|
35
41
|
if (!room) {
|
|
36
42
|
return false;
|
|
@@ -61,12 +67,6 @@ export class RoomRegistry {
|
|
|
61
67
|
return Array.from(this.rooms.entries());
|
|
62
68
|
}
|
|
63
69
|
|
|
64
|
-
async reloadAllFromDisk() {
|
|
65
|
-
await Promise.allSettled(
|
|
66
|
-
Array.from(this.rooms.values(), (room) => room.reloadFromDisk?.()),
|
|
67
|
-
);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
70
|
async reconcileWorkspaceChange(workspaceChange = {}) {
|
|
71
71
|
const deletedPaths = new Set(workspaceChange.deletedPaths ?? []);
|
|
72
72
|
const renamedPaths = Array.isArray(workspaceChange.renamedPaths) ? workspaceChange.renamedPaths : [];
|
|
@@ -128,7 +128,7 @@ export class RoomRegistry {
|
|
|
128
128
|
}
|
|
129
129
|
|
|
130
130
|
const result = await room.reloadFromDisk?.();
|
|
131
|
-
if (result && result.ok === false &&
|
|
131
|
+
if (result && result.ok === false && ['invalid-excalidraw', 'invalid-canvas'].includes(result.reason)) {
|
|
132
132
|
reloadRequiredPaths.push(pathValue);
|
|
133
133
|
} else if (result?.highlightRange) {
|
|
134
134
|
highlightRanges.push({
|
|
@@ -102,6 +102,24 @@ function publicAuditEvent(record = null) {
|
|
|
102
102
|
};
|
|
103
103
|
}
|
|
104
104
|
|
|
105
|
+
function parseAuditCursor(cursor) {
|
|
106
|
+
if (!cursor) return null;
|
|
107
|
+
try {
|
|
108
|
+
if (typeof cursor !== 'string' || cursor.length > 256 || !/^[A-Za-z0-9_-]+$/u.test(cursor)) {
|
|
109
|
+
throw new Error('Invalid cursor');
|
|
110
|
+
}
|
|
111
|
+
const value = JSON.parse(Buffer.from(cursor, 'base64url').toString('utf8'));
|
|
112
|
+
if (!Array.isArray(value) || value.length !== 2
|
|
113
|
+
|| !Number.isSafeInteger(value[0]) || value[0] < 0
|
|
114
|
+
|| typeof value[1] !== 'string' || !value[1] || value[1].length > 128) {
|
|
115
|
+
throw new Error('Invalid cursor');
|
|
116
|
+
}
|
|
117
|
+
return { createdAt: value[0], id: value[1] };
|
|
118
|
+
} catch {
|
|
119
|
+
throw createHostedError(400, 'Invalid access history cursor.', 'HOSTED_AUDIT_CURSOR_INVALID');
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
105
123
|
function publicVaultSource(record = null) {
|
|
106
124
|
if (!record) {
|
|
107
125
|
return null;
|
|
@@ -734,8 +752,17 @@ export class HostedWorkspaceService {
|
|
|
734
752
|
}));
|
|
735
753
|
}
|
|
736
754
|
|
|
737
|
-
async listAuditEvents(user) {
|
|
755
|
+
async listAuditEvents(user, { cursor = '', limit = 50 } = {}) {
|
|
738
756
|
await this.requireAdmin(user);
|
|
739
|
-
|
|
757
|
+
const pageSize = Math.min(100, Math.max(1, Number.parseInt(limit, 10) || 50));
|
|
758
|
+
const rows = await this.store.listAuditEvents({ before: parseAuditCursor(cursor), limit: pageSize + 1 });
|
|
759
|
+
const events = rows.slice(0, pageSize).map(publicAuditEvent);
|
|
760
|
+
const last = events.at(-1);
|
|
761
|
+
return {
|
|
762
|
+
events,
|
|
763
|
+
nextCursor: rows.length > pageSize
|
|
764
|
+
? Buffer.from(JSON.stringify([last.createdAt, last.id])).toString('base64url')
|
|
765
|
+
: null,
|
|
766
|
+
};
|
|
740
767
|
}
|
|
741
768
|
}
|
|
@@ -1,49 +1,13 @@
|
|
|
1
1
|
import { deflateRawSync } from 'node:zlib';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
return String.fromCharCode(48 + value);
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
if (value < 36) {
|
|
9
|
-
return String.fromCharCode(55 + value);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
if (value < 62) {
|
|
13
|
-
return String.fromCharCode(61 + value);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
if (value === 62) {
|
|
17
|
-
return '-';
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
if (value === 63) {
|
|
21
|
-
return '_';
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
return '?';
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function append3bytes(byte1, byte2, byte3) {
|
|
28
|
-
const c1 = byte1 >> 2;
|
|
29
|
-
const c2 = ((byte1 & 0x03) << 4) | (byte2 >> 4);
|
|
30
|
-
const c3 = ((byte2 & 0x0f) << 2) | (byte3 >> 6);
|
|
31
|
-
const c4 = byte3 & 0x3f;
|
|
32
|
-
|
|
33
|
-
return `${encode6bit(c1 & 0x3f)}${encode6bit(c2 & 0x3f)}${encode6bit(c3 & 0x3f)}${encode6bit(c4 & 0x3f)}`;
|
|
34
|
-
}
|
|
3
|
+
const BASE64URL_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
|
|
4
|
+
const PLANTUML_ALPHABET = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_';
|
|
35
5
|
|
|
36
6
|
export function encodePlantUmlText(source = '') {
|
|
37
7
|
const compressed = deflateRawSync(Buffer.from(String(source), 'utf-8'));
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
compressed[index + 1] ?? 0,
|
|
44
|
-
compressed[index + 2] ?? 0,
|
|
45
|
-
);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
return encoded;
|
|
8
|
+
const padded = Buffer.alloc(Math.ceil(compressed.length / 3) * 3);
|
|
9
|
+
compressed.copy(padded);
|
|
10
|
+
return padded.toString('base64url').replace(/./gu, (character) => (
|
|
11
|
+
PLANTUML_ALPHABET[BASE64URL_ALPHABET.indexOf(character)]
|
|
12
|
+
));
|
|
49
13
|
}
|
|
@@ -107,7 +107,6 @@ export class GitDiffService {
|
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
getScopedFiles(status, scope = 'working-tree', path = null) {
|
|
110
|
-
const orderedFiles = [];
|
|
111
110
|
const fileMap = new Map();
|
|
112
111
|
const sectionMap = createSectionMap(status.sections);
|
|
113
112
|
const candidateSections = scope === 'staged'
|
|
@@ -126,13 +125,10 @@ export class GitDiffService {
|
|
|
126
125
|
const existing = fileMap.get(file.path) ?? null;
|
|
127
126
|
const merged = mergeScopedFile(existing, file, scope);
|
|
128
127
|
fileMap.set(file.path, merged);
|
|
129
|
-
if (!existing) {
|
|
130
|
-
orderedFiles.push(merged);
|
|
131
|
-
}
|
|
132
128
|
}
|
|
133
129
|
}
|
|
134
130
|
|
|
135
|
-
return
|
|
131
|
+
return Array.from(fileMap.values());
|
|
136
132
|
}
|
|
137
133
|
|
|
138
134
|
async getScopeSummary({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequestError as createGitRequestError } from '../http/http-errors.js';
|
|
2
2
|
import { getVaultFileKind, isImageAttachmentFilePath } from '../../../domain/file-kind.js';
|
|
3
3
|
import { normalizeRelativeGitPath } from './path-utils.js';
|
|
4
|
-
import { getImageMimeType } from '
|
|
4
|
+
import { getImageMimeType } from '../../shared/image-mime.js';
|
|
5
5
|
import {
|
|
6
6
|
countPatchLines,
|
|
7
7
|
parseGitLogHeader,
|
|
@@ -16,6 +16,8 @@ import {
|
|
|
16
16
|
const EMPTY_TREE_HASH = '4b825dc642cb6eb9a060e54bf8d69288fbee4904';
|
|
17
17
|
const DEFAULT_HISTORY_LIMIT = 30;
|
|
18
18
|
const HISTORY_LIMIT_CAP = 50;
|
|
19
|
+
const RESPONSE_CACHE_LIMIT = 50;
|
|
20
|
+
const MAX_CACHED_RESPONSE_BYTES = 256 * 1024;
|
|
19
21
|
|
|
20
22
|
function clampHistoryLimit(limit) {
|
|
21
23
|
const parsedLimit = Number.parseInt(String(limit ?? DEFAULT_HISTORY_LIMIT), 10);
|
|
@@ -77,8 +79,22 @@ function getCachedValue(cache, key) {
|
|
|
77
79
|
}
|
|
78
80
|
|
|
79
81
|
function setCachedValue(cache, key, value, ttlMs) {
|
|
82
|
+
const now = Date.now();
|
|
83
|
+
for (const [cachedKey, cached] of cache) {
|
|
84
|
+
if (now >= cached.expiresAt) cache.delete(cachedKey);
|
|
85
|
+
}
|
|
86
|
+
cache.delete(key);
|
|
87
|
+
const payloadBytes = Buffer.isBuffer(value.content)
|
|
88
|
+
? value.content.byteLength
|
|
89
|
+
: Buffer.byteLength(JSON.stringify(value));
|
|
90
|
+
if (ttlMs <= 0 || payloadBytes + Buffer.byteLength(key) > MAX_CACHED_RESPONSE_BYTES) {
|
|
91
|
+
return value;
|
|
92
|
+
}
|
|
93
|
+
while (cache.size >= RESPONSE_CACHE_LIMIT) {
|
|
94
|
+
cache.delete(cache.keys().next().value);
|
|
95
|
+
}
|
|
80
96
|
cache.set(key, {
|
|
81
|
-
expiresAt:
|
|
97
|
+
expiresAt: now + ttlMs,
|
|
82
98
|
value,
|
|
83
99
|
});
|
|
84
100
|
return value;
|
|
@@ -7,7 +7,7 @@ import { getVaultFileKind, isImageAttachmentFilePath } from '../../../domain/fil
|
|
|
7
7
|
import { mapWithConcurrency } from '../../shared/async-utils.js';
|
|
8
8
|
import { createEmptyStats } from './responses.js';
|
|
9
9
|
import { splitContentLines } from './parsers.js';
|
|
10
|
-
import { getImageMimeType } from '
|
|
10
|
+
import { getImageMimeType } from '../../shared/image-mime.js';
|
|
11
11
|
|
|
12
12
|
async function countFileLines(filePath) {
|
|
13
13
|
if (isImageAttachmentFilePath(filePath)) {
|