ryugi-artifacts 1.66.0 → 1.67.0
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/dist/cli.cjs +114 -70
- package/dist/output-bootstrap.cjs +1 -1
- package/dist/server.cjs +691 -451
- package/dist/viewer/{AgentStatusPill-B6X8KYhc.js → AgentStatusPill-CkFOocLp.js} +1 -1
- package/dist/viewer/ArtboardLayout-c2tN7qmA.js +12 -0
- package/dist/viewer/ArtifactList-Ba_vsFps.js +2 -0
- package/dist/viewer/{AutoPublishPrompt-BSofyZTo.js → AutoPublishPrompt-DBjUFJp0.js} +1 -1
- package/dist/viewer/{Avatar-Cp_i6ALh.js → Avatar-C76h25SW.js} +1 -1
- package/dist/viewer/Avatar-CiprmZa8.js +1 -0
- package/dist/viewer/{BottomSheet-BD-1fVgU.js → BottomSheet-BN94WJR-.js} +1 -1
- package/dist/viewer/{Canvas-DYRPeGj4.js → Canvas-BycJwc4p.js} +1 -1
- package/dist/viewer/CompositeItem-DP4e-Lcw.js +1 -0
- package/dist/viewer/DocumentLayout-BkpeuOpb.js +2 -0
- package/dist/viewer/DocumentPage-BqQXaW4l.js +4 -0
- package/dist/viewer/{DropdownMenu-DZ0qcmvX.js → DropdownMenu-4Ouduev6.js} +1 -1
- package/dist/viewer/{HtmlLayout-DOCRj2nS.js → HtmlLayout-Dwd8Iy0b.js} +1 -1
- package/dist/viewer/MenuSubmenuTrigger-BFgGHPek.js +1 -0
- package/dist/viewer/MenuTrigger-Dp816lqx.js +1 -0
- package/dist/viewer/{PhoneArtboardBar-ZHSm-rmy.js → PhoneArtboardBar-D1Ohbjxv.js} +1 -1
- package/dist/viewer/{PhoneSheet-DxyGiHhE.js → PhoneSheet-u7ImxAef.js} +1 -1
- package/dist/viewer/Popover-pOLZvL-K.js +1 -0
- package/dist/viewer/{PreviewLayout-8f_FSu9n.js → PreviewLayout-CQyYo3HQ.js} +2 -2
- package/dist/viewer/Segmented-jrL3VjDO.js +1 -0
- package/dist/viewer/Select-YHMVx9FX.js +1 -0
- package/dist/viewer/SelectScrollUpArrow-xXX8JHOC.js +1 -0
- package/dist/viewer/SettingsDialog-Dk2pmarN.js +1 -0
- package/dist/viewer/{SnapshotDocument-BfYSAQoy.js → SnapshotDocument-ve5bKPKM.js} +1 -1
- package/dist/viewer/SplitShell-B8aI0YSC.js +1 -0
- package/dist/viewer/{ThreadView-BUtexgWc.js → ThreadView-B4kNB_AB.js} +1 -1
- package/dist/viewer/TooltipPopup-DZRCQVrx.js +1 -0
- package/dist/viewer/{VirtualizedEditor-D9Ivycdp-BNgnIRWE.js → VirtualizedEditor-D9Ivycdp-D8_HtwY3.js} +1 -1
- package/dist/viewer/{VirtualizedRenderer-C_d95FXi-CLurmXlj.js → VirtualizedRenderer-C_d95FXi-DV00RbUh.js} +1 -1
- package/dist/viewer/{WarningsBadge-X-rqGa7y.js → WarningsBadge-CaAGWi0B.js} +1 -1
- package/dist/viewer/WhiteboardLayout-C9yzQzlb.js +3 -0
- package/dist/viewer/{WritingCursor-trMEG3IR.js → WritingCursor-DElcFC08.js} +1 -1
- package/dist/viewer/{abnfDiagram-VCTEODGH-ODz2u-Tc.js → abnfDiagram-VCTEODGH-BHNSlgBN.js} +1 -1
- package/dist/viewer/{agentLook-BWWdg3j_.js → agentLook-BkD9GF0y.js} +1 -1
- package/dist/viewer/{anchor-DfNlik1u.js → anchor-C6f5HUUc.js} +1 -1
- package/dist/viewer/{ar-SA-G6X2FPQ2-_MwLvkMh.js → ar-SA-G6X2FPQ2-kYFjvsjA.js} +1 -1
- package/dist/viewer/{architecture-7GRP2DOG-iSQ3-M8E.js → architecture-7GRP2DOG-Do0w0Nkr.js} +1 -1
- package/dist/viewer/{architectureDiagram-5GKGNRK7-BL5B1Cwd.js → architectureDiagram-5GKGNRK7-Du27ms23.js} +1 -1
- package/dist/viewer/{az-AZ-76LH7QW2-DoVas4wb.js → az-AZ-76LH7QW2-BjFBhSZJ.js} +1 -1
- package/dist/viewer/{bg-BG-XCXSNQG7-CYg_Nqhh.js → bg-BG-XCXSNQG7-Ck_hluXV.js} +1 -1
- package/dist/viewer/{blockDiagram-I7D4REHJ-1893qd6O.js → blockDiagram-I7D4REHJ-ZAPqzK7M.js} +1 -1
- package/dist/viewer/{bn-BD-2XOGV67Q-B3yYegfy.js → bn-BD-2XOGV67Q-D8RL--QF.js} +1 -1
- package/dist/viewer/{c4Diagram-7LVT6UL2-DLFhWMfM.js → c4Diagram-7LVT6UL2-CpZ4wCIe.js} +1 -1
- package/dist/viewer/{ca-ES-6MX7JW3Y-C3CynyTA.js → ca-ES-6MX7JW3Y-CmU7_qfi.js} +1 -1
- package/dist/viewer/{channel-gGfhtVCU.js → channel-B15uf_mz.js} +161 -161
- package/dist/viewer/channel-DB143Xik.js +1 -0
- package/dist/viewer/{chunk-4HAMMTFA-BOUTaKFB.js → chunk-4HAMMTFA-4oEiNUVg.js} +1 -1
- package/dist/viewer/{chunk-75Z2AOVW-AtKWqbsp.js → chunk-75Z2AOVW-DG3lmbGz.js} +1 -1
- package/dist/viewer/{chunk-DU6HZSFF-dg0wiFNr.js → chunk-DU6HZSFF-Dv3KmGY3.js} +1 -1
- package/dist/viewer/{chunk-EIO257PC-CiuVQ5tC.js → chunk-EIO257PC-DC6UJx10.js} +1 -1
- package/dist/viewer/{chunk-F27PBJKO-C3v6jBrH.js → chunk-F27PBJKO-DtFqk0w0.js} +1 -1
- package/dist/viewer/{chunk-GMAD6QVW-7o8gxuzy.js → chunk-GMAD6QVW-BK3CBpHU.js} +1 -1
- package/dist/viewer/{chunk-GVQU2GXP-DYfPE_kP.js → chunk-GVQU2GXP-CpsL6KWe.js} +1 -1
- package/dist/viewer/{chunk-IMKFNOWR-aN-toW4j.js → chunk-IMKFNOWR-DqRCtwcS.js} +1 -1
- package/dist/viewer/{chunk-L3NEJ4N5-CnyBfeWQ.js → chunk-L3NEJ4N5-bcRPIfs5.js} +1 -1
- package/dist/viewer/{chunk-OSK3NFVY-Dx0uAOLK.js → chunk-OSK3NFVY-BF2pXgrt.js} +1 -1
- package/dist/viewer/{chunk-P2QGCYS3-CAUxyWiK.js → chunk-P2QGCYS3-qI3BJZiV.js} +1 -1
- package/dist/viewer/{chunk-POPQ4Y6H-cr_OqW9b.js → chunk-POPQ4Y6H-D7_l0PbI.js} +1 -1
- package/dist/viewer/{chunk-PWAF6VOD-BMYvIGbv.js → chunk-PWAF6VOD-aeOMJQRL.js} +1 -1
- package/dist/viewer/{chunk-SHT3W25Y-BIhh6C-D.js → chunk-SHT3W25Y-BT5Wvvpu.js} +1 -1
- package/dist/viewer/{chunk-SVP7TREG-CA39sTgF.js → chunk-SVP7TREG-HG6La_wJ.js} +1 -1
- package/dist/viewer/{chunk-TICWLB2K-ByYHKmi7.js → chunk-TICWLB2K-DQpzLhAV.js} +1 -1
- package/dist/viewer/classDiagram-ZZMXUADV-DmJptHUP.js +1 -0
- package/dist/viewer/classDiagram-v2-VYDZK3BY-DmJptHUP.js +1 -0
- package/dist/viewer/{cs-CZ-2BRQDIVT-XNDLvq55.js → cs-CZ-2BRQDIVT-ahJk7hMM.js} +1 -1
- package/dist/viewer/{cynefin-OW5HDTMX-DpVSlbHP.js → cynefin-OW5HDTMX-nLOUGSf6.js} +1 -1
- package/dist/viewer/{cynefinDiagram-5FMLGOSQ-dHtfu-cX.js → cynefinDiagram-5FMLGOSQ-BO8dTCaE.js} +1 -1
- package/dist/viewer/{da-DK-5WZEPLOC-gGE6wcsX.js → da-DK-5WZEPLOC-ClRScj-s.js} +1 -1
- package/dist/viewer/{dagre-GXQ25YYZ-_49K5ME-.js → dagre-GXQ25YYZ-DTS_PRYI.js} +1 -1
- package/dist/viewer/{de-DE-XR44H4JA-xIn9zjsb.js → de-DE-XR44H4JA-D7v9Ws-w.js} +1 -1
- package/dist/viewer/{diagram-S7CK7UJ4-DnOVKbi8.js → diagram-S7CK7UJ4-5ytAW4Ck.js} +1 -1
- package/dist/viewer/{diagram-UQ7AKVKN-fXoq3ttg.js → diagram-UQ7AKVKN-DYUYBUBB.js} +1 -1
- package/dist/viewer/{diagram-VSXAHHWV-6LRIw8JH.js → diagram-VSXAHHWV-DeK669yc.js} +1 -1
- package/dist/viewer/{diagram-VX7I27RA-Co4MGh3a.js → diagram-VX7I27RA-pvfOXaeo.js} +1 -1
- package/dist/viewer/{diagram-Z3DM3KII-CLydqyhw.js → diagram-Z3DM3KII-D1tl_QsD.js} +1 -1
- package/dist/viewer/{dist-Bz_w4503.js → dist-02K6bLL5.js} +1 -1
- package/dist/viewer/{dist-b6Q8lY9Z.js → dist-1bnd_vgl.js} +1 -1
- package/dist/viewer/{dist-Be1Fe9dm.js → dist-7B7d5HYf.js} +1 -1
- package/dist/viewer/{dist-tlg8Gs4P.js → dist-BFwe-f96.js} +1 -1
- package/dist/viewer/{dist-aG5n-ukt.js → dist-BPIXPagN.js} +1 -1
- package/dist/viewer/{dist-BMJTKaNs.js → dist-BYMCet81.js} +1 -1
- package/dist/viewer/{dist-CLkvS-96.js → dist-BYp2eXKg.js} +1 -1
- package/dist/viewer/{dist-D8aaHNbP.js → dist-BZ5zojGQ.js} +4 -4
- package/dist/viewer/{dist-PX2c5w5B.js → dist-BsqIZGjl.js} +1 -1
- package/dist/viewer/{dist-8rAEP2kA.js → dist-Bw9MgUwF.js} +1 -1
- package/dist/viewer/{dist-DzGJipXU.js → dist-CAsi2KZK.js} +1 -1
- package/dist/viewer/{dist-Bh7I-jIz.js → dist-CDJ30uU2.js} +1 -1
- package/dist/viewer/{dist-mvJ-AbtV.js → dist-C_3pdJsj.js} +1 -1
- package/dist/viewer/{dist-BUCcrdqC.js → dist-Ck5orTzJ.js} +1 -1
- package/dist/viewer/{dist-CEQ8CIP-.js → dist-ClgG_XeE.js} +1 -1
- package/dist/viewer/{dist-BD0n8L2H.js → dist-CouAAeQX.js} +1 -1
- package/dist/viewer/{dist-Mwa2JYhN.js → dist-DVSSZHwn.js} +1 -1
- package/dist/viewer/{dist-CXkT6bXz.js → dist-IUX27npr.js} +1 -1
- package/dist/viewer/{dist-DQ3KAbgk.js → dist-Jn92mbUg.js} +1 -1
- package/dist/viewer/{dist-C8dsmt7M.js → dist-Ly85CnCY.js} +1 -1
- package/dist/viewer/{dist-CbgyqbcE.js → dist-Qc2dX3vA.js} +1 -1
- package/dist/viewer/{dist-DVH2k1zy.js → dist-hlfvil5J.js} +1 -1
- package/dist/viewer/{dist-uRinEKZF.js → dist-u7ism1gK.js} +1 -1
- package/dist/viewer/{dist-6KUMXJHX.js → dist-xg9TzjpP.js} +1 -1
- package/dist/viewer/{ebnfDiagram-PWID7BFC-eRw9PImL.js → ebnfDiagram-PWID7BFC-CL1U6Bgh.js} +1 -1
- package/dist/viewer/{el-GR-BZB4AONW-ydMLjdVd.js → el-GR-BZB4AONW-qfDNQt0F.js} +1 -1
- package/dist/viewer/{en-B4ZKOASM-u6OniCbC.js → en-B4ZKOASM-DjB7bdQE.js} +1 -1
- package/dist/viewer/{erDiagram-RLTQ6QDP-DUfKaOXm.js → erDiagram-RLTQ6QDP-C_lYUtOw.js} +1 -1
- package/dist/viewer/{es-ES-U4NZUMDT-CCvOElHW.js → es-ES-U4NZUMDT-CFw9usvE.js} +1 -1
- package/dist/viewer/{eu-ES-A7QVB2H4-C_WD5IZg.js → eu-ES-A7QVB2H4-4BNzkAsh.js} +1 -1
- package/dist/viewer/{eventmodeling-NTZA5JFV-C0rYyF74.js → eventmodeling-NTZA5JFV-CQBUT8Rf.js} +1 -1
- package/dist/viewer/{fa-IR-HGAKTJCU-BIkl-rJS.js → fa-IR-HGAKTJCU-C9i2Nfz_.js} +1 -1
- package/dist/viewer/{fi-FI-Z5N7JZ37-6HM4TKYa.js → fi-FI-Z5N7JZ37-C8UDB8bk.js} +1 -1
- package/dist/viewer/flowDiagram-HODETNUW-CV4rxiFw.js +1 -0
- package/dist/viewer/{fr-FR-RHASNOE6-Br__REnh.js → fr-FR-RHASNOE6-Mc-SCvoh.js} +1 -1
- package/dist/viewer/{ganttDiagram-EL5Y4UJY-DHQPmBwq.js → ganttDiagram-EL5Y4UJY-N-oOcKbq.js} +1 -1
- package/dist/viewer/{gitGraph-4MIJSDKK-Duos0FcC.js → gitGraph-4MIJSDKK-Z6v79k7p.js} +1 -1
- package/dist/viewer/{gitGraphDiagram-WWUBYQGX-BlhH29yu.js → gitGraphDiagram-WWUBYQGX-CORAtQJ3.js} +1 -1
- package/dist/viewer/{gl-ES-HMX3MZ6V-CSlRksGt.js → gl-ES-HMX3MZ6V-OfRSBrho.js} +1 -1
- package/dist/viewer/{he-IL-6SHJWFNN-7fwBpcZp.js → he-IL-6SHJWFNN-CjhadtGW.js} +1 -1
- package/dist/viewer/{hi-IN-IWLTKZ5I-liiwbLNI.js → hi-IN-IWLTKZ5I-CYYvph9P.js} +1 -1
- package/dist/viewer/{hu-HU-A5ZG7DT2-DdiFF2-_.js → hu-HU-A5ZG7DT2-B6NTEmIC.js} +1 -1
- package/dist/viewer/{id-ID-SAP4L64H-BbyroKKj.js → id-ID-SAP4L64H-B8Xf9sUo.js} +1 -1
- package/dist/viewer/{image-GAAHSSAO-Bl6iT5Xi.js → image-GAAHSSAO-hDM8yXwe.js} +1 -1
- package/dist/viewer/index.html +5 -5
- package/dist/viewer/index.js +2 -2
- package/dist/viewer/index3.css +28 -0
- package/dist/viewer/{info-A6RAGUB7-BayhR2hO.js → info-A6RAGUB7-CE-QPkyy.js} +1 -1
- package/dist/viewer/{infoDiagram-27XIBGKW-B7gYXKyi.js → infoDiagram-27XIBGKW-DrHsUoxu.js} +1 -1
- package/dist/viewer/{ishikawaDiagram-5VMMS53U-BCeyxXmy.js → ishikawaDiagram-5VMMS53U-nWj2IsTY.js} +1 -1
- package/dist/viewer/{it-IT-JPQ66NNP-Dl5XaFPJ.js → it-IT-JPQ66NNP-C810Op7y.js} +1 -1
- package/dist/viewer/{ja-JP-DBVTYXUO-Ds16kWgN.js → ja-JP-DBVTYXUO-DIbcYoJP.js} +1 -1
- package/dist/viewer/{journeyDiagram-3NMN7TZE-BRHyu3on.js → journeyDiagram-3NMN7TZE-CuKomypa.js} +1 -1
- package/dist/viewer/{kaa-6HZHGXH3-BZtk4Q-J.js → kaa-6HZHGXH3-cCX5zN8B.js} +1 -1
- package/dist/viewer/{kab-KAB-ZGHBKWFO-sX86-rIi.js → kab-KAB-ZGHBKWFO-B-RTmCXO.js} +1 -1
- package/dist/viewer/{kanban-definition-UXKFOSKX-D8dXYlkf.js → kanban-definition-UXKFOSKX-CKVuo3k4.js} +1 -1
- package/dist/viewer/{kk-KZ-P5N5QNE5-Kj6xbUfb.js → kk-KZ-P5N5QNE5-DYBkhmQl.js} +1 -1
- package/dist/viewer/{km-KH-HSX4SM5Z-Du9UYSIR.js → km-KH-HSX4SM5Z-CCxaEuqg.js} +1 -1
- package/dist/viewer/{ko-KR-MTYHY66A-D13455tH.js → ko-KR-MTYHY66A-3m7U3iBI.js} +1 -1
- package/dist/viewer/{ku-TR-6OUDTVRD-CRU2T1Xq.js → ku-TR-6OUDTVRD-X3ikgsVo.js} +1 -1
- package/dist/viewer/local-split-host-BMRFYq_O.js +1 -0
- package/dist/viewer/{lt-LT-XHIRWOB4-CaPQXWaa.js → lt-LT-XHIRWOB4-vvKpbejg.js} +1 -1
- package/dist/viewer/{lv-LV-5QDEKY6T-CWmJ_HNo.js → lv-LV-5QDEKY6T-BSM4MzKc.js} +1 -1
- package/dist/viewer/{mermaid-parser.core-Dq72O3lo.js → mermaid-parser.core-Bj6JAkmh.js} +3 -3
- package/dist/viewer/{mindmap-definition-YA3MSWOX-B5ND0SS0.js → mindmap-definition-YA3MSWOX-CCiNFisT.js} +1 -1
- package/dist/viewer/{mr-IN-CRQNXWMA-ClPq9z9c.js → mr-IN-CRQNXWMA-DXzOwWpa.js} +1 -1
- package/dist/viewer/{my-MM-5M5IBNSE-BgvPEMQG.js → my-MM-5M5IBNSE-Dn_OAz2K.js} +1 -1
- package/dist/viewer/{nb-NO-T6EIAALU-f4YcrpZO.js → nb-NO-T6EIAALU-fMPessoz.js} +1 -1
- package/dist/viewer/{nl-NL-IS3SIHDZ-51w_0F9O.js → nl-NL-IS3SIHDZ-DnTNhgqn.js} +1 -1
- package/dist/viewer/{nn-NO-6E72VCQL-C-asnGQd.js → nn-NO-6E72VCQL-8Yii387T.js} +1 -1
- package/dist/viewer/{oc-FR-POXYY2M6-CNXcOCrh.js → oc-FR-POXYY2M6-3ioiiCNK.js} +1 -1
- package/dist/viewer/{pa-IN-N4M65BXN-D2sTi4tB.js → pa-IN-N4M65BXN-B4yi3y3p.js} +1 -1
- package/dist/viewer/{packet-AYTQ26CC-C5eStsUT.js → packet-AYTQ26CC-4dovYoGN.js} +1 -1
- package/dist/viewer/{parseTrigger-Dpx4xwme.js → parseTrigger-BgQHa_Nx.js} +1 -1
- package/dist/viewer/{pegDiagram-XKGWAZYB-AfpuhbMK.js → pegDiagram-XKGWAZYB-CVV6hVF8.js} +1 -1
- package/dist/viewer/percentages-BXMCSKIN-DdTdqxCn.js +1 -0
- package/dist/viewer/{pie-WAS4IAKB-BuIit_wP.js → pie-WAS4IAKB-BuHK79R3.js} +1 -1
- package/dist/viewer/{pieDiagram-E7YTZNPT-CRSbhyv1.js → pieDiagram-E7YTZNPT-CEhHpuzY.js} +1 -1
- package/dist/viewer/{pl-PL-T2D74RX3-CaatC1Ad.js → pl-PL-T2D74RX3-OpiYmyBs.js} +1 -1
- package/dist/viewer/preview.html +4 -4
- package/dist/viewer/preview.js +1 -1
- package/dist/viewer/{prod-DdmJv0MO.js → prod-D0vYYRO1.js} +9 -9
- package/dist/viewer/{pt-BR-5N22H2LF-Cl2reV9F.js → pt-BR-5N22H2LF-D8F6ooYC.js} +1 -1
- package/dist/viewer/{pt-PT-UZXXM6DQ-Dl1E3lVz.js → pt-PT-UZXXM6DQ-D3mGarXo.js} +1 -1
- package/dist/viewer/{quadrantDiagram-AXDQQJYC-x1Uf4NVM.js → quadrantDiagram-AXDQQJYC-BeTd5Owh.js} +1 -1
- package/dist/viewer/{radar-RG4KPBEZ-DQGD6mHG.js → radar-RG4KPBEZ-Bs5JYSqQ.js} +1 -1
- package/dist/viewer/{railroad-74A4TZTK-_jyPADpx.js → railroad-74A4TZTK-60ZhIRvO.js} +1 -1
- package/dist/viewer/{railroad-abnf-HS5TGJTU-BbeCaDR8.js → railroad-abnf-HS5TGJTU-crN_5FSb.js} +1 -1
- package/dist/viewer/{railroad-ebnf-LZEXJU2U-0u5eXsT9.js → railroad-ebnf-LZEXJU2U-Cq5MpEFr.js} +1 -1
- package/dist/viewer/{railroad-peg-WCYAUIDC-DfdmN9rz.js → railroad-peg-WCYAUIDC-3_b7NLcX.js} +1 -1
- package/dist/viewer/{railroadDiagram-O6MQD6OU-Bss7JqQV.js → railroadDiagram-O6MQD6OU-Vy-0n1VR.js} +1 -1
- package/dist/viewer/ref-DBHRFrMN.js +1 -0
- package/dist/viewer/{requirementDiagram-BXWQKSXE-T8cs3e3U.js → requirementDiagram-BXWQKSXE-3UTyJ8ZV.js} +1 -1
- package/dist/viewer/{ro-RO-JPDTUUEW-LJoACXW2.js → ro-RO-JPDTUUEW-ukAakPc_.js} +1 -1
- package/dist/viewer/{route-DDEGqDvB.js → route-Cvbs0pMv.js} +2 -2
- package/dist/viewer/route-messages-9SZM1864.js +1 -0
- package/dist/viewer/{ru-RU-B4JR7IUQ-Dr1RnL66.js → ru-RU-B4JR7IUQ-DsKKiTcC.js} +1 -1
- package/dist/viewer/{sankeyDiagram-P5KCCOFB-uvLee9BZ.js → sankeyDiagram-P5KCCOFB-DS3TrrxP.js} +1 -1
- package/dist/viewer/{selection-A2YAIJTR.js → selection-DuzBGS_K.js} +1 -1
- package/dist/viewer/{sequenceDiagram-WJ2MYXX4-DcTFNs19.js → sequenceDiagram-WJ2MYXX4-C-MQ1r66.js} +1 -1
- package/dist/viewer/settings-dialog-DcUSfYHj.js +1 -0
- package/dist/viewer/{si-LK-N5RQ5JYF-BLq3al5N.js → si-LK-N5RQ5JYF-fd9skMWt.js} +1 -1
- package/dist/viewer/{sk-SK-C5VTKIMK-a-IIZ4GT.js → sk-SK-C5VTKIMK-94yPrt-v.js} +1 -1
- package/dist/viewer/{sl-SI-NN7IZMDC-o1isoOWW.js → sl-SI-NN7IZMDC-CXyf9Y_h.js} +1 -1
- package/dist/viewer/{split-url-BDMlmdjs.js → split-url-DCXSi810.js} +2 -2
- package/dist/viewer/{stateDiagram-D77RDMKH-BZM8bgzK.js → stateDiagram-D77RDMKH-uLNLMbA4.js} +1 -1
- package/dist/viewer/stateDiagram-v2-MP3YSRHH-4X9ufUCL.js +1 -0
- package/dist/viewer/subset-shared.chunk-ByQ-gvtV.js +1 -0
- package/dist/viewer/{subset-worker.chunk-26hNkxyu.js → subset-worker.chunk-CCjlZvyE.js} +1 -1
- package/dist/viewer/{sv-SE-XGPEYMSR-B_D5ChEk.js → sv-SE-XGPEYMSR-DPbLSv0c.js} +1 -1
- package/dist/viewer/{swimlanes-42K2YHIH-Dg0qxOws.js → swimlanes-42K2YHIH-y-2hdIuq.js} +1 -1
- package/dist/viewer/swimlanesDiagram-VR7AAH4N-BThkkUgr.js +8 -0
- package/dist/viewer/{ta-IN-2NMHFXQM-ClGBXdV4.js → ta-IN-2NMHFXQM-BK3L3kDX.js} +1 -1
- package/dist/viewer/{th-TH-HPSO5L25-DAJ8sOl3.js → th-TH-HPSO5L25-CFBmFkzs.js} +1 -1
- package/dist/viewer/{timeline-definition-24CTP7MA-DXaemj2u.js → timeline-definition-24CTP7MA-erBEzv25.js} +1 -1
- package/dist/viewer/{tr-TR-DEFEU3FU-BzHu5pEn.js → tr-TR-DEFEU3FU-Cy9-JU8k.js} +1 -1
- package/dist/viewer/{treeView-Q6P3EWNA-C_VbpbNe.js → treeView-Q6P3EWNA-1tNBreej.js} +1 -1
- package/dist/viewer/{treemap-WGGIJYW6-BGL5LSgs.js → treemap-WGGIJYW6-DbqYBKFh.js} +1 -1
- package/dist/viewer/{uk-UA-QMV73CPH-BPDqw53G.js → uk-UA-QMV73CPH-DwAQPx1c.js} +1 -1
- package/dist/viewer/useAriaLabelledBy-1TFrbqTT.js +1 -0
- package/dist/viewer/useOpenInteractionType-B7ZAWZlS.js +1 -0
- package/dist/viewer/{useTranslation-BcipDuhp.js → useTranslation-DczhMFuq.js} +1 -1
- package/dist/viewer/useTypeFavicon-fHGk7fhQ.js +1 -0
- package/dist/viewer/{vennDiagram-4TSXK5OY-DZKcEaHf.js → vennDiagram-4TSXK5OY-gxGufpuC.js} +1 -1
- package/dist/viewer/verdicts-B9EpSu2Q.js +1 -0
- package/dist/viewer/{vi-VN-M7AON7JQ-CJEuQOxR.js → vi-VN-M7AON7JQ-C8FCmKmt.js} +1 -1
- package/dist/viewer/{view-CJUgyKGY.js → view-CX7yv-Pv.js} +1 -1
- package/dist/viewer/{viewport-CFJHn_Y6-BGH6hsZG.js → viewport-CFJHn_Y6-C1jXsfyM.js} +1 -1
- package/dist/viewer/{wardley-WFR3VGLG-Dkp_-AaL.js → wardley-WFR3VGLG-BeUHBiNR.js} +1 -1
- package/dist/viewer/{wardleyDiagram-VM6X3IG4-86pEJitp.js → wardleyDiagram-VM6X3IG4-BEH6ZNYM.js} +1 -1
- package/dist/viewer/{xychartDiagram-S5SC5T6Z-CAsfEZ7P.js → xychartDiagram-S5SC5T6Z-Sb2wN887.js} +1 -1
- package/dist/viewer/{zh-CN-LNUGB5OW-m354m4Nb.js → zh-CN-LNUGB5OW-CjcOJMLB.js} +1 -1
- package/dist/viewer/{zh-HK-E62DVLB3-HnR0Htak.js → zh-HK-E62DVLB3-C2ghlkfZ.js} +1 -1
- package/dist/viewer/{zh-TW-RAJ6MFWO-BUClvKp2.js → zh-TW-RAJ6MFWO-CDfhTlX4.js} +1 -1
- package/dist/viewer-lib/{Canvas-XtRYXIEb.js → Canvas-BSA0o7dK.js} +3 -3
- package/dist/viewer-lib/{PhoneArtboardBar-DfzvB3QO.js → PhoneArtboardBar-BAYT7ihY.js} +2 -2
- package/dist/viewer-lib/{PreviewView-lLevZBla.js → PreviewView-C7t7ZIzk.js} +2 -2
- package/dist/viewer-lib/{ReadOnlyWhiteboard-D0CZ0LdG.js → ReadOnlyWhiteboard-CWflWeSo.js} +3 -3
- package/dist/viewer-lib/{SnapshotDocument-T_gyY6JJ.js → SnapshotDocument-CgnqSKkP.js} +13631 -13624
- package/dist/viewer-lib/{VirtualizedEditor-D9Ivycdp-Blh2vJwo.js → VirtualizedEditor-D9Ivycdp-CRIrE_5w.js} +2 -2
- package/dist/viewer-lib/{VirtualizedRenderer-C_d95FXi-BOJs6MXx.js → VirtualizedRenderer-C_d95FXi-Zicvc4ph.js} +3 -3
- package/dist/viewer-lib/{WarningsBadge-BtnTIfpB.js → WarningsBadge-D5jWxCxT.js} +1 -1
- package/dist/viewer-lib/{agentLook-DWANryek.js → agentLook-B23cR9K4.js} +1 -1
- package/dist/viewer-lib/{ar-SA-G6X2FPQ2-DSCh8zTd.js → ar-SA-G6X2FPQ2-Duv5zla_.js} +1 -1
- package/dist/viewer-lib/{az-AZ-76LH7QW2-CNdNs8nj.js → az-AZ-76LH7QW2-BlP0W-O3.js} +1 -1
- package/dist/viewer-lib/{bg-BG-XCXSNQG7-PU2ZxsGw.js → bg-BG-XCXSNQG7-8U63f6nC.js} +1 -1
- package/dist/viewer-lib/{bn-BD-2XOGV67Q-XLdOhNaI.js → bn-BD-2XOGV67Q-C-NXsQHr.js} +1 -1
- package/dist/viewer-lib/{ca-ES-6MX7JW3Y-UY8MZC4L.js → ca-ES-6MX7JW3Y-CRMSXAX-.js} +1 -1
- package/dist/viewer-lib/{chunk-EIO257PC-C1U1qIlr.js → chunk-EIO257PC-Bn-GD-Zt.js} +1 -1
- package/dist/viewer-lib/core.js +3 -3
- package/dist/viewer-lib/{cs-CZ-2BRQDIVT-BFfwha5e.js → cs-CZ-2BRQDIVT-Dz9S_d4x.js} +1 -1
- package/dist/viewer-lib/{da-DK-5WZEPLOC-DDviq7_M.js → da-DK-5WZEPLOC-CHcNiE6q.js} +1 -1
- package/dist/viewer-lib/{de-DE-XR44H4JA-C9myJh7C.js → de-DE-XR44H4JA-NcoEL-P8.js} +1 -1
- package/dist/viewer-lib/{dist-DQlRNM1V.js → dist-5GpEJ-bH.js} +3 -3
- package/dist/viewer-lib/{dist-D0AhZFIx.js → dist-BQdzYH0T.js} +2 -2
- package/dist/viewer-lib/{dist-Bb9R9QlE.js → dist-BTwBk5SA.js} +3 -3
- package/dist/viewer-lib/{dist-D9t2NKPt.js → dist-BUAaHyRl.js} +3 -3
- package/dist/viewer-lib/{dist-C0iQb-kP.js → dist-BUPma0-6.js} +2 -2
- package/dist/viewer-lib/{dist-CAoIkY40.js → dist-BeRdUOTO.js} +2 -2
- package/dist/viewer-lib/{dist-BsTwyJB3.js → dist-BmR1ILj9.js} +2 -2
- package/dist/viewer-lib/{dist-5qRQAgi-.js → dist-Bnu-2VVl.js} +3 -3
- package/dist/viewer-lib/{dist-C-R9SWz_.js → dist-Bs3YnXsj.js} +4 -4
- package/dist/viewer-lib/{dist-DaJwO7Xc.js → dist-C773LAGa.js} +2 -2
- package/dist/viewer-lib/{dist-Bal1GKlv.js → dist-CQMnJ128.js} +1 -1
- package/dist/viewer-lib/{dist-DTqMZxNq.js → dist-CjjfbMFL.js} +3 -3
- package/dist/viewer-lib/{dist-Dli815JZ.js → dist-CkvV3vBQ.js} +2 -2
- package/dist/viewer-lib/{dist-CvyyocBe.js → dist-CpOPVqpt.js} +3 -3
- package/dist/viewer-lib/{dist-D85VCWJe.js → dist-DADVpqjr.js} +3 -3
- package/dist/viewer-lib/{dist-D3y43SEU.js → dist-DQ73SSla.js} +1 -1
- package/dist/viewer-lib/{dist-D6SeV1Ef.js → dist-DaIYYQw6.js} +2 -2
- package/dist/viewer-lib/{dist-CTxT1PXe.js → dist-Dh-J-Rgq.js} +4 -4
- package/dist/viewer-lib/{dist-BAZg8tW9.js → dist-DjolX4i2.js} +3 -3
- package/dist/viewer-lib/{dist-CEezXcL4.js → dist-DthLTMm5.js} +2 -2
- package/dist/viewer-lib/{dist-Mng5zZmU.js → dist-DyGv52rq.js} +3 -3
- package/dist/viewer-lib/{dist-CKL7I9Qx.js → dist-PFn-QQ_s.js} +4 -4
- package/dist/viewer-lib/{dist-wAvEq47e.js → dist-lX8KxHAX.js} +3 -3
- package/dist/viewer-lib/document.js +787 -785
- package/dist/viewer-lib/{el-GR-BZB4AONW-GpnZgGUN.js → el-GR-BZB4AONW-Ckitl9ll.js} +1 -1
- package/dist/viewer-lib/{en-B4ZKOASM-CFqMifHo.js → en-B4ZKOASM-DDOXe6SM.js} +1 -1
- package/dist/viewer-lib/{es-ES-U4NZUMDT-DRdVwGjw.js → es-ES-U4NZUMDT-D5Il9sGa.js} +1 -1
- package/dist/viewer-lib/{eu-ES-A7QVB2H4-BkyvJflk.js → eu-ES-A7QVB2H4-DzVr94jH.js} +1 -1
- package/dist/viewer-lib/{fa-IR-HGAKTJCU-BwsYAcy8.js → fa-IR-HGAKTJCU-j4IP_Edo.js} +1 -1
- package/dist/viewer-lib/{fi-FI-Z5N7JZ37-CBeMgc4e.js → fi-FI-Z5N7JZ37-B0DDhQ1Z.js} +1 -1
- package/dist/viewer-lib/{fr-FR-RHASNOE6-CSCzRtsr.js → fr-FR-RHASNOE6-DWknbOF7.js} +1 -1
- package/dist/viewer-lib/{gl-ES-HMX3MZ6V-Dsd9rhFU.js → gl-ES-HMX3MZ6V-shg10h_v.js} +1 -1
- package/dist/viewer-lib/{he-IL-6SHJWFNN-BzbqaoiX.js → he-IL-6SHJWFNN-Ed04ekIs.js} +1 -1
- package/dist/viewer-lib/{hi-IN-IWLTKZ5I-DW-xTmxl.js → hi-IN-IWLTKZ5I-DjdOFRmR.js} +1 -1
- package/dist/viewer-lib/{hu-HU-A5ZG7DT2-DFcambMZ.js → hu-HU-A5ZG7DT2-n8QpqZ4Z.js} +1 -1
- package/dist/viewer-lib/{i18n-AbkxQTcI.js → i18n-CqqLJ6Bn.js} +92 -10
- package/dist/viewer-lib/{id-ID-SAP4L64H-tTBC6jhJ.js → id-ID-SAP4L64H-s-M00021.js} +1 -1
- package/dist/viewer-lib/{image-GAAHSSAO-DYWFpM2G.js → image-GAAHSSAO-BJML0bqE.js} +1 -1
- package/dist/viewer-lib/index.js +2509 -1988
- package/dist/viewer-lib/{it-IT-JPQ66NNP-D_dRrUXm.js → it-IT-JPQ66NNP-CDsG32dJ.js} +1 -1
- package/dist/viewer-lib/{ja-JP-DBVTYXUO-Bg7zRyCt.js → ja-JP-DBVTYXUO-DbxhxSyk.js} +1 -1
- package/dist/viewer-lib/{kaa-6HZHGXH3-C3jbC37K.js → kaa-6HZHGXH3-DJomTlzL.js} +1 -1
- package/dist/viewer-lib/{kab-KAB-ZGHBKWFO-3wPaJGNV.js → kab-KAB-ZGHBKWFO-CI0oP3Bj.js} +1 -1
- package/dist/viewer-lib/{kk-KZ-P5N5QNE5-CxV-rOti.js → kk-KZ-P5N5QNE5-7CjRJsra.js} +1 -1
- package/dist/viewer-lib/{km-KH-HSX4SM5Z-CjWW8EnV.js → km-KH-HSX4SM5Z-CoNkwzsI.js} +1 -1
- package/dist/viewer-lib/{ko-KR-MTYHY66A-DYgqutRt.js → ko-KR-MTYHY66A-DFQinSan.js} +1 -1
- package/dist/viewer-lib/{ku-TR-6OUDTVRD-BKEfJRQu.js → ku-TR-6OUDTVRD-bVcYOoDk.js} +1 -1
- package/dist/viewer-lib/{lib-BWIKhY0u.js → lib-CoXZilpj.js} +125 -125
- package/dist/viewer-lib/{lt-LT-XHIRWOB4-C40q3QcD.js → lt-LT-XHIRWOB4-BIsiqKj8.js} +1 -1
- package/dist/viewer-lib/{lv-LV-5QDEKY6T-C8cvmasQ.js → lv-LV-5QDEKY6T-CPC7ylaV.js} +1 -1
- package/dist/viewer-lib/{mr-IN-CRQNXWMA-B5iL27vN.js → mr-IN-CRQNXWMA-CiY-592d.js} +1 -1
- package/dist/viewer-lib/{my-MM-5M5IBNSE-BIaP8rPS.js → my-MM-5M5IBNSE-CqJsVoJu.js} +1 -1
- package/dist/viewer-lib/{nb-NO-T6EIAALU-D2L2JYb0.js → nb-NO-T6EIAALU-BBLgzHfY.js} +1 -1
- package/dist/viewer-lib/{nl-NL-IS3SIHDZ-BF9POnBF.js → nl-NL-IS3SIHDZ-vencjWhM.js} +1 -1
- package/dist/viewer-lib/{nn-NO-6E72VCQL-DtL4ep0j.js → nn-NO-6E72VCQL-BWHOGPEl.js} +1 -1
- package/dist/viewer-lib/{oc-FR-POXYY2M6-CM0au5Lk.js → oc-FR-POXYY2M6-BYL_PQLS.js} +1 -1
- package/dist/viewer-lib/{pa-IN-N4M65BXN-D-jLm3EK.js → pa-IN-N4M65BXN-Cv4ZB-QP.js} +1 -1
- package/dist/viewer-lib/percentages-BXMCSKIN-BdIkw9ta.js +1 -0
- package/dist/viewer-lib/{pl-PL-T2D74RX3-rTHmzHqx.js → pl-PL-T2D74RX3-2YdY7WUN.js} +1 -1
- package/dist/viewer-lib/{plugin-_bGVeqI0-BPW31nnw.js → plugin-_bGVeqI0-DaWymUTi.js} +1 -1
- package/dist/viewer-lib/{prod-D2rw6WFD.js → prod-BrZ_Nr0-.js} +59 -59
- package/dist/viewer-lib/{pt-BR-5N22H2LF-DBo3zEkE.js → pt-BR-5N22H2LF-BgPsrxRG.js} +1 -1
- package/dist/viewer-lib/{pt-PT-UZXXM6DQ-CinObC39.js → pt-PT-UZXXM6DQ-4FPiYyES.js} +1 -1
- package/dist/viewer-lib/{ro-RO-JPDTUUEW-BJvdgr_5.js → ro-RO-JPDTUUEW-BwoX9h84.js} +1 -1
- package/dist/viewer-lib/{route-messages-DTiEU_zp.js → route-messages-CqMvUkfR.js} +279 -241
- package/dist/viewer-lib/{ru-RU-B4JR7IUQ-C8RoEcU9.js → ru-RU-B4JR7IUQ-Bd9s4exj.js} +1 -1
- package/dist/viewer-lib/{si-LK-N5RQ5JYF-CmH33jvB.js → si-LK-N5RQ5JYF-COjPyEJf.js} +1 -1
- package/dist/viewer-lib/{sk-SK-C5VTKIMK-DbX5YK4x.js → sk-SK-C5VTKIMK-DY61Iqus.js} +1 -1
- package/dist/viewer-lib/{sl-SI-NN7IZMDC-GaQJzO11.js → sl-SI-NN7IZMDC-CoLAIrA-.js} +1 -1
- package/dist/viewer-lib/{stylex-CnT-Ts3D.css → stylex-B2Kji6ve.css} +32 -0
- package/dist/viewer-lib/subset-shared.chunk-BT3koTww.js +2 -0
- package/dist/viewer-lib/{subset-worker.chunk-DaNQ8W3O.js → subset-worker.chunk-1lo51MmF.js} +2 -2
- package/dist/viewer-lib/{sv-SE-XGPEYMSR-C4cib1qC.js → sv-SE-XGPEYMSR-DghaMqt3.js} +1 -1
- package/dist/viewer-lib/{ta-IN-2NMHFXQM-COXiexro.js → ta-IN-2NMHFXQM-GfsHy3fq.js} +1 -1
- package/dist/viewer-lib/{th-TH-HPSO5L25-DZu-t4j-.js → th-TH-HPSO5L25-Dp7xyi9G.js} +1 -1
- package/dist/viewer-lib/{tr-TR-DEFEU3FU-CJMaRH7e.js → tr-TR-DEFEU3FU-BaJOrAUy.js} +1 -1
- package/dist/viewer-lib/types/src/shared/artifact-kinds.d.ts +34 -0
- package/dist/viewer-lib/types/src/shared/backlinks.d.ts +2 -1
- package/dist/viewer-lib/types/src/shared/cascade.d.ts +40 -0
- package/dist/viewer-lib/types/src/shared/ref-status.d.ts +9 -1
- package/dist/viewer-lib/types/src/shared/ref.d.ts +5 -9
- package/dist/viewer-lib/types/src/viewer/components/CascadeList.d.ts +13 -0
- package/dist/viewer-lib/types/src/viewer/components/SharePanel.d.ts +15 -0
- package/dist/viewer-lib/types/src/viewer/document/useCloudRefBoard.d.ts +5 -0
- package/dist/viewer-lib/types/src/viewer/library/index.d.ts +4 -1
- package/dist/viewer-lib/types/src/viewer/split/messages.d.ts +3 -0
- package/dist/viewer-lib/types/src/viewer/split/route-messages.d.ts +3 -1
- package/dist/viewer-lib/types/src/viewer/split/split-url.d.ts +9 -2
- package/dist/viewer-lib/types/src/viewer/split/usePaneStage.d.ts +16 -0
- package/dist/viewer-lib/types/src/viewer/split/useSplitRouting.d.ts +8 -5
- package/dist/viewer-lib/{uk-UA-QMV73CPH-BNjGwvPi.js → uk-UA-QMV73CPH-Dg_TFHUA.js} +1 -1
- package/dist/viewer-lib/{vi-VN-M7AON7JQ-CFAjVdhW.js → vi-VN-M7AON7JQ-BbasR-kZ.js} +1 -1
- package/dist/viewer-lib/{viewport-CFJHn_Y6-C-nOAUOA.js → viewport-CFJHn_Y6-rsrJTmFz.js} +1 -1
- package/dist/viewer-lib/{zh-CN-LNUGB5OW-CJGcookC.js → zh-CN-LNUGB5OW-DP1552am.js} +1 -1
- package/dist/viewer-lib/{zh-HK-E62DVLB3-DbKlJaOJ.js → zh-HK-E62DVLB3-DMsDsoF6.js} +1 -1
- package/dist/viewer-lib/{zh-TW-RAJ6MFWO-6xqeRDl-.js → zh-TW-RAJ6MFWO-D1mbuuHb.js} +1 -1
- package/package.json +1 -1
- package/dist/viewer/ArtboardLayout-CL7CeJtR.js +0 -12
- package/dist/viewer/ArtifactList-C9WYHhVD.js +0 -2
- package/dist/viewer/Avatar-TFwLueDr.js +0 -1
- package/dist/viewer/CompositeItem-DYLRmrE_.js +0 -1
- package/dist/viewer/DocumentLayout-BbmdEZ-E.js +0 -2
- package/dist/viewer/DocumentPage-Cv3CsvrN.js +0 -4
- package/dist/viewer/MenuSubmenuTrigger-CbXQxNH6.js +0 -1
- package/dist/viewer/MenuTrigger-DUDnBy5x.js +0 -1
- package/dist/viewer/Popover-Df89KUPH.js +0 -1
- package/dist/viewer/Select-C5fhFls_.js +0 -1
- package/dist/viewer/SelectScrollUpArrow-ekubXj7Y.js +0 -1
- package/dist/viewer/SettingsDialog-DyvJKJ-o.js +0 -1
- package/dist/viewer/SplitShell-Dm7Po2-x.js +0 -1
- package/dist/viewer/TooltipPopup-Bkov4dq9.js +0 -1
- package/dist/viewer/WhiteboardLayout-Bobg7qpA.js +0 -3
- package/dist/viewer/channel-Bs9FsVFX.js +0 -1
- package/dist/viewer/classDiagram-ZZMXUADV-BWwOjUTg.js +0 -1
- package/dist/viewer/classDiagram-v2-VYDZK3BY-BWwOjUTg.js +0 -1
- package/dist/viewer/flowDiagram-HODETNUW-DyOrsOBQ.js +0 -1
- package/dist/viewer/local-split-host-BGIN8Z8E.js +0 -1
- package/dist/viewer/messages-D-DLzi0K.js +0 -1
- package/dist/viewer/percentages-BXMCSKIN-DR7Xa-V1.js +0 -1
- package/dist/viewer/route-messages-Cw5rlOIe.js +0 -1
- package/dist/viewer/settings-dialog-CI1cXQbx.js +0 -1
- package/dist/viewer/stateDiagram-v2-MP3YSRHH-2e0z4X46.js +0 -1
- package/dist/viewer/subset-shared.chunk-DYPlDRg8.js +0 -1
- package/dist/viewer/swimlanesDiagram-VR7AAH4N-CikAcpC5.js +0 -8
- package/dist/viewer/useControlledState-D_GlZYtL.js +0 -1
- package/dist/viewer/useOpenInteractionType-7AMeX8Ol.js +0 -1
- package/dist/viewer/useTypeFavicon-Dw5tQpxT.js +0 -1
- package/dist/viewer/verdicts-DXrETzvP.js +0 -1
- package/dist/viewer-lib/percentages-BXMCSKIN-BX16aURg.js +0 -1
- package/dist/viewer-lib/subset-shared.chunk-MS3AeOFb.js +0 -2
package/dist/server.cjs
CHANGED
|
@@ -48378,12 +48378,12 @@ var require_websocket_server = __commonJS({
|
|
|
48378
48378
|
// src/server/main.ts
|
|
48379
48379
|
var import_node_child_process5 = require("node:child_process");
|
|
48380
48380
|
var import_node_crypto13 = __toESM(require("node:crypto"), 1);
|
|
48381
|
-
var
|
|
48381
|
+
var import_node_fs46 = __toESM(require("node:fs"), 1);
|
|
48382
48382
|
var import_node_os2 = __toESM(require("node:os"), 1);
|
|
48383
|
-
var
|
|
48383
|
+
var import_node_path42 = __toESM(require("node:path"), 1);
|
|
48384
48384
|
|
|
48385
48385
|
// package.json
|
|
48386
|
-
var version = "1.
|
|
48386
|
+
var version = "1.67.0";
|
|
48387
48387
|
|
|
48388
48388
|
// src/server/browser-focus.ts
|
|
48389
48389
|
var import_node_child_process = require("node:child_process");
|
|
@@ -49189,9 +49189,9 @@ function clearCredentials(file) {
|
|
|
49189
49189
|
}
|
|
49190
49190
|
|
|
49191
49191
|
// src/server/hub.ts
|
|
49192
|
-
var
|
|
49192
|
+
var import_node_fs43 = __toESM(require("node:fs"), 1);
|
|
49193
49193
|
var import_node_http2 = __toESM(require("node:http"), 1);
|
|
49194
|
-
var
|
|
49194
|
+
var import_node_path40 = __toESM(require("node:path"), 1);
|
|
49195
49195
|
|
|
49196
49196
|
// src/server/access.ts
|
|
49197
49197
|
var LOOPBACK = /* @__PURE__ */ new Set(["localhost", "::1", "[::1]"]);
|
|
@@ -49218,9 +49218,9 @@ var originAllowed = (policy, origin, { cloud = false } = {}) => origin === void
|
|
|
49218
49218
|
var navigationAllowed = (secFetchSite) => secFetchSite === void 0 || secFetchSite === "none" || secFetchSite === "same-origin";
|
|
49219
49219
|
|
|
49220
49220
|
// src/server/app.ts
|
|
49221
|
-
var
|
|
49221
|
+
var import_node_fs40 = __toESM(require("node:fs"), 1);
|
|
49222
49222
|
var import_node_http = __toESM(require("node:http"), 1);
|
|
49223
|
-
var
|
|
49223
|
+
var import_node_path37 = __toESM(require("node:path"), 1);
|
|
49224
49224
|
|
|
49225
49225
|
// src/shared/cloud.ts
|
|
49226
49226
|
var MAX_ARTIFACT_BYTES = 20 * 1024 * 1024;
|
|
@@ -49626,9 +49626,9 @@ function watchArtifacts(ctx) {
|
|
|
49626
49626
|
var PAGE_CSP = "sandbox allow-scripts allow-modals allow-forms allow-popups allow-downloads";
|
|
49627
49627
|
var DOCUMENT_ASSET_CSP = "sandbox; default-src 'none'";
|
|
49628
49628
|
var ISOLATED_BOARD_CSP = "worker-src 'none'";
|
|
49629
|
-
function contentCsp(type,
|
|
49629
|
+
function contentCsp(type, path45, ownOrigin) {
|
|
49630
49630
|
if (type === "html") return PAGE_CSP;
|
|
49631
|
-
if (type === "document") return
|
|
49631
|
+
if (type === "document") return path45.endsWith(".html") ? PAGE_CSP : DOCUMENT_ASSET_CSP;
|
|
49632
49632
|
return ownOrigin ? ISOLATED_BOARD_CSP : "sandbox allow-scripts";
|
|
49633
49633
|
}
|
|
49634
49634
|
|
|
@@ -49656,8 +49656,8 @@ function routeBoardRequest(req, pathname) {
|
|
|
49656
49656
|
}
|
|
49657
49657
|
|
|
49658
49658
|
// src/server/context.ts
|
|
49659
|
-
var
|
|
49660
|
-
var
|
|
49659
|
+
var import_node_fs36 = __toESM(require("node:fs"), 1);
|
|
49660
|
+
var import_node_path33 = __toESM(require("node:path"), 1);
|
|
49661
49661
|
|
|
49662
49662
|
// src/server/agent-review.ts
|
|
49663
49663
|
var import_node_crypto5 = __toESM(require("node:crypto"), 1);
|
|
@@ -50855,20 +50855,41 @@ function createAvatars(fetchImpl = fetch) {
|
|
|
50855
50855
|
};
|
|
50856
50856
|
}
|
|
50857
50857
|
|
|
50858
|
+
// src/shared/artifact-kinds.ts
|
|
50859
|
+
var ARTIFACT_KINDS = [
|
|
50860
|
+
{ type: "document", refAttribute: "document", subTargets: [], splitPane: true },
|
|
50861
|
+
{ type: "artboard", refAttribute: "artboard", subTargets: ["group", "board"], splitPane: true },
|
|
50862
|
+
{
|
|
50863
|
+
type: "whiteboard",
|
|
50864
|
+
refAttribute: "whiteboard",
|
|
50865
|
+
subTargets: ["page", "frame"],
|
|
50866
|
+
splitPane: true
|
|
50867
|
+
},
|
|
50868
|
+
{ type: "html", refAttribute: "html", subTargets: [], splitPane: true }
|
|
50869
|
+
];
|
|
50870
|
+
var REF_KIND_NAMES = ARTIFACT_KINDS.map(
|
|
50871
|
+
(kind) => kind.refAttribute
|
|
50872
|
+
);
|
|
50873
|
+
var REF_SUB_TARGETS = [
|
|
50874
|
+
...new Set(ARTIFACT_KINDS.flatMap((kind) => kind.subTargets))
|
|
50875
|
+
];
|
|
50876
|
+
function artifactKind(type) {
|
|
50877
|
+
return ARTIFACT_KINDS.find((kind) => kind.type === type) ?? null;
|
|
50878
|
+
}
|
|
50879
|
+
|
|
50858
50880
|
// src/shared/ref.ts
|
|
50859
50881
|
var isRefNode = (node) => node.type === "ref";
|
|
50860
|
-
var
|
|
50861
|
-
|
|
50862
|
-
|
|
50863
|
-
|
|
50864
|
-
|
|
50865
|
-
|
|
50866
|
-
|
|
50867
|
-
|
|
50868
|
-
|
|
50869
|
-
|
|
50870
|
-
var
|
|
50871
|
-
var refSlug = (ref) => ref.whiteboard ?? ref.artboard ?? "";
|
|
50882
|
+
var refKinds = (ref) => REF_KIND_NAMES.filter((kind) => ref[kind] !== void 0);
|
|
50883
|
+
var refTarget = (node) => {
|
|
50884
|
+
const target = {};
|
|
50885
|
+
for (const kind of REF_KIND_NAMES) if (node[kind] !== void 0) target[kind] = node[kind];
|
|
50886
|
+
if (node.to) target.to = node.to;
|
|
50887
|
+
for (const sub2 of REF_SUB_TARGETS) if (node[sub2]) target[sub2] = node[sub2];
|
|
50888
|
+
if (node.label) target.label = node.label;
|
|
50889
|
+
return target;
|
|
50890
|
+
};
|
|
50891
|
+
var refKind = (ref) => refKinds(ref)[0] ?? "artboard";
|
|
50892
|
+
var refSlug = (ref) => ref[refKind(ref)] ?? "";
|
|
50872
50893
|
var refKey = (ref) => ref.frame ?? (ref.page ? `page:${ref.page}` : void 0) ?? ref.group ?? ref.board ?? "";
|
|
50873
50894
|
function refsIn(state2) {
|
|
50874
50895
|
const found = [];
|
|
@@ -50888,7 +50909,7 @@ function backlinksFor(slug, artboardId, docs, kind = "artboard") {
|
|
|
50888
50909
|
if (refKind(ref) !== kind || refSlug(ref) !== slug) continue;
|
|
50889
50910
|
if (ref.to && ref.to !== artboardId) continue;
|
|
50890
50911
|
const key2 = refKey(ref);
|
|
50891
|
-
(backlinks[key2] ??= []).push({
|
|
50912
|
+
(backlinks[key2] ??= []).push({ from: document2, fromType: "document", blockId: ref.blockId });
|
|
50892
50913
|
}
|
|
50893
50914
|
}
|
|
50894
50915
|
return backlinks;
|
|
@@ -50897,7 +50918,7 @@ function backlinkWarnings(backlinks, canvas) {
|
|
|
50897
50918
|
if (!canvas) return [];
|
|
50898
50919
|
return Object.entries(backlinks).flatMap(
|
|
50899
50920
|
([key2, entries2]) => key2 && !canvas.groups.includes(key2) && !canvas.boards.includes(key2) ? entries2.map(
|
|
50900
|
-
({
|
|
50921
|
+
({ from, fromType, blockId: blockId2 }) => `${fromType} ${from} block ${blockId2} references ${key2}, which this artboard no longer has`
|
|
50901
50922
|
) : []
|
|
50902
50923
|
);
|
|
50903
50924
|
}
|
|
@@ -51811,6 +51832,36 @@ function createBoardCommentRegistry(options2) {
|
|
|
51811
51832
|
};
|
|
51812
51833
|
}
|
|
51813
51834
|
|
|
51835
|
+
// src/server/cascade-deps.ts
|
|
51836
|
+
var import_node_fs16 = __toESM(require("node:fs"), 1);
|
|
51837
|
+
var import_node_path13 = __toESM(require("node:path"), 1);
|
|
51838
|
+
var REF_TARGET = new RegExp(
|
|
51839
|
+
`<ref\\b[^>]*?\\b(${ARTIFACT_KINDS.map((kind) => kind.refAttribute).join("|")})="([^"]+)"`,
|
|
51840
|
+
"g"
|
|
51841
|
+
);
|
|
51842
|
+
var typeOfAttribute = new Map(
|
|
51843
|
+
ARTIFACT_KINDS.map((kind) => [kind.refAttribute, kind.type])
|
|
51844
|
+
);
|
|
51845
|
+
var REFERENCES_OF = {
|
|
51846
|
+
document: (dir) => {
|
|
51847
|
+
const file = import_node_path13.default.join(dir, "doc.xml");
|
|
51848
|
+
const xml = import_node_fs16.default.existsSync(file) ? import_node_fs16.default.readFileSync(file, "utf8") : "";
|
|
51849
|
+
return [...xml.matchAll(REF_TARGET)].map(
|
|
51850
|
+
(match) => `${typeOfAttribute.get(match[1])}/${match[2]}`
|
|
51851
|
+
);
|
|
51852
|
+
}
|
|
51853
|
+
};
|
|
51854
|
+
function referencesOf(root, key2) {
|
|
51855
|
+
const ref = artifactKeyOf(key2);
|
|
51856
|
+
const dir = ref && resolveArtifactDir(root, ref.type, ref.id);
|
|
51857
|
+
const extract = ref && REFERENCES_OF[ref.type];
|
|
51858
|
+
if (!dir || !extract) return [];
|
|
51859
|
+
return [...new Set(extract(dir))].filter((target) => {
|
|
51860
|
+
const each = artifactKeyOf(target);
|
|
51861
|
+
return !!each && resolveArtifactDir(root, each.type, each.id) !== null;
|
|
51862
|
+
});
|
|
51863
|
+
}
|
|
51864
|
+
|
|
51814
51865
|
// src/server/cloud.ts
|
|
51815
51866
|
var import_node_crypto10 = __toESM(require("node:crypto"), 1);
|
|
51816
51867
|
|
|
@@ -51826,6 +51877,84 @@ function formatBytes(bytes) {
|
|
|
51826
51877
|
return `${unit === 0 ? value : Number(value.toFixed(1))} ${UNITS[unit]}`;
|
|
51827
51878
|
}
|
|
51828
51879
|
|
|
51880
|
+
// src/shared/cascade.ts
|
|
51881
|
+
var ACTIONABLE = ["unpublished", "stale", "private", "withdrawn"];
|
|
51882
|
+
var CHECKED_BY_DEFAULT = ["unpublished", "stale"];
|
|
51883
|
+
function stateOf(status, visibility) {
|
|
51884
|
+
const needed = !status.published ? status.withdrawn ? "withdrawn" : "unpublished" : visibility === "public" && status.visibility === "private" ? "private" : status.stale ? "stale" : "ready";
|
|
51885
|
+
return status.blocked && needed !== "private" && needed !== "ready" ? "blocked" : needed;
|
|
51886
|
+
}
|
|
51887
|
+
var visibleNow = (status, visibility) => status.published && (visibility === "private" || status.visibility === "public");
|
|
51888
|
+
async function buildCascade(root, visibility, deps) {
|
|
51889
|
+
const items = /* @__PURE__ */ new Map();
|
|
51890
|
+
const queue = [root];
|
|
51891
|
+
for (let at7 = 0; at7 < queue.length; at7++) {
|
|
51892
|
+
const from = queue[at7];
|
|
51893
|
+
for (const key2 of new Set(await deps.referencesOf(from))) {
|
|
51894
|
+
if (key2 === root) continue;
|
|
51895
|
+
const known = items.get(key2);
|
|
51896
|
+
if (known) {
|
|
51897
|
+
if (!known.parents.includes(from)) known.parents.push(from);
|
|
51898
|
+
continue;
|
|
51899
|
+
}
|
|
51900
|
+
const status = await deps.statusOf(key2);
|
|
51901
|
+
if (!status) continue;
|
|
51902
|
+
const state2 = stateOf(status, visibility);
|
|
51903
|
+
items.set(key2, {
|
|
51904
|
+
artifact: key2,
|
|
51905
|
+
title: status.title,
|
|
51906
|
+
via: from === root ? null : from,
|
|
51907
|
+
parents: [from],
|
|
51908
|
+
state: state2,
|
|
51909
|
+
open: visibleNow(status, visibility),
|
|
51910
|
+
checked: CHECKED_BY_DEFAULT.includes(state2),
|
|
51911
|
+
selectable: ACTIONABLE.includes(state2),
|
|
51912
|
+
...state2 === "blocked" && status.blocked ? { blocked: status.blocked } : {},
|
|
51913
|
+
...status.stale && !status.blocked ? { changed: true } : {}
|
|
51914
|
+
});
|
|
51915
|
+
queue.push(key2);
|
|
51916
|
+
}
|
|
51917
|
+
}
|
|
51918
|
+
return resolveSelection([...items.values()], {}, root);
|
|
51919
|
+
}
|
|
51920
|
+
function resolveSelection(items, overrides, root) {
|
|
51921
|
+
const byKey = new Map(items.map((item2) => [item2.artifact, item2]));
|
|
51922
|
+
const wanted = (item2) => ACTIONABLE.includes(item2.state) && (overrides[item2.artifact] ?? CHECKED_BY_DEFAULT.includes(item2.state));
|
|
51923
|
+
const isRoot = (key2) => root ? key2 === root : !byKey.has(key2);
|
|
51924
|
+
const reachable = /* @__PURE__ */ new Set();
|
|
51925
|
+
const opens = (key2) => {
|
|
51926
|
+
if (isRoot(key2)) return true;
|
|
51927
|
+
const item2 = byKey.get(key2);
|
|
51928
|
+
return !!item2 && reachable.has(key2) && (item2.open || wanted(item2));
|
|
51929
|
+
};
|
|
51930
|
+
for (let changed = true; changed; ) {
|
|
51931
|
+
changed = false;
|
|
51932
|
+
for (const item2 of items) {
|
|
51933
|
+
if (reachable.has(item2.artifact) || !item2.parents.some(opens)) continue;
|
|
51934
|
+
reachable.add(item2.artifact);
|
|
51935
|
+
changed = true;
|
|
51936
|
+
}
|
|
51937
|
+
}
|
|
51938
|
+
return items.map((item2) => {
|
|
51939
|
+
const { reason: _reason, upstream: _upstream, ...rest } = item2;
|
|
51940
|
+
const reason = item2.state === "blocked" ? item2.blocked : void 0;
|
|
51941
|
+
if (!reachable.has(item2.artifact))
|
|
51942
|
+
return {
|
|
51943
|
+
...rest,
|
|
51944
|
+
checked: false,
|
|
51945
|
+
selectable: false,
|
|
51946
|
+
reason: "upstream",
|
|
51947
|
+
upstream: item2.via ?? item2.parents[0]
|
|
51948
|
+
};
|
|
51949
|
+
return {
|
|
51950
|
+
...rest,
|
|
51951
|
+
checked: wanted(item2),
|
|
51952
|
+
selectable: ACTIONABLE.includes(item2.state),
|
|
51953
|
+
...reason ? { reason } : {}
|
|
51954
|
+
};
|
|
51955
|
+
});
|
|
51956
|
+
}
|
|
51957
|
+
|
|
51829
51958
|
// src/shared/cloud-error.ts
|
|
51830
51959
|
function cloudErrorDetails(value) {
|
|
51831
51960
|
if (!value || typeof value !== "object") return {};
|
|
@@ -52141,8 +52270,8 @@ function callbackPage(result, locale = "en") {
|
|
|
52141
52270
|
}
|
|
52142
52271
|
|
|
52143
52272
|
// src/server/config.ts
|
|
52144
|
-
var
|
|
52145
|
-
var
|
|
52273
|
+
var import_node_fs17 = __toESM(require("node:fs"), 1);
|
|
52274
|
+
var import_node_path14 = __toESM(require("node:path"), 1);
|
|
52146
52275
|
var defaults = () => ({ version: 1, artifacts: {} });
|
|
52147
52276
|
function isCloudRecord(value) {
|
|
52148
52277
|
if (typeof value !== "object" || value === null) return false;
|
|
@@ -52183,7 +52312,7 @@ function normalize(raw) {
|
|
|
52183
52312
|
function readConfig(file) {
|
|
52184
52313
|
let text5;
|
|
52185
52314
|
try {
|
|
52186
|
-
text5 =
|
|
52315
|
+
text5 = import_node_fs17.default.readFileSync(file, "utf8");
|
|
52187
52316
|
} catch {
|
|
52188
52317
|
return { config: defaults() };
|
|
52189
52318
|
}
|
|
@@ -52198,22 +52327,22 @@ function readConfig(file) {
|
|
|
52198
52327
|
}
|
|
52199
52328
|
var IGNORED = ["config.json", "artifacts/*", "!artifacts/document/", "artifacts/document/*/.artifact-id"];
|
|
52200
52329
|
function ensureGitignore(dir) {
|
|
52201
|
-
const file =
|
|
52330
|
+
const file = import_node_path14.default.join(dir, ".gitignore");
|
|
52202
52331
|
let current = "";
|
|
52203
52332
|
try {
|
|
52204
|
-
current =
|
|
52333
|
+
current = import_node_fs17.default.readFileSync(file, "utf8");
|
|
52205
52334
|
} catch {
|
|
52206
52335
|
}
|
|
52207
52336
|
const present = new Set(current.split(/\r?\n/).map((line2) => line2.trim()));
|
|
52208
52337
|
const missing = IGNORED.filter((line2) => !present.has(line2));
|
|
52209
52338
|
if (missing.length === 0) return;
|
|
52210
|
-
|
|
52339
|
+
import_node_fs17.default.writeFileSync(file, `${current}${current === "" || current.endsWith("\n") ? "" : "\n"}${missing.join("\n")}
|
|
52211
52340
|
`);
|
|
52212
52341
|
}
|
|
52213
52342
|
function ensureConfig(file) {
|
|
52214
|
-
|
|
52215
|
-
ensureGitignore(
|
|
52216
|
-
if (!
|
|
52343
|
+
import_node_fs17.default.mkdirSync(import_node_path14.default.dirname(file), { recursive: true });
|
|
52344
|
+
ensureGitignore(import_node_path14.default.dirname(file));
|
|
52345
|
+
if (!import_node_fs17.default.existsSync(file)) writeJsonAtomic(file, defaults());
|
|
52217
52346
|
}
|
|
52218
52347
|
function updateArtifactConfig(file, key2, patch) {
|
|
52219
52348
|
const { config, warning } = readConfig(file);
|
|
@@ -52233,27 +52362,27 @@ function setProjectAutoPublish(file, value) {
|
|
|
52233
52362
|
if (warning) throw new Error(warning);
|
|
52234
52363
|
if (value === null) delete config.autoPublish;
|
|
52235
52364
|
else config.autoPublish = value;
|
|
52236
|
-
|
|
52365
|
+
import_node_fs17.default.mkdirSync(import_node_path14.default.dirname(file), { recursive: true });
|
|
52237
52366
|
writeJsonAtomic(file, config);
|
|
52238
52367
|
}
|
|
52239
52368
|
|
|
52240
52369
|
// src/server/host-id.ts
|
|
52241
|
-
var
|
|
52242
|
-
var
|
|
52370
|
+
var import_node_fs18 = __toESM(require("node:fs"), 1);
|
|
52371
|
+
var import_node_path15 = __toESM(require("node:path"), 1);
|
|
52243
52372
|
function hostIdFor(credentialsFile2) {
|
|
52244
|
-
const file =
|
|
52373
|
+
const file = import_node_path15.default.join(import_node_path15.default.dirname(credentialsFile2), "host-id");
|
|
52245
52374
|
const saved = readPersisted(file);
|
|
52246
52375
|
if (/^[\w-]{16,64}$/.test(saved)) return saved;
|
|
52247
52376
|
const id3 = randomToken();
|
|
52248
|
-
|
|
52249
|
-
|
|
52377
|
+
import_node_fs18.default.mkdirSync(import_node_path15.default.dirname(file), { recursive: true, mode: 448 });
|
|
52378
|
+
import_node_fs18.default.writeFileSync(file, `${id3}
|
|
52250
52379
|
`, { mode: 384 });
|
|
52251
52380
|
return id3;
|
|
52252
52381
|
}
|
|
52253
52382
|
|
|
52254
52383
|
// src/server/pack.ts
|
|
52255
|
-
var
|
|
52256
|
-
var
|
|
52384
|
+
var import_node_fs19 = __toESM(require("node:fs"), 1);
|
|
52385
|
+
var import_node_path16 = __toESM(require("node:path"), 1);
|
|
52257
52386
|
var ArtifactTooLarge = class extends Error {
|
|
52258
52387
|
};
|
|
52259
52388
|
var excluded = (type, relative) => (type === "document" || type === "artboard" || type === "whiteboard") && relative === "comments.json";
|
|
@@ -52262,7 +52391,7 @@ var pageListOf = (dir, type, overrides) => {
|
|
|
52262
52391
|
if (overrides?.has(PAGES_FILE))
|
|
52263
52392
|
return parsePages(overrides.get(PAGES_FILE)?.toString("utf8") ?? null).pages;
|
|
52264
52393
|
try {
|
|
52265
|
-
return parsePages(
|
|
52394
|
+
return parsePages(import_node_fs19.default.readFileSync(import_node_path16.default.join(dir, PAGES_FILE), "utf8")).pages;
|
|
52266
52395
|
} catch {
|
|
52267
52396
|
return [];
|
|
52268
52397
|
}
|
|
@@ -52272,7 +52401,7 @@ function packArtifact(dir, type, {
|
|
|
52272
52401
|
maxBytes = MAX_ARTIFACT_BYTES,
|
|
52273
52402
|
overrides: given
|
|
52274
52403
|
} = {}) {
|
|
52275
|
-
const rootReal =
|
|
52404
|
+
const rootReal = import_node_fs19.default.realpathSync(dir);
|
|
52276
52405
|
const pages = pageListOf(dir, type, given);
|
|
52277
52406
|
const deletedPages = new Set(
|
|
52278
52407
|
pages.filter((page) => isDeletedPage(page) && isPageId(page.id)).map((page) => pageFileOf(page.id))
|
|
@@ -52285,17 +52414,17 @@ function packArtifact(dir, type, {
|
|
|
52285
52414
|
const visited = /* @__PURE__ */ new Set([rootReal]);
|
|
52286
52415
|
let total = 0;
|
|
52287
52416
|
const walk = (current) => {
|
|
52288
|
-
for (const entry of
|
|
52417
|
+
for (const entry of import_node_fs19.default.readdirSync(current, { withFileTypes: true })) {
|
|
52289
52418
|
if (entry.name.startsWith(".")) continue;
|
|
52290
|
-
const full =
|
|
52419
|
+
const full = import_node_path16.default.join(current, entry.name);
|
|
52291
52420
|
let real;
|
|
52292
52421
|
try {
|
|
52293
|
-
real =
|
|
52422
|
+
real = import_node_fs19.default.realpathSync(full);
|
|
52294
52423
|
} catch {
|
|
52295
52424
|
continue;
|
|
52296
52425
|
}
|
|
52297
|
-
if (!real.startsWith(rootReal +
|
|
52298
|
-
const stat =
|
|
52426
|
+
if (!real.startsWith(rootReal + import_node_path16.default.sep)) continue;
|
|
52427
|
+
const stat = import_node_fs19.default.statSync(real);
|
|
52299
52428
|
if (stat.isDirectory()) {
|
|
52300
52429
|
if (visited.has(real)) continue;
|
|
52301
52430
|
visited.add(real);
|
|
@@ -52303,7 +52432,7 @@ function packArtifact(dir, type, {
|
|
|
52303
52432
|
continue;
|
|
52304
52433
|
}
|
|
52305
52434
|
if (!stat.isFile()) continue;
|
|
52306
|
-
const relative =
|
|
52435
|
+
const relative = import_node_path16.default.relative(dir, full).split(import_node_path16.default.sep).join("/");
|
|
52307
52436
|
if (excluded(type, relative) || deletedPages.has(relative)) continue;
|
|
52308
52437
|
if (!overrides?.has(relative)) total += stat.size;
|
|
52309
52438
|
found.push({ path: relative, real });
|
|
@@ -52317,14 +52446,14 @@ function packArtifact(dir, type, {
|
|
|
52317
52446
|
);
|
|
52318
52447
|
}
|
|
52319
52448
|
return [
|
|
52320
|
-
...found.filter((file) => !overrides?.has(file.path)).map((file) => ({ path: file.path, data:
|
|
52449
|
+
...found.filter((file) => !overrides?.has(file.path)).map((file) => ({ path: file.path, data: import_node_fs19.default.readFileSync(file.real) })),
|
|
52321
52450
|
...[...overrides ?? []].flatMap(([file, data]) => data ? [{ path: file, data }] : [])
|
|
52322
52451
|
];
|
|
52323
52452
|
}
|
|
52324
52453
|
|
|
52325
52454
|
// src/server/publish-payload.ts
|
|
52326
|
-
var
|
|
52327
|
-
var
|
|
52455
|
+
var import_node_fs21 = __toESM(require("node:fs"), 1);
|
|
52456
|
+
var import_node_path18 = __toESM(require("node:path"), 1);
|
|
52328
52457
|
|
|
52329
52458
|
// src/shared/whiteboard/scene.ts
|
|
52330
52459
|
var BOOKKEEPING = /* @__PURE__ */ new Set(["version", "versionNonce", "updated", "seed", "customData"]);
|
|
@@ -64872,63 +65001,57 @@ function registerRef(registry2) {
|
|
|
64872
65001
|
const previous = registry2.getReader(CARRIER);
|
|
64873
65002
|
registry2.registerReader(CARRIER, (el3, ctx) => {
|
|
64874
65003
|
if (!el3.hasAttribute(MARK3)) return previous ? previous(el3, ctx) : false;
|
|
64875
|
-
const
|
|
64876
|
-
|
|
64877
|
-
|
|
64878
|
-
|
|
64879
|
-
|
|
64880
|
-
|
|
64881
|
-
|
|
64882
|
-
to: attr("to"),
|
|
64883
|
-
group: attr("group"),
|
|
64884
|
-
board: attr("board"),
|
|
64885
|
-
frame: attr("frame"),
|
|
64886
|
-
page: attr("page"),
|
|
64887
|
-
label: el3.textContent ?? void 0
|
|
64888
|
-
})
|
|
64889
|
-
};
|
|
65004
|
+
const target = {};
|
|
65005
|
+
for (const name of [...REF_KIND_NAMES, "to", ...REF_SUB_TARGETS]) {
|
|
65006
|
+
const value = el3.getAttribute(name);
|
|
65007
|
+
if (value !== null) target[name] = value;
|
|
65008
|
+
}
|
|
65009
|
+
target.label = el3.textContent ?? void 0;
|
|
65010
|
+
return { type: "ref", version: 1, ...refTarget(target) };
|
|
64890
65011
|
});
|
|
64891
65012
|
registry2.registerWriter("ref", (node) => {
|
|
64892
|
-
const ref = node;
|
|
64893
|
-
const attrs = {
|
|
64894
|
-
|
|
64895
|
-
|
|
64896
|
-
|
|
64897
|
-
|
|
64898
|
-
...ref.group ? { group: ref.group } : {},
|
|
64899
|
-
...ref.board ? { board: ref.board } : {},
|
|
64900
|
-
...ref.frame ? { frame: ref.frame } : {},
|
|
64901
|
-
...ref.page ? { page: ref.page } : {}
|
|
64902
|
-
};
|
|
65013
|
+
const ref = refTarget(node);
|
|
65014
|
+
const attrs = { [MARK3]: "1" };
|
|
65015
|
+
for (const name of [...REF_KIND_NAMES, "to", ...REF_SUB_TARGETS]) {
|
|
65016
|
+
const value = ref[name];
|
|
65017
|
+
if (value !== void 0) attrs[name] = value;
|
|
65018
|
+
}
|
|
64903
65019
|
if (!ref.label) return { tag: CARRIER, attrs, selfClosing: true };
|
|
64904
65020
|
return { tag: CARRIER, attrs, children: [ref.label] };
|
|
64905
65021
|
});
|
|
64906
65022
|
}
|
|
65023
|
+
var NOUN = {
|
|
65024
|
+
document: "a document",
|
|
65025
|
+
artboard: "an artboard",
|
|
65026
|
+
whiteboard: "a whiteboard",
|
|
65027
|
+
html: "an html page"
|
|
65028
|
+
};
|
|
65029
|
+
var NEEDS = ["artboard", "whiteboard", "document", "html"];
|
|
65030
|
+
var either = (items) => items.length === 1 ? items[0] : `${items.slice(0, -1).join(", ")} or ${items.at(-1)}`;
|
|
64907
65031
|
function refProblem(ref) {
|
|
64908
|
-
|
|
64909
|
-
|
|
64910
|
-
|
|
64911
|
-
|
|
64912
|
-
|
|
64913
|
-
|
|
64914
|
-
|
|
64915
|
-
|
|
64916
|
-
|
|
64917
|
-
|
|
64918
|
-
|
|
64919
|
-
|
|
64920
|
-
|
|
64921
|
-
|
|
64922
|
-
|
|
64923
|
-
|
|
64924
|
-
|
|
64925
|
-
|
|
64926
|
-
return
|
|
64927
|
-
|
|
64928
|
-
if (
|
|
64929
|
-
|
|
64930
|
-
|
|
64931
|
-
return `<ref artboard="${ref.artboard}"> names either a group or a board, not both`;
|
|
65032
|
+
const kinds2 = refKinds(ref);
|
|
65033
|
+
if (kinds2.length > 1)
|
|
65034
|
+
return `<ref> names one target: either ${either(kinds2.map((kind2) => NOUN[kind2]))}, not both`;
|
|
65035
|
+
const kind = kinds2[0];
|
|
65036
|
+
if (!kind)
|
|
65037
|
+
return `<ref> needs ${either(NEEDS.map((name) => NOUN[name]))}: the slug of one in this project`;
|
|
65038
|
+
const slug = ref[kind] ?? "";
|
|
65039
|
+
const at7 = `<ref ${kind}="${slug}">`;
|
|
65040
|
+
if (!isArtifactId(slug))
|
|
65041
|
+
return `${at7} is not ${NOUN[kind].replace(/ page$/, "")} slug: lowercase letters, digits and hyphens`;
|
|
65042
|
+
const allowed = artifactKind(kind)?.subTargets ?? [];
|
|
65043
|
+
const named3 = REF_SUB_TARGETS.filter((sub2) => ref[sub2] !== void 0);
|
|
65044
|
+
for (const sub2 of named3) {
|
|
65045
|
+
if (allowed.includes(sub2)) continue;
|
|
65046
|
+
const owners = ARTIFACT_KINDS.filter(
|
|
65047
|
+
(each) => each.subTargets.includes(sub2)
|
|
65048
|
+
).map((each) => each.type);
|
|
65049
|
+
const takes = allowed.length ? `${NOUN[kind]} reference takes ${either(allowed)}` : `${NOUN[kind]} reference takes no sub-target`;
|
|
65050
|
+
return `${at7} has no ${sub2}: ${sub2} belongs to ${either(owners)} references; ${takes}`;
|
|
65051
|
+
}
|
|
65052
|
+
if (named3.length > 1) return `${at7} names either a ${named3[0]} or a ${named3[1]}, not both`;
|
|
65053
|
+
if (ref.page !== void 0 && !isPageId(ref.page))
|
|
65054
|
+
return `<ref ${kind}="${slug}" page="${ref.page}"> is not a page id: lowercase letters, digits and hyphens`;
|
|
64932
65055
|
return null;
|
|
64933
65056
|
}
|
|
64934
65057
|
function badRefs(state2) {
|
|
@@ -66225,31 +66348,31 @@ function injectRuntime(html, options2 = {}) {
|
|
|
66225
66348
|
}
|
|
66226
66349
|
|
|
66227
66350
|
// src/server/whiteboard-index.ts
|
|
66228
|
-
var
|
|
66229
|
-
var
|
|
66351
|
+
var import_node_fs20 = __toESM(require("node:fs"), 1);
|
|
66352
|
+
var import_node_path17 = __toESM(require("node:path"), 1);
|
|
66230
66353
|
var readText = (file) => {
|
|
66231
66354
|
try {
|
|
66232
|
-
return
|
|
66355
|
+
return import_node_fs20.default.readFileSync(file, "utf8");
|
|
66233
66356
|
} catch {
|
|
66234
66357
|
return null;
|
|
66235
66358
|
}
|
|
66236
66359
|
};
|
|
66237
66360
|
function pageFilesIn(dir) {
|
|
66238
66361
|
try {
|
|
66239
|
-
return
|
|
66362
|
+
return import_node_fs20.default.readdirSync(import_node_path17.default.join(dir, PAGES_DIR)).filter((name) => name.endsWith(".excalidraw")).map((name) => name.slice(0, -".excalidraw".length)).sort();
|
|
66240
66363
|
} catch {
|
|
66241
66364
|
return [];
|
|
66242
66365
|
}
|
|
66243
66366
|
}
|
|
66244
66367
|
function readBoardIndex(dir) {
|
|
66245
66368
|
const { pages } = normalizePages(
|
|
66246
|
-
parsePages(readText(
|
|
66369
|
+
parsePages(readText(import_node_path17.default.join(dir, PAGES_FILE))).pages,
|
|
66247
66370
|
pageFilesIn(dir)
|
|
66248
66371
|
);
|
|
66249
66372
|
const frames = {};
|
|
66250
66373
|
const scenes = {};
|
|
66251
66374
|
for (const page of pages) {
|
|
66252
|
-
const text5 = readText(
|
|
66375
|
+
const text5 = readText(import_node_path17.default.join(dir, pageFileOf(page.id)));
|
|
66253
66376
|
const parsed = text5 === null ? null : parseScene(text5);
|
|
66254
66377
|
if (!parsed || "error" in parsed) continue;
|
|
66255
66378
|
scenes[page.id] = parsed.scene;
|
|
@@ -66279,11 +66402,11 @@ function publishPayload(ref, dir, title, payload, comments = emptyComments()) {
|
|
|
66279
66402
|
if (ref.type === "document")
|
|
66280
66403
|
return {
|
|
66281
66404
|
title,
|
|
66282
|
-
state: parseDocument2(
|
|
66405
|
+
state: parseDocument2(import_node_fs21.default.readFileSync(import_node_path18.default.join(dir, "doc.xml"), "utf8")),
|
|
66283
66406
|
comments: sharedComments(comments)
|
|
66284
66407
|
};
|
|
66285
66408
|
if (ref.type === "whiteboard") {
|
|
66286
|
-
const parsed = parseScene(
|
|
66409
|
+
const parsed = parseScene(import_node_fs21.default.readFileSync(import_node_path18.default.join(dir, "scene.excalidraw"), "utf8"));
|
|
66287
66410
|
if ("error" in parsed) throw new Error(parsed.error);
|
|
66288
66411
|
const pages = livePages(readBoardIndex(dir).pages);
|
|
66289
66412
|
return {
|
|
@@ -66317,12 +66440,12 @@ function withCloudRuntime(type, files) {
|
|
|
66317
66440
|
}
|
|
66318
66441
|
|
|
66319
66442
|
// src/server/settings.ts
|
|
66320
|
-
var
|
|
66321
|
-
var
|
|
66322
|
-
var settingsFileFor = (credentialsFile2) =>
|
|
66443
|
+
var import_node_fs22 = __toESM(require("node:fs"), 1);
|
|
66444
|
+
var import_node_path19 = __toESM(require("node:path"), 1);
|
|
66445
|
+
var settingsFileFor = (credentialsFile2) => import_node_path19.default.join(import_node_path19.default.dirname(credentialsFile2), "config.json");
|
|
66323
66446
|
function readSettings(file) {
|
|
66324
66447
|
try {
|
|
66325
|
-
const raw = JSON.parse(
|
|
66448
|
+
const raw = JSON.parse(import_node_fs22.default.readFileSync(file, "utf8"));
|
|
66326
66449
|
return typeof raw === "object" && raw !== null && !Array.isArray(raw) ? raw : {};
|
|
66327
66450
|
} catch {
|
|
66328
66451
|
return {};
|
|
@@ -66333,7 +66456,7 @@ function readGlobalAutoPublish(file) {
|
|
|
66333
66456
|
return typeof value === "boolean" ? value : void 0;
|
|
66334
66457
|
}
|
|
66335
66458
|
function writeGlobalAutoPublish(file, value) {
|
|
66336
|
-
|
|
66459
|
+
import_node_fs22.default.mkdirSync(import_node_path19.default.dirname(file), { recursive: true, mode: 448 });
|
|
66337
66460
|
writeJsonAtomic(file, { ...readSettings(file), autoPublish: value });
|
|
66338
66461
|
}
|
|
66339
66462
|
function postponeGlobalAutoPublish(file) {
|
|
@@ -66342,7 +66465,7 @@ function postponeGlobalAutoPublish(file) {
|
|
|
66342
66465
|
writeGlobalAutoPublish(file, false);
|
|
66343
66466
|
return "off";
|
|
66344
66467
|
}
|
|
66345
|
-
|
|
66468
|
+
import_node_fs22.default.mkdirSync(import_node_path19.default.dirname(file), { recursive: true, mode: 448 });
|
|
66346
66469
|
writeJsonAtomic(file, { ...settings, autoPublishPostponed: true });
|
|
66347
66470
|
return "postponed";
|
|
66348
66471
|
}
|
|
@@ -66362,7 +66485,7 @@ var CALLBACK_TICKET_TTL_MS = 30 * 60 * 1e3;
|
|
|
66362
66485
|
var UPLOAD_CONCURRENCY = 6;
|
|
66363
66486
|
var MAX_JSON_BODY = 4096;
|
|
66364
66487
|
var CLOUD_ID = /^[\w-]{1,64}$/;
|
|
66365
|
-
var ROUTE = /^\/api\/cloud\/(status|login|logout|artifacts|publish|publication|reserve|visibility|auto-publish|sync)(?:\/([^/]+)(?:\/([^/]+))?)?$/;
|
|
66488
|
+
var ROUTE = /^\/api\/cloud\/(status|login|logout|artifacts|publish|publish-refs|publication|refs|reserve|visibility|auto-publish|sync)(?:\/([^/]+)(?:\/([^/]+))?)?$/;
|
|
66366
66489
|
var SignedOut = class extends Error {
|
|
66367
66490
|
};
|
|
66368
66491
|
var CloudRefused = class extends Error {
|
|
@@ -66479,7 +66602,7 @@ function createCloudRoutes(options2) {
|
|
|
66479
66602
|
const challenge = import_node_crypto10.default.createHash("sha256").update(verifier).digest("base64url");
|
|
66480
66603
|
return `${origin}/auth/cli?port=${options2.port()}&state=${state2}&challenge=${challenge}`;
|
|
66481
66604
|
};
|
|
66482
|
-
const cloudFetch = async (method,
|
|
66605
|
+
const cloudFetch = async (method, path45, body) => {
|
|
66483
66606
|
const credentials = readCredentials(credentialsFile2, origin);
|
|
66484
66607
|
if (!credentials) throw new SignedOut();
|
|
66485
66608
|
const headers = { Authorization: `Bearer ${credentials.token}` };
|
|
@@ -66493,7 +66616,7 @@ function createCloudRoutes(options2) {
|
|
|
66493
66616
|
}
|
|
66494
66617
|
let res;
|
|
66495
66618
|
try {
|
|
66496
|
-
res = await fetch(`${origin}${
|
|
66619
|
+
res = await fetch(`${origin}${path45}`, { method, headers, body: payload });
|
|
66497
66620
|
} catch (err) {
|
|
66498
66621
|
throw new CloudRefused(502, `could not reach ${origin}: ${err.message}`);
|
|
66499
66622
|
}
|
|
@@ -66522,21 +66645,6 @@ function createCloudRoutes(options2) {
|
|
|
66522
66645
|
return res;
|
|
66523
66646
|
};
|
|
66524
66647
|
const artifactEntry = (key2) => readConfig(configFile).config.artifacts[key2] ?? {};
|
|
66525
|
-
const referencedBoards = (ref, visibility) => {
|
|
66526
|
-
const boards = {
|
|
66527
|
-
unpublished: [],
|
|
66528
|
-
private: [],
|
|
66529
|
-
published: []
|
|
66530
|
-
};
|
|
66531
|
-
for (const slug of new Set(options2.references?.(ref) ?? [])) {
|
|
66532
|
-
const entry = artifactEntry(`artboard/${slug}`);
|
|
66533
|
-
const state2 = publishState(entry);
|
|
66534
|
-
if (!state2.published) boards.unpublished.push(slug);
|
|
66535
|
-
else if (visibility === "public" && (entry.cloud?.visibility ?? state2.visibility) === "private")
|
|
66536
|
-
boards.private.push(slug);
|
|
66537
|
-
}
|
|
66538
|
-
return boards;
|
|
66539
|
-
};
|
|
66540
66648
|
const publications = /* @__PURE__ */ new Map();
|
|
66541
66649
|
const changedDuringPublish = /* @__PURE__ */ new Set();
|
|
66542
66650
|
const snapshot2 = (key2) => ({
|
|
@@ -66629,7 +66737,7 @@ function createCloudRoutes(options2) {
|
|
|
66629
66737
|
const content = {
|
|
66630
66738
|
title: inspected.title,
|
|
66631
66739
|
payload: inspected.payload,
|
|
66632
|
-
files: hashed.map(({ path:
|
|
66740
|
+
files: hashed.map(({ path: path45, hash: hash2 }) => ({ path: path45, hash: hash2 }))
|
|
66633
66741
|
};
|
|
66634
66742
|
const fingerprint = sha(
|
|
66635
66743
|
JSON.stringify({
|
|
@@ -66840,6 +66948,102 @@ function createCloudRoutes(options2) {
|
|
|
66840
66948
|
return { kind: "failed", message: err.message };
|
|
66841
66949
|
}
|
|
66842
66950
|
};
|
|
66951
|
+
const cascadeStatus = async (key2) => {
|
|
66952
|
+
const ref = artifactKeyOf(key2);
|
|
66953
|
+
const inspected = ref && await options2.inspect(ref);
|
|
66954
|
+
if (!ref || !inspected) return null;
|
|
66955
|
+
const entry = artifactEntry(key2);
|
|
66956
|
+
const published = !!entry.cloud?.publishedAt;
|
|
66957
|
+
let blocked = null;
|
|
66958
|
+
let fingerprint = null;
|
|
66959
|
+
try {
|
|
66960
|
+
const prepared = await prepare(ref);
|
|
66961
|
+
if (prepared.ready) fingerprint = prepared.fingerprint;
|
|
66962
|
+
else blocked = prepared.reasons.join("; ");
|
|
66963
|
+
} catch (err) {
|
|
66964
|
+
if (err instanceof SignedOut) throw err;
|
|
66965
|
+
blocked = err.message.replace(/^cloud refused \(\d+\): /, "");
|
|
66966
|
+
}
|
|
66967
|
+
return {
|
|
66968
|
+
title: inspected.title,
|
|
66969
|
+
published,
|
|
66970
|
+
withdrawn: !entry.cloud && entry.autoPublish === false,
|
|
66971
|
+
stale: published && fingerprint !== null && fingerprint !== entry.cloud?.fingerprint,
|
|
66972
|
+
visibility: published ? entry.cloud?.visibility ?? publishState(entry).visibility : null,
|
|
66973
|
+
blocked
|
|
66974
|
+
};
|
|
66975
|
+
};
|
|
66976
|
+
const cascadeOf = (ref, visibility) => buildCascade(`${ref.type}/${ref.id}`, visibility, {
|
|
66977
|
+
referencesOf: (key2) => {
|
|
66978
|
+
const each = artifactKeyOf(key2);
|
|
66979
|
+
return each ? options2.references?.(each) ?? [] : [];
|
|
66980
|
+
},
|
|
66981
|
+
statusOf: cascadeStatus
|
|
66982
|
+
});
|
|
66983
|
+
const publishRefs = async (ref, refs3, makePublic, requested) => {
|
|
66984
|
+
const rootKey = `${ref.type}/${ref.id}`;
|
|
66985
|
+
const visibility = requested ?? publishState(artifactEntry(rootKey)).visibility;
|
|
66986
|
+
const listed = await cascadeOf(ref, visibility);
|
|
66987
|
+
const overrides = Object.fromEntries(
|
|
66988
|
+
listed.map((item2) => [item2.artifact, false])
|
|
66989
|
+
);
|
|
66990
|
+
for (const key2 of [...refs3, ...makePublic]) overrides[key2] = true;
|
|
66991
|
+
const items = resolveSelection(listed, overrides);
|
|
66992
|
+
const known = new Map(items.map((item2) => [item2.artifact, item2]));
|
|
66993
|
+
for (const key2 of [...refs3, ...makePublic]) {
|
|
66994
|
+
const item2 = known.get(key2);
|
|
66995
|
+
if (!item2?.selectable)
|
|
66996
|
+
throw new CloudRefused(400, `${key2} is not a reference ${rootKey} can publish`);
|
|
66997
|
+
if (makePublic.includes(key2) !== (item2.state === "private"))
|
|
66998
|
+
throw new CloudRefused(
|
|
66999
|
+
400,
|
|
67000
|
+
item2.state === "private" ? `${key2} is private: list it in makePublic` : `${key2} is not private: list it in refs`
|
|
67001
|
+
);
|
|
67002
|
+
}
|
|
67003
|
+
const results = [];
|
|
67004
|
+
let stopped = false;
|
|
67005
|
+
for (const item2 of items.filter((each) => each.checked)) {
|
|
67006
|
+
const action = item2.state === "private" ? "make-public" : item2.state === "stale" ? "update" : "publish";
|
|
67007
|
+
if (stopped) {
|
|
67008
|
+
results.push({ artifact: item2.artifact, action, status: "not_attempted" });
|
|
67009
|
+
continue;
|
|
67010
|
+
}
|
|
67011
|
+
const target = artifactKeyOf(item2.artifact);
|
|
67012
|
+
try {
|
|
67013
|
+
await serialized(item2.artifact, async () => {
|
|
67014
|
+
if (action === "make-public") {
|
|
67015
|
+
await setVisibility(target, "public");
|
|
67016
|
+
if (!item2.changed) return;
|
|
67017
|
+
}
|
|
67018
|
+
const result = await publish(target, action === "publish" ? visibility : void 0, {
|
|
67019
|
+
skipUnchanged: true
|
|
67020
|
+
});
|
|
67021
|
+
if (result.status !== 200)
|
|
67022
|
+
throw new CloudRefused(
|
|
67023
|
+
409,
|
|
67024
|
+
(result.body.reasons ?? []).join("; ") || "not ready to publish"
|
|
67025
|
+
);
|
|
67026
|
+
updateArtifactConfig(configFile, item2.artifact, { autoPublish: null });
|
|
67027
|
+
});
|
|
67028
|
+
results.push({ artifact: item2.artifact, action, status: "published" });
|
|
67029
|
+
} catch (err) {
|
|
67030
|
+
if (err instanceof SignedOut) throw err;
|
|
67031
|
+
const httpStatus = err instanceof CloudRefused ? err.status : void 0;
|
|
67032
|
+
results.push({
|
|
67033
|
+
artifact: item2.artifact,
|
|
67034
|
+
action,
|
|
67035
|
+
status: httpStatus !== void 0 && httpStatus < 500 ? "failed" : "unknown",
|
|
67036
|
+
error: {
|
|
67037
|
+
error: err.message.replace(/^cloud refused \(\d+\): /, ""),
|
|
67038
|
+
...err instanceof CloudRefused ? err.details : {},
|
|
67039
|
+
...httpStatus === void 0 ? {} : { httpStatus }
|
|
67040
|
+
}
|
|
67041
|
+
});
|
|
67042
|
+
stopped = true;
|
|
67043
|
+
}
|
|
67044
|
+
}
|
|
67045
|
+
return { status: stopped ? "partial" : "published", results };
|
|
67046
|
+
};
|
|
66843
67047
|
const route = async (req, res, match) => {
|
|
66844
67048
|
const [, action, first, second2] = match;
|
|
66845
67049
|
const method = req.method ?? "GET";
|
|
@@ -66877,9 +67081,7 @@ function createCloudRoutes(options2) {
|
|
|
66877
67081
|
if (action === "artifacts" && method === "GET" && !first) {
|
|
66878
67082
|
const query2 = new URL(req.url ?? "/", "http://localhost").searchParams;
|
|
66879
67083
|
query2.delete("key");
|
|
66880
|
-
const listed = await (await expectOk(
|
|
66881
|
-
await cloudFetch("GET", `/api/artifacts${query2.size ? `?${query2}` : ""}`)
|
|
66882
|
-
)).json();
|
|
67084
|
+
const listed = await (await expectOk(await cloudFetch("GET", `/api/artifacts${query2.size ? `?${query2}` : ""}`))).json();
|
|
66883
67085
|
adoptCloudVisibility(listed.artifacts);
|
|
66884
67086
|
sendJson(res, 200, listed);
|
|
66885
67087
|
return;
|
|
@@ -66901,12 +67103,27 @@ function createCloudRoutes(options2) {
|
|
|
66901
67103
|
if (published.status === 200) updateArtifactConfig(configFile, key2, { autoPublish: null });
|
|
66902
67104
|
return published;
|
|
66903
67105
|
});
|
|
66904
|
-
|
|
66905
|
-
|
|
66906
|
-
|
|
66907
|
-
|
|
66908
|
-
|
|
66909
|
-
)
|
|
67106
|
+
sendJson(res, result.status, result.body);
|
|
67107
|
+
return;
|
|
67108
|
+
}
|
|
67109
|
+
if (action === "refs" && ref && method === "GET") {
|
|
67110
|
+
const requested = new URL(req.url ?? "/", "http://hub").searchParams.get("visibility");
|
|
67111
|
+
if (requested !== null && !isVisibility(requested))
|
|
67112
|
+
throw new CloudRefused(400, 'visibility must be "public" or "private"');
|
|
67113
|
+
const visibility = requested ?? publishState(artifactEntry(`${ref.type}/${ref.id}`)).visibility;
|
|
67114
|
+
sendJson(res, 200, { visibility, items: await cascadeOf(ref, visibility) });
|
|
67115
|
+
return;
|
|
67116
|
+
}
|
|
67117
|
+
if (action === "publish-refs" && ref && method === "POST") {
|
|
67118
|
+
const body = await readJsonBody(req);
|
|
67119
|
+
if (body?.visibility !== void 0 && !isVisibility(body.visibility))
|
|
67120
|
+
throw new CloudRefused(400, 'visibility must be "public" or "private"');
|
|
67121
|
+
const list2 = (value) => Array.isArray(value) && value.every((each) => typeof each === "string") ? value : null;
|
|
67122
|
+
const refs3 = list2(body?.refs ?? []);
|
|
67123
|
+
const makePublic = list2(body?.makePublic ?? []);
|
|
67124
|
+
if (!refs3 || !makePublic)
|
|
67125
|
+
throw new CloudRefused(400, "refs and makePublic must be lists of <type>/<id>");
|
|
67126
|
+
sendJson(res, 200, await publishRefs(ref, refs3, makePublic, body?.visibility));
|
|
66910
67127
|
return;
|
|
66911
67128
|
}
|
|
66912
67129
|
if (action === "sync" && ref && method === "GET") {
|
|
@@ -67040,6 +67257,17 @@ function createCloudRoutes(options2) {
|
|
|
67040
67257
|
}
|
|
67041
67258
|
return snapshot2(key2);
|
|
67042
67259
|
},
|
|
67260
|
+
async cascade(key2, visibility) {
|
|
67261
|
+
const ref = artifactKeyOf(key2);
|
|
67262
|
+
if (!ref) throw new CloudRefused(404, "artifact not found");
|
|
67263
|
+
const shown = visibility ?? publishState(artifactEntry(key2)).visibility;
|
|
67264
|
+
return { visibility: shown, items: await cascadeOf(ref, shown) };
|
|
67265
|
+
},
|
|
67266
|
+
publishRefsNow(key2, refs3, makePublic, visibility) {
|
|
67267
|
+
const ref = artifactKeyOf(key2);
|
|
67268
|
+
if (!ref) throw new CloudRefused(404, "artifact not found");
|
|
67269
|
+
return publishRefs(ref, refs3, makePublic, visibility);
|
|
67270
|
+
},
|
|
67043
67271
|
autoPublishEnabled: () => autoPublishState().enabled,
|
|
67044
67272
|
token: () => readCredentials(credentialsFile2, origin)?.token ?? null,
|
|
67045
67273
|
async handle(req, res, match) {
|
|
@@ -67063,7 +67291,7 @@ function createCloudRoutes(options2) {
|
|
|
67063
67291
|
|
|
67064
67292
|
// src/server/comment-names.ts
|
|
67065
67293
|
var import_node_child_process2 = require("node:child_process");
|
|
67066
|
-
var
|
|
67294
|
+
var import_node_fs23 = __toESM(require("node:fs"), 1);
|
|
67067
67295
|
|
|
67068
67296
|
// src/server/agent.ts
|
|
67069
67297
|
var NAMES = {
|
|
@@ -67156,7 +67384,7 @@ function commentNames({ agentFile, projectDir, cloud }) {
|
|
|
67156
67384
|
agent: () => {
|
|
67157
67385
|
try {
|
|
67158
67386
|
return detectAgent(
|
|
67159
|
-
JSON.parse(
|
|
67387
|
+
JSON.parse(import_node_fs23.default.readFileSync(agentFile, "utf8"))
|
|
67160
67388
|
);
|
|
67161
67389
|
} catch {
|
|
67162
67390
|
return void 0;
|
|
@@ -67236,28 +67464,28 @@ function createDirectRelay(options2) {
|
|
|
67236
67464
|
}
|
|
67237
67465
|
|
|
67238
67466
|
// src/server/document.ts
|
|
67239
|
-
var
|
|
67240
|
-
var
|
|
67467
|
+
var import_node_fs25 = __toESM(require("node:fs"), 1);
|
|
67468
|
+
var import_node_path21 = __toESM(require("node:path"), 1);
|
|
67241
67469
|
|
|
67242
67470
|
// src/server/html.ts
|
|
67243
|
-
var
|
|
67244
|
-
var
|
|
67471
|
+
var import_node_fs24 = __toESM(require("node:fs"), 1);
|
|
67472
|
+
var import_node_path20 = __toESM(require("node:path"), 1);
|
|
67245
67473
|
var TITLE = /<title[^>]*>([\s\S]*?)<\/title>/i;
|
|
67246
67474
|
function latestMtime(dir) {
|
|
67247
67475
|
let latest2 = 0;
|
|
67248
67476
|
let entries2;
|
|
67249
67477
|
try {
|
|
67250
|
-
entries2 =
|
|
67478
|
+
entries2 = import_node_fs24.default.readdirSync(dir, { withFileTypes: true });
|
|
67251
67479
|
} catch {
|
|
67252
67480
|
return latest2;
|
|
67253
67481
|
}
|
|
67254
67482
|
for (const entry of entries2) {
|
|
67255
67483
|
if (entry.name.startsWith(".")) continue;
|
|
67256
|
-
const full =
|
|
67484
|
+
const full = import_node_path20.default.join(dir, entry.name);
|
|
67257
67485
|
try {
|
|
67258
67486
|
latest2 = Math.max(
|
|
67259
67487
|
latest2,
|
|
67260
|
-
entry.isDirectory() ? latestMtime(full) :
|
|
67488
|
+
entry.isDirectory() ? latestMtime(full) : import_node_fs24.default.statSync(full).mtimeMs
|
|
67261
67489
|
);
|
|
67262
67490
|
} catch {
|
|
67263
67491
|
continue;
|
|
@@ -67268,7 +67496,7 @@ function latestMtime(dir) {
|
|
|
67268
67496
|
function readHtml(dir, id3) {
|
|
67269
67497
|
let source;
|
|
67270
67498
|
try {
|
|
67271
|
-
source =
|
|
67499
|
+
source = import_node_fs24.default.readFileSync(import_node_path20.default.join(dir, ENTRY_FILE.html), "utf8");
|
|
67272
67500
|
} catch {
|
|
67273
67501
|
return { title: id3, warnings: ["index.html not found"], version: latestMtime(dir) };
|
|
67274
67502
|
}
|
|
@@ -67281,7 +67509,7 @@ var FIRST_HEADING = /<h[1-6]\b[^>]*>([\s\S]*?)<\/h[1-6]>/i;
|
|
|
67281
67509
|
function readDocument(dir, id3) {
|
|
67282
67510
|
let source;
|
|
67283
67511
|
try {
|
|
67284
|
-
source =
|
|
67512
|
+
source = import_node_fs25.default.readFileSync(import_node_path21.default.join(dir, ENTRY_FILE.document), "utf8");
|
|
67285
67513
|
} catch {
|
|
67286
67514
|
return { title: id3, warnings: ["doc.xml not found"], version: latestMtime(dir) };
|
|
67287
67515
|
}
|
|
@@ -67290,17 +67518,17 @@ function readDocument(dir, id3) {
|
|
|
67290
67518
|
}
|
|
67291
67519
|
|
|
67292
67520
|
// src/server/documents.ts
|
|
67293
|
-
var
|
|
67294
|
-
var
|
|
67521
|
+
var import_node_fs28 = __toESM(require("node:fs"), 1);
|
|
67522
|
+
var import_node_path25 = __toESM(require("node:path"), 1);
|
|
67295
67523
|
|
|
67296
67524
|
// src/server/change-cursors.ts
|
|
67297
|
-
var
|
|
67298
|
-
var
|
|
67299
|
-
var cursorsFile2 = (stateDir, id3) =>
|
|
67525
|
+
var import_node_fs26 = __toESM(require("node:fs"), 1);
|
|
67526
|
+
var import_node_path22 = __toESM(require("node:path"), 1);
|
|
67527
|
+
var cursorsFile2 = (stateDir, id3) => import_node_path22.default.join(stateDir, "document", id3, "change-cursors.json");
|
|
67300
67528
|
var isOpId = (value) => typeof value === "object" && value !== null && typeof value.peer === "string" && Number.isInteger(value.counter);
|
|
67301
67529
|
function read2(file) {
|
|
67302
67530
|
try {
|
|
67303
|
-
const value = JSON.parse(
|
|
67531
|
+
const value = JSON.parse(import_node_fs26.default.readFileSync(file, "utf8"));
|
|
67304
67532
|
if (typeof value !== "object" || value === null || Array.isArray(value)) return {};
|
|
67305
67533
|
return Object.fromEntries(
|
|
67306
67534
|
Object.entries(value).filter(
|
|
@@ -67322,8 +67550,8 @@ function createChangeCursors(stateDir) {
|
|
|
67322
67550
|
}
|
|
67323
67551
|
|
|
67324
67552
|
// src/server/document-asks.ts
|
|
67325
|
-
var
|
|
67326
|
-
var
|
|
67553
|
+
var import_node_fs27 = __toESM(require("node:fs"), 1);
|
|
67554
|
+
var import_node_path23 = __toESM(require("node:path"), 1);
|
|
67327
67555
|
var blockOf = (asks, ask) => asks.find((a5) => a5.id === ask)?.blockId ?? "*";
|
|
67328
67556
|
function humanAskOp(asks, threads2, op3) {
|
|
67329
67557
|
if (op3.op !== "create") {
|
|
@@ -67368,8 +67596,8 @@ function askListing(asks, threads2) {
|
|
|
67368
67596
|
};
|
|
67369
67597
|
}
|
|
67370
67598
|
function writeAsksFile(stateDir, id3, asks, threads2) {
|
|
67371
|
-
const file =
|
|
67372
|
-
if (!asks.length && !
|
|
67599
|
+
const file = import_node_path23.default.join(stateDir, "document", id3, "asks.json");
|
|
67600
|
+
if (!asks.length && !import_node_fs27.default.existsSync(file)) return;
|
|
67373
67601
|
const latest2 = latestSubmission(threads2);
|
|
67374
67602
|
writeJsonAtomic(file, {
|
|
67375
67603
|
latest: latest2 ? { id: latest2.id, at: latest2.at, withdrawn: latest2.withdrawn } : null
|
|
@@ -68730,19 +68958,19 @@ var ElementDOMSlot = class _ElementDOMSlot extends DOMSlot {
|
|
|
68730
68958
|
}
|
|
68731
68959
|
};
|
|
68732
68960
|
function indexPath(root, child) {
|
|
68733
|
-
const
|
|
68961
|
+
const path45 = [];
|
|
68734
68962
|
let node = child;
|
|
68735
68963
|
for (; node !== root && node !== null; node = node.parentNode) {
|
|
68736
68964
|
let i7 = 0;
|
|
68737
68965
|
for (let sibling = node.previousSibling; sibling !== null; sibling = sibling.previousSibling) {
|
|
68738
68966
|
i7++;
|
|
68739
68967
|
}
|
|
68740
|
-
|
|
68968
|
+
path45.push(i7);
|
|
68741
68969
|
}
|
|
68742
68970
|
if (!(node === root)) {
|
|
68743
68971
|
formatDevErrorMessage(`indexPath: root is not a parent of child`);
|
|
68744
68972
|
}
|
|
68745
|
-
return
|
|
68973
|
+
return path45.reverse();
|
|
68746
68974
|
}
|
|
68747
68975
|
var TEXT_MUTATION_VARIANCE = 100;
|
|
68748
68976
|
var isProcessingMutations = false;
|
|
@@ -78102,9 +78330,9 @@ function getActiveElementDeep(root) {
|
|
|
78102
78330
|
function getComposedEventTarget(event) {
|
|
78103
78331
|
const target = event.target;
|
|
78104
78332
|
if (target !== null && isHTMLElement(target) && target.shadowRoot !== null && typeof event.composedPath === "function") {
|
|
78105
|
-
const
|
|
78106
|
-
if (
|
|
78107
|
-
return
|
|
78333
|
+
const path45 = event.composedPath();
|
|
78334
|
+
if (path45.length > 0) {
|
|
78335
|
+
return path45[0];
|
|
78108
78336
|
}
|
|
78109
78337
|
}
|
|
78110
78338
|
return target;
|
|
@@ -90398,7 +90626,7 @@ var as = null;
|
|
|
90398
90626
|
function us(t7) {
|
|
90399
90627
|
as = t7;
|
|
90400
90628
|
}
|
|
90401
|
-
var
|
|
90629
|
+
var fs28 = /* @__PURE__ */ Symbol("INTERNAL_SKIP_AFTER_CLONE_FROM");
|
|
90402
90630
|
var ds = 1;
|
|
90403
90631
|
function hs() {
|
|
90404
90632
|
ds = 1;
|
|
@@ -90870,7 +91098,7 @@ function Il(t7) {
|
|
|
90870
91098
|
return ci(t7) || Fl(t7);
|
|
90871
91099
|
}
|
|
90872
91100
|
function Ll(t7, e5 = false) {
|
|
90873
|
-
const n8 = t7.constructor.clone(t7,
|
|
91101
|
+
const n8 = t7.constructor.clone(t7, fs28);
|
|
90874
91102
|
return Ds(n8, null), n8.afterCloneFrom(t7), e5 || n8.resetOnCopyNodeFrom(t7), n8;
|
|
90875
91103
|
}
|
|
90876
91104
|
function Kl(t7) {
|
|
@@ -91115,7 +91343,7 @@ function wc(t7) {
|
|
|
91115
91343
|
})(t7), Tc.set(t7, n8)), n8;
|
|
91116
91344
|
}
|
|
91117
91345
|
function Ec(t7) {
|
|
91118
|
-
const e5 = t7.constructor.clone(t7,
|
|
91346
|
+
const e5 = t7.constructor.clone(t7, fs28);
|
|
91119
91347
|
return e5.afterCloneFrom(t7), e5;
|
|
91120
91348
|
}
|
|
91121
91349
|
function Ac(t7) {
|
|
@@ -91262,7 +91490,7 @@ function Bc(t7) {
|
|
|
91262
91490
|
if (Kc(t9, "clone") || (t9.clone = (e7, n12) => {
|
|
91263
91491
|
us(e7);
|
|
91264
91492
|
const o10 = new t9();
|
|
91265
|
-
return n12 !==
|
|
91493
|
+
return n12 !== fs28 && o10.afterCloneFrom(e7), o10;
|
|
91266
91494
|
}), Kc(t9, "importJSON") || (t9.importJSON = o9 && o9.$importJSON || /* @__PURE__ */ (function(t10) {
|
|
91267
91495
|
return (e7) => {
|
|
91268
91496
|
const n12 = ga(t10);
|
|
@@ -120238,10 +120466,10 @@ function $placeBlocks(runtime, $isTarget) {
|
|
|
120238
120466
|
}
|
|
120239
120467
|
const documentKey = $documentKey();
|
|
120240
120468
|
for (const [key2, frame] of targets) {
|
|
120241
|
-
const
|
|
120242
|
-
let id3 = derivePositionalId(documentKey,
|
|
120469
|
+
const path45 = placeOf(frame);
|
|
120470
|
+
let id3 = derivePositionalId(documentKey, path45);
|
|
120243
120471
|
for (let attempt = 1; taken.has(id3); attempt++) {
|
|
120244
|
-
id3 = derivePositionalId(documentKey, `${
|
|
120472
|
+
id3 = derivePositionalId(documentKey, `${path45}#${attempt}`);
|
|
120245
120473
|
}
|
|
120246
120474
|
taken.add(id3);
|
|
120247
120475
|
placed.set(key2, id3);
|
|
@@ -132457,7 +132685,7 @@ function Vx(e5) {
|
|
|
132457
132685
|
}
|
|
132458
132686
|
return t7;
|
|
132459
132687
|
}
|
|
132460
|
-
function
|
|
132688
|
+
function fs29(e5, t7, n8) {
|
|
132461
132689
|
for (; t7 < e5.length; ) {
|
|
132462
132690
|
let r8 = e5[t7];
|
|
132463
132691
|
if (r8 === " " || r8 === `
|
|
@@ -132476,20 +132704,20 @@ function Rp(e5, t7) {
|
|
|
132476
132704
|
}
|
|
132477
132705
|
function Xs2(e5, t7, n8, r8 = 0) {
|
|
132478
132706
|
if (r8 > Tp) throw new Error("YAML: nesting is too deep");
|
|
132479
|
-
t7 =
|
|
132707
|
+
t7 = fs29(e5, t7, false);
|
|
132480
132708
|
let o8 = e5[t7];
|
|
132481
132709
|
if (o8 === "{") {
|
|
132482
132710
|
let a5 = {};
|
|
132483
132711
|
t7++;
|
|
132484
132712
|
let i7 = true;
|
|
132485
132713
|
for (; ; ) {
|
|
132486
|
-
if (t7 =
|
|
132714
|
+
if (t7 = fs29(e5, t7, false), t7 >= e5.length) throw new Or2("YAML: unexpected end of the stream within a flow collection");
|
|
132487
132715
|
if (e5[t7] === "}") return [a5, t7 + 1];
|
|
132488
132716
|
Rp(e5[t7], i7);
|
|
132489
132717
|
let c10;
|
|
132490
|
-
[c10, t7] = Xs2(e5, t7, ":,}", r8 + 1), t7 =
|
|
132718
|
+
[c10, t7] = Xs2(e5, t7, ":,}", r8 + 1), t7 = fs29(e5, t7, false);
|
|
132491
132719
|
let l8 = null;
|
|
132492
|
-
e5[t7] === ":" && ([l8, t7] = Xs2(e5, t7 + 1, ",}", r8 + 1)), Vo3(a5, String(c10), l8), t7 =
|
|
132720
|
+
e5[t7] === ":" && ([l8, t7] = Xs2(e5, t7 + 1, ",}", r8 + 1)), Vo3(a5, String(c10), l8), t7 = fs29(e5, t7, false), i7 = e5[t7] === ",", i7 && t7++;
|
|
132493
132721
|
}
|
|
132494
132722
|
}
|
|
132495
132723
|
if (o8 === "[") {
|
|
@@ -132497,11 +132725,11 @@ function Xs2(e5, t7, n8, r8 = 0) {
|
|
|
132497
132725
|
t7++;
|
|
132498
132726
|
let i7 = true;
|
|
132499
132727
|
for (; ; ) {
|
|
132500
|
-
if (t7 =
|
|
132728
|
+
if (t7 = fs29(e5, t7, false), t7 >= e5.length) throw new Or2("YAML: unexpected end of the stream within a flow collection");
|
|
132501
132729
|
if (e5[t7] === "]") return [a5, t7 + 1];
|
|
132502
132730
|
Rp(e5[t7], i7);
|
|
132503
132731
|
let c10;
|
|
132504
|
-
[c10, t7] = Xs2(e5, t7, ",]", r8 + 1), a5.push(c10), t7 =
|
|
132732
|
+
[c10, t7] = Xs2(e5, t7, ",]", r8 + 1), a5.push(c10), t7 = fs29(e5, t7, false), i7 = e5[t7] === ",", i7 && t7++;
|
|
132505
132733
|
}
|
|
132506
132734
|
}
|
|
132507
132735
|
if (o8 === '"') {
|
|
@@ -132661,7 +132889,7 @@ function Hn3(e5) {
|
|
|
132661
132889
|
let t7 = e5.trim();
|
|
132662
132890
|
if (t7[0] === "{" || t7[0] === "[") try {
|
|
132663
132891
|
let [o8, s7] = Xs2(t7, 0, "");
|
|
132664
|
-
if (
|
|
132892
|
+
if (fs29(t7, s7, false) === t7.length) return o8;
|
|
132665
132893
|
} catch (o8) {
|
|
132666
132894
|
throw o8 instanceof Or2 ? new Error(o8.message) : o8;
|
|
132667
132895
|
}
|
|
@@ -152995,27 +153223,27 @@ var sqrtTall = function sqrtTall2(extraVinculum, hLinePad2, viewBoxHeight) {
|
|
|
152995
153223
|
};
|
|
152996
153224
|
var sqrtPath = function sqrtPath2(size, extraVinculum, viewBoxHeight) {
|
|
152997
153225
|
extraVinculum = 1e3 * extraVinculum;
|
|
152998
|
-
var
|
|
153226
|
+
var path45 = "";
|
|
152999
153227
|
switch (size) {
|
|
153000
153228
|
case "sqrtMain":
|
|
153001
|
-
|
|
153229
|
+
path45 = sqrtMain(extraVinculum, hLinePad);
|
|
153002
153230
|
break;
|
|
153003
153231
|
case "sqrtSize1":
|
|
153004
|
-
|
|
153232
|
+
path45 = sqrtSize1(extraVinculum, hLinePad);
|
|
153005
153233
|
break;
|
|
153006
153234
|
case "sqrtSize2":
|
|
153007
|
-
|
|
153235
|
+
path45 = sqrtSize2(extraVinculum, hLinePad);
|
|
153008
153236
|
break;
|
|
153009
153237
|
case "sqrtSize3":
|
|
153010
|
-
|
|
153238
|
+
path45 = sqrtSize3(extraVinculum, hLinePad);
|
|
153011
153239
|
break;
|
|
153012
153240
|
case "sqrtSize4":
|
|
153013
|
-
|
|
153241
|
+
path45 = sqrtSize4(extraVinculum, hLinePad);
|
|
153014
153242
|
break;
|
|
153015
153243
|
case "sqrtTall":
|
|
153016
|
-
|
|
153244
|
+
path45 = sqrtTall(extraVinculum, hLinePad, viewBoxHeight);
|
|
153017
153245
|
}
|
|
153018
|
-
return
|
|
153246
|
+
return path45;
|
|
153019
153247
|
};
|
|
153020
153248
|
var innerPath = function innerPath2(name, height) {
|
|
153021
153249
|
switch (name) {
|
|
@@ -153041,7 +153269,7 @@ var innerPath = function innerPath2(name, height) {
|
|
|
153041
153269
|
return "";
|
|
153042
153270
|
}
|
|
153043
153271
|
};
|
|
153044
|
-
var
|
|
153272
|
+
var path25 = {
|
|
153045
153273
|
// The doubleleftarrow geometry is from glyph U+21D0 in the font KaTeX Main
|
|
153046
153274
|
doubleleftarrow: "M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z",
|
|
153047
153275
|
// doublerightarrow is from glyph U+21D2 in font KaTeX Main
|
|
@@ -153570,7 +153798,7 @@ var PathNode = class {
|
|
|
153570
153798
|
if (this.alternate) {
|
|
153571
153799
|
node.setAttribute("d", this.alternate);
|
|
153572
153800
|
} else {
|
|
153573
|
-
node.setAttribute("d",
|
|
153801
|
+
node.setAttribute("d", path25[this.pathName]);
|
|
153574
153802
|
}
|
|
153575
153803
|
return node;
|
|
153576
153804
|
}
|
|
@@ -153578,7 +153806,7 @@ var PathNode = class {
|
|
|
153578
153806
|
if (this.alternate) {
|
|
153579
153807
|
return '<path d="' + escape4(this.alternate) + '"/>';
|
|
153580
153808
|
} else {
|
|
153581
|
-
return '<path d="' + escape4(
|
|
153809
|
+
return '<path d="' + escape4(path25[this.pathName]) + '"/>';
|
|
153582
153810
|
}
|
|
153583
153811
|
}
|
|
153584
153812
|
};
|
|
@@ -157229,8 +157457,8 @@ var svgData = {
|
|
|
157229
157457
|
};
|
|
157230
157458
|
var staticSvg = function staticSvg2(value, options2) {
|
|
157231
157459
|
var _svgData$value = svgData[value], pathName = _svgData$value[0], width = _svgData$value[1], height = _svgData$value[2];
|
|
157232
|
-
var
|
|
157233
|
-
var svgNode = new SvgNode([
|
|
157460
|
+
var path45 = new PathNode(pathName);
|
|
157461
|
+
var svgNode = new SvgNode([path45], {
|
|
157234
157462
|
"width": makeEm(width),
|
|
157235
157463
|
"height": makeEm(height),
|
|
157236
157464
|
// Override CSS rule `.katex svg { width: 100% }`
|
|
@@ -158373,8 +158601,8 @@ var stretchySvg = function stretchySvg2(group, options2) {
|
|
|
158373
158601
|
pathName = "tilde" + imgIndex;
|
|
158374
158602
|
}
|
|
158375
158603
|
}
|
|
158376
|
-
var
|
|
158377
|
-
var svgNode = new SvgNode([
|
|
158604
|
+
var path45 = new PathNode(pathName);
|
|
158605
|
+
var svgNode = new SvgNode([path45], {
|
|
158378
158606
|
"width": "100%",
|
|
158379
158607
|
"height": makeEm(_height),
|
|
158380
158608
|
"viewBox": "0 0 " + viewBoxWidth + " " + viewBoxHeight,
|
|
@@ -159588,8 +159816,8 @@ var makeGlyphSpan = function makeGlyphSpan2(symbol, font, mode, options2) {
|
|
|
159588
159816
|
};
|
|
159589
159817
|
var makeInner = function makeInner2(ch4, height, options2) {
|
|
159590
159818
|
var width = fontMetricsData["Size4-Regular"][ch4.charCodeAt(0)] ? fontMetricsData["Size4-Regular"][ch4.charCodeAt(0)][4] : fontMetricsData["Size1-Regular"][ch4.charCodeAt(0)][4];
|
|
159591
|
-
var
|
|
159592
|
-
var svgNode = new SvgNode([
|
|
159819
|
+
var path45 = new PathNode("inner", innerPath(ch4, Math.round(1e3 * height)));
|
|
159820
|
+
var svgNode = new SvgNode([path45], {
|
|
159593
159821
|
"width": makeEm(width),
|
|
159594
159822
|
"height": makeEm(height),
|
|
159595
159823
|
// Override CSS rule `.katex svg { width: 100% }`
|
|
@@ -159758,10 +159986,10 @@ var makeStackedDelim = function makeStackedDelim2(delim, heightTotal, center, op
|
|
|
159758
159986
|
var midHeight = realHeightTotal - topHeightTotal - bottomHeightTotal;
|
|
159759
159987
|
var viewBoxHeight = Math.round(realHeightTotal * 1e3);
|
|
159760
159988
|
var pathStr = tallDelim(svgLabel, Math.round(midHeight * 1e3));
|
|
159761
|
-
var
|
|
159989
|
+
var path45 = new PathNode(svgLabel, pathStr);
|
|
159762
159990
|
var width = makeEm(viewBoxWidth / 1e3);
|
|
159763
159991
|
var height = makeEm(viewBoxHeight / 1e3);
|
|
159764
|
-
var svg = new SvgNode([
|
|
159992
|
+
var svg = new SvgNode([path45], {
|
|
159765
159993
|
"width": width,
|
|
159766
159994
|
"height": height,
|
|
159767
159995
|
"viewBox": "0 0 " + viewBoxWidth + " " + viewBoxHeight
|
|
@@ -159802,8 +160030,8 @@ var makeStackedDelim = function makeStackedDelim2(delim, heightTotal, center, op
|
|
|
159802
160030
|
var vbPad = 80;
|
|
159803
160031
|
var emPad = 0.08;
|
|
159804
160032
|
var sqrtSvg = function sqrtSvg2(sqrtName, height, viewBoxHeight, extraVinculum, options2) {
|
|
159805
|
-
var
|
|
159806
|
-
var pathNode = new PathNode(sqrtName,
|
|
160033
|
+
var path45 = sqrtPath(sqrtName, extraVinculum, viewBoxHeight);
|
|
160034
|
+
var pathNode = new PathNode(sqrtName, path45);
|
|
159807
160035
|
var svg = new SvgNode([pathNode], {
|
|
159808
160036
|
// Note: 1000:1 ratio of viewBox to document em width.
|
|
159809
160037
|
"width": "400em",
|
|
@@ -160302,8 +160530,8 @@ var htmlBuilder$7 = (group, options2) => {
|
|
|
160302
160530
|
var angleHeight = inner2.height + inner2.depth + lineWeight + clearance;
|
|
160303
160531
|
inner2.style.paddingLeft = makeEm(angleHeight / 2 + lineWeight);
|
|
160304
160532
|
var viewBoxHeight = Math.floor(1e3 * angleHeight * scale);
|
|
160305
|
-
var
|
|
160306
|
-
var svgNode = new SvgNode([new PathNode("phase",
|
|
160533
|
+
var path45 = phasePath(viewBoxHeight);
|
|
160534
|
+
var svgNode = new SvgNode([new PathNode("phase", path45)], {
|
|
160307
160535
|
"width": "400em",
|
|
160308
160536
|
"height": makeEm(viewBoxHeight / 1e3),
|
|
160309
160537
|
"viewBox": "0 0 400000 " + viewBoxHeight,
|
|
@@ -166827,7 +167055,7 @@ function renderProblems(state2) {
|
|
|
166827
167055
|
|
|
166828
167056
|
// src/server/document-session.ts
|
|
166829
167057
|
var import_promises = __toESM(require("node:fs/promises"), 1);
|
|
166830
|
-
var
|
|
167058
|
+
var import_node_path24 = __toESM(require("node:path"), 1);
|
|
166831
167059
|
|
|
166832
167060
|
// ../../node_modules/.pnpm/loro-crdt@1.16.4/node_modules/loro-crdt/base64/index.js
|
|
166833
167061
|
function _loadWasmModule(sync, filepath, src, imports2) {
|
|
@@ -166843,10 +167071,10 @@ function _loadWasmModule(sync, filepath, src, imports2) {
|
|
|
166843
167071
|
var buf = null;
|
|
166844
167072
|
var isNode2 = typeof process !== "undefined" && process.versions != null && process.versions.node != null;
|
|
166845
167073
|
if (filepath && isNode2) {
|
|
166846
|
-
var
|
|
166847
|
-
var
|
|
167074
|
+
var fs50 = null;
|
|
167075
|
+
var path45 = null;
|
|
166848
167076
|
return new Promise((resolve, reject) => {
|
|
166849
|
-
|
|
167077
|
+
fs50.readFile(path45.resolve(__dirname, filepath), (error, buffer) => {
|
|
166850
167078
|
if (error != null) {
|
|
166851
167079
|
reject(error);
|
|
166852
167080
|
} else {
|
|
@@ -168149,10 +168377,10 @@ var LoroDoc = class _LoroDoc {
|
|
|
168149
168377
|
* @param {string} path
|
|
168150
168378
|
* @returns {Value | Container | undefined}
|
|
168151
168379
|
*/
|
|
168152
|
-
getByPath(
|
|
168380
|
+
getByPath(path45) {
|
|
168153
168381
|
try {
|
|
168154
168382
|
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
|
168155
|
-
const ptr0 = passStringToWasm0(
|
|
168383
|
+
const ptr0 = passStringToWasm0(path45, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
|
168156
168384
|
const len0 = WASM_VECTOR_LEN;
|
|
168157
168385
|
wasm.lorodoc_getByPath(retptr, this.__wbg_ptr, ptr0, len0);
|
|
168158
168386
|
var r02 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
|
|
@@ -175773,16 +176001,16 @@ var Diff = class {
|
|
|
175773
176001
|
}
|
|
175774
176002
|
}
|
|
175775
176003
|
}
|
|
175776
|
-
addToPath(
|
|
175777
|
-
const last =
|
|
176004
|
+
addToPath(path45, added, removed, oldPosInc, options2) {
|
|
176005
|
+
const last = path45.lastComponent;
|
|
175778
176006
|
if (last && !options2.oneChangePerToken && last.added === added && last.removed === removed) {
|
|
175779
176007
|
return {
|
|
175780
|
-
oldPos:
|
|
176008
|
+
oldPos: path45.oldPos + oldPosInc,
|
|
175781
176009
|
lastComponent: { count: last.count + 1, added, removed, previousComponent: last.previousComponent }
|
|
175782
176010
|
};
|
|
175783
176011
|
} else {
|
|
175784
176012
|
return {
|
|
175785
|
-
oldPos:
|
|
176013
|
+
oldPos: path45.oldPos + oldPosInc,
|
|
175786
176014
|
lastComponent: { count: 1, added, removed, previousComponent: last }
|
|
175787
176015
|
};
|
|
175788
176016
|
}
|
|
@@ -180666,7 +180894,7 @@ async function readText2(file) {
|
|
|
180666
180894
|
}
|
|
180667
180895
|
}
|
|
180668
180896
|
async function writeAtomic(file, data) {
|
|
180669
|
-
await import_promises.default.mkdir(
|
|
180897
|
+
await import_promises.default.mkdir(import_node_path24.default.dirname(file), { recursive: true });
|
|
180670
180898
|
const tmp = `${file}.${process.pid}.tmp`;
|
|
180671
180899
|
await import_promises.default.writeFile(tmp, data);
|
|
180672
180900
|
await import_promises.default.rename(tmp, file);
|
|
@@ -180700,7 +180928,7 @@ async function createDocumentSession(options2) {
|
|
|
180700
180928
|
let lastGoodText = null;
|
|
180701
180929
|
let lastAgentText = null;
|
|
180702
180930
|
let lastFileText = await readText2(file) ?? "";
|
|
180703
|
-
const activityFile =
|
|
180931
|
+
const activityFile = import_node_path24.default.join(import_node_path24.default.dirname(snapshotFile), "agent-active");
|
|
180704
180932
|
let agentActiveAt = await lastAgentWrite(activityFile, file);
|
|
180705
180933
|
let activitySaved = Promise.resolve();
|
|
180706
180934
|
const emitStatus = () => emit({ type: "status", outcome, streaming: streaming > 0, agentActiveAt });
|
|
@@ -180925,39 +181153,45 @@ function fillRefIds(state2, lookup2) {
|
|
|
180925
181153
|
const children2 = state2.root.children.map(fill);
|
|
180926
181154
|
return { ...state2, root: { ...state2.root, children: children2 } };
|
|
180927
181155
|
}
|
|
181156
|
+
var NOUN2 = {
|
|
181157
|
+
document: "a document",
|
|
181158
|
+
artboard: "an artboard",
|
|
181159
|
+
whiteboard: "a whiteboard",
|
|
181160
|
+
html: "an html page"
|
|
181161
|
+
};
|
|
180928
181162
|
function refWarnings(refs3, lookup2) {
|
|
180929
181163
|
return refs3.flatMap((ref) => {
|
|
180930
181164
|
const at7 = `block ${ref.blockId}: `;
|
|
180931
|
-
|
|
180932
|
-
const slug = ref
|
|
180933
|
-
const id3 = lookup2.idOf(slug);
|
|
180934
|
-
if (!id3)
|
|
181165
|
+
const kind = refKind(ref);
|
|
181166
|
+
const slug = refSlug(ref);
|
|
181167
|
+
const id3 = lookup2.idOf(slug, kind);
|
|
181168
|
+
if (!id3)
|
|
181169
|
+
return [`${at7}<ref ${kind}="${slug}"> names ${NOUN2[kind]} that is not in this project`];
|
|
180935
181170
|
if (ref.to && ref.to !== id3)
|
|
180936
181171
|
return [
|
|
180937
|
-
`${at7}<ref
|
|
180938
|
-
];
|
|
180939
|
-
const canvas = lookup2.canvasOf(slug);
|
|
180940
|
-
if (!canvas) return [];
|
|
180941
|
-
if (ref.group && !canvas.groups.includes(ref.group))
|
|
180942
|
-
return [
|
|
180943
|
-
`${at7}<ref artboard="${slug}" group="${ref.group}">: the artboard has no group ${ref.group}`
|
|
180944
|
-
];
|
|
180945
|
-
if (ref.board && !canvas.boards.includes(ref.board))
|
|
180946
|
-
return [
|
|
180947
|
-
`${at7}<ref artboard="${slug}" board="${ref.board}">: the artboard has no board ${ref.board}`
|
|
181172
|
+
`${at7}<ref ${kind}="${slug}"> points at ${ref.to}, but ${slug} is now ${id3}; delete to= to point the reference at it`
|
|
180948
181173
|
];
|
|
181174
|
+
if (kind === "whiteboard") return whiteboardWarnings(ref, at7, lookup2);
|
|
181175
|
+
if (kind === "artboard") return artboardWarnings(ref, at7, lookup2);
|
|
180949
181176
|
return [];
|
|
180950
181177
|
});
|
|
180951
181178
|
}
|
|
180952
|
-
function
|
|
180953
|
-
const slug = ref.
|
|
180954
|
-
const
|
|
180955
|
-
if (!
|
|
180956
|
-
|
|
180957
|
-
|
|
181179
|
+
function artboardWarnings(ref, at7, lookup2) {
|
|
181180
|
+
const slug = ref.artboard;
|
|
181181
|
+
const canvas = lookup2.canvasOf(slug);
|
|
181182
|
+
if (!canvas) return [];
|
|
181183
|
+
if (ref.group && !canvas.groups.includes(ref.group))
|
|
181184
|
+
return [
|
|
181185
|
+
`${at7}<ref artboard="${slug}" group="${ref.group}">: the artboard has no group ${ref.group}`
|
|
181186
|
+
];
|
|
181187
|
+
if (ref.board && !canvas.boards.includes(ref.board))
|
|
180958
181188
|
return [
|
|
180959
|
-
`${at7}<ref
|
|
181189
|
+
`${at7}<ref artboard="${slug}" board="${ref.board}">: the artboard has no board ${ref.board}`
|
|
180960
181190
|
];
|
|
181191
|
+
return [];
|
|
181192
|
+
}
|
|
181193
|
+
function whiteboardWarnings(ref, at7, lookup2) {
|
|
181194
|
+
const slug = ref.whiteboard;
|
|
180961
181195
|
const index = lookup2.framesOf(slug);
|
|
180962
181196
|
if (!index) return [];
|
|
180963
181197
|
if (ref.page) {
|
|
@@ -181011,10 +181245,14 @@ function createDocumentRegistry(options2) {
|
|
|
181011
181245
|
const before2 = JSON.parse(lastArtboards.get(id3) ?? "[]");
|
|
181012
181246
|
lastArtboards.set(id3, key2);
|
|
181013
181247
|
const all = [...before2, ...refs3];
|
|
181014
|
-
const
|
|
181015
|
-
|
|
181016
|
-
|
|
181017
|
-
|
|
181248
|
+
const keys2 = [...new Set(all.map((ref) => `${refKind(ref)}/${refSlug(ref)}`))];
|
|
181249
|
+
options2.onRefsChange?.(
|
|
181250
|
+
id3,
|
|
181251
|
+
keys2.map((key3) => {
|
|
181252
|
+
const [type, slug] = key3.split("/");
|
|
181253
|
+
return { type, id: slug };
|
|
181254
|
+
})
|
|
181255
|
+
);
|
|
181018
181256
|
};
|
|
181019
181257
|
const liveRefWarnings = (id3) => {
|
|
181020
181258
|
const session = ready.get(id3);
|
|
@@ -181022,7 +181260,7 @@ function createDocumentRegistry(options2) {
|
|
|
181022
181260
|
};
|
|
181023
181261
|
const warnings = /* @__PURE__ */ new Map();
|
|
181024
181262
|
const rechecks = /* @__PURE__ */ new Map();
|
|
181025
|
-
const docFile = (id3) =>
|
|
181263
|
+
const docFile = (id3) => import_node_path25.default.join(options2.root, "document", id3, "doc.xml");
|
|
181026
181264
|
const commentStores = /* @__PURE__ */ new Map();
|
|
181027
181265
|
const cursors = createCommentCursors(options2.stateDir);
|
|
181028
181266
|
const changeCursors = createChangeCursors(options2.stateDir);
|
|
@@ -181030,7 +181268,7 @@ function createDocumentRegistry(options2) {
|
|
|
181030
181268
|
let store = commentStores.get(id3);
|
|
181031
181269
|
if (!store) {
|
|
181032
181270
|
store = createCommentStore(
|
|
181033
|
-
|
|
181271
|
+
import_node_path25.default.join(options2.root, "document", id3, "comments.json"),
|
|
181034
181272
|
options2.names
|
|
181035
181273
|
);
|
|
181036
181274
|
commentStores.set(id3, store);
|
|
@@ -181063,10 +181301,10 @@ function createDocumentRegistry(options2) {
|
|
|
181063
181301
|
if (JSON.stringify(store.warnings()) !== before2) options2.onWarningsChange(id3);
|
|
181064
181302
|
};
|
|
181065
181303
|
const create3 = async (id3) => {
|
|
181066
|
-
if (!
|
|
181304
|
+
if (!import_node_fs28.default.existsSync(docFile(id3))) return null;
|
|
181067
181305
|
const session = await createDocumentSession({
|
|
181068
181306
|
file: docFile(id3),
|
|
181069
|
-
snapshotFile:
|
|
181307
|
+
snapshotFile: import_node_path25.default.join(options2.stateDir, "document", id3, "doc.loro"),
|
|
181070
181308
|
fillRefs: (state2) => fillRefIds(state2, refLookup),
|
|
181071
181309
|
...options2.timing,
|
|
181072
181310
|
log: options2.log
|
|
@@ -181144,7 +181382,7 @@ function createDocumentRegistry(options2) {
|
|
|
181144
181382
|
const known = sessions.has(id3);
|
|
181145
181383
|
void open2(id3).then((session) => {
|
|
181146
181384
|
if (!session || !known) return;
|
|
181147
|
-
|
|
181385
|
+
import_node_fs28.default.readFile(docFile(id3), "utf8", (err, text5) => {
|
|
181148
181386
|
if (!err) session.onFileText(text5);
|
|
181149
181387
|
});
|
|
181150
181388
|
});
|
|
@@ -181225,8 +181463,8 @@ function createDocumentRegistry(options2) {
|
|
|
181225
181463
|
}
|
|
181226
181464
|
|
|
181227
181465
|
// src/server/dynamic-blocks.ts
|
|
181228
|
-
var
|
|
181229
|
-
var
|
|
181466
|
+
var import_node_fs29 = __toESM(require("node:fs"), 1);
|
|
181467
|
+
var import_node_path26 = __toESM(require("node:path"), 1);
|
|
181230
181468
|
function dynamicUrls(xml) {
|
|
181231
181469
|
const urls = /* @__PURE__ */ new Set();
|
|
181232
181470
|
for (const match of stripOpaque(xml).matchAll(TAG)) {
|
|
@@ -181239,7 +181477,7 @@ function dynamicUrls(xml) {
|
|
|
181239
181477
|
}
|
|
181240
181478
|
var mtimeOf = (file) => {
|
|
181241
181479
|
try {
|
|
181242
|
-
return
|
|
181480
|
+
return import_node_fs29.default.statSync(file).mtimeMs;
|
|
181243
181481
|
} catch {
|
|
181244
181482
|
return -1;
|
|
181245
181483
|
}
|
|
@@ -181256,7 +181494,7 @@ function createDynamicBlocks(limits) {
|
|
|
181256
181494
|
};
|
|
181257
181495
|
const entry = (id3, dir, file) => {
|
|
181258
181496
|
const map = files(id3);
|
|
181259
|
-
const mtime = mtimeOf(
|
|
181497
|
+
const mtime = mtimeOf(import_node_path26.default.join(dir, file));
|
|
181260
181498
|
let state2 = map.get(file);
|
|
181261
181499
|
if (!state2 || state2.mtime !== mtime) {
|
|
181262
181500
|
state2 = { mtime, errors: [], ran: false };
|
|
@@ -181281,19 +181519,19 @@ function createDynamicBlocks(limits) {
|
|
|
181281
181519
|
state(id3, dir) {
|
|
181282
181520
|
let xml;
|
|
181283
181521
|
try {
|
|
181284
|
-
xml =
|
|
181522
|
+
xml = import_node_fs29.default.readFileSync(import_node_path26.default.join(dir, "doc.xml"), "utf8");
|
|
181285
181523
|
} catch {
|
|
181286
181524
|
return { warnings: [], dynamic: {} };
|
|
181287
181525
|
}
|
|
181288
181526
|
const urls = dynamicUrls(xml);
|
|
181289
181527
|
const map = files(id3);
|
|
181290
181528
|
for (const [file, state2] of map) {
|
|
181291
|
-
if (!urls.includes(file) || state2.mtime !== mtimeOf(
|
|
181529
|
+
if (!urls.includes(file) || state2.mtime !== mtimeOf(import_node_path26.default.join(dir, file))) map.delete(file);
|
|
181292
181530
|
}
|
|
181293
181531
|
const warnings = [];
|
|
181294
181532
|
const dynamic = {};
|
|
181295
181533
|
for (const url of urls) {
|
|
181296
|
-
if (!
|
|
181534
|
+
if (!import_node_fs29.default.existsSync(import_node_path26.default.join(dir, url))) warnings.push(`${url} not found`);
|
|
181297
181535
|
const state2 = map.get(url);
|
|
181298
181536
|
for (const error of state2?.errors ?? []) warnings.push(`runtime: ${url}: ${error}`);
|
|
181299
181537
|
dynamic[url] = { ran: state2?.ran ?? false };
|
|
@@ -181309,7 +181547,7 @@ var MAX_COMMENT_OP = 64 * 1024;
|
|
|
181309
181547
|
var MAX_DOCUMENT_UPDATE = 8 * 1024 * 1024;
|
|
181310
181548
|
|
|
181311
181549
|
// src/server/artifact-file.ts
|
|
181312
|
-
var
|
|
181550
|
+
var import_node_fs30 = __toESM(require("node:fs"), 1);
|
|
181313
181551
|
var RESOLVE = {
|
|
181314
181552
|
artboard: resolveBoardFile,
|
|
181315
181553
|
document: resolveDocumentAsset,
|
|
@@ -181323,8 +181561,8 @@ function readArtifactFile(dir, type, relative, uiRuntimeUrl, maxBytes = Infinity
|
|
|
181323
181561
|
if (!target) return null;
|
|
181324
181562
|
let data;
|
|
181325
181563
|
try {
|
|
181326
|
-
if (
|
|
181327
|
-
data =
|
|
181564
|
+
if (import_node_fs30.default.statSync(target).size > maxBytes) throw new RangeError("too large");
|
|
181565
|
+
data = import_node_fs30.default.readFileSync(target);
|
|
181328
181566
|
} catch (err) {
|
|
181329
181567
|
if (err instanceof RangeError) throw err;
|
|
181330
181568
|
return null;
|
|
@@ -181460,6 +181698,20 @@ async function handleRelay(ctx, key2, body, conn, contentOrigin = "") {
|
|
|
181460
181698
|
const request = typeof body === "object" && body !== null ? body : {};
|
|
181461
181699
|
if (request.op === "publication" && ctx.cloud) return ctx.cloud.publication(key2);
|
|
181462
181700
|
if (request.op === "publish" && ctx.cloud) return ctx.cloud.publishNow(key2);
|
|
181701
|
+
if (request.op === "refs" && ctx.cloud)
|
|
181702
|
+
return ctx.cloud.cascade(
|
|
181703
|
+
key2,
|
|
181704
|
+
request.visibility === "public" || request.visibility === "private" ? request.visibility : void 0
|
|
181705
|
+
);
|
|
181706
|
+
if (request.op === "publish-refs" && ctx.cloud) {
|
|
181707
|
+
const list2 = (value) => Array.isArray(value) ? value.filter((each) => typeof each === "string") : [];
|
|
181708
|
+
return ctx.cloud.publishRefsNow(
|
|
181709
|
+
key2,
|
|
181710
|
+
list2(request.refs),
|
|
181711
|
+
list2(request.makePublic),
|
|
181712
|
+
request.visibility === "public" || request.visibility === "private" ? request.visibility : void 0
|
|
181713
|
+
);
|
|
181714
|
+
}
|
|
181463
181715
|
if (request.op === "meta") return ctx.artifactMeta(ref, dir, contentOrigin);
|
|
181464
181716
|
if (request.op === "file") {
|
|
181465
181717
|
const file = typeof request.path === "string" ? readArtifactFile(
|
|
@@ -181519,8 +181771,8 @@ async function handleRelay(ctx, key2, body, conn, contentOrigin = "") {
|
|
|
181519
181771
|
}
|
|
181520
181772
|
|
|
181521
181773
|
// src/server/selection.ts
|
|
181522
|
-
var
|
|
181523
|
-
var
|
|
181774
|
+
var import_node_fs31 = __toESM(require("node:fs"), 1);
|
|
181775
|
+
var import_node_path27 = __toESM(require("node:path"), 1);
|
|
181524
181776
|
|
|
181525
181777
|
// src/shared/selection.ts
|
|
181526
181778
|
var SELECTION_FULL_NODES = 20;
|
|
@@ -181665,7 +181917,7 @@ function readAnySelection(value) {
|
|
|
181665
181917
|
function createSelectionStore(stateDir, exists) {
|
|
181666
181918
|
const tabs = /* @__PURE__ */ new Map();
|
|
181667
181919
|
let clock = 0;
|
|
181668
|
-
const fileOf2 = (kind, id3) =>
|
|
181920
|
+
const fileOf2 = (kind, id3) => import_node_path27.default.join(stateDir, kind, id3, "selection.json");
|
|
181669
181921
|
const write = (kind, id3) => {
|
|
181670
181922
|
let winner;
|
|
181671
181923
|
for (const tab of tabs.values()) {
|
|
@@ -181673,7 +181925,7 @@ function createSelectionStore(stateDir, exists) {
|
|
|
181673
181925
|
if (!winner || tab.humanAt > winner.humanAt || tab.humanAt === winner.humanAt && tab.seenAt > winner.seenAt)
|
|
181674
181926
|
winner = tab;
|
|
181675
181927
|
}
|
|
181676
|
-
if (!winner?.state)
|
|
181928
|
+
if (!winner?.state) import_node_fs31.default.rmSync(fileOf2(kind, id3), { force: true });
|
|
181677
181929
|
else
|
|
181678
181930
|
writeJsonAtomic(fileOf2(kind, id3), {
|
|
181679
181931
|
artifact: `${kind}/${id3}`,
|
|
@@ -181715,11 +181967,11 @@ function createSelectionStore(stateDir, exists) {
|
|
|
181715
181967
|
for (const kind of ["artboard", "document", "whiteboard"]) {
|
|
181716
181968
|
let ids;
|
|
181717
181969
|
try {
|
|
181718
|
-
ids =
|
|
181970
|
+
ids = import_node_fs31.default.readdirSync(import_node_path27.default.join(stateDir, kind));
|
|
181719
181971
|
} catch {
|
|
181720
181972
|
continue;
|
|
181721
181973
|
}
|
|
181722
|
-
for (const id3 of ids)
|
|
181974
|
+
for (const id3 of ids) import_node_fs31.default.rmSync(fileOf2(kind, id3), { force: true });
|
|
181723
181975
|
}
|
|
181724
181976
|
}
|
|
181725
181977
|
};
|
|
@@ -181727,13 +181979,13 @@ function createSelectionStore(stateDir, exists) {
|
|
|
181727
181979
|
|
|
181728
181980
|
// src/server/verify-recordings.ts
|
|
181729
181981
|
var import_node_crypto11 = __toESM(require("node:crypto"), 1);
|
|
181730
|
-
var
|
|
181731
|
-
var
|
|
181982
|
+
var import_node_fs33 = __toESM(require("node:fs"), 1);
|
|
181983
|
+
var import_node_path29 = __toESM(require("node:path"), 1);
|
|
181732
181984
|
|
|
181733
181985
|
// src/server/recording-trim.ts
|
|
181734
181986
|
var import_node_child_process3 = require("node:child_process");
|
|
181735
|
-
var
|
|
181736
|
-
var
|
|
181987
|
+
var import_node_fs32 = __toESM(require("node:fs"), 1);
|
|
181988
|
+
var import_node_path28 = __toESM(require("node:path"), 1);
|
|
181737
181989
|
function run2(command, args, signal3) {
|
|
181738
181990
|
return new Promise((resolve, reject) => {
|
|
181739
181991
|
(0, import_node_child_process3.execFile)(
|
|
@@ -181753,7 +182005,7 @@ function run2(command, args, signal3) {
|
|
|
181753
182005
|
});
|
|
181754
182006
|
}
|
|
181755
182007
|
async function trimRecording(input, output, signal3) {
|
|
181756
|
-
if (input === output ||
|
|
182008
|
+
if (input === output || import_node_fs32.default.existsSync(output))
|
|
181757
182009
|
throw new Error("Choose a new output path; existing files are never overwritten.");
|
|
181758
182010
|
const probe = JSON.parse(
|
|
181759
182011
|
(await run2(
|
|
@@ -181825,9 +182077,9 @@ async function trimRecording(input, output, signal3) {
|
|
|
181825
182077
|
if (start > 0 || end < duration) status = "trimmed";
|
|
181826
182078
|
}
|
|
181827
182079
|
if (status === "trimmed") {
|
|
181828
|
-
const temporary =
|
|
182080
|
+
const temporary = import_node_fs32.default.mkdtempSync(import_node_path28.default.join(import_node_path28.default.dirname(output), ".trim-"));
|
|
181829
182081
|
try {
|
|
181830
|
-
const encoded =
|
|
182082
|
+
const encoded = import_node_path28.default.join(temporary, "clip.mp4");
|
|
181831
182083
|
await run2(
|
|
181832
182084
|
"ffmpeg",
|
|
181833
182085
|
[
|
|
@@ -181863,9 +182115,9 @@ async function trimRecording(input, output, signal3) {
|
|
|
181863
182115
|
],
|
|
181864
182116
|
signal3
|
|
181865
182117
|
);
|
|
181866
|
-
|
|
182118
|
+
import_node_fs32.default.linkSync(encoded, output);
|
|
181867
182119
|
} finally {
|
|
181868
|
-
|
|
182120
|
+
import_node_fs32.default.rmSync(temporary, { recursive: true, force: true });
|
|
181869
182121
|
}
|
|
181870
182122
|
}
|
|
181871
182123
|
return { duration, start, end, removed: duration - (end - start), status };
|
|
@@ -181876,7 +182128,7 @@ var POLICY = "idle-ends-v2";
|
|
|
181876
182128
|
var STABLE_MS = 750;
|
|
181877
182129
|
var digest2 = (data) => import_node_crypto11.default.createHash("sha256").update(data).digest("hex");
|
|
181878
182130
|
var stamp2 = (file) => {
|
|
181879
|
-
const stat =
|
|
182131
|
+
const stat = import_node_fs33.default.statSync(file);
|
|
181880
182132
|
return `${stat.dev}:${stat.ino}:${stat.size}:${stat.mtimeMs}:${stat.ctimeMs}`;
|
|
181881
182133
|
};
|
|
181882
182134
|
function createVerifyRecordings(options2) {
|
|
@@ -181890,7 +182142,7 @@ function createVerifyRecordings(options2) {
|
|
|
181890
182142
|
const notify = (job) => {
|
|
181891
182143
|
if (current(job)) options2.onChange(job.artifact);
|
|
181892
182144
|
};
|
|
181893
|
-
const cacheDir =
|
|
182145
|
+
const cacheDir = import_node_path29.default.join(options2.stateDir, "recordings");
|
|
181894
182146
|
async function process2(job) {
|
|
181895
182147
|
let temporary;
|
|
181896
182148
|
try {
|
|
@@ -181899,7 +182151,7 @@ function createVerifyRecordings(options2) {
|
|
|
181899
182151
|
options2.onChange(job.artifact);
|
|
181900
182152
|
return;
|
|
181901
182153
|
}
|
|
181902
|
-
const bytes = await
|
|
182154
|
+
const bytes = await import_node_fs33.default.promises.readFile(job.file);
|
|
181903
182155
|
if (!current(job)) return;
|
|
181904
182156
|
if (stamp2(job.file) !== job.stamp) {
|
|
181905
182157
|
jobs.delete(job.key);
|
|
@@ -181907,22 +182159,22 @@ function createVerifyRecordings(options2) {
|
|
|
181907
182159
|
return;
|
|
181908
182160
|
}
|
|
181909
182161
|
const key2 = digest2(`${POLICY}:${digest2(bytes)}`);
|
|
181910
|
-
const dir =
|
|
181911
|
-
const output =
|
|
181912
|
-
const metadata =
|
|
182162
|
+
const dir = import_node_path29.default.join(cacheDir, key2);
|
|
182163
|
+
const output = import_node_path29.default.join(dir, "clip.mp4");
|
|
182164
|
+
const metadata = import_node_path29.default.join(dir, "result.json");
|
|
181913
182165
|
let cached;
|
|
181914
182166
|
try {
|
|
181915
|
-
const saved = JSON.parse(
|
|
181916
|
-
if (saved.result.status !== "trimmed" ||
|
|
182167
|
+
const saved = JSON.parse(import_node_fs33.default.readFileSync(metadata, "utf8"));
|
|
182168
|
+
if (saved.result.status !== "trimmed" || import_node_fs33.default.existsSync(output) && saved.hash === digest2(import_node_fs33.default.readFileSync(output)))
|
|
181917
182169
|
cached = saved;
|
|
181918
182170
|
} catch {
|
|
181919
182171
|
}
|
|
181920
182172
|
if (!cached) {
|
|
181921
|
-
|
|
181922
|
-
temporary =
|
|
181923
|
-
const input =
|
|
181924
|
-
const prepared =
|
|
181925
|
-
|
|
182173
|
+
import_node_fs33.default.mkdirSync(cacheDir, { recursive: true });
|
|
182174
|
+
temporary = import_node_fs33.default.mkdtempSync(import_node_path29.default.join(cacheDir, ".prepare-"));
|
|
182175
|
+
const input = import_node_path29.default.join(temporary, "capture");
|
|
182176
|
+
const prepared = import_node_path29.default.join(temporary, "clip.mp4");
|
|
182177
|
+
import_node_fs33.default.writeFileSync(input, bytes);
|
|
181926
182178
|
const result = await (options2.prepare ?? trimRecording)(
|
|
181927
182179
|
input,
|
|
181928
182180
|
prepared,
|
|
@@ -181934,9 +182186,9 @@ function createVerifyRecordings(options2) {
|
|
|
181934
182186
|
options2.onChange(job.artifact);
|
|
181935
182187
|
return;
|
|
181936
182188
|
}
|
|
181937
|
-
|
|
181938
|
-
const hash2 = result.status === "trimmed" ? digest2(
|
|
181939
|
-
if (result.status === "trimmed")
|
|
182189
|
+
import_node_fs33.default.mkdirSync(dir, { recursive: true });
|
|
182190
|
+
const hash2 = result.status === "trimmed" ? digest2(import_node_fs33.default.readFileSync(prepared)) : void 0;
|
|
182191
|
+
if (result.status === "trimmed") import_node_fs33.default.copyFileSync(prepared, output);
|
|
181940
182192
|
cached = { result, ...hash2 ? { hash: hash2 } : {} };
|
|
181941
182193
|
writeJsonAtomic(metadata, cached);
|
|
181942
182194
|
}
|
|
@@ -181969,7 +182221,7 @@ function createVerifyRecordings(options2) {
|
|
|
181969
182221
|
};
|
|
181970
182222
|
notify(job);
|
|
181971
182223
|
} finally {
|
|
181972
|
-
if (temporary)
|
|
182224
|
+
if (temporary) import_node_fs33.default.rmSync(temporary, { recursive: true, force: true });
|
|
181973
182225
|
}
|
|
181974
182226
|
}
|
|
181975
182227
|
function pump() {
|
|
@@ -182035,7 +182287,7 @@ function createVerifyRecordings(options2) {
|
|
|
182035
182287
|
if (job.state.status === "processing") pending.add(boardId);
|
|
182036
182288
|
if (job.virtual && job.output) {
|
|
182037
182289
|
canvas.boards[boardId] = { ...board, file: job.virtual, src: job.virtual };
|
|
182038
|
-
versions[job.virtual] =
|
|
182290
|
+
versions[job.virtual] = import_node_fs33.default.statSync(job.output).mtimeMs;
|
|
182039
182291
|
}
|
|
182040
182292
|
}
|
|
182041
182293
|
for (const job of jobs.values()) if (job.artifact === id3 && !active.has(job.key)) stop(job);
|
|
@@ -182064,7 +182316,7 @@ function createVerifyRecordings(options2) {
|
|
|
182064
182316
|
continue;
|
|
182065
182317
|
const original = job.key.slice(id3.length + 1);
|
|
182066
182318
|
if (!referenced.has(original)) overrides.set(original, null);
|
|
182067
|
-
overrides.set(job.virtual,
|
|
182319
|
+
overrides.set(job.virtual, import_node_fs33.default.readFileSync(job.output));
|
|
182068
182320
|
}
|
|
182069
182321
|
if (overrides.size) overrides.set("canvas.json", Buffer.from(JSON.stringify(payload.canvas)));
|
|
182070
182322
|
return overrides;
|
|
@@ -182078,8 +182330,8 @@ function createVerifyRecordings(options2) {
|
|
|
182078
182330
|
}
|
|
182079
182331
|
|
|
182080
182332
|
// src/server/whiteboard.ts
|
|
182081
|
-
var
|
|
182082
|
-
var
|
|
182333
|
+
var import_node_fs34 = __toESM(require("node:fs"), 1);
|
|
182334
|
+
var import_node_path30 = __toESM(require("node:path"), 1);
|
|
182083
182335
|
|
|
182084
182336
|
// src/server/whiteboard-lint.ts
|
|
182085
182337
|
var LINE_TYPES = /* @__PURE__ */ new Set(["arrow", "line"]);
|
|
@@ -182129,16 +182381,16 @@ var segmentsCross = (a5, b6, c10, d10) => side(a5, b6, c10) * side(a5, b6, d10)
|
|
|
182129
182381
|
var pathOf = (element) => {
|
|
182130
182382
|
const { points: points2 } = element;
|
|
182131
182383
|
if (!Array.isArray(points2) || points2.length < 2) return null;
|
|
182132
|
-
const
|
|
182384
|
+
const path45 = [];
|
|
182133
182385
|
for (const point2 of points2) {
|
|
182134
182386
|
if (!Array.isArray(point2) || typeof point2[0] !== "number" || typeof point2[1] !== "number")
|
|
182135
182387
|
return null;
|
|
182136
|
-
|
|
182388
|
+
path45.push([(element.x ?? 0) + point2[0], (element.y ?? 0) + point2[1]]);
|
|
182137
182389
|
}
|
|
182138
|
-
return
|
|
182390
|
+
return path45;
|
|
182139
182391
|
};
|
|
182140
|
-
var segmentsOf = (
|
|
182141
|
-
var lengthOf = (
|
|
182392
|
+
var segmentsOf = (path45) => path45.slice(1).map((end, index) => [path45[index], end]);
|
|
182393
|
+
var lengthOf = (path45) => segmentsOf(path45).reduce((sum2, [a5, b6]) => sum2 + Math.hypot(b6[0] - a5[0], b6[1] - a5[1]), 0);
|
|
182142
182394
|
var boundIds = (element) => [element.startBinding?.elementId, element.endBinding?.elementId].filter(
|
|
182143
182395
|
(id3) => typeof id3 === "string"
|
|
182144
182396
|
);
|
|
@@ -182175,18 +182427,18 @@ function arrowWarnings(live3, geometry) {
|
|
|
182175
182427
|
);
|
|
182176
182428
|
const arrows = live3.flatMap((element) => {
|
|
182177
182429
|
if (!LINE_TYPES.has(element.type) || ryugi(element).author !== "agent") return [];
|
|
182178
|
-
const
|
|
182179
|
-
return
|
|
182430
|
+
const path45 = pathOf(element);
|
|
182431
|
+
return path45 ? [{ element, path: path45, bound: boundIds(element) }] : [];
|
|
182180
182432
|
});
|
|
182181
182433
|
const warnings = [];
|
|
182182
|
-
for (const { element, path:
|
|
182183
|
-
const ends = [
|
|
182434
|
+
for (const { element, path: path45 } of arrows) {
|
|
182435
|
+
const ends = [path45[0], path45.at(-1)];
|
|
182184
182436
|
const around = obstacles.filter(
|
|
182185
182437
|
(shape2) => !ends.some((end) => holds(geometry[shape2.id], end))
|
|
182186
182438
|
);
|
|
182187
182439
|
for (const shape2 of around) {
|
|
182188
182440
|
const box2 = inset(geometry[shape2.id], GRAZE);
|
|
182189
|
-
if (segmentsOf(
|
|
182441
|
+
if (segmentsOf(path45).some(([a5, b6]) => segmentHits(a5, b6, box2)))
|
|
182190
182442
|
warnings.push(
|
|
182191
182443
|
`arrow ${element.id} crosses ${shape2.id} \u2014 move ${shape2.id} or bend the arrow around it`
|
|
182192
182444
|
);
|
|
@@ -182204,7 +182456,7 @@ function arrowWarnings(live3, geometry) {
|
|
|
182204
182456
|
const need = Math.ceil(
|
|
182205
182457
|
(Math.abs(dx2) * label.w + Math.abs(dy2) * label.h) / chord + LABEL_MARGIN
|
|
182206
182458
|
);
|
|
182207
|
-
const length = lengthOf(
|
|
182459
|
+
const length = lengthOf(path45);
|
|
182208
182460
|
if (length < need)
|
|
182209
182461
|
warnings.push(
|
|
182210
182462
|
`label of arrow ${element.id} needs the arrow to be at least ${need} px long (now ${Math.round(length)}) \u2014 move its ends apart or shorten the label`
|
|
@@ -182236,7 +182488,7 @@ function readWhiteboard(dir, id3) {
|
|
|
182236
182488
|
const version3 = latestMtime(dir);
|
|
182237
182489
|
let source;
|
|
182238
182490
|
try {
|
|
182239
|
-
source =
|
|
182491
|
+
source = import_node_fs34.default.readFileSync(import_node_path30.default.join(dir, ENTRY_FILE.whiteboard), "utf8");
|
|
182240
182492
|
} catch {
|
|
182241
182493
|
return {
|
|
182242
182494
|
title: id3,
|
|
@@ -182359,7 +182611,7 @@ function onlyPage(result, page, pages) {
|
|
|
182359
182611
|
}
|
|
182360
182612
|
|
|
182361
182613
|
// src/server/whiteboard-comments.ts
|
|
182362
|
-
var
|
|
182614
|
+
var import_node_path31 = __toESM(require("node:path"), 1);
|
|
182363
182615
|
|
|
182364
182616
|
// src/shared/whiteboard/comments.ts
|
|
182365
182617
|
var MAX_ELEMENTS = 50;
|
|
@@ -182484,7 +182736,7 @@ function createWhiteboardComments(options2) {
|
|
|
182484
182736
|
let found = stores.get(id3);
|
|
182485
182737
|
if (!found) {
|
|
182486
182738
|
found = createStore(
|
|
182487
|
-
|
|
182739
|
+
import_node_path31.default.join(options2.root, "whiteboard", id3, "comments.json"),
|
|
182488
182740
|
rules,
|
|
182489
182741
|
options2.names
|
|
182490
182742
|
);
|
|
@@ -182580,8 +182832,8 @@ function createWhiteboardComments(options2) {
|
|
|
182580
182832
|
}
|
|
182581
182833
|
|
|
182582
182834
|
// src/server/whiteboards.ts
|
|
182583
|
-
var
|
|
182584
|
-
var
|
|
182835
|
+
var import_node_fs35 = __toESM(require("node:fs"), 1);
|
|
182836
|
+
var import_node_path32 = __toESM(require("node:path"), 1);
|
|
182585
182837
|
|
|
182586
182838
|
// src/server/whiteboard-merge.ts
|
|
182587
182839
|
var nonce = () => Math.floor(Math.random() * 2 ** 31);
|
|
@@ -182711,7 +182963,7 @@ var emptyScene = () => ({
|
|
|
182711
182963
|
});
|
|
182712
182964
|
var readText3 = (file) => {
|
|
182713
182965
|
try {
|
|
182714
|
-
return
|
|
182966
|
+
return import_node_fs35.default.readFileSync(file, "utf8");
|
|
182715
182967
|
} catch {
|
|
182716
182968
|
return null;
|
|
182717
182969
|
}
|
|
@@ -182726,8 +182978,8 @@ var validGeometry = (value) => {
|
|
|
182726
182978
|
};
|
|
182727
182979
|
function writeTextAtomic(file, text5) {
|
|
182728
182980
|
const tmp = `${file}.${process.pid}.tmp`;
|
|
182729
|
-
|
|
182730
|
-
|
|
182981
|
+
import_node_fs35.default.writeFileSync(tmp, text5);
|
|
182982
|
+
import_node_fs35.default.renameSync(tmp, file);
|
|
182731
182983
|
}
|
|
182732
182984
|
function createWhiteboards(opts) {
|
|
182733
182985
|
const writeDelayMs = opts.writeDelayMs ?? 500;
|
|
@@ -182736,9 +182988,9 @@ function createWhiteboards(opts) {
|
|
|
182736
182988
|
const geometries = /* @__PURE__ */ new Map();
|
|
182737
182989
|
const renders = /* @__PURE__ */ new Map();
|
|
182738
182990
|
const legacyCleared = /* @__PURE__ */ new Set();
|
|
182739
|
-
const stateDir = opts.stateDir ??
|
|
182740
|
-
const
|
|
182741
|
-
const pageStateOf = (id3, page) =>
|
|
182991
|
+
const stateDir = opts.stateDir ?? import_node_path32.default.join(opts.root, ".state");
|
|
182992
|
+
const stateOf2 = (id3) => import_node_path32.default.join(stateDir, "whiteboard", id3);
|
|
182993
|
+
const pageStateOf = (id3, page) => import_node_path32.default.join(stateOf2(id3), "pages", page);
|
|
182742
182994
|
const keyOf = (id3, page) => `${id3}
|
|
182743
182995
|
${page}`;
|
|
182744
182996
|
const list2 = (id3) => {
|
|
@@ -182746,7 +182998,7 @@ ${page}`;
|
|
|
182746
182998
|
if (existing) return existing;
|
|
182747
182999
|
const dir = resolveArtifactDir(opts.root, "whiteboard", id3);
|
|
182748
183000
|
if (!dir) return null;
|
|
182749
|
-
const file =
|
|
183001
|
+
const file = import_node_path32.default.join(dir, PAGES_FILE);
|
|
182750
183002
|
const text5 = readText3(file);
|
|
182751
183003
|
const parsed = parsePages(text5);
|
|
182752
183004
|
const created = {
|
|
@@ -182780,7 +183032,7 @@ ${page}`;
|
|
|
182780
183032
|
if (existing) return existing;
|
|
182781
183033
|
const dir = resolveArtifactDir(opts.root, "whiteboard", id3);
|
|
182782
183034
|
if (!dir) return null;
|
|
182783
|
-
const file =
|
|
183035
|
+
const file = import_node_path32.default.join(dir, pageFileOf(page));
|
|
182784
183036
|
const text5 = readText3(file);
|
|
182785
183037
|
const parsed = text5 === null ? { scene: emptyScene() } : parseScene(text5, pageFileOf(page));
|
|
182786
183038
|
const session = {
|
|
@@ -182809,7 +183061,7 @@ ${page}`;
|
|
|
182809
183061
|
session.pending = false;
|
|
182810
183062
|
const text5 = serializeScene(session.scene);
|
|
182811
183063
|
if (text5 === session.written) return;
|
|
182812
|
-
|
|
183064
|
+
import_node_fs35.default.mkdirSync(import_node_path32.default.dirname(session.file), { recursive: true });
|
|
182813
183065
|
writeTextAtomic(session.file, text5);
|
|
182814
183066
|
session.written = text5;
|
|
182815
183067
|
};
|
|
@@ -182875,7 +183127,7 @@ ${page}`;
|
|
|
182875
183127
|
if (legacyCleared.has(id3)) return;
|
|
182876
183128
|
legacyCleared.add(id3);
|
|
182877
183129
|
for (const name of ["render.png", "render.json", "geometry.json"])
|
|
182878
|
-
|
|
183130
|
+
import_node_fs35.default.rmSync(import_node_path32.default.join(stateOf2(id3), name), { force: true });
|
|
182879
183131
|
};
|
|
182880
183132
|
const known = (id3, page) => isPageId(page) && resolveArtifactDir(opts.root, "whiteboard", id3) !== null;
|
|
182881
183133
|
const live3 = (id3) => livePages(normalized2(id3)?.pages ?? []);
|
|
@@ -182944,19 +183196,19 @@ ${page}`;
|
|
|
182944
183196
|
reportGeometry(id3, geometry, page = MAIN_PAGE) {
|
|
182945
183197
|
if (!validGeometry(geometry) || !known(id3, page)) return false;
|
|
182946
183198
|
geometries.set(keyOf(id3, page), geometry);
|
|
182947
|
-
writeJsonAtomic(
|
|
183199
|
+
writeJsonAtomic(import_node_path32.default.join(pageStateOf(id3, page), "geometry.json"), geometry);
|
|
182948
183200
|
stateWritten(id3);
|
|
182949
183201
|
return true;
|
|
182950
183202
|
},
|
|
182951
183203
|
render: (id3, page = MAIN_PAGE) => renders.get(keyOf(id3, page)) ?? null,
|
|
182952
|
-
renderPathOf: (id3, page = MAIN_PAGE) =>
|
|
183204
|
+
renderPathOf: (id3, page = MAIN_PAGE) => import_node_path32.default.join(pageStateOf(id3, page), "render.png"),
|
|
182953
183205
|
reportRender(id3, png, sceneVersion, page = MAIN_PAGE) {
|
|
182954
183206
|
if (!Number.isFinite(sceneVersion) || !known(id3, page)) return false;
|
|
182955
|
-
|
|
182956
|
-
writeTextAtomic(
|
|
183207
|
+
import_node_fs35.default.mkdirSync(pageStateOf(id3, page), { recursive: true });
|
|
183208
|
+
writeTextAtomic(import_node_path32.default.join(pageStateOf(id3, page), "render.png"), png);
|
|
182957
183209
|
const meta = { sceneVersion, at: (/* @__PURE__ */ new Date()).toISOString() };
|
|
182958
183210
|
renders.set(keyOf(id3, page), meta);
|
|
182959
|
-
writeJsonAtomic(
|
|
183211
|
+
writeJsonAtomic(import_node_path32.default.join(pageStateOf(id3, page), "render.json"), meta);
|
|
182960
183212
|
stateWritten(id3);
|
|
182961
183213
|
return true;
|
|
182962
183214
|
},
|
|
@@ -182981,7 +183233,6 @@ ${page}`;
|
|
|
182981
183233
|
}
|
|
182982
183234
|
|
|
182983
183235
|
// src/server/context.ts
|
|
182984
|
-
var REF_ARTBOARD = /<ref\b[^>]*?\bartboard="([^"]+)"/g;
|
|
182985
183236
|
function readArtifactSource(dir, ref, runtime = []) {
|
|
182986
183237
|
if (ref.type === "artboard") {
|
|
182987
183238
|
const payload2 = readCanvas(dir);
|
|
@@ -183011,18 +183262,18 @@ function titleOf(payload) {
|
|
|
183011
183262
|
return "Untitled artifact";
|
|
183012
183263
|
}
|
|
183013
183264
|
function createServerContext(options2) {
|
|
183014
|
-
const root =
|
|
183015
|
-
const viewerDir =
|
|
183016
|
-
const runtimeDir = options2.runtimeDir ?
|
|
183017
|
-
const stateDir =
|
|
183018
|
-
|
|
183019
|
-
|
|
183265
|
+
const root = import_node_path33.default.resolve(options2.root);
|
|
183266
|
+
const viewerDir = import_node_path33.default.resolve(options2.viewerDir);
|
|
183267
|
+
const runtimeDir = options2.runtimeDir ? import_node_path33.default.resolve(options2.runtimeDir) : null;
|
|
183268
|
+
const stateDir = import_node_path33.default.join(root, ".state");
|
|
183269
|
+
import_node_fs36.default.mkdirSync(stateDir, { recursive: true, mode: 448 });
|
|
183270
|
+
import_node_fs36.default.writeFileSync(import_node_path33.default.join(stateDir, ".gitignore"), "*\n");
|
|
183020
183271
|
if (options2.configFile) ensureConfig(options2.configFile);
|
|
183021
|
-
const portFile =
|
|
183022
|
-
const tokenFile =
|
|
183272
|
+
const portFile = import_node_path33.default.join(stateDir, ".last-port");
|
|
183273
|
+
const tokenFile = import_node_path33.default.join(stateDir, ".last-token");
|
|
183023
183274
|
const mount = options2.mount;
|
|
183024
183275
|
const token = mount?.token ?? (readPersisted(tokenFile) || randomToken());
|
|
183025
|
-
if (!mount)
|
|
183276
|
+
if (!mount) import_node_fs36.default.writeFileSync(tokenFile, `${token}
|
|
183026
183277
|
`, { mode: 384 });
|
|
183027
183278
|
const contentToken = randomToken();
|
|
183028
183279
|
const loopback = isLoopbackHost(options2.host);
|
|
@@ -183052,7 +183303,7 @@ function createServerContext(options2) {
|
|
|
183052
183303
|
const pages = whiteboards.livePages(id3).flatMap((page) => {
|
|
183053
183304
|
const scene = whiteboards.scene(id3, page.id);
|
|
183054
183305
|
if (!scene) return [];
|
|
183055
|
-
const bytes =
|
|
183306
|
+
const bytes = import_node_fs36.default.statSync(import_node_path33.default.join(dir, pageFileOf(page.id)), { throwIfNoEntry: false })?.size ?? 0;
|
|
183056
183307
|
return [
|
|
183057
183308
|
{
|
|
183058
183309
|
id: page.id,
|
|
@@ -183125,8 +183376,8 @@ function createServerContext(options2) {
|
|
|
183125
183376
|
});
|
|
183126
183377
|
const avatars = createAvatars(options2.fetch);
|
|
183127
183378
|
const names = commentNames({
|
|
183128
|
-
agentFile:
|
|
183129
|
-
projectDir:
|
|
183379
|
+
agentFile: import_node_path33.default.join(stateDir, "agent"),
|
|
183380
|
+
projectDir: import_node_path33.default.resolve(root, "../.."),
|
|
183130
183381
|
cloud: options2.cloud
|
|
183131
183382
|
});
|
|
183132
183383
|
const whiteboardComments = createWhiteboardComments({
|
|
@@ -183184,11 +183435,7 @@ function createServerContext(options2) {
|
|
|
183184
183435
|
writeState({ type: "document", id: id3 }, dir);
|
|
183185
183436
|
broadcast({ type: "change", artifact: `document/${id3}`, files: [] });
|
|
183186
183437
|
},
|
|
183187
|
-
onRefsChange: (_id,
|
|
183188
|
-
const targets = [
|
|
183189
|
-
...artboards.map((id3) => ({ type: "artboard", id: id3 })),
|
|
183190
|
-
...whiteboards2.map((id3) => ({ type: "whiteboard", id: id3 }))
|
|
183191
|
-
];
|
|
183438
|
+
onRefsChange: (_id, targets) => {
|
|
183192
183439
|
for (const ref of targets) {
|
|
183193
183440
|
const dir = resolveArtifactDir(root, ref.type, ref.id);
|
|
183194
183441
|
if (!dir) continue;
|
|
@@ -183244,15 +183491,9 @@ function createServerContext(options2) {
|
|
|
183244
183491
|
const cloud = options2.cloud && options2.configFile ? createCloudRoutes({
|
|
183245
183492
|
...options2.cloud,
|
|
183246
183493
|
configFile: options2.configFile,
|
|
183247
|
-
project:
|
|
183494
|
+
project: import_node_path33.default.basename(import_node_path33.default.resolve(root, "../..")),
|
|
183248
183495
|
address: (ref) => artifactPath(root, ref.type, ref.id).split("/").pop(),
|
|
183249
|
-
references: (ref) => {
|
|
183250
|
-
if (ref.type !== "document") return [];
|
|
183251
|
-
const dir = resolveArtifactDir(root, "document", ref.id);
|
|
183252
|
-
const file = dir ? import_node_path32.default.join(dir, "doc.xml") : null;
|
|
183253
|
-
const xml = file && import_node_fs35.default.existsSync(file) ? import_node_fs35.default.readFileSync(file, "utf8") : "";
|
|
183254
|
-
return [...xml.matchAll(REF_ARTBOARD)].map((match) => match[1]).filter((slug) => resolveArtifactDir(root, "artboard", slug) !== null);
|
|
183255
|
-
},
|
|
183496
|
+
references: (ref) => referencesOf(root, `${ref.type}/${ref.id}`),
|
|
183256
183497
|
port: () => ctx.port,
|
|
183257
183498
|
inspect,
|
|
183258
183499
|
onPublication: (key2, publication) => {
|
|
@@ -183260,7 +183501,7 @@ function createServerContext(options2) {
|
|
|
183260
183501
|
}
|
|
183261
183502
|
}) : null;
|
|
183262
183503
|
const autoPublisher = cloud ? createAutoPublisher({
|
|
183263
|
-
stateFile:
|
|
183504
|
+
stateFile: import_node_path33.default.join(stateDir, "auto-publish.json"),
|
|
183264
183505
|
enabled: cloud.autoPublishEnabled,
|
|
183265
183506
|
token: cloud.token,
|
|
183266
183507
|
publish: async (key2) => {
|
|
@@ -183306,7 +183547,7 @@ function createServerContext(options2) {
|
|
|
183306
183547
|
staleThreads: boardComments.stale(ref.id),
|
|
183307
183548
|
listening: boardComments.listening(ref.id),
|
|
183308
183549
|
backlinks: backlinksOf(ref.id)
|
|
183309
|
-
} :
|
|
183550
|
+
} : { backlinks: backlinksOf(ref.id, ref.type) },
|
|
183310
183551
|
contentBase: `${contentOrigin}${contentPrefix}${ref.type}/${ref.id}/`
|
|
183311
183552
|
});
|
|
183312
183553
|
const signatures = /* @__PURE__ */ new Map();
|
|
@@ -183320,11 +183561,10 @@ function createServerContext(options2) {
|
|
|
183320
183561
|
payload,
|
|
183321
183562
|
ref.type === "artboard" ? { ...extra, ...artboardHints(ref.id) } : extra
|
|
183322
183563
|
);
|
|
183323
|
-
|
|
183324
|
-
|
|
183325
|
-
|
|
183326
|
-
|
|
183327
|
-
);
|
|
183564
|
+
writeJsonAtomic(
|
|
183565
|
+
import_node_path33.default.join(stateDir, ref.type, ref.id, "backlinks.json"),
|
|
183566
|
+
backlinksOf(ref.id, ref.type)
|
|
183567
|
+
);
|
|
183328
183568
|
} catch (err) {
|
|
183329
183569
|
console.error(JSON.stringify({ type: "state-write-error", error: err.message }));
|
|
183330
183570
|
}
|
|
@@ -183417,7 +183657,7 @@ function createServerContext(options2) {
|
|
|
183417
183657
|
};
|
|
183418
183658
|
return ctx;
|
|
183419
183659
|
}
|
|
183420
|
-
var projectName = (ctx) =>
|
|
183660
|
+
var projectName = (ctx) => import_node_path33.default.basename(import_node_path33.default.dirname(import_node_path33.default.dirname(ctx.root)));
|
|
183421
183661
|
|
|
183422
183662
|
// ../../node_modules/.pnpm/ws@8.18.3/node_modules/ws/wrapper.mjs
|
|
183423
183663
|
var import_stream = __toESM(require_stream(), 1);
|
|
@@ -183591,8 +183831,8 @@ function createRelayClient(options2) {
|
|
|
183591
183831
|
}
|
|
183592
183832
|
|
|
183593
183833
|
// src/server/routes/content.ts
|
|
183594
|
-
var
|
|
183595
|
-
var
|
|
183834
|
+
var import_node_fs37 = __toESM(require("node:fs"), 1);
|
|
183835
|
+
var import_node_path34 = __toESM(require("node:path"), 1);
|
|
183596
183836
|
function serveContent(ctx, res, rest, range, mode = "main") {
|
|
183597
183837
|
const { root, runtimeDir, recordings, options: options2 } = ctx;
|
|
183598
183838
|
if (rest.startsWith("runtime/")) {
|
|
@@ -183644,7 +183884,7 @@ function serveContent(ctx, res, rest, range, mode = "main") {
|
|
|
183644
183884
|
sendFile(res, target, headers, range);
|
|
183645
183885
|
return;
|
|
183646
183886
|
}
|
|
183647
|
-
|
|
183887
|
+
import_node_fs37.default.readFile(target, "utf8", (err, source) => {
|
|
183648
183888
|
if (err) send(res, 404, "Not found");
|
|
183649
183889
|
else {
|
|
183650
183890
|
const uiRuntimeUrl = runtimeDir ? `${mode === "board" ? "/c/" : ctx.contentPrefix}runtime/ryugi-ui.js` : void 0;
|
|
@@ -183680,7 +183920,7 @@ var robotsRoute = {
|
|
|
183680
183920
|
path: "/robots.txt",
|
|
183681
183921
|
auth: "public",
|
|
183682
183922
|
handle: (_req, res, ctx) => {
|
|
183683
|
-
sendFile(res,
|
|
183923
|
+
sendFile(res, import_node_path34.default.join(ctx.viewerDir, "robots.txt"));
|
|
183684
183924
|
}
|
|
183685
183925
|
};
|
|
183686
183926
|
var contentRoute = {
|
|
@@ -183727,8 +183967,8 @@ var createBoardRequestHandler = (ctx) => (req, res) => {
|
|
|
183727
183967
|
};
|
|
183728
183968
|
|
|
183729
183969
|
// src/server/routes/agent.ts
|
|
183730
|
-
var
|
|
183731
|
-
var
|
|
183970
|
+
var import_node_fs38 = __toESM(require("node:fs"), 1);
|
|
183971
|
+
var import_node_path35 = __toESM(require("node:path"), 1);
|
|
183732
183972
|
|
|
183733
183973
|
// src/shared/whiteboard/summary.ts
|
|
183734
183974
|
var STICKY_FILL = "#ffec99";
|
|
@@ -183859,7 +184099,7 @@ var CHECK_BROWSER_WAIT_MS = 1e4;
|
|
|
183859
184099
|
var agentName = (fields) => typeof fields.agent === "string" && fields.agent.length > 0 && fields.agent.length <= 100 ? fields.agent : void 0;
|
|
183860
184100
|
var blockIdsOf = async (ctx, id3, dir) => {
|
|
183861
184101
|
await (await ctx.documents.open(id3))?.flush();
|
|
183862
|
-
const state2 = parseDocument2(
|
|
184102
|
+
const state2 = parseDocument2(import_node_fs38.default.readFileSync(import_node_path35.default.join(dir, "doc.xml"), "utf8"));
|
|
183863
184103
|
return new Set(
|
|
183864
184104
|
state2.root.children.flatMap(
|
|
183865
184105
|
(block) => block.$?.blockId ? [block.$.blockId] : []
|
|
@@ -184044,7 +184284,7 @@ async function serveAgentCheck(res, ctx, type, id3, page = null) {
|
|
|
184044
184284
|
let merging = false;
|
|
184045
184285
|
if (ref.type === "document") {
|
|
184046
184286
|
const session = await documents.open(ref.id);
|
|
184047
|
-
const text5 = await
|
|
184287
|
+
const text5 = await import_node_fs38.default.promises.readFile(import_node_path35.default.join(dir, "doc.xml"), "utf8").catch(() => null);
|
|
184048
184288
|
if (session && text5 !== null) {
|
|
184049
184289
|
session.onFileText(text5);
|
|
184050
184290
|
const timeout = new Promise(
|
|
@@ -184057,7 +184297,7 @@ async function serveAgentCheck(res, ctx, type, id3, page = null) {
|
|
|
184057
184297
|
if (ref.type === "whiteboard") await whiteboardCaughtUp(ctx, ref.id, checkedPages);
|
|
184058
184298
|
const payload = ctx.writeState(ref, dir);
|
|
184059
184299
|
const written = JSON.parse(
|
|
184060
|
-
await
|
|
184300
|
+
await import_node_fs38.default.promises.readFile(import_node_path35.default.join(stateDir, ref.type, ref.id, "warnings.json"), "utf8")
|
|
184061
184301
|
);
|
|
184062
184302
|
const state2 = page === null ? written : {
|
|
184063
184303
|
...written,
|
|
@@ -184224,7 +184464,7 @@ async function serveAgentWhiteboardScene(req, res, ctx, id3) {
|
|
|
184224
184464
|
sendJson(res, 404, { error: `whiteboard/${id3} not found` });
|
|
184225
184465
|
return;
|
|
184226
184466
|
}
|
|
184227
|
-
const selection = readSelectedIds(
|
|
184467
|
+
const selection = readSelectedIds(import_node_path35.default.join(ctx.stateDir, "whiteboard", id3, "selection.json"));
|
|
184228
184468
|
const summary = summarize(scene, { ...frame ? { frame } : {}, selected: selection });
|
|
184229
184469
|
sendJson(res, 200, {
|
|
184230
184470
|
artifact: `whiteboard/${id3}`,
|
|
@@ -184238,7 +184478,7 @@ async function serveAgentWhiteboardScene(req, res, ctx, id3) {
|
|
|
184238
184478
|
}
|
|
184239
184479
|
function readSelectedIds(file) {
|
|
184240
184480
|
try {
|
|
184241
|
-
const parsed = JSON.parse(
|
|
184481
|
+
const parsed = JSON.parse(import_node_fs38.default.readFileSync(file, "utf8"));
|
|
184242
184482
|
return (parsed.selected ?? []).flatMap(
|
|
184243
184483
|
(item2) => typeof item2.id === "string" ? [item2.id] : []
|
|
184244
184484
|
);
|
|
@@ -184548,8 +184788,8 @@ function shape(element, at7, scale) {
|
|
|
184548
184788
|
case "arrow":
|
|
184549
184789
|
case "line":
|
|
184550
184790
|
case "freedraw": {
|
|
184551
|
-
const
|
|
184552
|
-
return
|
|
184791
|
+
const path45 = points(element).map(([dx2, dy2]) => at7(x9 + dx2, y5 + dy2).join(",")).join(" ");
|
|
184792
|
+
return path45 ? `<polyline points="${path45}" stroke="${stroke}" stroke-width="1.4" fill="none" stroke-linecap="round"/>` : "";
|
|
184553
184793
|
}
|
|
184554
184794
|
case "text": {
|
|
184555
184795
|
const size = Math.max(4, Math.min(28, h9 || 12 * scale));
|
|
@@ -185085,8 +185325,8 @@ var clientSocketRoute = {
|
|
|
185085
185325
|
};
|
|
185086
185326
|
|
|
185087
185327
|
// src/server/routes/viewer.ts
|
|
185088
|
-
var
|
|
185089
|
-
var
|
|
185328
|
+
var import_node_fs39 = __toESM(require("node:fs"), 1);
|
|
185329
|
+
var import_node_path36 = __toESM(require("node:path"), 1);
|
|
185090
185330
|
|
|
185091
185331
|
// src/shared/type-icons.ts
|
|
185092
185332
|
var TYPE_GLYPHS = {
|
|
@@ -185215,8 +185455,8 @@ function serveShell(req, res, ctx, { pathname, key: key2 }, embedded) {
|
|
|
185215
185455
|
if (ref) headers["Referrer-Policy"] = "same-origin";
|
|
185216
185456
|
if (key2 !== null && !loopback)
|
|
185217
185457
|
headers["Set-Cookie"] = `${ctx.cookieName}=${ctx.token}; HttpOnly; SameSite=Strict; Path=/`;
|
|
185218
|
-
const entry = preview2 &&
|
|
185219
|
-
void
|
|
185458
|
+
const entry = preview2 && import_node_fs39.default.existsSync(import_node_path36.default.join(viewerDir, "preview.html")) ? "preview.html" : "index.html";
|
|
185459
|
+
void import_node_fs39.default.promises.readFile(import_node_path36.default.join(viewerDir, entry), "utf8").then((template) => {
|
|
185220
185460
|
const html = viewerPage(template, {
|
|
185221
185461
|
title,
|
|
185222
185462
|
description,
|
|
@@ -185568,7 +185808,7 @@ async function startArtifactsServer(options2) {
|
|
|
185568
185808
|
} catch {
|
|
185569
185809
|
ctx.port = await listen(server, options2.host, 0);
|
|
185570
185810
|
}
|
|
185571
|
-
|
|
185811
|
+
import_node_fs40.default.writeFileSync(ctx.portFile, `${ctx.port}
|
|
185572
185812
|
`, { mode: 384 });
|
|
185573
185813
|
}
|
|
185574
185814
|
const port = ctx.port;
|
|
@@ -185577,7 +185817,7 @@ async function startArtifactsServer(options2) {
|
|
|
185577
185817
|
const boardServer = import_node_http.default.createServer(handleBoardRequest);
|
|
185578
185818
|
if (mount) ctx.boardPort = mount.boardPort;
|
|
185579
185819
|
else if (loopback) {
|
|
185580
|
-
const boardPortFile =
|
|
185820
|
+
const boardPortFile = import_node_path37.default.join(stateDir, BOARD_PORT_FILE);
|
|
185581
185821
|
const previousBoardPort = Number(readPersisted(boardPortFile));
|
|
185582
185822
|
try {
|
|
185583
185823
|
ctx.boardPort = await listen(
|
|
@@ -185588,7 +185828,7 @@ async function startArtifactsServer(options2) {
|
|
|
185588
185828
|
} catch {
|
|
185589
185829
|
ctx.boardPort = await listen(boardServer, options2.host, 0);
|
|
185590
185830
|
}
|
|
185591
|
-
|
|
185831
|
+
import_node_fs40.default.writeFileSync(boardPortFile, `${ctx.boardPort}
|
|
185592
185832
|
`, { mode: 384 });
|
|
185593
185833
|
}
|
|
185594
185834
|
const boardPort = ctx.boardPort;
|
|
@@ -185607,7 +185847,7 @@ async function startArtifactsServer(options2) {
|
|
|
185607
185847
|
initialChanges.push({ ref: entry, payload, files: [] });
|
|
185608
185848
|
if (entry.type === "document") void ctx.documents.open(entry.id);
|
|
185609
185849
|
}
|
|
185610
|
-
writeJsonAtomic(
|
|
185850
|
+
writeJsonAtomic(import_node_path37.default.join(stateDir, "server-info"), {
|
|
185611
185851
|
type: "server-started",
|
|
185612
185852
|
url,
|
|
185613
185853
|
port,
|
|
@@ -185691,66 +185931,66 @@ async function startArtifactsServer(options2) {
|
|
|
185691
185931
|
});
|
|
185692
185932
|
await ctx.documents.close().catch(() => void 0);
|
|
185693
185933
|
ctx.whiteboards.close();
|
|
185694
|
-
if (mount)
|
|
185934
|
+
if (mount) import_node_fs40.default.rmSync(import_node_path37.default.join(stateDir, "server-info"), { force: true });
|
|
185695
185935
|
}
|
|
185696
185936
|
};
|
|
185697
185937
|
}
|
|
185698
185938
|
var mountArtifactsProject = (options2) => startArtifactsServer(options2);
|
|
185699
185939
|
|
|
185700
185940
|
// src/server/artifact-index.ts
|
|
185701
|
-
var
|
|
185702
|
-
var
|
|
185941
|
+
var import_node_fs42 = __toESM(require("node:fs"), 1);
|
|
185942
|
+
var import_node_path39 = __toESM(require("node:path"), 1);
|
|
185703
185943
|
|
|
185704
185944
|
// src/server/machine.ts
|
|
185705
|
-
var
|
|
185945
|
+
var import_node_fs41 = __toESM(require("node:fs"), 1);
|
|
185706
185946
|
var import_node_os = __toESM(require("node:os"), 1);
|
|
185707
|
-
var
|
|
185947
|
+
var import_node_path38 = __toESM(require("node:path"), 1);
|
|
185708
185948
|
var DORMANT_AFTER_MS = 7 * 24 * 60 * 60 * 1e3;
|
|
185709
185949
|
function machinePaths(env = process.env, homedir = import_node_os.default.homedir()) {
|
|
185710
|
-
const home = env.RYUGI_SERVER_HOME ||
|
|
185950
|
+
const home = env.RYUGI_SERVER_HOME || import_node_path38.default.join(homedir, ".ryugi", "server");
|
|
185711
185951
|
return {
|
|
185712
185952
|
home,
|
|
185713
|
-
pid:
|
|
185714
|
-
serverId:
|
|
185715
|
-
info:
|
|
185716
|
-
log:
|
|
185717
|
-
version:
|
|
185718
|
-
lock:
|
|
185719
|
-
key:
|
|
185720
|
-
projects:
|
|
185721
|
-
settings:
|
|
185722
|
-
stopped:
|
|
185953
|
+
pid: import_node_path38.default.join(home, "server.pid"),
|
|
185954
|
+
serverId: import_node_path38.default.join(home, "server-instance-id"),
|
|
185955
|
+
info: import_node_path38.default.join(home, "server-info"),
|
|
185956
|
+
log: import_node_path38.default.join(home, "server.log"),
|
|
185957
|
+
version: import_node_path38.default.join(home, "server-version"),
|
|
185958
|
+
lock: import_node_path38.default.join(home, "start.lock"),
|
|
185959
|
+
key: import_node_path38.default.join(home, "key"),
|
|
185960
|
+
projects: import_node_path38.default.join(home, "projects.json"),
|
|
185961
|
+
settings: import_node_path38.default.join(home, "settings.json"),
|
|
185962
|
+
stopped: import_node_path38.default.join(home, "server-stopped")
|
|
185723
185963
|
};
|
|
185724
185964
|
}
|
|
185725
185965
|
function ensureHome(home) {
|
|
185726
|
-
|
|
185727
|
-
|
|
185966
|
+
import_node_fs41.default.mkdirSync(home, { recursive: true, mode: 448 });
|
|
185967
|
+
import_node_fs41.default.chmodSync(home, 448);
|
|
185728
185968
|
}
|
|
185729
185969
|
var realDir = (dir) => {
|
|
185730
185970
|
try {
|
|
185731
|
-
return
|
|
185971
|
+
return import_node_fs41.default.realpathSync(import_node_path38.default.resolve(dir));
|
|
185732
185972
|
} catch {
|
|
185733
|
-
return
|
|
185973
|
+
return import_node_path38.default.resolve(dir);
|
|
185734
185974
|
}
|
|
185735
185975
|
};
|
|
185736
185976
|
var validEntry = (value) => {
|
|
185737
185977
|
const entry = value;
|
|
185738
|
-
return !!entry && typeof entry.dir === "string" &&
|
|
185978
|
+
return !!entry && typeof entry.dir === "string" && import_node_path38.default.isAbsolute(entry.dir) && Number.isFinite(entry.registeredAt) && Number.isFinite(entry.lastUsedAt);
|
|
185739
185979
|
};
|
|
185740
185980
|
function readProjects(file) {
|
|
185741
185981
|
try {
|
|
185742
|
-
const value = JSON.parse(
|
|
185982
|
+
const value = JSON.parse(import_node_fs41.default.readFileSync(file, "utf8"));
|
|
185743
185983
|
return Array.isArray(value.projects) ? value.projects.filter(validEntry) : [];
|
|
185744
185984
|
} catch {
|
|
185745
185985
|
return [];
|
|
185746
185986
|
}
|
|
185747
185987
|
}
|
|
185748
185988
|
function writeProjects(file, projects) {
|
|
185749
|
-
ensureHome(
|
|
185989
|
+
ensureHome(import_node_path38.default.dirname(file));
|
|
185750
185990
|
const tmp = `${file}.${process.pid}.tmp`;
|
|
185751
|
-
|
|
185991
|
+
import_node_fs41.default.writeFileSync(tmp, `${JSON.stringify({ projects }, null, 2)}
|
|
185752
185992
|
`, { mode: 384 });
|
|
185753
|
-
|
|
185993
|
+
import_node_fs41.default.renameSync(tmp, file);
|
|
185754
185994
|
}
|
|
185755
185995
|
function registerProject(file, projectDir, now = Date.now()) {
|
|
185756
185996
|
const dir = realDir(projectDir);
|
|
@@ -185767,10 +186007,10 @@ function removeProject(file, projectDir) {
|
|
|
185767
186007
|
const kept = projects.filter((entry) => entry.dir !== dir);
|
|
185768
186008
|
if (kept.length !== projects.length) writeProjects(file, kept);
|
|
185769
186009
|
}
|
|
185770
|
-
var artifactsRootOf = (projectDir) =>
|
|
186010
|
+
var artifactsRootOf = (projectDir) => import_node_path38.default.join(projectDir, ".ryugi", "artifacts");
|
|
185771
186011
|
function pruneProjects(file) {
|
|
185772
186012
|
const projects = readProjects(file);
|
|
185773
|
-
const kept = projects.filter((entry) =>
|
|
186013
|
+
const kept = projects.filter((entry) => import_node_fs41.default.existsSync(artifactsRootOf(entry.dir)));
|
|
185774
186014
|
if (kept.length !== projects.length) writeProjects(file, kept);
|
|
185775
186015
|
return kept;
|
|
185776
186016
|
}
|
|
@@ -185779,7 +186019,7 @@ var isDormant = (entry, now = Date.now()) => now - entry.lastUsedAt > DORMANT_AF
|
|
|
185779
186019
|
// src/server/artifact-index.ts
|
|
185780
186020
|
var readAddress = (dir) => {
|
|
185781
186021
|
try {
|
|
185782
|
-
const value =
|
|
186022
|
+
const value = import_node_fs42.default.readFileSync(import_node_path39.default.join(dir, ".artifact-id"), "utf8").trim();
|
|
185783
186023
|
return isArtifactAddress(value) ? value : null;
|
|
185784
186024
|
} catch {
|
|
185785
186025
|
return null;
|
|
@@ -185787,7 +186027,7 @@ var readAddress = (dir) => {
|
|
|
185787
186027
|
};
|
|
185788
186028
|
var mtimeOf2 = (dir) => {
|
|
185789
186029
|
try {
|
|
185790
|
-
return
|
|
186030
|
+
return import_node_fs42.default.statSync(dir).mtimeMs;
|
|
185791
186031
|
} catch {
|
|
185792
186032
|
return 0;
|
|
185793
186033
|
}
|
|
@@ -185886,7 +186126,7 @@ var ARTIFACT_KEY = /^(?:artboard|document|html)\/[a-z0-9][a-z0-9-]*$/;
|
|
|
185886
186126
|
var SEP = "\n";
|
|
185887
186127
|
var realDir2 = (dir) => {
|
|
185888
186128
|
try {
|
|
185889
|
-
return
|
|
186129
|
+
return import_node_fs43.default.realpathSync(import_node_path40.default.resolve(dir));
|
|
185890
186130
|
} catch {
|
|
185891
186131
|
return null;
|
|
185892
186132
|
}
|
|
@@ -185944,7 +186184,7 @@ async function startHub(options2) {
|
|
|
185944
186184
|
runtimeDir: options2.runtimeDir,
|
|
185945
186185
|
host: options2.host,
|
|
185946
186186
|
urlHost: options2.urlHost,
|
|
185947
|
-
configFile:
|
|
186187
|
+
configFile: import_node_path40.default.join(project, ".ryugi", "config.json"),
|
|
185948
186188
|
cloud: options2.cloud,
|
|
185949
186189
|
fetch: options2.fetch,
|
|
185950
186190
|
debounceMs: options2.debounceMs,
|
|
@@ -185959,7 +186199,7 @@ async function startHub(options2) {
|
|
|
185959
186199
|
}
|
|
185960
186200
|
return pending;
|
|
185961
186201
|
};
|
|
185962
|
-
const configFileOf = (project) =>
|
|
186202
|
+
const configFileOf = (project) => import_node_path40.default.join(project, ".ryugi", "config.json");
|
|
185963
186203
|
const servedBy = (project) => {
|
|
185964
186204
|
const mounted = ready.get(project);
|
|
185965
186205
|
if (mounted) return mounted.served();
|
|
@@ -186006,10 +186246,10 @@ async function startHub(options2) {
|
|
|
186006
186246
|
}) : null;
|
|
186007
186247
|
const origin = `http://${urlHostForHttp(options2.urlHost)}:${port}`;
|
|
186008
186248
|
const url = loopback ? `${origin}/` : `${origin}/?key=${options2.token}`;
|
|
186009
|
-
const infoFileOf = (project) =>
|
|
186249
|
+
const infoFileOf = (project) => import_node_path40.default.join(artifactsRootOf(project), ".state", "server-info");
|
|
186010
186250
|
const writeCompatInfo = (project) => {
|
|
186011
186251
|
try {
|
|
186012
|
-
|
|
186252
|
+
import_node_fs43.default.mkdirSync(import_node_path40.default.dirname(infoFileOf(project)), { recursive: true, mode: 448 });
|
|
186013
186253
|
writeJsonAtomic(infoFileOf(project), {
|
|
186014
186254
|
type: "server-started",
|
|
186015
186255
|
url,
|
|
@@ -186028,7 +186268,7 @@ async function startHub(options2) {
|
|
|
186028
186268
|
counts.set(entry.project, (counts.get(entry.project) ?? 0) + 1);
|
|
186029
186269
|
return ordered3().map((entry) => ({
|
|
186030
186270
|
dir: entry.dir,
|
|
186031
|
-
name:
|
|
186271
|
+
name: import_node_path40.default.basename(entry.dir),
|
|
186032
186272
|
lastUsedAt: entry.lastUsedAt,
|
|
186033
186273
|
dormant: isDormant(entry),
|
|
186034
186274
|
artifacts: counts.get(entry.dir) ?? 0
|
|
@@ -186041,7 +186281,7 @@ async function startHub(options2) {
|
|
|
186041
186281
|
const root = artifactsRootOf(entry.dir);
|
|
186042
186282
|
const listed = listArtifacts(root);
|
|
186043
186283
|
for (const warning of listed.warnings)
|
|
186044
|
-
warnings.push(`${
|
|
186284
|
+
warnings.push(`${import_node_path40.default.basename(entry.dir)}: ${warning}`);
|
|
186045
186285
|
for (const artifact of listed.artifacts) {
|
|
186046
186286
|
try {
|
|
186047
186287
|
artifacts.push({
|
|
@@ -186092,7 +186332,7 @@ async function startHub(options2) {
|
|
|
186092
186332
|
};
|
|
186093
186333
|
const publishedIn = (project, cloudId) => {
|
|
186094
186334
|
try {
|
|
186095
|
-
const { artifacts } = readConfig(
|
|
186335
|
+
const { artifacts } = readConfig(import_node_path40.default.join(project, ".ryugi", "config.json")).config;
|
|
186096
186336
|
return Object.values(artifacts).some((entry) => entry.cloud?.id === cloudId);
|
|
186097
186337
|
} catch {
|
|
186098
186338
|
return false;
|
|
@@ -186155,7 +186395,7 @@ async function startHub(options2) {
|
|
|
186155
186395
|
const register = async (dir, open2) => {
|
|
186156
186396
|
const real = realDir2(dir);
|
|
186157
186397
|
if (!real) throw new Error(`Project directory not found: ${dir}`);
|
|
186158
|
-
|
|
186398
|
+
import_node_fs43.default.mkdirSync(artifactsRootOf(real), { recursive: true });
|
|
186159
186399
|
const entry = registerProject(projectsFile, real);
|
|
186160
186400
|
index.rescan();
|
|
186161
186401
|
writeCompatInfo(real);
|
|
@@ -186165,10 +186405,10 @@ async function startHub(options2) {
|
|
|
186165
186405
|
return entry;
|
|
186166
186406
|
};
|
|
186167
186407
|
const remove2 = async (dir) => {
|
|
186168
|
-
const real = realDir2(dir) ??
|
|
186408
|
+
const real = realDir2(dir) ?? import_node_path40.default.resolve(dir);
|
|
186169
186409
|
removeProject(projectsFile, real);
|
|
186170
186410
|
index.rescan();
|
|
186171
|
-
|
|
186411
|
+
import_node_fs43.default.rmSync(infoFileOf(real), { force: true });
|
|
186172
186412
|
const pending = mounts.get(real);
|
|
186173
186413
|
mounts.delete(real);
|
|
186174
186414
|
ready.delete(real);
|
|
@@ -186176,17 +186416,17 @@ async function startHub(options2) {
|
|
|
186176
186416
|
};
|
|
186177
186417
|
const logTail = (project) => {
|
|
186178
186418
|
try {
|
|
186179
|
-
const fd3 =
|
|
186419
|
+
const fd3 = import_node_fs43.default.openSync(options2.paths.log, "r");
|
|
186180
186420
|
try {
|
|
186181
|
-
const size =
|
|
186421
|
+
const size = import_node_fs43.default.fstatSync(fd3).size;
|
|
186182
186422
|
const length = Math.min(size, LOG_TAIL_BYTES);
|
|
186183
186423
|
const buffer = Buffer.alloc(length);
|
|
186184
|
-
|
|
186424
|
+
import_node_fs43.default.readSync(fd3, buffer, 0, length, size - length);
|
|
186185
186425
|
const lines = buffer.toString("utf8").split("\n").filter(Boolean);
|
|
186186
186426
|
if (length < size) lines.shift();
|
|
186187
186427
|
return lines.filter((line2) => !project || line2.includes(project)).slice(-LOG_TAIL_LINES);
|
|
186188
186428
|
} finally {
|
|
186189
|
-
|
|
186429
|
+
import_node_fs43.default.closeSync(fd3);
|
|
186190
186430
|
}
|
|
186191
186431
|
} catch {
|
|
186192
186432
|
return [];
|
|
@@ -186324,7 +186564,7 @@ async function startHub(options2) {
|
|
|
186324
186564
|
mounts.clear();
|
|
186325
186565
|
ready.clear();
|
|
186326
186566
|
await Promise.all(all.map(async (pending) => (await pending.catch(() => null))?.close()));
|
|
186327
|
-
for (const entry of ordered3())
|
|
186567
|
+
for (const entry of ordered3()) import_node_fs43.default.rmSync(infoFileOf(entry.dir), { force: true });
|
|
186328
186568
|
for (const server of [front, board]) server.closeAllConnections();
|
|
186329
186569
|
await Promise.all(stopped);
|
|
186330
186570
|
}
|
|
@@ -186333,8 +186573,8 @@ async function startHub(options2) {
|
|
|
186333
186573
|
|
|
186334
186574
|
// src/server/relaunch.ts
|
|
186335
186575
|
var import_node_child_process4 = require("node:child_process");
|
|
186336
|
-
var
|
|
186337
|
-
var
|
|
186576
|
+
var import_node_fs44 = __toESM(require("node:fs"), 1);
|
|
186577
|
+
var import_node_path41 = __toESM(require("node:path"), 1);
|
|
186338
186578
|
var LAUNCHER_COMMAND = /^node "(.+)"$/;
|
|
186339
186579
|
var WAIT_THEN_RUN = `
|
|
186340
186580
|
const [pid, file, ...args] = process.argv.slice(1);
|
|
@@ -186348,20 +186588,20 @@ tick();
|
|
|
186348
186588
|
function relaunchCommand(env, serverDir) {
|
|
186349
186589
|
const launcher = LAUNCHER_COMMAND.exec(env.RYUGI_ARTIFACTS_LAUNCHER ?? "")?.[1];
|
|
186350
186590
|
if (launcher) return [process.execPath, launcher];
|
|
186351
|
-
const cli =
|
|
186352
|
-
return
|
|
186591
|
+
const cli = import_node_path41.default.join(serverDir, "cli.cjs");
|
|
186592
|
+
return import_node_fs44.default.existsSync(cli) ? [process.execPath, cli] : null;
|
|
186353
186593
|
}
|
|
186354
186594
|
function pinLauncherRelease(env, homedir, version3, now = Date.now()) {
|
|
186355
|
-
const releases =
|
|
186356
|
-
env.XDG_CACHE_HOME ||
|
|
186595
|
+
const releases = import_node_path41.default.join(
|
|
186596
|
+
env.XDG_CACHE_HOME || import_node_path41.default.join(homedir, ".cache"),
|
|
186357
186597
|
"ryugi",
|
|
186358
186598
|
"artifacts"
|
|
186359
186599
|
);
|
|
186360
|
-
|
|
186361
|
-
const file =
|
|
186600
|
+
import_node_fs44.default.mkdirSync(releases, { recursive: true });
|
|
186601
|
+
const file = import_node_path41.default.join(releases, "latest.json");
|
|
186362
186602
|
const tmp = `${file}.${process.pid}`;
|
|
186363
|
-
|
|
186364
|
-
|
|
186603
|
+
import_node_fs44.default.writeFileSync(tmp, JSON.stringify({ version: version3, checkedAt: now }));
|
|
186604
|
+
import_node_fs44.default.renameSync(tmp, file);
|
|
186365
186605
|
}
|
|
186366
186606
|
function spawnAfterExit(pid, argv, env = process.env) {
|
|
186367
186607
|
const [file, ...args] = argv;
|
|
@@ -186375,7 +186615,7 @@ function spawnAfterExit(pid, argv, env = process.env) {
|
|
|
186375
186615
|
}
|
|
186376
186616
|
|
|
186377
186617
|
// src/server/update-check.ts
|
|
186378
|
-
var
|
|
186618
|
+
var import_node_fs45 = __toESM(require("node:fs"), 1);
|
|
186379
186619
|
var REGISTRY_URL = "https://registry.npmjs.org/ryugi-artifacts/latest";
|
|
186380
186620
|
var DAY_MS = 24 * 60 * 60 * 1e3;
|
|
186381
186621
|
var TIMEOUT_MS2 = 5e3;
|
|
@@ -186390,7 +186630,7 @@ function newerVersion(candidate, current) {
|
|
|
186390
186630
|
}
|
|
186391
186631
|
function readCache(file) {
|
|
186392
186632
|
try {
|
|
186393
|
-
const value = JSON.parse(
|
|
186633
|
+
const value = JSON.parse(import_node_fs45.default.readFileSync(file, "utf8"));
|
|
186394
186634
|
return typeof value.version === "string" && Number.isFinite(value.checkedAt) ? value : null;
|
|
186395
186635
|
} catch {
|
|
186396
186636
|
return null;
|
|
@@ -186414,7 +186654,7 @@ function createUpdateCheck(options2) {
|
|
|
186414
186654
|
const { version: version3 } = await res.json();
|
|
186415
186655
|
if (typeof version3 !== "string") return;
|
|
186416
186656
|
cached = { version: version3, checkedAt: now() };
|
|
186417
|
-
|
|
186657
|
+
import_node_fs45.default.writeFileSync(options2.cacheFile, `${JSON.stringify(cached)}
|
|
186418
186658
|
`, { mode: 384 });
|
|
186419
186659
|
} catch {
|
|
186420
186660
|
}
|
|
@@ -186426,12 +186666,12 @@ function createUpdateCheck(options2) {
|
|
|
186426
186666
|
var UPDATE_POLL_MS = 60 * 60 * 1e3;
|
|
186427
186667
|
function machineKey(file) {
|
|
186428
186668
|
try {
|
|
186429
|
-
const key3 =
|
|
186669
|
+
const key3 = import_node_fs46.default.readFileSync(file, "utf8").trim();
|
|
186430
186670
|
if (/^[a-f0-9]{48}$/.test(key3)) return key3;
|
|
186431
186671
|
} catch {
|
|
186432
186672
|
}
|
|
186433
186673
|
const key2 = import_node_crypto13.default.randomBytes(24).toString("hex");
|
|
186434
|
-
|
|
186674
|
+
import_node_fs46.default.writeFileSync(file, `${key2}
|
|
186435
186675
|
`, { mode: 384 });
|
|
186436
186676
|
return key2;
|
|
186437
186677
|
}
|
|
@@ -186440,14 +186680,14 @@ async function main2() {
|
|
|
186440
186680
|
const paths = machinePaths();
|
|
186441
186681
|
ensureHome(paths.home);
|
|
186442
186682
|
const updates = createUpdateCheck({
|
|
186443
|
-
cacheFile:
|
|
186683
|
+
cacheFile: import_node_path42.default.join(paths.home, "latest.json"),
|
|
186444
186684
|
current: version
|
|
186445
186685
|
});
|
|
186446
186686
|
const hub = await startHub({
|
|
186447
186687
|
host: config.host,
|
|
186448
186688
|
urlHost: config.urlHost,
|
|
186449
|
-
viewerDir:
|
|
186450
|
-
runtimeDir:
|
|
186689
|
+
viewerDir: import_node_path42.default.join(__dirname, "viewer"),
|
|
186690
|
+
runtimeDir: import_node_path42.default.join(__dirname, "runtime"),
|
|
186451
186691
|
ports: config.ports,
|
|
186452
186692
|
boardPorts: config.boardPorts,
|
|
186453
186693
|
paths,
|
|
@@ -186484,14 +186724,14 @@ async function main2() {
|
|
|
186484
186724
|
if (stopping) return;
|
|
186485
186725
|
stopping = true;
|
|
186486
186726
|
console.info(JSON.stringify({ type: "server-stopped", reason, at: (/* @__PURE__ */ new Date()).toISOString() }));
|
|
186487
|
-
|
|
186727
|
+
import_node_fs46.default.rmSync(paths.info, { force: true });
|
|
186488
186728
|
if (intended) writeJsonAtomic(paths.stopped, { reason, timestamp: Date.now() });
|
|
186489
186729
|
await hub.close();
|
|
186490
186730
|
process.exit(0);
|
|
186491
186731
|
}
|
|
186492
186732
|
function readRunningVersion() {
|
|
186493
186733
|
try {
|
|
186494
|
-
return
|
|
186734
|
+
return import_node_fs46.default.readFileSync(paths.version, "utf8").trim() || version;
|
|
186495
186735
|
} catch {
|
|
186496
186736
|
return version;
|
|
186497
186737
|
}
|
|
@@ -186534,7 +186774,7 @@ async function main2() {
|
|
|
186534
186774
|
process.on("SIGTERM", () => void shutdown("SIGTERM"));
|
|
186535
186775
|
process.on("SIGINT", () => void shutdown("SIGINT"));
|
|
186536
186776
|
process.on("SIGHUP", () => void shutdown("SIGHUP"));
|
|
186537
|
-
|
|
186777
|
+
import_node_fs46.default.rmSync(paths.stopped, { force: true });
|
|
186538
186778
|
const started = {
|
|
186539
186779
|
type: "server-started",
|
|
186540
186780
|
url: hub.url,
|