collabmd 0.1.51 → 0.1.54
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/README.md +1 -1
- package/bin/collabmd.js +3 -2
- package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-kJfwukbn.js +1 -0
- package/dist/client/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/dist/client/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/dist/client/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/dist/client/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/dist/client/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/dist/client/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/dist/client/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/dist/client/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/dist/client/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/dist/client/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/dist/client/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/dist/client/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/dist/client/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/dist/client/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/dist/client/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/dist/client/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/dist/client/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/dist/client/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/dist/client/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/dist/client/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/dist/client/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/dist/client/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/dist/client/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/dist/client/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/dist/client/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/dist/client/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/dist/client/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/dist/client/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/dist/client/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/dist/client/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/dist/client/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/dist/client/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/dist/client/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/dist/client/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/dist/client/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/dist/client/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/dist/client/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/dist/client/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/dist/client/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/dist/client/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/dist/client/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/dist/client/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/dist/client/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/dist/client/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/dist/client/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/dist/client/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/dist/client/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/dist/client/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/dist/client/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/dist/client/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/dist/client/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/dist/client/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/dist/client/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/dist/client/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/dist/client/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/dist/client/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/dist/client/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/dist/client/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/dist/client/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/dist/client/assets/Middleware-DUgFSleI.js +1 -0
- package/dist/client/assets/_basePickBy-QJXUw_pr.js +1 -0
- package/dist/client/assets/_baseUniq-DR4vVjyC.js +1 -0
- package/dist/client/assets/abnfDiagram-O67JEVCF-Dwt6a0Ds.js +1 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-DxNxad6-.js +1 -0
- package/dist/client/assets/architecture-7GRP2DOG-BBwRXFv3.js +1 -0
- package/dist/client/assets/architecture-7GRP2DOG-DJVtYNt-.js +1 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-C1uvg5id.js +36 -0
- package/dist/client/assets/architectureDiagram-NJMV4G6O-D5CGiX3G.js +36 -0
- package/dist/client/assets/{babel-CY5KOv-I.js → babel-Bi_28hhi.js} +1 -1
- package/dist/client/assets/band-D-Cum8PO.js +1 -0
- package/dist/client/assets/blockDiagram-BEXU5L5S-BgTM0var.js +140 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-B2YonsoG.js +129 -0
- package/dist/client/assets/{browser-BKLM0ThC-IxjwuOIz-DyJcVMFR.js → browser-BKLM0ThC-BCLQGPD6-K2seJgRL.js} +1 -1
- package/dist/client/assets/{browser-utils-DbXSMI-6.js → browser-utils-S4QYY31r.js} +1 -1
- package/dist/client/assets/{c4Diagram-7LVT6UL2-VAk1HPmz.js → c4Diagram-7LVT6UL2-r4IwomZm.js} +2 -2
- package/dist/client/assets/c4Diagram-YGBWAQC7-_xZPrNkB.js +38 -0
- package/dist/client/assets/channel-CgcHBnmr.js +1 -0
- package/dist/client/assets/chunk-2E4U76K2-CIQUuV9n.js +1 -0
- package/dist/client/assets/chunk-2Q5K7J3B-BMFG3ur0.js +1 -0
- package/dist/client/assets/{chunk-2ZTRR5NV-C2qZJila.js → chunk-2ZTRR5NV-CnDP55cn.js} +1 -1
- package/dist/client/assets/chunk-2ZTRR5NV-DcPRfelM.js +2 -0
- package/dist/client/assets/chunk-3FUC2YCW-8tZlhTGX.js +1 -0
- package/dist/client/assets/{chunk-3Z5EZCMW-DMniOlPd.js → chunk-3Z5EZCMW-BAnA6eQ7.js} +1 -1
- package/dist/client/assets/chunk-3Z5EZCMW-Yx4Q5AcN.js +1 -0
- package/dist/client/assets/chunk-4HAMMTFA-q0ldNVvr.js +62 -0
- package/dist/client/assets/chunk-5DYCD2WN-BKWCKnK-.js +1 -0
- package/dist/client/assets/{chunk-5V3GS4D5-i-ZDOEnP.js → chunk-5V3GS4D5-B5uC2oxu.js} +1 -1
- package/dist/client/assets/chunk-5V3GS4D5-BR7kgIgJ.js +1 -0
- package/dist/client/assets/chunk-5VM5RSS4-hE9rU_bl.js +15 -0
- package/dist/client/assets/chunk-6AEJRKK7-DTVZj5bY.js +1 -0
- package/dist/client/assets/{chunk-6AZGARVD-BB6FqMl-.js → chunk-6AZGARVD--pTGpDnx.js} +1 -1
- package/dist/client/assets/chunk-6AZGARVD-CnZDr4Cj.js +1 -0
- package/dist/client/assets/{chunk-6EIED4P4-DdUJkP0f.js → chunk-6EIED4P4-Bp8dpTvX.js} +1 -1
- package/dist/client/assets/chunk-6EIED4P4-DBVWq7Tz.js +1 -0
- package/dist/client/assets/{chunk-6K3QC6MW-CqVsVn-y.js → chunk-6K3QC6MW-DGVRzL6v.js} +1 -1
- package/dist/client/assets/chunk-6K3QC6MW-JnuvEGV4.js +1 -0
- package/dist/client/assets/{chunk-6TQVIW2G-DKlLbNIP.js → chunk-6TQVIW2G-BSj0l_pu.js} +1 -1
- package/dist/client/assets/chunk-6TQVIW2G-DgBX-Pv0.js +1 -0
- package/dist/client/assets/chunk-742MDFTN-D1nh6vNv.js +1 -0
- package/dist/client/assets/{chunk-747NJXEK-BFkZPlab.js → chunk-747NJXEK-BjqqAsS9.js} +1 -1
- package/dist/client/assets/chunk-747NJXEK-Cur1aosP.js +2 -0
- package/dist/client/assets/chunk-75Z2AOVW-DitkSoSG.js +2 -0
- package/dist/client/assets/chunk-7INBJB4K-CDmiHbaX.js +62 -0
- package/dist/client/assets/chunk-7M6MHVWA-BDakkknV.js +213 -0
- package/dist/client/assets/chunk-7PRAP22T-9uTvtc_-.js +1 -0
- package/dist/client/assets/{chunk-CLGD4ZFX-Cmtx89ht.js → chunk-CLGD4ZFX-BfYJtJm1.js} +1 -1
- package/dist/client/assets/chunk-DU6HZSFF-CWlP1Dk_.js +125 -0
- package/dist/client/assets/chunk-DUW6YSOI-Dgx8z5s3.js +1 -0
- package/dist/client/assets/chunk-DYU5D34O-DN0WQZBm.js +1 -0
- package/dist/client/assets/{chunk-F27PBJKO-Dg3H6KLL.js → chunk-F27PBJKO-DPcsPcEs.js} +1 -1
- package/dist/client/assets/{chunk-FOHPRMQF-DHwB1DNv.js → chunk-FOHPRMQF-Dmmo5Kak.js} +9 -9
- package/dist/client/assets/chunk-FOHPRMQF-DzxwRta7.js +161 -0
- package/dist/client/assets/chunk-GMAD6QVW-Bgk8qnty.js +8 -0
- package/dist/client/assets/chunk-GNY47TPC-CTrH5O5R.js +1 -0
- package/dist/client/assets/{chunk-SVP7TREG-XlsB_ZMZ.js → chunk-GTNCS2PH-ChgkzEIi.js} +1 -1
- package/dist/client/assets/chunk-GVQU2GXP-CQ8cl-Uu.js +1 -0
- package/dist/client/assets/chunk-GWA4HPMP-CGmv2yIq.js +1 -0
- package/dist/client/assets/{chunk-I5DQTOEV-Hm2LfiYI.js → chunk-I5DQTOEV-B98XA8VK.js} +1 -1
- package/dist/client/assets/chunk-I5DQTOEV-aBZooNp1.js +1 -0
- package/dist/client/assets/{chunk-ICYGCRZG-749o-pGJ.js → chunk-ICYGCRZG-D97UeqJs.js} +1 -1
- package/dist/client/assets/chunk-ICYGCRZG-odvlDZyA.js +1 -0
- package/dist/client/assets/{chunk-IH6LHLGP-CC6I9F3i.js → chunk-IH6LHLGP-BNevEHZK.js} +1 -1
- package/dist/client/assets/chunk-IH6LHLGP-CvXe34hB.js +1 -0
- package/dist/client/assets/{chunk-IMKFNOWR-3F6NhHUP.js → chunk-IMKFNOWR-CBqxfpcP.js} +2 -2
- package/dist/client/assets/{chunk-ZPMXAHWN-Dt0TxJa6.js → chunk-ISPTBLVO-BMsDq9Ha.js} +4 -4
- package/dist/client/assets/chunk-J5ZVWO5B-oDCd-gWO.js +1 -0
- package/dist/client/assets/chunk-JWPE2WC7-GDilnS5Y.js +1 -0
- package/dist/client/assets/{chunk-KI3K4JFJ-Rma-0k_M.js → chunk-KI3K4JFJ-D5XCPRZv.js} +1 -1
- package/dist/client/assets/chunk-KI3K4JFJ-FTtDwx3-.js +1 -0
- package/dist/client/assets/chunk-L3NEJ4N5-BflzkdTI.js +1 -0
- package/dist/client/assets/{chunk-LNGE3PJU-DWpGwHrW.js → chunk-LNGE3PJU-5-SxdO55.js} +1 -1
- package/dist/client/assets/chunk-LNGE3PJU-5nWSl6jJ.js +34 -0
- package/dist/client/assets/chunk-MBY4JIJT-DTJ4UcAm.js +8 -0
- package/dist/client/assets/chunk-NETBCI7D-CmUwDWUZ.js +1 -0
- package/dist/client/assets/chunk-O7XYJQB3-D0_ZY2za.js +126 -0
- package/dist/client/assets/chunk-OSK3NFVY-DqeKV_pg.js +10 -0
- package/dist/client/assets/{chunk-OUJLGHUK-D0j2JRSg.js → chunk-OUJLGHUK-75UXlPjl.js} +1 -1
- package/dist/client/assets/chunk-OUJLGHUK-DA95-S9B.js +2 -0
- package/dist/client/assets/{chunk-P2QGCYS3-Du8EtwOa.js → chunk-P2QGCYS3-BA--DhpW.js} +1 -1
- package/dist/client/assets/chunk-POPQ4Y6H-V_NEc45n.js +1 -0
- package/dist/client/assets/chunk-PWAF6VOD-D_kLse-N.js +1 -0
- package/dist/client/assets/{chunk-SHT3W25Y-BKaI8jZO.js → chunk-SHT3W25Y-YM3S-A_M.js} +5 -5
- package/dist/client/assets/chunk-SVP7TREG-DdNhDOmW.js +88 -0
- package/dist/client/assets/chunk-T5WUORNS-DD7KlyY6.js +40 -0
- package/dist/client/assets/{chunk-TICWLB2K-Cpp2z8yK.js → chunk-TICWLB2K-BGGgCr4x.js} +3 -3
- package/dist/client/assets/chunk-TLUHSLCS-DCZhIDYA.js +1 -0
- package/dist/client/assets/chunk-UA2S7LBM-DicYDjDM.js +1 -0
- package/dist/client/assets/{chunk-UY3FDG6J-CnmaAkG5.js → chunk-UY3FDG6J-DqSM_0FB.js} +1 -1
- package/dist/client/assets/chunk-UY3FDG6J-QT-rkt0y.js +1 -0
- package/dist/client/assets/chunk-WEXAMYUT-DDlVNp8J.js +1 -0
- package/dist/client/assets/chunk-X3CZISLH-BixgQztF.js +1 -0
- package/dist/client/assets/chunk-X3CZISLH-DwWpRaN8.js +1 -0
- package/dist/client/assets/{chunk-XHIXRSVI-BFQ6B8BE.js → chunk-XHIXRSVI-BSN7JlfK.js} +1 -1
- package/dist/client/assets/chunk-XHIXRSVI-DN_fEwws.js +1 -0
- package/dist/client/assets/chunk-XXDRQBXY-C7hQHDmQ.js +1 -0
- package/dist/client/assets/{chunk-XXDRQBXY-BvKO0v-W.js → chunk-XXDRQBXY-CdRN9Akd.js} +1 -1
- package/dist/client/assets/chunk-Y2CYZVJY-BbRBGnmc.js +1 -0
- package/dist/client/assets/chunk-Z7XXMR3K-P4Vaq8hD.js +10 -0
- package/dist/client/assets/chunk-ZIGJFQKS-b8OUHKK5.js +2 -0
- package/dist/client/assets/classDiagram-ZZMXUADV-QLbh_Nkf.js +1 -0
- package/dist/client/assets/classDiagram-v2-NBCMYWYE-3TQORq33.js +217 -0
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-QLbh_Nkf.js +1 -0
- package/dist/client/assets/clone-C1hp9FUh.js +1 -0
- package/dist/client/assets/comment-markdown-renderer-Bxi_JRSR.js +1 -0
- package/dist/client/assets/comment-thread-store-CHvy8GF8.js +1 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-Czr0rwGr.js +1 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-DLmEf9HS.js +1 -0
- package/dist/client/assets/cynefin-OW5HDTMX-CF3N9j1_.js +1 -0
- package/dist/client/assets/cynefin-OW5HDTMX-e-Quc9Yl.js +1 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-DTnLZaO7.js +62 -0
- package/dist/client/assets/cynefinDiagram-VND7K2PF-DwfMZ3vk.js +62 -0
- package/dist/client/assets/cytoscape-cose-bilkent-NdTYBUiT.js +1 -0
- package/dist/client/assets/cytoscape-fcose-DE9_QRG_.js +1 -0
- package/dist/client/assets/cytoscape.esm-EK2DW5Qr.js +321 -0
- package/dist/client/assets/dagre-6A5THRUB-DewyAGK6.js +4 -0
- package/dist/client/assets/dagre-D7FiCLLP.js +1 -0
- package/dist/client/assets/{dagre-GXQ25YYZ-BSfKCfy7.js → dagre-GXQ25YYZ-Vtyx08Qh.js} +2 -2
- package/dist/client/assets/deferred-collab-D4cxEdad.css +1 -0
- package/dist/client/assets/deferred-preview-BAXYgf4T.css +1 -0
- package/dist/client/assets/diagram-22UHCM2B-DbZirFfl.js +200 -0
- package/dist/client/assets/diagram-3UASUU5V-DmhdYv6_.js +24 -0
- package/dist/client/assets/diagram-ATOU4E4O-B5uX-jVO.js +3 -0
- package/dist/client/assets/diagram-CDSNMT55-D_qyS11R.js +30 -0
- package/dist/client/assets/diagram-MLGK6HIB-DIBG6Ivu.js +24 -0
- package/dist/client/assets/diagram-MPIPVDR6-D9XsALDV.js +41 -0
- package/dist/client/assets/{diagram-S7CK7UJ4-D7KaM9yj.js → diagram-S7CK7UJ4-CGTzfo2f.js} +3 -3
- package/dist/client/assets/diagram-UQ7AKVKN-CWZS8QtB.js +41 -0
- package/dist/client/assets/{diagram-VSXAHHWV-B3-U-Q2E.js → diagram-VSXAHHWV-DaO1nOZF.js} +3 -3
- package/dist/client/assets/diagram-VX7I27RA-B54P6Cyf.js +24 -0
- package/dist/client/assets/diagram-Z3DM3KII-Cl2EXiXp.js +24 -0
- package/dist/client/assets/direct-engine-DVLMOJWp-C-YL5NFb.js +5 -0
- package/dist/client/assets/{dist-B7XMN9AT.js → dist-9Eodxf4G.js} +1 -1
- package/dist/client/assets/{dist-Bfxzlnrf.js → dist-B2ZNQifU.js} +1 -1
- package/dist/client/assets/dist-B6QCMNze.js +1 -0
- package/dist/client/assets/dist-BIAv19LO.js +1 -0
- package/dist/client/assets/dist-BKYp1-dl.js +13 -0
- package/dist/client/assets/{dist-CO0-4CuV.js → dist-BSAZ-Hek.js} +8 -8
- package/dist/client/assets/{dist-DJAMplZI.js → dist-BSTbcioM.js} +2 -2
- package/dist/client/assets/{dist-EWJYvBK1.js → dist-BT9gJXCb.js} +1 -1
- package/dist/client/assets/dist-BTVg1m-V.js +1 -0
- package/dist/client/assets/{dist-Bdy9ZRzd.js → dist-Bi9ZIYXq.js} +1 -1
- package/dist/client/assets/{dist-Drv_wZYC.js → dist-BpAUe9sL.js} +1 -1
- package/dist/client/assets/dist-Bqo-XRVG.js +1 -0
- package/dist/client/assets/{dist-CqXVyYoH.js → dist-BrKhPlc9.js} +1 -1
- package/dist/client/assets/dist-CBsvKPcT.js +1 -0
- package/dist/client/assets/{dist-nxQErAaK.js → dist-CJBYh9Wy.js} +9 -9
- package/dist/client/assets/dist-CRwfjtwz.js +2 -0
- package/dist/client/assets/{dist-BzFSJM0U.js → dist-CX7Kc61C.js} +1 -1
- package/dist/client/assets/dist-CYfPeupF.js +1 -0
- package/dist/client/assets/dist-Ch6Sr9KF.js +28 -0
- package/dist/client/assets/{dist-DCpIH3-_.js → dist-CoXN2D3R.js} +1 -1
- package/dist/client/assets/{dist-CbDyXgCo.js → dist-CucpLxUY.js} +1 -1
- package/dist/client/assets/dist-DHBMeCxC.js +6 -0
- package/dist/client/assets/dist-DLEg9d4u.js +1 -0
- package/dist/client/assets/{dist-By7ieqAf.js → dist-DOHWxIty.js} +1 -1
- package/dist/client/assets/dist-DYFBD-wW.js +1 -0
- package/dist/client/assets/{dist-BR81yxMt.js → dist-DeCV9FU4.js} +1 -1
- package/dist/client/assets/dist-DugWGOjQ.js +1 -0
- package/dist/client/assets/{dist-DVXzbeDx.js → dist-KrdpB_GB.js} +1 -1
- package/dist/client/assets/{dist-B_B4XLmq.js → dist-NNrRnB-f.js} +1 -1
- package/dist/client/assets/{dist-Bx3QkS-3.js → dist-PUxZqhFe.js} +1 -1
- package/dist/client/assets/dist-cYiJMWHJ.js +1 -0
- package/dist/client/assets/dist-iKC7go4m.js +1 -0
- package/dist/client/assets/{dist-CrWzIWEE.js → dist-lw5TGjI6.js} +1 -1
- package/dist/client/assets/{dist-CELhfKzh.js → dist-uk11ih8u.js} +2 -2
- package/dist/client/assets/{document-formatter-Qdiq9uJs.js → document-formatter-6I63vstk.js} +1 -1
- package/dist/client/assets/{drawioEditor-CHf1vtdQ.js → drawioEditor-DNTjsjzJ.js} +2 -2
- package/dist/client/assets/duration-BiuFXtXd.js +1 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-PfC84FyI.js +1 -0
- package/dist/client/assets/ebnfDiagram-ZINNZB2B-DYvm_QtE.js +1 -0
- package/dist/client/assets/editor-session-D8GGkJak.js +14 -0
- package/dist/client/assets/elk-276RUBZZ-B8LB3Pac.js +27 -0
- package/dist/client/assets/embedded-editor-base-elU0Avik.css +1 -0
- package/dist/client/assets/{embedpdf-LUXDBD3-.js → embedpdf-TkbBYowM.js} +1 -1
- package/dist/client/assets/{embedpdf-DA4bA119-E8wZ11J2.js → embedpdf-cl9qiF45-itpgqvGY.js} +5 -5
- package/dist/client/assets/{en-2RFA324Y-BsuNJTcL.js → en-JTHJ2SIP-DBz9bRq4.js} +1 -1
- package/dist/client/assets/erDiagram-OPXOYQCR-o8GRv8A_.js +99 -0
- package/dist/client/assets/{erDiagram-RLTQ6QDP-CWrH1UJ9.js → erDiagram-RLTQ6QDP-C9cJl5NB.js} +2 -2
- package/dist/client/assets/esm-BzZ1JFVo.js +65 -0
- package/dist/client/assets/{estree-CuT_pB8K.js → estree-DGmLqopC.js} +18 -18
- package/dist/client/assets/eventmodeling-NTZA5JFV-CDy1bN6j.js +1 -0
- package/dist/client/assets/eventmodeling-NTZA5JFV-Dxtv5D-P.js +1 -0
- package/dist/client/assets/{excalidraw-element-link-iA6zo0_f.js → excalidraw-element-link-BRZOTIeI.js} +2 -2
- package/dist/client/assets/{excalidrawEditor-DDE0n1Pk.css → excalidrawEditor-BCTFp_CV.css} +1 -1
- package/dist/client/assets/excalidrawEditor-D0orhhku.js +9 -0
- package/dist/client/assets/export-page-CVJNMERq.js +46 -0
- package/dist/client/assets/exportDocument-Ba-n1X4U.css +1 -0
- package/dist/client/assets/exportDocument-DSshnmnZ.js +2 -0
- package/dist/client/assets/{fa-IR-FIYUE2GQ-C865Nx3X.js → fa-IR-I4JNTJHK-CFtHZqoT.js} +1 -1
- package/dist/client/assets/file-search-BA8o_gs0.js +1 -0
- package/dist/client/assets/flowDiagram-HODETNUW-Bq4470NR.js +1 -0
- package/dist/client/assets/flowDiagram-KWPJA3E3-DQG9qGiU.js +1 -0
- package/dist/client/assets/forth-D6RzAl64.js +1 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-x40PW0Ah.js +292 -0
- package/dist/client/assets/ganttDiagram-FUAMR5RP-BQpsI7gQ.js +292 -0
- package/dist/client/assets/gitGraph-4MIJSDKK-B-rpDYbz.js +1 -0
- package/dist/client/assets/gitGraph-4MIJSDKK-ZaBIE4Lb.js +1 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-ahsNaZsp.js +106 -0
- package/dist/client/assets/gitGraphDiagram-X574FWY7-wbs_2m9f.js +106 -0
- package/dist/client/assets/graphlib-C9Tl7QrK.js +1 -0
- package/dist/client/assets/{html-Cdnr2qzU.js → html-BryNQ_yx.js} +7 -7
- package/dist/client/assets/html-DTuc_pxj.js +1 -0
- package/dist/client/assets/{id-ID-EOMR5R3I-CGQwUjoL.js → id-ID-2WY7E4VX-CCAeQpPr.js} +2 -2
- package/dist/client/assets/image-I42VHMUI-B2-c_ifV.js +1 -0
- package/dist/client/assets/{image-blob-reduce.esm-Dj7YBvMv.js → image-blob-reduce.esm-BFq-Mx5V.js} +2 -2
- package/dist/client/assets/index-BCgNcVNs.css +1 -0
- package/dist/client/assets/index-BpmR5Qqk.js +1140 -0
- package/dist/client/assets/info-A6RAGUB7-BcGxhjED.js +1 -0
- package/dist/client/assets/info-A6RAGUB7-BlutK7BT.js +1 -0
- package/dist/client/assets/infoDiagram-27XIBGKW-MrZyptIy.js +2 -0
- package/dist/client/assets/infoDiagram-VRGFBTTK-KkUjDRAQ.js +2 -0
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-CRy9vIS5.js → ishikawaDiagram-5VMMS53U-Bnt9yM0O.js} +2 -2
- package/dist/client/assets/ishikawaDiagram-OU5B5YK6-Di9BcpOY.js +70 -0
- package/dist/client/assets/{it-IT-FC2VTM3L-KTijNcUe.js → it-IT-INVHSAJF-DytAgndh.js} +1 -1
- package/dist/client/assets/javascript-B9I2pbsP.js +1 -0
- package/dist/client/assets/javascript-DctB8BJo.js +1 -0
- package/dist/client/assets/{journeyDiagram-3NMN7TZE-D4ZR_s9J.js → journeyDiagram-3NMN7TZE-Bl0abK1r.js} +1 -1
- package/dist/client/assets/journeyDiagram-ZHPQQLJL-J-sGrs9e.js +139 -0
- package/dist/client/assets/jsx-runtime-DKj5X9O4.js +1 -0
- package/dist/client/assets/kanban-definition-PNTS6WVX-5ZDV_yIa.js +89 -0
- package/dist/client/assets/{kanban-definition-UXKFOSKX-CIDTmu5g.js → kanban-definition-UXKFOSKX-DMgUfNt0.js} +10 -10
- package/dist/client/assets/{katex-CXMH3UgJ.js → katex-9NBMfU68.js} +2 -2
- package/dist/client/assets/katex-ZlcWpGUi.js +257 -0
- package/dist/client/assets/line-DEbP8Ok6.js +1 -0
- package/dist/client/assets/linear-DExL6ILt.js +1 -0
- package/dist/client/assets/{lobby-presence-Rdjnc0_0.js → lobby-presence-KJrYhMdN.js} +1 -1
- package/dist/client/assets/{lua-CL1SqxuB.js → lua-zbJo2mq3.js} +1 -1
- package/dist/client/assets/{markdown-CByV-4CU.js → markdown-CZ1tYEW8.js} +23 -23
- package/dist/client/assets/markdown-it-DpvIRaVq.js +13 -0
- package/dist/client/assets/markdown-math-CyyBVuDO.js +517 -0
- package/dist/client/assets/merge-CALoRt3l.js +1 -0
- package/dist/client/assets/{mermaid-parser.core-DrdLA3p0.js → mermaid-parser.core-Bpogunsh.js} +1 -1
- package/dist/client/assets/mermaid-parser.core-DBy--Jc0.js +3 -0
- package/dist/client/assets/mermaid.core-BeOUPE3Q.js +10 -0
- package/dist/client/assets/mindmap-definition-NLK3R4M7-ByVb-0vj.js +96 -0
- package/dist/client/assets/{mindmap-definition-YA3MSWOX-DO8NB9VH.js → mindmap-definition-YA3MSWOX-DBZN5_GH.js} +29 -29
- package/dist/client/assets/{nginx-BMaDbqW3.js → nginx-8H7HVH4w.js} +1 -1
- package/dist/client/assets/packet-AYTQ26CC-CqpSjTWl.js +1 -0
- package/dist/client/assets/packet-AYTQ26CC-DvbY8dI6.js +1 -0
- package/dist/client/assets/{pdfium-RAgkpwfK.wasm → pdfium-BJ2Yip8Q.wasm} +0 -0
- package/dist/client/assets/pegDiagram-GJSIUBJH-aost1sSO.js +1 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-DRo8CZu3.js +1 -0
- package/dist/client/assets/percentages-LWOC67ZH-VhvllE7L.js +1 -0
- package/dist/client/assets/{pica-xkWDouSg.js → pica-BPrp-GK1.js} +1 -1
- package/dist/client/assets/pie-DzWLGKAD.js +1 -0
- package/dist/client/assets/pie-WAS4IAKB-Bg2eCNl5.js +1 -0
- package/dist/client/assets/pie-WAS4IAKB-DWSm9SSD.js +1 -0
- package/dist/client/assets/pieDiagram-5QR66LMP-BICdpEuz.js +39 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-CZThaHsc.js +39 -0
- package/dist/client/assets/{preload-helper-CtT0-S4g.js → preload-helper-BAlEavIC.js} +1 -1
- package/dist/client/assets/preview-render-compiler-BmWQStaL.js +43 -0
- package/dist/client/assets/preview-render-profile-D652PAjA.js +1 -0
- package/dist/client/assets/preview-render-worker-BA4VK_GY.js +575 -0
- package/dist/client/assets/prod-CA0ie9yD.js +145 -0
- package/dist/client/assets/prod-yKJZ3E4s.js +1 -0
- package/dist/client/assets/{pug-Wky5Dnfy.js → pug-CqqUmdG7.js} +1 -1
- package/dist/client/assets/purify.es-go7v6Te-.js +3 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-fJE7iAxt.js → quadrantDiagram-AXDQQJYC-C5iowkl_.js} +3 -3
- package/dist/client/assets/quadrantDiagram-O4NWA36T-Bgx5bF97.js +7 -0
- package/dist/client/assets/quick-switcher-controller-B5vT9Vj5.js +1 -0
- package/dist/client/assets/radar-RG4KPBEZ-BfNQUEQy.js +1 -0
- package/dist/client/assets/radar-RG4KPBEZ-DxExotg6.js +1 -0
- package/dist/client/assets/railroad-74A4TZTK-BaQ6U6eJ.js +1 -0
- package/dist/client/assets/railroad-74A4TZTK-FfHmeIQk.js +1 -0
- package/dist/client/assets/railroad-abnf-HS5TGJTU-BJ3KZw7J.js +1 -0
- package/dist/client/assets/railroad-abnf-HS5TGJTU-CLkdDRsJ.js +1 -0
- package/dist/client/assets/railroad-ebnf-LZEXJU2U-B162zvcG.js +1 -0
- package/dist/client/assets/railroad-ebnf-LZEXJU2U-DA0sEq7w.js +1 -0
- package/dist/client/assets/railroad-peg-WCYAUIDC-CGs5GeJ5.js +1 -0
- package/dist/client/assets/railroad-peg-WCYAUIDC-DCmlICzO.js +1 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-BTt_rKjT.js +1 -0
- package/dist/client/assets/railroadDiagram-XR7U4H2S-DbVoNgSz.js +1 -0
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-Balm0WW8.js → requirementDiagram-BXWQKSXE-BkvazG7r.js} +1 -1
- package/dist/client/assets/requirementDiagram-PLB6GJNP-BT0j9C40.js +84 -0
- 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-IPEJSGJF-X1BCUIrf.js +40 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-C_IemB9h.js +40 -0
- package/dist/client/assets/sankeyLinkHorizontal-usjP1-Cg.js +1 -0
- package/dist/client/assets/sequenceDiagram-PO4LG4MO-B-2QfXhV.js +169 -0
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-BL1j3Sn-.js → sequenceDiagram-WJ2MYXX4-CxFBgLGd.js} +3 -3
- package/dist/client/assets/{sieve-BAxa3IjF.js → sieve-tLWDfEkZ.js} +1 -1
- package/dist/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -1
- package/dist/client/assets/sizeCapture-INFHLROL-DrzwYt5z.js +1 -0
- package/dist/client/assets/sl-SI-QY5KCFGA-RZhwMpQL.js +8 -0
- package/dist/client/assets/solr-B78wSQJQ.js +1 -0
- package/dist/client/assets/src-XiVvaevx.js +1 -0
- package/dist/client/assets/{standalone-6z5x8CWe.js → standalone-DbyFjvTU.js} +1 -1
- package/dist/client/assets/stateDiagram-D77RDMKH-BaSQ6Owj.js +1 -0
- package/dist/client/assets/stateDiagram-v2-GCMORJYK-CsVcfwVp.js +291 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CLlwrdvU.js +1 -0
- package/dist/client/assets/sv-SE-O3OFCY3J-DnS86_7q.js +12 -0
- package/dist/client/assets/swimlanes-2SLR337P-CnYTVqRX.js +1 -0
- package/dist/client/assets/swimlanes-42K2YHIH-CALFEmiS.js +1 -0
- package/dist/client/assets/swimlanesDiagram-TC7HE7FX-Bh4tmz27.js +8 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-xhehUG9e.js +8 -0
- package/dist/client/assets/th-TH-WLSZUSBX-DHehoYR2.js +1 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-7pch5JAr.js → timeline-definition-24CTP7MA-zse-5Dbm.js} +5 -5
- package/dist/client/assets/timeline-definition-EJHVYXUP-BhqPlKkN.js +120 -0
- package/dist/client/assets/treeView-Q6P3EWNA-BvHOzbu9.js +1 -0
- package/dist/client/assets/treeView-Q6P3EWNA-Cccy0ngL.js +1 -0
- package/dist/client/assets/treemap-CxZTjHiH.js +1 -0
- package/dist/client/assets/treemap-WGGIJYW6-oety7paS.js +1 -0
- package/dist/client/assets/treemap-WGGIJYW6-sMRCjCtX.js +1 -0
- package/dist/client/assets/usecaseDiagram-POWQR4AR-DR2LHQYs.js +328 -0
- package/dist/client/assets/v4-DDdyfk2q.js +1 -0
- package/dist/client/assets/{vault-api-client-QjZ_T03l.js → vault-api-client-NS_EVHJ3.js} +2 -2
- package/dist/client/assets/vault-paths-BT-6nztu.js +1 -0
- package/dist/client/assets/venn.esm-C5rDfA9t.js +7 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-DgHr6cJD.js +28 -0
- package/dist/client/assets/vennDiagram-UO4OBE2U-BRwLn2Q1.js +28 -0
- package/dist/client/assets/{verilog-7LoJAqYT.js → verilog-CjI9Y6RI.js} +1 -1
- package/dist/client/assets/wardley-WFR3VGLG-BdwDpX_I.js +1 -0
- package/dist/client/assets/wardley-WFR3VGLG-Y7xty_3m.js +1 -0
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-BbSlUwuM.js → wardleyDiagram-VM6X3IG4-9A60XZis.js} +3 -3
- package/dist/client/assets/wardleyDiagram-VNRHLVJA-B_tMcVFG.js +78 -0
- package/dist/client/assets/wiki-link-resolver-Dch88erO.js +1 -0
- package/dist/client/assets/{worker-engine-m0rlHn8R-eSDcDGEI.js → worker-engine-BCCrxWYm-CX0qJ_cG.js} +1 -1
- package/dist/client/assets/{workspace-sync-client-D4nblH_2.js → workspace-sync-client-BrMtf6zN.js} +1 -1
- package/dist/client/assets/xychartDiagram-PMCCYNJV-fRpZ1MA5.js +7 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-D00iy-wB.js +7 -0
- package/dist/client/assets/{yaml-9ltHPDNO.js → yaml-BcZaqAz8.js} +1 -1
- package/dist/client/assets/{yjs-provider-reset-guard-R43MnLNc.js → yjs-provider-reset-guard-DpntzUDR.js} +1 -1
- package/dist/client/drawio-editor.html +8 -7
- package/dist/client/excalidraw-editor.html +41 -34
- package/dist/client/export-document.html +4 -3
- package/dist/client/index.html +32 -14
- package/package.json +22 -19
- package/src/client/app/drawio-editor.html +1 -0
- package/src/client/app/excalidraw-editor.html +1 -0
- package/src/client/app/export-document-entry.js +1 -0
- package/src/client/app/export-document.html +1 -0
- package/src/client/app/index.html +30 -12
- package/src/client/app/main-entry.js +30 -4
- package/src/client/application/app-shell/ui-feature-shell.js +20 -1
- package/src/client/application/app-shell-elements.js +2 -0
- package/src/client/application/diagram-preview-hydrator.js +7 -0
- package/src/client/application/mermaid-preview-hydrator.js +89 -3
- package/src/client/application/preview-diagram-utils.js +1 -0
- package/src/client/application/preview-render-compiler.js +2 -0
- package/src/client/application/preview-render-executor.js +4 -1
- package/src/client/application/preview-render-profile.js +8 -12
- package/src/client/application/preview-renderer.js +3 -0
- package/src/client/bootstrap/collabmd-app-shell.js +19 -8
- package/src/client/browser-utils.js +22 -1
- package/src/client/domain/excalidraw-scene.js +0 -11
- package/src/client/domain/file-search.js +2 -1
- package/src/client/domain/highlight-runtime.js +30 -3
- package/src/client/domain/markdown-math.js +14 -0
- package/src/client/domain/runtime-paths.js +4 -0
- package/src/client/export/export-host.js +3 -7
- package/src/client/export/export-pipeline.js +208 -21
- package/src/client/infrastructure/browser-preferences-port.js +8 -0
- package/src/client/infrastructure/editor-session.js +20 -0
- package/src/client/infrastructure/editor-view-adapter.js +8 -7
- package/src/client/infrastructure/excalidraw-room-client.js +2 -45
- package/src/client/infrastructure/git-api-client.js +5 -0
- package/src/client/infrastructure/runtime-config.js +14 -0
- package/src/client/infrastructure/tab-activity-lock.js +8 -4
- package/src/client/infrastructure/webmcp-tool-registry.js +12 -5
- package/src/client/presentation/bases-preview-controller.js +2 -1
- package/src/client/presentation/comment-markdown-renderer.js +2 -0
- package/src/client/presentation/comment-ui-controller.js +21 -30
- package/src/client/presentation/create-menu-presenter.js +16 -18
- package/src/client/presentation/drawio-embed-controller.js +58 -8
- package/src/client/presentation/excalidraw-embed-controller.js +14 -4
- package/src/client/presentation/file-action-controller.js +21 -1
- package/src/client/presentation/file-explorer-controller.js +1 -0
- package/src/client/presentation/file-explorer-view.js +56 -8
- package/src/client/presentation/file-history-view-controller.js +6 -0
- package/src/client/presentation/git-diff-view-controller.js +3 -2
- package/src/client/presentation/git-panel-controller.js +6 -5
- package/src/client/presentation/image-lightbox-controller.js +7 -6
- package/src/client/presentation/outline-controller.js +0 -86
- package/src/client/presentation/quick-switcher-controller.js +50 -13
- package/src/client/presentation/scroll-sync-controller.js +69 -21
- package/src/client/presentation/vault-dashboard.js +63 -0
- package/src/client/styles/components/navigation.css +2 -2
- package/src/client/styles/deferred-collab.css +1 -0
- package/src/client/styles/deferred-preview.css +1 -0
- package/src/client/styles/features/diagram-preview.css +1 -0
- package/src/client/styles/features/preview-markdown.css +4 -4
- package/src/client/styles/foundation/themes.css +56 -271
- package/src/client/styles/foundation/utilities.css +2 -0
- package/src/client/styles/layout/editor-page.css +0 -1
- package/src/client/styles/layout/overlays.css +5 -0
- package/src/client/styles/layout/shell.css +158 -0
- package/src/client/styles/layout/sidebar.css +3 -0
- package/src/client/styles/surfaces/landing-page.css +260 -0
- package/src/domain/agent-tool-definitions.js +45 -13
- package/src/domain/collabmd-content-capabilities.js +59 -4
- package/src/domain/collaboration-protocol.js +2 -0
- package/src/domain/markdown-outline.js +35 -0
- package/src/server/application/agent-connection-service.js +6 -2
- package/src/server/application/agent-content-service.js +124 -56
- package/src/server/auth/create-auth-service.js +40 -12
- package/src/server/auth/session-cookie.js +49 -38
- package/src/server/config/env.js +40 -7
- package/src/server/domain/backlink-index.js +1 -11
- package/src/server/domain/bases/base-query-results.js +7 -3
- package/src/server/domain/bases/base-query-service.js +2 -7
- package/src/server/domain/collaboration/collaboration-room.js +54 -16
- package/src/server/domain/docx-exporter.js +256 -2
- package/src/server/domain/hosted-workspace-contract.js +7 -0
- package/src/server/domain/hosted-workspace.js +29 -62
- package/src/server/domain/ripgrep-search-service.js +44 -28
- package/src/server/infrastructure/git/diff-service.js +15 -11
- package/src/server/infrastructure/git/git-service.js +4 -0
- package/src/server/infrastructure/git/image-mime.js +4 -3
- package/src/server/infrastructure/git/status-service.js +10 -6
- package/src/server/infrastructure/http/create-git-api-query-handler.js +25 -0
- package/src/server/infrastructure/http/create-static-handler.js +3 -1
- package/src/server/infrastructure/http/create-vault-api-query-handler.js +14 -54
- package/src/server/infrastructure/http/http-response.js +2 -0
- package/src/server/infrastructure/persistence/hosted-metadata-store.js +42 -5
- package/src/server/infrastructure/persistence/path-utils.js +23 -3
- package/src/server/infrastructure/persistence/pull-backup-store.js +52 -42
- package/src/server/infrastructure/persistence/sidecar-store.js +7 -4
- package/src/server/infrastructure/persistence/vault-file-store.js +55 -168
- package/src/server/infrastructure/plantuml/plantuml-renderer.js +33 -0
- package/src/server/infrastructure/structurizr/structurizr-workspace-service.js +24 -10
- package/src/server/infrastructure/websocket/attach-collaboration-gateway.js +7 -3
- package/src/server/infrastructure/websocket/client-socket-session.js +32 -4
- package/src/server/infrastructure/workspace/file-system-sync-service.js +4 -2
- package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-Crf9Y3Q6.js +0 -1
- package/dist/client/assets/abnfDiagram-VCTEODGH-PuinKbSQ.js +0 -1
- package/dist/client/assets/architecture-7GRP2DOG-BMOPAkUC.js +0 -1
- package/dist/client/assets/architectureDiagram-5GKGNRK7-46hPkrZv.js +0 -36
- package/dist/client/assets/blockDiagram-I7D4REHJ-C1S5Bzf8.js +0 -129
- package/dist/client/assets/channel-jwdhnPiV.js +0 -1
- package/dist/client/assets/chunk-2E4U76K2-Ba8Wf22k.js +0 -1
- package/dist/client/assets/chunk-4HAMMTFA-Ht-73lsT.js +0 -62
- package/dist/client/assets/chunk-5XKZK2GL-D4UAZSOJ.js +0 -1
- package/dist/client/assets/chunk-75Z2AOVW-B2cZexqK.js +0 -2
- package/dist/client/assets/chunk-DU6HZSFF-C6d6PJfE.js +0 -127
- package/dist/client/assets/chunk-GMAD6QVW-DUfjx_d5.js +0 -72
- package/dist/client/assets/chunk-GVQU2GXP-D1l7oRGR.js +0 -1
- package/dist/client/assets/chunk-L3NEJ4N5-BmCVn4y-.js +0 -1
- package/dist/client/assets/chunk-OSK3NFVY-CWHXAmfx.js +0 -10
- package/dist/client/assets/chunk-POPQ4Y6H-B5yJIrZE.js +0 -1
- package/dist/client/assets/chunk-PWAF6VOD-B3gML4ps.js +0 -1
- package/dist/client/assets/chunk-TLUHSLCS-Yl7B0Vrz.js +0 -1
- package/dist/client/assets/chunk-ZNVOA63L-BmCQjhx-.js +0 -40
- package/dist/client/assets/classDiagram-ZZMXUADV-BRw9vo8U.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-BRw9vo8U.js +0 -1
- package/dist/client/assets/comment-markdown-renderer-B9_vPc3F.js +0 -1
- package/dist/client/assets/comment-thread-store-NNHqRVsX.js +0 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-Cm_QF_yb.js +0 -1
- package/dist/client/assets/cynefin-OW5HDTMX-7tP7QfM3.js +0 -1
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-BRoCEoZM.js +0 -62
- package/dist/client/assets/cytoscape.esm-B-NFISlW.js +0 -321
- package/dist/client/assets/dagre-PrKaheQc.js +0 -1
- package/dist/client/assets/deferred-collab-rBe4nuQ2.css +0 -1
- package/dist/client/assets/deferred-preview-pe7Iwwx3.css +0 -1
- package/dist/client/assets/diagram-UQ7AKVKN-JevUZuYi.js +0 -41
- package/dist/client/assets/diagram-VX7I27RA-pSD4HMh1.js +0 -24
- package/dist/client/assets/diagram-Z3DM3KII-D8r1_CIb.js +0 -24
- package/dist/client/assets/direct-engine-DdrQKpgq-B5zIoeQw.js +0 -5
- package/dist/client/assets/dist-B3HdUPsK.js +0 -1
- package/dist/client/assets/dist-BIRygGYH.js +0 -1
- package/dist/client/assets/dist-BPyOlNLY.js +0 -2
- package/dist/client/assets/dist-ByhQbe-x.js +0 -1
- package/dist/client/assets/dist-C5NkYKAa.js +0 -1
- package/dist/client/assets/dist-CEirJSxk.js +0 -1
- package/dist/client/assets/dist-CRnJ0D9h.js +0 -1
- package/dist/client/assets/dist-CyNrloSI.js +0 -1
- package/dist/client/assets/dist-D60_kdpQ.js +0 -1
- package/dist/client/assets/dist-Hdhj3L3t.js +0 -1
- package/dist/client/assets/dist-gRRhmB-2.js +0 -6
- package/dist/client/assets/dist-kWb2d1CH.js +0 -1
- package/dist/client/assets/dist-kiD2GIsD.js +0 -13
- package/dist/client/assets/dist-l-56SowH.js +0 -19
- package/dist/client/assets/dist-sLzRQQk7.js +0 -1
- package/dist/client/assets/ebnfDiagram-PWID7BFC-UJ0Fz5ci.js +0 -1
- package/dist/client/assets/editor-session-4Bn81iWm.js +0 -14
- package/dist/client/assets/embedded-editor-base-jK221GC8.css +0 -1
- package/dist/client/assets/eventmodeling-NTZA5JFV-BR2FzK4R.js +0 -1
- package/dist/client/assets/excalidrawEditor-WIuguTz7.js +0 -9
- package/dist/client/assets/export-page-AN-wI5p4.js +0 -56
- package/dist/client/assets/exportDocument-B7IagJhQ.css +0 -1
- package/dist/client/assets/exportDocument-B9xNKpQe.js +0 -2
- package/dist/client/assets/file-search-DDLyyLDU.js +0 -1
- package/dist/client/assets/flowDiagram-HODETNUW-kb1lUSBo.js +0 -1
- package/dist/client/assets/forth-Cezjo90N.js +0 -1
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-BBNzDfaV.js +0 -292
- package/dist/client/assets/gitGraph-4MIJSDKK-DYlXv_yJ.js +0 -1
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-Csf0Dm_1.js +0 -106
- package/dist/client/assets/graphlib-DS17s2tU.js +0 -1
- package/dist/client/assets/image-2QKV3NAF-BUbX0y5Y.js +0 -1
- package/dist/client/assets/index-BAmZnTFV.css +0 -1
- package/dist/client/assets/index-mWiw418b.js +0 -1111
- package/dist/client/assets/info-A6RAGUB7-BlU-8_xu.js +0 -1
- package/dist/client/assets/infoDiagram-27XIBGKW-Bzy6kCbb.js +0 -2
- package/dist/client/assets/javascript-BWjar7HY.js +0 -1
- package/dist/client/assets/javascript-D-FtdkNC.js +0 -1
- package/dist/client/assets/jsx-runtime-BpzPEenQ.js +0 -1
- package/dist/client/assets/line-DSWLHgpx.js +0 -1
- package/dist/client/assets/linear-n-3HSMUF.js +0 -1
- package/dist/client/assets/markdown-it-CocJWnjv.js +0 -13
- package/dist/client/assets/mermaid.core-C_FK-7n4.js +0 -1
- package/dist/client/assets/mermaid.core-D0cMM4Rl.js +0 -10
- package/dist/client/assets/packet-AYTQ26CC-BSJEH9Lb.js +0 -1
- package/dist/client/assets/pegDiagram-XKGWAZYB-DS6Ab21R.js +0 -1
- package/dist/client/assets/percentages-Q7USCRWZ-DWE6uvTs.js +0 -1
- package/dist/client/assets/pie-WAS4IAKB-qxv01Y8W.js +0 -1
- package/dist/client/assets/pieDiagram-E7YTZNPT-BbFe6Tgs.js +0 -39
- package/dist/client/assets/preview-render-compiler-C_7J7eia.js +0 -43
- package/dist/client/assets/preview-render-compiler-DzJ1KR_M.js +0 -1
- package/dist/client/assets/preview-render-worker-1DoIDllV.js +0 -59
- package/dist/client/assets/prod-D5TxmmoB.js +0 -1
- package/dist/client/assets/prod-pbFU4TaM.js +0 -145
- package/dist/client/assets/quick-switcher-controller-CUajuy78.js +0 -1
- package/dist/client/assets/radar-RG4KPBEZ-B6h6pWOs.js +0 -1
- package/dist/client/assets/railroad-74A4TZTK-CGtTWdGc.js +0 -1
- package/dist/client/assets/railroad-abnf-HS5TGJTU-Cq7y22IA.js +0 -1
- package/dist/client/assets/railroad-ebnf-LZEXJU2U-V0aQVv9m.js +0 -1
- package/dist/client/assets/railroad-peg-WCYAUIDC-BQiIsX_p.js +0 -1
- package/dist/client/assets/railroadDiagram-O6MQD6OU-CUQKqbCK.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/sankeyDiagram-P5KCCOFB-CcbMqrlQ.js +0 -40
- package/dist/client/assets/sl-SI-JRML4FIH-D53L_0S2.js +0 -6
- package/dist/client/assets/solr-BBopId9w.js +0 -1
- package/dist/client/assets/src-oBChb5qS.js +0 -1
- package/dist/client/assets/stateDiagram-D77RDMKH-DNi924hh.js +0 -1
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-C62JEwak.js +0 -1
- package/dist/client/assets/sv-SE-4ZPKFFXF-DT-G7RCI.js +0 -12
- package/dist/client/assets/swimlanes-42K2YHIH-ColgjSH4.js +0 -1
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-B9UZhEj4.js +0 -8
- package/dist/client/assets/th-TH-P7CTMGDK-6sy0NO7K.js +0 -1
- package/dist/client/assets/treeView-Q6P3EWNA-BTTYcvrF.js +0 -1
- package/dist/client/assets/treemap-WGGIJYW6-Cg7tyfH8.js +0 -1
- package/dist/client/assets/vennDiagram-4TSXK5OY-C5taziCX.js +0 -34
- package/dist/client/assets/wardley-WFR3VGLG-C6N1rULY.js +0 -1
- package/dist/client/assets/wiki-link-resolver-C2P_WmTV.js +0 -1
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-D06X1arY.js +0 -7
- package/src/server/domain/collaboration/protocol.js +0 -6
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
} from '../../domain/excalidraw-agent-scene.js';
|
|
17
17
|
import { inspectAgentExcalidrawScene, renderAgentExcalidrawSvg } from '../../domain/excalidraw-agent-verification.js';
|
|
18
18
|
import { getVaultFileKind, isBaseFilePath } from '../../domain/file-kind.js';
|
|
19
|
+
import { collectMarkdownOutline } from '../../domain/markdown-outline.js';
|
|
19
20
|
import { isWholeWordMatch } from '../../domain/literal-text-search.js';
|
|
20
21
|
import { createWikiTargetIndex } from '../../domain/wiki-link-resolver.js';
|
|
21
22
|
import {
|
|
@@ -27,6 +28,7 @@ import {
|
|
|
27
28
|
collectMarkdownImageSources,
|
|
28
29
|
collectMarkdownReferences,
|
|
29
30
|
} from '../domain/markdown-reference-extractor.js';
|
|
31
|
+
import { searchExcalidrawSceneText } from '../domain/ripgrep-search-service.js';
|
|
30
32
|
import { compareWorkspacePaths, normalizeWorkspacePath } from '../domain/workspace-state.js';
|
|
31
33
|
|
|
32
34
|
const MAX_DOCUMENT_CHARACTERS = 200_000;
|
|
@@ -337,8 +339,8 @@ export class AgentContentService {
|
|
|
337
339
|
|
|
338
340
|
async searchVault(actor, {
|
|
339
341
|
kinds = [],
|
|
340
|
-
limit =
|
|
341
|
-
maxSnippetsPerFile =
|
|
342
|
+
limit = 10,
|
|
343
|
+
maxSnippetsPerFile = 2,
|
|
342
344
|
prefix = '',
|
|
343
345
|
query = '',
|
|
344
346
|
wholeWord = false,
|
|
@@ -348,85 +350,124 @@ export class AgentContentService {
|
|
|
348
350
|
const normalizedQuery = String(query ?? '').trim().slice(0, 500);
|
|
349
351
|
const normalizedPrefix = normalizeWorkspacePath(prefix);
|
|
350
352
|
const kindFilter = new Set(Array.isArray(kinds) ? kinds : []);
|
|
351
|
-
const snippetLimit = clampInteger(maxSnippetsPerFile,
|
|
352
|
-
const
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
maxSnippetsPerFile: snippetLimit,
|
|
356
|
-
prefix: normalizedPrefix,
|
|
357
|
-
query: normalizedQuery,
|
|
358
|
-
wholeWord,
|
|
359
|
-
signal,
|
|
360
|
-
});
|
|
361
|
-
if (normalizedQuery.length < 2) return result;
|
|
362
|
-
|
|
353
|
+
const snippetLimit = clampInteger(maxSnippetsPerFile, 2, 1, 10);
|
|
354
|
+
const pageSize = clampInteger(limit, 10, 1, 50);
|
|
355
|
+
const livePaths = new Set();
|
|
356
|
+
let liveIncomplete = false;
|
|
363
357
|
const liveFiles = [];
|
|
364
|
-
for (const [path, room] of this.roomRegistry?.getRooms?.() ?? []) {
|
|
358
|
+
for (const [path, room] of normalizedQuery.length >= 2 ? this.roomRegistry?.getRooms?.() ?? [] : []) {
|
|
365
359
|
const kind = getVaultFileKind(path);
|
|
366
360
|
if (
|
|
367
361
|
!isAgentReadablePath(path)
|
|
368
|
-
|| !room.isHydrated?.()
|
|
369
362
|
|| (normalizedPrefix && path !== normalizedPrefix && !path.startsWith(`${normalizedPrefix}/`))
|
|
370
363
|
|| (kindFilter.size > 0 && !kindFilter.has(kind))
|
|
371
364
|
) continue;
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
365
|
+
livePaths.add(path);
|
|
366
|
+
const content = room.isHydrated?.()
|
|
367
|
+
? room.readEditableContent?.() ?? room.getPersistedContent?.()
|
|
368
|
+
: null;
|
|
369
|
+
if (content == null || content.length > MAX_AGENT_READ_SOURCE_CHARACTERS) {
|
|
370
|
+
liveIncomplete = true;
|
|
371
|
+
continue;
|
|
372
|
+
}
|
|
373
|
+
signal?.throwIfAborted();
|
|
374
|
+
let live;
|
|
375
|
+
if (kind === 'excalidraw') {
|
|
376
|
+
let scene;
|
|
377
|
+
try {
|
|
378
|
+
scene = JSON.parse(content);
|
|
379
|
+
} catch {
|
|
380
|
+
liveIncomplete = true;
|
|
381
|
+
continue;
|
|
382
|
+
}
|
|
383
|
+
live = searchExcalidrawSceneText(scene, {
|
|
384
|
+
query: normalizedQuery, maxSnippetsPerFile: snippetLimit, wholeWord,
|
|
385
|
+
});
|
|
386
|
+
} else {
|
|
387
|
+
live = searchLiveText(content, normalizedQuery, snippetLimit, wholeWord);
|
|
388
|
+
}
|
|
376
389
|
if (live.matchCount > 0) {
|
|
377
390
|
liveFiles.push({ file: path, kind, ...live });
|
|
378
391
|
}
|
|
379
392
|
}
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
393
|
+
const result = await this.searchService.search({
|
|
394
|
+
excludedPaths: [...livePaths],
|
|
395
|
+
kinds: [...kindFilter],
|
|
396
|
+
limit: pageSize,
|
|
397
|
+
maxSnippetsPerFile: snippetLimit,
|
|
398
|
+
prefix: normalizedPrefix,
|
|
399
|
+
query: normalizedQuery,
|
|
400
|
+
wholeWord,
|
|
401
|
+
signal,
|
|
402
|
+
});
|
|
403
|
+
const candidates = [...result.files.filter(({ file }) => !livePaths.has(file)), ...liveFiles]
|
|
404
|
+
.sort((left, right) => compareWorkspacePaths(left.file, right.file));
|
|
405
|
+
const files = candidates.slice(0, pageSize);
|
|
386
406
|
return {
|
|
387
407
|
...result,
|
|
388
408
|
files,
|
|
389
409
|
matchCount: files.reduce((sum, file) => sum + file.matchCount, 0),
|
|
390
|
-
truncated: result.truncated ||
|
|
410
|
+
truncated: result.truncated || liveIncomplete || candidates.length > files.length
|
|
411
|
+
|| files.some((file) => file.truncated),
|
|
391
412
|
};
|
|
392
413
|
}
|
|
393
414
|
|
|
394
|
-
async readDocument(actor, { lineCount =
|
|
415
|
+
async readDocument(actor, { lineCount = 80, mode = 'content', path, startLine = 1 } = {}) {
|
|
395
416
|
requireScope(actor, 'vault:read');
|
|
396
417
|
const normalizedPath = normalizeWorkspacePath(path);
|
|
418
|
+
const kind = getVaultFileKind(normalizedPath);
|
|
397
419
|
if (!isAgentReadablePath(normalizedPath)) {
|
|
398
420
|
throw createAgentContentError('AGENT_UNSUPPORTED_DOCUMENT', 'Document type is not readable by agents', 400);
|
|
399
421
|
}
|
|
422
|
+
if (!['content', 'outline'].includes(mode) || (mode === 'outline' && kind !== 'markdown')) {
|
|
423
|
+
throw createAgentContentError('AGENT_INPUT_INVALID', 'Outline mode requires a Markdown document', 400);
|
|
424
|
+
}
|
|
400
425
|
const content = await this.readCurrentContent(normalizedPath);
|
|
401
426
|
if (content.length > MAX_AGENT_READ_SOURCE_CHARACTERS) {
|
|
402
427
|
throw createAgentContentError('AGENT_DOCUMENT_TOO_LARGE', 'Document is too large for agent reading', 413);
|
|
403
428
|
}
|
|
404
429
|
const lines = content.split('\n');
|
|
405
430
|
const start = clampInteger(startLine, 1, 1, Math.max(lines.length, 1));
|
|
406
|
-
const count = clampInteger(lineCount,
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
characterTruncated = true;
|
|
413
|
-
let returnedLineCount = 1;
|
|
414
|
-
for (let index = 0; index < selected.length; index += 1) {
|
|
415
|
-
if (selected.charCodeAt(index) === 10) returnedLineCount += 1;
|
|
416
|
-
}
|
|
417
|
-
if (selected.endsWith('\n')) returnedLineCount -= 1;
|
|
418
|
-
endLine = Math.min(start + Math.max(returnedLineCount, 1) - 1, lines.length);
|
|
419
|
-
}
|
|
420
|
-
return {
|
|
421
|
-
content: selected,
|
|
422
|
-
endLine,
|
|
423
|
-
kind: getVaultFileKind(normalizedPath),
|
|
431
|
+
const count = clampInteger(lineCount, 80, 1, MAX_READ_LINES);
|
|
432
|
+
const result = {
|
|
433
|
+
content: '',
|
|
434
|
+
endLine: lines.length,
|
|
435
|
+
kind,
|
|
436
|
+
nextStartLine: null,
|
|
424
437
|
path: normalizedPath,
|
|
425
438
|
revision: await createEditableContentRevision(content),
|
|
426
439
|
startLine: start,
|
|
427
440
|
totalLines: lines.length,
|
|
428
|
-
truncated:
|
|
441
|
+
truncated: false,
|
|
429
442
|
};
|
|
443
|
+
if (mode === 'outline') {
|
|
444
|
+
const headings = collectMarkdownOutline(content).filter(({ line }) => line >= start);
|
|
445
|
+
result.headings = headings.slice(0, count);
|
|
446
|
+
if (headings.length > count) {
|
|
447
|
+
result.endLine = result.headings.at(-1).line;
|
|
448
|
+
result.nextStartLine = headings[count].line;
|
|
449
|
+
result.truncated = true;
|
|
450
|
+
}
|
|
451
|
+
return result;
|
|
452
|
+
}
|
|
453
|
+
const selected = [];
|
|
454
|
+
let characters = 0;
|
|
455
|
+
for (const line of lines.slice(start - 1, start - 1 + count)) {
|
|
456
|
+
const size = line.length + (selected.length ? 1 : 0);
|
|
457
|
+
if (characters + size > MAX_READ_CHARACTERS) {
|
|
458
|
+
if (selected.length === 0) {
|
|
459
|
+
throw createAgentContentError('AGENT_DOCUMENT_LINE_TOO_LARGE', 'This line exceeds the 100000-character read limit; read a different line or use Markdown outline mode', 413);
|
|
460
|
+
}
|
|
461
|
+
break;
|
|
462
|
+
}
|
|
463
|
+
selected.push(line);
|
|
464
|
+
characters += size;
|
|
465
|
+
}
|
|
466
|
+
result.content = selected.join('\n');
|
|
467
|
+
result.endLine = start + selected.length - 1;
|
|
468
|
+
result.truncated = result.endLine < lines.length;
|
|
469
|
+
result.nextStartLine = result.truncated ? result.endLine + 1 : null;
|
|
470
|
+
return result;
|
|
430
471
|
}
|
|
431
472
|
async inspectDocumentReferences(actor, { path } = {}) {
|
|
432
473
|
requireScope(actor, 'vault:read');
|
|
@@ -438,13 +479,22 @@ export class AgentContentService {
|
|
|
438
479
|
if (content.length > MAX_AGENT_READ_SOURCE_CHARACTERS) {
|
|
439
480
|
throw createAgentContentError('AGENT_DOCUMENT_TOO_LARGE', 'Document is too large for agent inspection', 413);
|
|
440
481
|
}
|
|
482
|
+
return {
|
|
483
|
+
...this.inspectMarkdownContent(normalizedPath, content),
|
|
484
|
+
backlinks: await this.backlinkIndex?.getBacklinks?.(normalizedPath) ?? [],
|
|
485
|
+
path: normalizedPath,
|
|
486
|
+
revision: await createEditableContentRevision(content),
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
inspectMarkdownContent(normalizedPath, content) {
|
|
441
491
|
const entries = Array.from(this.workspaceMutationCoordinator?.workspaceState?.entries?.values?.() ?? []);
|
|
442
492
|
const filePaths = entries
|
|
443
493
|
.filter((entry) => entry.nodeType !== 'directory')
|
|
444
494
|
.map((entry) => entry.path);
|
|
445
495
|
const references = collectMarkdownReferences(content, {
|
|
446
496
|
sourceFilePath: normalizedPath,
|
|
447
|
-
wikiTargetIndex: createWikiTargetIndex(filePaths),
|
|
497
|
+
wikiTargetIndex: createWikiTargetIndex([...filePaths, normalizedPath]),
|
|
448
498
|
});
|
|
449
499
|
const toPublicReference = (reference) => ({
|
|
450
500
|
exists: Boolean(reference.resolvedPath),
|
|
@@ -468,10 +518,7 @@ export class AgentContentService {
|
|
|
468
518
|
};
|
|
469
519
|
});
|
|
470
520
|
return {
|
|
471
|
-
backlinks: await this.backlinkIndex?.getBacklinks?.(normalizedPath) ?? [],
|
|
472
521
|
embeds: references.filter(({ isEmbed }) => isEmbed).map(toPublicReference),
|
|
473
|
-
path: normalizedPath,
|
|
474
|
-
revision: await createEditableContentRevision(content),
|
|
475
522
|
videos,
|
|
476
523
|
wikiLinks: references.filter(({ isEmbed }) => !isEmbed).map(toPublicReference),
|
|
477
524
|
};
|
|
@@ -479,6 +526,10 @@ export class AgentContentService {
|
|
|
479
526
|
|
|
480
527
|
async validateDocument(actor, { path } = {}) {
|
|
481
528
|
const inspected = await this.inspectDocumentReferences(actor, { path });
|
|
529
|
+
return { ...this.validateMarkdownReferences(inspected), path: inspected.path, revision: inspected.revision };
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
validateMarkdownReferences(inspected) {
|
|
482
533
|
const issues = [];
|
|
483
534
|
inspected.wikiLinks.filter(({ exists }) => !exists).forEach((reference) => {
|
|
484
535
|
issues.push({
|
|
@@ -506,8 +557,6 @@ export class AgentContentService {
|
|
|
506
557
|
});
|
|
507
558
|
return {
|
|
508
559
|
issues,
|
|
509
|
-
path: inspected.path,
|
|
510
|
-
revision: inspected.revision,
|
|
511
560
|
valid: issues.length === 0,
|
|
512
561
|
};
|
|
513
562
|
}
|
|
@@ -587,12 +636,13 @@ export class AgentContentService {
|
|
|
587
636
|
}
|
|
588
637
|
|
|
589
638
|
|
|
590
|
-
async applyTextEdits(actor, { path, replacements, revision } = {}) {
|
|
639
|
+
async applyTextEdits(actor, { path, replacements, revision, validate = false } = {}) {
|
|
591
640
|
requireScope(actor, 'vault:edit');
|
|
592
641
|
const normalizedPath = normalizeWorkspacePath(path);
|
|
593
642
|
if (!isAgentEditablePath(normalizedPath)) {
|
|
594
643
|
throw createAgentContentError('AGENT_UNSUPPORTED_DOCUMENT', 'Document type is not editable by agents', 400);
|
|
595
644
|
}
|
|
645
|
+
this.requireMarkdownValidation(normalizedPath, validate);
|
|
596
646
|
return this.runForPath(normalizedPath, async () => {
|
|
597
647
|
const content = await this.readCurrentContent(normalizedPath);
|
|
598
648
|
if (content.length > MAX_DOCUMENT_CHARACTERS) {
|
|
@@ -619,7 +669,13 @@ export class AgentContentService {
|
|
|
619
669
|
const nextContent = applyExactTextChanges(content, changes);
|
|
620
670
|
assertValidAgentBaseContent(normalizedPath, nextContent);
|
|
621
671
|
const room = this.roomRegistry?.get?.(normalizedPath);
|
|
672
|
+
const validation = validate
|
|
673
|
+
? this.validateMarkdownReferences(this.inspectMarkdownContent(normalizedPath, nextContent))
|
|
674
|
+
: null;
|
|
622
675
|
if (room) {
|
|
676
|
+
if (room.readEditableContent() !== content) {
|
|
677
|
+
throw createAgentContentError('AGENT_REVISION_CONFLICT', 'Document changed; read it again before editing', 409);
|
|
678
|
+
}
|
|
623
679
|
room.applyExactTextChanges(changes, {
|
|
624
680
|
origin: createCollaborationOrigin(actor),
|
|
625
681
|
});
|
|
@@ -636,7 +692,8 @@ export class AgentContentService {
|
|
|
636
692
|
return {
|
|
637
693
|
path: normalizedPath,
|
|
638
694
|
replacementCount: changes.length,
|
|
639
|
-
revision: await createEditableContentRevision(
|
|
695
|
+
revision: await createEditableContentRevision(nextContent),
|
|
696
|
+
...(validation ? { validation } : {}),
|
|
640
697
|
};
|
|
641
698
|
});
|
|
642
699
|
}
|
|
@@ -795,18 +852,22 @@ export class AgentContentService {
|
|
|
795
852
|
});
|
|
796
853
|
}
|
|
797
854
|
|
|
798
|
-
async createDocument(actor, { content = '', path } = {}) {
|
|
855
|
+
async createDocument(actor, { content = '', path, validate = false } = {}) {
|
|
799
856
|
requireScope(actor, 'vault:edit');
|
|
800
857
|
const normalizedPath = normalizeWorkspacePath(path);
|
|
801
858
|
if (!isAgentCreatablePath(normalizedPath)) {
|
|
802
859
|
throw createAgentContentError('AGENT_UNSUPPORTED_DOCUMENT', 'Document type cannot be created by agents', 400);
|
|
803
860
|
}
|
|
861
|
+
this.requireMarkdownValidation(normalizedPath, validate);
|
|
804
862
|
const normalizedContent = normalizeEditableText(content);
|
|
805
863
|
if (normalizedContent.length > MAX_DOCUMENT_CHARACTERS) {
|
|
806
864
|
throw createAgentContentError('AGENT_DOCUMENT_TOO_LARGE', 'Document is too large for agent creation', 413);
|
|
807
865
|
}
|
|
808
866
|
assertValidAgentBaseContent(normalizedPath, normalizedContent);
|
|
809
867
|
return this.runForPath(normalizedPath, async () => {
|
|
868
|
+
const validation = validate
|
|
869
|
+
? this.validateMarkdownReferences(this.inspectMarkdownContent(normalizedPath, normalizedContent))
|
|
870
|
+
: null;
|
|
810
871
|
const result = await this.workspaceMutationCoordinator.createFile({
|
|
811
872
|
content: normalizedContent,
|
|
812
873
|
origin: getMutationOrigin(actor),
|
|
@@ -827,10 +888,17 @@ export class AgentContentService {
|
|
|
827
888
|
kind: getVaultFileKind(normalizedPath),
|
|
828
889
|
path: normalizedPath,
|
|
829
890
|
revision: await createEditableContentRevision(normalizedContent),
|
|
891
|
+
...(validation ? { validation } : {}),
|
|
830
892
|
};
|
|
831
893
|
});
|
|
832
894
|
}
|
|
833
895
|
|
|
896
|
+
requireMarkdownValidation(path, validate) {
|
|
897
|
+
if (validate && getVaultFileKind(path) !== 'markdown') {
|
|
898
|
+
throw createAgentContentError('AGENT_INPUT_INVALID', 'Reference validation requires a Markdown document', 400);
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
|
|
834
902
|
getSyntax(actor, { kind = '' } = {}) {
|
|
835
903
|
requireScope(actor, 'vault:read');
|
|
836
904
|
if (!kind) return { capabilities: listCollabMdContentCapabilities() };
|
|
@@ -3,9 +3,6 @@ import {
|
|
|
3
3
|
AUTH_STRATEGY_NONE,
|
|
4
4
|
AUTH_STRATEGY_OIDC,
|
|
5
5
|
AUTH_STRATEGY_PASSWORD,
|
|
6
|
-
SUPPORTED_AUTH_STRATEGIES,
|
|
7
|
-
createRandomAuthPassword,
|
|
8
|
-
createRandomSessionSecret,
|
|
9
6
|
} from './auth-constants.js';
|
|
10
7
|
import {
|
|
11
8
|
buildClientConfig,
|
|
@@ -18,14 +15,27 @@ import {
|
|
|
18
15
|
createPasswordStrategy,
|
|
19
16
|
} from './auth-strategies.js';
|
|
20
17
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
18
|
+
function resolveRequestProtocol(req) {
|
|
19
|
+
const forwarded = String(req.headers['x-forwarded-proto'] ?? '').split(',')[0].trim().toLowerCase();
|
|
20
|
+
if (forwarded === 'https' || forwarded === 'http') {
|
|
21
|
+
return `${forwarded}:`;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
try {
|
|
25
|
+
const cfVisitor = JSON.parse(req.headers['cf-visitor'] ?? '');
|
|
26
|
+
if (String(cfVisitor?.scheme).toLowerCase() === 'https') {
|
|
27
|
+
return 'https:';
|
|
28
|
+
}
|
|
29
|
+
} catch {
|
|
30
|
+
// Non-Cloudflare requests carry no cf-visitor payload.
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (req.socket?.encrypted) {
|
|
34
|
+
return 'https:';
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return 'http:';
|
|
38
|
+
}
|
|
29
39
|
|
|
30
40
|
export function createAuthService(config) {
|
|
31
41
|
const authConfig = config.auth ?? { strategy: AUTH_STRATEGY_NONE };
|
|
@@ -72,8 +82,26 @@ export function createAuthService(config) {
|
|
|
72
82
|
},
|
|
73
83
|
|
|
74
84
|
authorizeWebSocketRequest(req) {
|
|
85
|
+
// Browsers always send Origin; clients without it still need authentication.
|
|
86
|
+
if (req.headers.origin !== undefined) {
|
|
87
|
+
let allowed = false;
|
|
88
|
+
try {
|
|
89
|
+
const protocol = resolveRequestProtocol(req);
|
|
90
|
+
const expectedOrigin = authConfig.oidc?.publicBaseUrl
|
|
91
|
+
? new URL(authConfig.oidc.publicBaseUrl).origin
|
|
92
|
+
: new URL(`${protocol}//${req.headers.host}`).origin;
|
|
93
|
+
allowed = req.headers.origin === expectedOrigin;
|
|
94
|
+
} catch {
|
|
95
|
+
// Malformed or opaque origins are forbidden.
|
|
96
|
+
}
|
|
97
|
+
if (!allowed) {
|
|
98
|
+
return { ok: false, statusCode: 403, statusMessage: 'Forbidden', body: 'Origin not allowed' };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
75
101
|
if (strategy.isAuthenticated(req)) {
|
|
76
|
-
|
|
102
|
+
const expiresAt = authConfig.strategy === AUTH_STRATEGY_NONE
|
|
103
|
+
? null : sessionCookieManager.readSession(req)?.expiresAt;
|
|
104
|
+
return { ok: true, expiresAt: Number.isFinite(expiresAt) ? expiresAt : null };
|
|
77
105
|
}
|
|
78
106
|
|
|
79
107
|
return {
|
|
@@ -1,19 +1,11 @@
|
|
|
1
1
|
import { createHmac, timingSafeEqual } from 'node:crypto';
|
|
2
2
|
|
|
3
3
|
function decodeBase64Url(value) {
|
|
4
|
-
|
|
5
|
-
.replace(/-/g, '+')
|
|
6
|
-
.replace(/_/g, '/');
|
|
7
|
-
const paddingLength = (4 - (normalized.length % 4)) % 4;
|
|
8
|
-
return Buffer.from(`${normalized}${'='.repeat(paddingLength)}`, 'base64');
|
|
4
|
+
return Buffer.from(String(value ?? ''), 'base64url');
|
|
9
5
|
}
|
|
10
6
|
|
|
11
7
|
function encodeBase64Url(value) {
|
|
12
|
-
return Buffer.from(value)
|
|
13
|
-
.toString('base64')
|
|
14
|
-
.replace(/\+/g, '-')
|
|
15
|
-
.replace(/\//g, '_')
|
|
16
|
-
.replace(/=+$/g, '');
|
|
8
|
+
return Buffer.from(value).toString('base64url');
|
|
17
9
|
}
|
|
18
10
|
|
|
19
11
|
function parseCookieHeader(headerValue) {
|
|
@@ -78,6 +70,44 @@ export function createSignedCookieManager({
|
|
|
78
70
|
cookiePath = '/',
|
|
79
71
|
secret,
|
|
80
72
|
}) {
|
|
73
|
+
// Authenticating one request can verify the same cookie several times
|
|
74
|
+
// (strategy check + expiry read + user lookup). Memoize per request object;
|
|
75
|
+
// the cookie-header check keeps it correct if headers ever change.
|
|
76
|
+
const readCache = new WeakMap();
|
|
77
|
+
|
|
78
|
+
function readSignedCookie(req) {
|
|
79
|
+
const token = parseCookieHeader(req.headers.cookie).get(cookieName);
|
|
80
|
+
if (!token) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const separatorIndex = token.lastIndexOf('.');
|
|
85
|
+
if (separatorIndex <= 0) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const encodedPayload = token.slice(0, separatorIndex);
|
|
90
|
+
const encodedSignature = token.slice(separatorIndex + 1);
|
|
91
|
+
|
|
92
|
+
try {
|
|
93
|
+
const expectedSignature = createSignature(encodedPayload, secret);
|
|
94
|
+
const actualSignature = decodeBase64Url(encodedSignature);
|
|
95
|
+
|
|
96
|
+
if (actualSignature.length !== expectedSignature.length) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (!timingSafeEqual(actualSignature, expectedSignature)) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const payloadBuffer = decodeBase64Url(encodedPayload);
|
|
105
|
+
const payload = JSON.parse(payloadBuffer.toString('utf8'));
|
|
106
|
+
return payload && typeof payload === 'object' ? payload : null;
|
|
107
|
+
} catch {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
81
111
|
function createCookieAttributes(req, { expires = null } = {}) {
|
|
82
112
|
const attributes = [
|
|
83
113
|
'HttpOnly',
|
|
@@ -115,37 +145,18 @@ export function createSignedCookieManager({
|
|
|
115
145
|
},
|
|
116
146
|
|
|
117
147
|
read(req) {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
const separatorIndex = token.lastIndexOf('.');
|
|
124
|
-
if (separatorIndex <= 0) {
|
|
125
|
-
return null;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
const encodedPayload = token.slice(0, separatorIndex);
|
|
129
|
-
const encodedSignature = token.slice(separatorIndex + 1);
|
|
130
|
-
|
|
131
|
-
try {
|
|
132
|
-
const expectedSignature = createSignature(encodedPayload, secret);
|
|
133
|
-
const actualSignature = decodeBase64Url(encodedSignature);
|
|
134
|
-
|
|
135
|
-
if (actualSignature.length !== expectedSignature.length) {
|
|
136
|
-
return null;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
if (!timingSafeEqual(actualSignature, expectedSignature)) {
|
|
140
|
-
return null;
|
|
148
|
+
if (req && typeof req === 'object') {
|
|
149
|
+
const cached = readCache.get(req);
|
|
150
|
+
if (cached !== undefined) {
|
|
151
|
+
return cached;
|
|
141
152
|
}
|
|
142
153
|
|
|
143
|
-
const
|
|
144
|
-
|
|
145
|
-
return
|
|
146
|
-
} catch {
|
|
147
|
-
return null;
|
|
154
|
+
const result = readSignedCookie(req);
|
|
155
|
+
readCache.set(req, result);
|
|
156
|
+
return result;
|
|
148
157
|
}
|
|
158
|
+
|
|
159
|
+
return readSignedCookie(req);
|
|
149
160
|
},
|
|
150
161
|
};
|
|
151
162
|
}
|
package/src/server/config/env.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { basename, isAbsolute, relative, resolve } from 'path';
|
|
2
|
-
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { lstatSync, readdirSync, readFileSync } from 'node:fs';
|
|
3
3
|
import { fileURLToPath } from 'url';
|
|
4
4
|
|
|
5
5
|
import {
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
SUPPORTED_AUTH_STRATEGIES,
|
|
10
10
|
createRandomAuthPassword,
|
|
11
11
|
createRandomSessionSecret,
|
|
12
|
-
} from '../auth/
|
|
12
|
+
} from '../auth/auth-constants.js';
|
|
13
13
|
import { loadBuildInfo } from './build-info.js';
|
|
14
14
|
import { isPerfLoggingEnabled } from './perf-logging.js';
|
|
15
15
|
|
|
@@ -222,11 +222,11 @@ export function parseVaultList(rawValue) {
|
|
|
222
222
|
|
|
223
223
|
export function resolveConfiguredVaults(overrides = {}, env = process.env) {
|
|
224
224
|
if (Array.isArray(overrides.vaults)) {
|
|
225
|
-
return overrides.vaults.map(({ id, dir, repoUrl }) => {
|
|
225
|
+
return overrides.vaults.map(({ id, dir, name, repoUrl }) => {
|
|
226
226
|
if (!VAULT_ID_PATTERN.test(String(id ?? ''))) {
|
|
227
227
|
throw new Error(`Invalid vault id "${id}". ${VAULT_ID_HINT}`);
|
|
228
228
|
}
|
|
229
|
-
return { id, dir: resolve(dir), repoUrl: normalizeOptionalString(repoUrl) };
|
|
229
|
+
return { id, dir: resolve(dir), ...(name ? { name: normalizeOptionalString(name) } : {}), repoUrl: normalizeOptionalString(repoUrl) };
|
|
230
230
|
});
|
|
231
231
|
}
|
|
232
232
|
// ponytail: explicit directory (CLI positional) wins over the operator list
|
|
@@ -235,13 +235,34 @@ export function resolveConfiguredVaults(overrides = {}, env = process.env) {
|
|
|
235
235
|
return [{ id: basename(dir), dir }];
|
|
236
236
|
}
|
|
237
237
|
const rawList = normalizeOptionalString(env.COLLABMD_VAULTS);
|
|
238
|
-
|
|
238
|
+
const discovery = normalizeOptionalString(env.COLLABMD_VAULT_DISCOVERY);
|
|
239
|
+
if (!rawList && !discovery) {
|
|
239
240
|
const dir = resolveConfiguredVaultDir(overrides, env);
|
|
240
241
|
return [{ id: basename(dir), dir }];
|
|
241
242
|
}
|
|
242
|
-
|
|
243
|
+
let vaults;
|
|
244
|
+
if (rawList) {
|
|
245
|
+
vaults = parseVaultList(rawList);
|
|
246
|
+
} else {
|
|
247
|
+
if (!['all', 'marked'].includes(discovery)) {
|
|
248
|
+
throw new Error('COLLABMD_VAULT_DISCOVERY must be "all" or "marked".');
|
|
249
|
+
}
|
|
250
|
+
const root = resolve(env.COLLABMD_VAULT_DIR || '.');
|
|
251
|
+
// ponytail: discover immediate real directories at startup; restart to pick up additions.
|
|
252
|
+
vaults = readdirSync(root, { withFileTypes: true })
|
|
253
|
+
.filter((entry) => entry.isDirectory() && !entry.name.startsWith('.')
|
|
254
|
+
&& (discovery === 'all' || lstatSync(resolve(root, entry.name, '.collabmd'), { throwIfNoEntry: false })?.isDirectory()))
|
|
255
|
+
.sort((a, b) => a.name.localeCompare(b.name, 'en'))
|
|
256
|
+
.map((entry) => ({ id: entry.name, dir: resolve(root, entry.name) }));
|
|
257
|
+
if (vaults.length === 0) {
|
|
258
|
+
throw new Error('No vaults found. Check COLLABMD_VAULT_DIR and COLLABMD_VAULT_DISCOVERY.');
|
|
259
|
+
}
|
|
260
|
+
}
|
|
243
261
|
const seenIds = new Set();
|
|
244
262
|
for (const vault of vaults) {
|
|
263
|
+
if (!VAULT_ID_PATTERN.test(vault.id)) {
|
|
264
|
+
throw new Error(`Invalid vault id "${vault.id}". ${VAULT_ID_HINT}`);
|
|
265
|
+
}
|
|
245
266
|
if (seenIds.has(vault.id)) {
|
|
246
267
|
throw new Error(`Duplicate vault id "${vault.id}" in COLLABMD_VAULTS.`);
|
|
247
268
|
}
|
|
@@ -262,6 +283,17 @@ export function mangleVaultIdForEnv(vaultId) {
|
|
|
262
283
|
return String(vaultId ?? '').toUpperCase().replace(/[^A-Z0-9]/g, '_');
|
|
263
284
|
}
|
|
264
285
|
|
|
286
|
+
export function resolveVaultNames(vaults, env = process.env) {
|
|
287
|
+
return vaults.map((vault) => {
|
|
288
|
+
const suffix = mangleVaultIdForEnv(vault.id);
|
|
289
|
+
const name = normalizeOptionalString(env[`COLLABMD_VAULT_NAME_${suffix}`]);
|
|
290
|
+
if (name && vaults.filter((entry) => mangleVaultIdForEnv(entry.id) === suffix).length > 1) {
|
|
291
|
+
throw new Error(`Ambiguous vault name: multiple vaults share COLLABMD_VAULT_NAME_${suffix}.`);
|
|
292
|
+
}
|
|
293
|
+
return { ...vault, name: vault.name || name || vault.id };
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
|
|
265
297
|
// ponytail: explicit repoUrl wins, then COLLABMD_GIT_REPO_URL_<ID>, then the shared URL for the primary
|
|
266
298
|
export function resolveVaultRepoUrls(vaultDefs = [], overrides = {}, env = process.env) {
|
|
267
299
|
const globalRepoUrl = normalizeOptionalString(overrides.remote?.repoUrl ?? overrides.git?.remote?.repoUrl ?? env.COLLABMD_GIT_REPO_URL);
|
|
@@ -540,7 +572,7 @@ function resolvePublicDir(nodeEnv) {
|
|
|
540
572
|
|
|
541
573
|
export function loadConfig(overrides = {}) {
|
|
542
574
|
const nodeEnv = process.env.NODE_ENV || 'development';
|
|
543
|
-
const vaults = resolveVaultRepoUrls(resolveConfiguredVaults(overrides), overrides);
|
|
575
|
+
const vaults = resolveVaultNames(resolveVaultRepoUrls(resolveConfiguredVaults(overrides), overrides));
|
|
544
576
|
// ponytail: vaultDir stays the primary vault; other vaults resolve through the registry
|
|
545
577
|
const vaultDir = overrides.vaultDir || vaults[0].dir;
|
|
546
578
|
const basePath = normalizeAppBasePath(process.env.BASE_PATH || '');
|
|
@@ -622,6 +654,7 @@ export function loadConfig(overrides = {}) {
|
|
|
622
654
|
publicDir,
|
|
623
655
|
vaultDir,
|
|
624
656
|
vaults,
|
|
657
|
+
vaultDashboard: overrides.vaultDashboard ?? parseBooleanFlag(process.env.COLLABMD_VAULT_DASHBOARD),
|
|
625
658
|
publicWsBaseUrl: process.env.PUBLIC_WS_BASE_URL || '',
|
|
626
659
|
testWsRoomHydrateDelayMs: parsePositiveInt(process.env.TEST_WS_ROOM_HYDRATE_DELAY_MS, 0),
|
|
627
660
|
wikiLinkAutoCreate: process.env.COLLABMD_WIKI_LINK_AUTO_CREATE !== 'false',
|
|
@@ -21,16 +21,6 @@ import { mapWithConcurrency } from '../shared/async-utils.js';
|
|
|
21
21
|
|
|
22
22
|
const BACKLINK_BUILD_CONCURRENCY = 8;
|
|
23
23
|
|
|
24
|
-
function createDeferred() {
|
|
25
|
-
let resolve;
|
|
26
|
-
let reject;
|
|
27
|
-
const promise = new Promise((nextResolve, nextReject) => {
|
|
28
|
-
resolve = nextResolve;
|
|
29
|
-
reject = nextReject;
|
|
30
|
-
});
|
|
31
|
-
return { promise, reject, resolve };
|
|
32
|
-
}
|
|
33
|
-
|
|
34
24
|
export class BacklinkIndex {
|
|
35
25
|
constructor({
|
|
36
26
|
rebuildDelayMs = 150,
|
|
@@ -83,7 +73,7 @@ export class BacklinkIndex {
|
|
|
83
73
|
this._latestRequestedWorkspaceState = workspaceState;
|
|
84
74
|
}
|
|
85
75
|
if (!this._scheduledBuildDeferred) {
|
|
86
|
-
this._scheduledBuildDeferred =
|
|
76
|
+
this._scheduledBuildDeferred = Promise.withResolvers();
|
|
87
77
|
}
|
|
88
78
|
|
|
89
79
|
if (this._scheduledBuildTimer) {
|
|
@@ -103,8 +103,12 @@ function createSummaryPayload(columns, rows, summaries, definition, snapshot, th
|
|
|
103
103
|
|
|
104
104
|
function createCsv(rows, columns) {
|
|
105
105
|
const escapeCell = (value) => {
|
|
106
|
-
|
|
107
|
-
|
|
106
|
+
let text = toDisplayText(value);
|
|
107
|
+
// CSV quoting alone does not prevent spreadsheets from evaluating formulas.
|
|
108
|
+
if (typeof value !== 'number' && /^[\s\p{Cc}]*[=+@-]|^[\t\r\n]/u.test(text)) {
|
|
109
|
+
text = `'${text}`;
|
|
110
|
+
}
|
|
111
|
+
if (/[,"\r\n]/u.test(text)) {
|
|
108
112
|
return `"${text.replace(/"/g, '""')}"`;
|
|
109
113
|
}
|
|
110
114
|
return text;
|
|
@@ -112,7 +116,7 @@ function createCsv(rows, columns) {
|
|
|
112
116
|
|
|
113
117
|
const lines = [
|
|
114
118
|
columns.map((column) => escapeCell(column.label)).join(','),
|
|
115
|
-
...rows.map((row) => columns.map((column) => escapeCell(
|
|
119
|
+
...rows.map((row) => columns.map((column) => escapeCell(row.rawCells[column.id])).join(',')),
|
|
116
120
|
];
|
|
117
121
|
return `${lines.join('\n')}\n`;
|
|
118
122
|
}
|