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.
Files changed (361) hide show
  1. package/dist/cli.cjs +114 -70
  2. package/dist/output-bootstrap.cjs +1 -1
  3. package/dist/server.cjs +691 -451
  4. package/dist/viewer/{AgentStatusPill-B6X8KYhc.js → AgentStatusPill-CkFOocLp.js} +1 -1
  5. package/dist/viewer/ArtboardLayout-c2tN7qmA.js +12 -0
  6. package/dist/viewer/ArtifactList-Ba_vsFps.js +2 -0
  7. package/dist/viewer/{AutoPublishPrompt-BSofyZTo.js → AutoPublishPrompt-DBjUFJp0.js} +1 -1
  8. package/dist/viewer/{Avatar-Cp_i6ALh.js → Avatar-C76h25SW.js} +1 -1
  9. package/dist/viewer/Avatar-CiprmZa8.js +1 -0
  10. package/dist/viewer/{BottomSheet-BD-1fVgU.js → BottomSheet-BN94WJR-.js} +1 -1
  11. package/dist/viewer/{Canvas-DYRPeGj4.js → Canvas-BycJwc4p.js} +1 -1
  12. package/dist/viewer/CompositeItem-DP4e-Lcw.js +1 -0
  13. package/dist/viewer/DocumentLayout-BkpeuOpb.js +2 -0
  14. package/dist/viewer/DocumentPage-BqQXaW4l.js +4 -0
  15. package/dist/viewer/{DropdownMenu-DZ0qcmvX.js → DropdownMenu-4Ouduev6.js} +1 -1
  16. package/dist/viewer/{HtmlLayout-DOCRj2nS.js → HtmlLayout-Dwd8Iy0b.js} +1 -1
  17. package/dist/viewer/MenuSubmenuTrigger-BFgGHPek.js +1 -0
  18. package/dist/viewer/MenuTrigger-Dp816lqx.js +1 -0
  19. package/dist/viewer/{PhoneArtboardBar-ZHSm-rmy.js → PhoneArtboardBar-D1Ohbjxv.js} +1 -1
  20. package/dist/viewer/{PhoneSheet-DxyGiHhE.js → PhoneSheet-u7ImxAef.js} +1 -1
  21. package/dist/viewer/Popover-pOLZvL-K.js +1 -0
  22. package/dist/viewer/{PreviewLayout-8f_FSu9n.js → PreviewLayout-CQyYo3HQ.js} +2 -2
  23. package/dist/viewer/Segmented-jrL3VjDO.js +1 -0
  24. package/dist/viewer/Select-YHMVx9FX.js +1 -0
  25. package/dist/viewer/SelectScrollUpArrow-xXX8JHOC.js +1 -0
  26. package/dist/viewer/SettingsDialog-Dk2pmarN.js +1 -0
  27. package/dist/viewer/{SnapshotDocument-BfYSAQoy.js → SnapshotDocument-ve5bKPKM.js} +1 -1
  28. package/dist/viewer/SplitShell-B8aI0YSC.js +1 -0
  29. package/dist/viewer/{ThreadView-BUtexgWc.js → ThreadView-B4kNB_AB.js} +1 -1
  30. package/dist/viewer/TooltipPopup-DZRCQVrx.js +1 -0
  31. package/dist/viewer/{VirtualizedEditor-D9Ivycdp-BNgnIRWE.js → VirtualizedEditor-D9Ivycdp-D8_HtwY3.js} +1 -1
  32. package/dist/viewer/{VirtualizedRenderer-C_d95FXi-CLurmXlj.js → VirtualizedRenderer-C_d95FXi-DV00RbUh.js} +1 -1
  33. package/dist/viewer/{WarningsBadge-X-rqGa7y.js → WarningsBadge-CaAGWi0B.js} +1 -1
  34. package/dist/viewer/WhiteboardLayout-C9yzQzlb.js +3 -0
  35. package/dist/viewer/{WritingCursor-trMEG3IR.js → WritingCursor-DElcFC08.js} +1 -1
  36. package/dist/viewer/{abnfDiagram-VCTEODGH-ODz2u-Tc.js → abnfDiagram-VCTEODGH-BHNSlgBN.js} +1 -1
  37. package/dist/viewer/{agentLook-BWWdg3j_.js → agentLook-BkD9GF0y.js} +1 -1
  38. package/dist/viewer/{anchor-DfNlik1u.js → anchor-C6f5HUUc.js} +1 -1
  39. package/dist/viewer/{ar-SA-G6X2FPQ2-_MwLvkMh.js → ar-SA-G6X2FPQ2-kYFjvsjA.js} +1 -1
  40. package/dist/viewer/{architecture-7GRP2DOG-iSQ3-M8E.js → architecture-7GRP2DOG-Do0w0Nkr.js} +1 -1
  41. package/dist/viewer/{architectureDiagram-5GKGNRK7-BL5B1Cwd.js → architectureDiagram-5GKGNRK7-Du27ms23.js} +1 -1
  42. package/dist/viewer/{az-AZ-76LH7QW2-DoVas4wb.js → az-AZ-76LH7QW2-BjFBhSZJ.js} +1 -1
  43. package/dist/viewer/{bg-BG-XCXSNQG7-CYg_Nqhh.js → bg-BG-XCXSNQG7-Ck_hluXV.js} +1 -1
  44. package/dist/viewer/{blockDiagram-I7D4REHJ-1893qd6O.js → blockDiagram-I7D4REHJ-ZAPqzK7M.js} +1 -1
  45. package/dist/viewer/{bn-BD-2XOGV67Q-B3yYegfy.js → bn-BD-2XOGV67Q-D8RL--QF.js} +1 -1
  46. package/dist/viewer/{c4Diagram-7LVT6UL2-DLFhWMfM.js → c4Diagram-7LVT6UL2-CpZ4wCIe.js} +1 -1
  47. package/dist/viewer/{ca-ES-6MX7JW3Y-C3CynyTA.js → ca-ES-6MX7JW3Y-CmU7_qfi.js} +1 -1
  48. package/dist/viewer/{channel-gGfhtVCU.js → channel-B15uf_mz.js} +161 -161
  49. package/dist/viewer/channel-DB143Xik.js +1 -0
  50. package/dist/viewer/{chunk-4HAMMTFA-BOUTaKFB.js → chunk-4HAMMTFA-4oEiNUVg.js} +1 -1
  51. package/dist/viewer/{chunk-75Z2AOVW-AtKWqbsp.js → chunk-75Z2AOVW-DG3lmbGz.js} +1 -1
  52. package/dist/viewer/{chunk-DU6HZSFF-dg0wiFNr.js → chunk-DU6HZSFF-Dv3KmGY3.js} +1 -1
  53. package/dist/viewer/{chunk-EIO257PC-CiuVQ5tC.js → chunk-EIO257PC-DC6UJx10.js} +1 -1
  54. package/dist/viewer/{chunk-F27PBJKO-C3v6jBrH.js → chunk-F27PBJKO-DtFqk0w0.js} +1 -1
  55. package/dist/viewer/{chunk-GMAD6QVW-7o8gxuzy.js → chunk-GMAD6QVW-BK3CBpHU.js} +1 -1
  56. package/dist/viewer/{chunk-GVQU2GXP-DYfPE_kP.js → chunk-GVQU2GXP-CpsL6KWe.js} +1 -1
  57. package/dist/viewer/{chunk-IMKFNOWR-aN-toW4j.js → chunk-IMKFNOWR-DqRCtwcS.js} +1 -1
  58. package/dist/viewer/{chunk-L3NEJ4N5-CnyBfeWQ.js → chunk-L3NEJ4N5-bcRPIfs5.js} +1 -1
  59. package/dist/viewer/{chunk-OSK3NFVY-Dx0uAOLK.js → chunk-OSK3NFVY-BF2pXgrt.js} +1 -1
  60. package/dist/viewer/{chunk-P2QGCYS3-CAUxyWiK.js → chunk-P2QGCYS3-qI3BJZiV.js} +1 -1
  61. package/dist/viewer/{chunk-POPQ4Y6H-cr_OqW9b.js → chunk-POPQ4Y6H-D7_l0PbI.js} +1 -1
  62. package/dist/viewer/{chunk-PWAF6VOD-BMYvIGbv.js → chunk-PWAF6VOD-aeOMJQRL.js} +1 -1
  63. package/dist/viewer/{chunk-SHT3W25Y-BIhh6C-D.js → chunk-SHT3W25Y-BT5Wvvpu.js} +1 -1
  64. package/dist/viewer/{chunk-SVP7TREG-CA39sTgF.js → chunk-SVP7TREG-HG6La_wJ.js} +1 -1
  65. package/dist/viewer/{chunk-TICWLB2K-ByYHKmi7.js → chunk-TICWLB2K-DQpzLhAV.js} +1 -1
  66. package/dist/viewer/classDiagram-ZZMXUADV-DmJptHUP.js +1 -0
  67. package/dist/viewer/classDiagram-v2-VYDZK3BY-DmJptHUP.js +1 -0
  68. package/dist/viewer/{cs-CZ-2BRQDIVT-XNDLvq55.js → cs-CZ-2BRQDIVT-ahJk7hMM.js} +1 -1
  69. package/dist/viewer/{cynefin-OW5HDTMX-DpVSlbHP.js → cynefin-OW5HDTMX-nLOUGSf6.js} +1 -1
  70. package/dist/viewer/{cynefinDiagram-5FMLGOSQ-dHtfu-cX.js → cynefinDiagram-5FMLGOSQ-BO8dTCaE.js} +1 -1
  71. package/dist/viewer/{da-DK-5WZEPLOC-gGE6wcsX.js → da-DK-5WZEPLOC-ClRScj-s.js} +1 -1
  72. package/dist/viewer/{dagre-GXQ25YYZ-_49K5ME-.js → dagre-GXQ25YYZ-DTS_PRYI.js} +1 -1
  73. package/dist/viewer/{de-DE-XR44H4JA-xIn9zjsb.js → de-DE-XR44H4JA-D7v9Ws-w.js} +1 -1
  74. package/dist/viewer/{diagram-S7CK7UJ4-DnOVKbi8.js → diagram-S7CK7UJ4-5ytAW4Ck.js} +1 -1
  75. package/dist/viewer/{diagram-UQ7AKVKN-fXoq3ttg.js → diagram-UQ7AKVKN-DYUYBUBB.js} +1 -1
  76. package/dist/viewer/{diagram-VSXAHHWV-6LRIw8JH.js → diagram-VSXAHHWV-DeK669yc.js} +1 -1
  77. package/dist/viewer/{diagram-VX7I27RA-Co4MGh3a.js → diagram-VX7I27RA-pvfOXaeo.js} +1 -1
  78. package/dist/viewer/{diagram-Z3DM3KII-CLydqyhw.js → diagram-Z3DM3KII-D1tl_QsD.js} +1 -1
  79. package/dist/viewer/{dist-Bz_w4503.js → dist-02K6bLL5.js} +1 -1
  80. package/dist/viewer/{dist-b6Q8lY9Z.js → dist-1bnd_vgl.js} +1 -1
  81. package/dist/viewer/{dist-Be1Fe9dm.js → dist-7B7d5HYf.js} +1 -1
  82. package/dist/viewer/{dist-tlg8Gs4P.js → dist-BFwe-f96.js} +1 -1
  83. package/dist/viewer/{dist-aG5n-ukt.js → dist-BPIXPagN.js} +1 -1
  84. package/dist/viewer/{dist-BMJTKaNs.js → dist-BYMCet81.js} +1 -1
  85. package/dist/viewer/{dist-CLkvS-96.js → dist-BYp2eXKg.js} +1 -1
  86. package/dist/viewer/{dist-D8aaHNbP.js → dist-BZ5zojGQ.js} +4 -4
  87. package/dist/viewer/{dist-PX2c5w5B.js → dist-BsqIZGjl.js} +1 -1
  88. package/dist/viewer/{dist-8rAEP2kA.js → dist-Bw9MgUwF.js} +1 -1
  89. package/dist/viewer/{dist-DzGJipXU.js → dist-CAsi2KZK.js} +1 -1
  90. package/dist/viewer/{dist-Bh7I-jIz.js → dist-CDJ30uU2.js} +1 -1
  91. package/dist/viewer/{dist-mvJ-AbtV.js → dist-C_3pdJsj.js} +1 -1
  92. package/dist/viewer/{dist-BUCcrdqC.js → dist-Ck5orTzJ.js} +1 -1
  93. package/dist/viewer/{dist-CEQ8CIP-.js → dist-ClgG_XeE.js} +1 -1
  94. package/dist/viewer/{dist-BD0n8L2H.js → dist-CouAAeQX.js} +1 -1
  95. package/dist/viewer/{dist-Mwa2JYhN.js → dist-DVSSZHwn.js} +1 -1
  96. package/dist/viewer/{dist-CXkT6bXz.js → dist-IUX27npr.js} +1 -1
  97. package/dist/viewer/{dist-DQ3KAbgk.js → dist-Jn92mbUg.js} +1 -1
  98. package/dist/viewer/{dist-C8dsmt7M.js → dist-Ly85CnCY.js} +1 -1
  99. package/dist/viewer/{dist-CbgyqbcE.js → dist-Qc2dX3vA.js} +1 -1
  100. package/dist/viewer/{dist-DVH2k1zy.js → dist-hlfvil5J.js} +1 -1
  101. package/dist/viewer/{dist-uRinEKZF.js → dist-u7ism1gK.js} +1 -1
  102. package/dist/viewer/{dist-6KUMXJHX.js → dist-xg9TzjpP.js} +1 -1
  103. package/dist/viewer/{ebnfDiagram-PWID7BFC-eRw9PImL.js → ebnfDiagram-PWID7BFC-CL1U6Bgh.js} +1 -1
  104. package/dist/viewer/{el-GR-BZB4AONW-ydMLjdVd.js → el-GR-BZB4AONW-qfDNQt0F.js} +1 -1
  105. package/dist/viewer/{en-B4ZKOASM-u6OniCbC.js → en-B4ZKOASM-DjB7bdQE.js} +1 -1
  106. package/dist/viewer/{erDiagram-RLTQ6QDP-DUfKaOXm.js → erDiagram-RLTQ6QDP-C_lYUtOw.js} +1 -1
  107. package/dist/viewer/{es-ES-U4NZUMDT-CCvOElHW.js → es-ES-U4NZUMDT-CFw9usvE.js} +1 -1
  108. package/dist/viewer/{eu-ES-A7QVB2H4-C_WD5IZg.js → eu-ES-A7QVB2H4-4BNzkAsh.js} +1 -1
  109. package/dist/viewer/{eventmodeling-NTZA5JFV-C0rYyF74.js → eventmodeling-NTZA5JFV-CQBUT8Rf.js} +1 -1
  110. package/dist/viewer/{fa-IR-HGAKTJCU-BIkl-rJS.js → fa-IR-HGAKTJCU-C9i2Nfz_.js} +1 -1
  111. package/dist/viewer/{fi-FI-Z5N7JZ37-6HM4TKYa.js → fi-FI-Z5N7JZ37-C8UDB8bk.js} +1 -1
  112. package/dist/viewer/flowDiagram-HODETNUW-CV4rxiFw.js +1 -0
  113. package/dist/viewer/{fr-FR-RHASNOE6-Br__REnh.js → fr-FR-RHASNOE6-Mc-SCvoh.js} +1 -1
  114. package/dist/viewer/{ganttDiagram-EL5Y4UJY-DHQPmBwq.js → ganttDiagram-EL5Y4UJY-N-oOcKbq.js} +1 -1
  115. package/dist/viewer/{gitGraph-4MIJSDKK-Duos0FcC.js → gitGraph-4MIJSDKK-Z6v79k7p.js} +1 -1
  116. package/dist/viewer/{gitGraphDiagram-WWUBYQGX-BlhH29yu.js → gitGraphDiagram-WWUBYQGX-CORAtQJ3.js} +1 -1
  117. package/dist/viewer/{gl-ES-HMX3MZ6V-CSlRksGt.js → gl-ES-HMX3MZ6V-OfRSBrho.js} +1 -1
  118. package/dist/viewer/{he-IL-6SHJWFNN-7fwBpcZp.js → he-IL-6SHJWFNN-CjhadtGW.js} +1 -1
  119. package/dist/viewer/{hi-IN-IWLTKZ5I-liiwbLNI.js → hi-IN-IWLTKZ5I-CYYvph9P.js} +1 -1
  120. package/dist/viewer/{hu-HU-A5ZG7DT2-DdiFF2-_.js → hu-HU-A5ZG7DT2-B6NTEmIC.js} +1 -1
  121. package/dist/viewer/{id-ID-SAP4L64H-BbyroKKj.js → id-ID-SAP4L64H-B8Xf9sUo.js} +1 -1
  122. package/dist/viewer/{image-GAAHSSAO-Bl6iT5Xi.js → image-GAAHSSAO-hDM8yXwe.js} +1 -1
  123. package/dist/viewer/index.html +5 -5
  124. package/dist/viewer/index.js +2 -2
  125. package/dist/viewer/index3.css +28 -0
  126. package/dist/viewer/{info-A6RAGUB7-BayhR2hO.js → info-A6RAGUB7-CE-QPkyy.js} +1 -1
  127. package/dist/viewer/{infoDiagram-27XIBGKW-B7gYXKyi.js → infoDiagram-27XIBGKW-DrHsUoxu.js} +1 -1
  128. package/dist/viewer/{ishikawaDiagram-5VMMS53U-BCeyxXmy.js → ishikawaDiagram-5VMMS53U-nWj2IsTY.js} +1 -1
  129. package/dist/viewer/{it-IT-JPQ66NNP-Dl5XaFPJ.js → it-IT-JPQ66NNP-C810Op7y.js} +1 -1
  130. package/dist/viewer/{ja-JP-DBVTYXUO-Ds16kWgN.js → ja-JP-DBVTYXUO-DIbcYoJP.js} +1 -1
  131. package/dist/viewer/{journeyDiagram-3NMN7TZE-BRHyu3on.js → journeyDiagram-3NMN7TZE-CuKomypa.js} +1 -1
  132. package/dist/viewer/{kaa-6HZHGXH3-BZtk4Q-J.js → kaa-6HZHGXH3-cCX5zN8B.js} +1 -1
  133. package/dist/viewer/{kab-KAB-ZGHBKWFO-sX86-rIi.js → kab-KAB-ZGHBKWFO-B-RTmCXO.js} +1 -1
  134. package/dist/viewer/{kanban-definition-UXKFOSKX-D8dXYlkf.js → kanban-definition-UXKFOSKX-CKVuo3k4.js} +1 -1
  135. package/dist/viewer/{kk-KZ-P5N5QNE5-Kj6xbUfb.js → kk-KZ-P5N5QNE5-DYBkhmQl.js} +1 -1
  136. package/dist/viewer/{km-KH-HSX4SM5Z-Du9UYSIR.js → km-KH-HSX4SM5Z-CCxaEuqg.js} +1 -1
  137. package/dist/viewer/{ko-KR-MTYHY66A-D13455tH.js → ko-KR-MTYHY66A-3m7U3iBI.js} +1 -1
  138. package/dist/viewer/{ku-TR-6OUDTVRD-CRU2T1Xq.js → ku-TR-6OUDTVRD-X3ikgsVo.js} +1 -1
  139. package/dist/viewer/local-split-host-BMRFYq_O.js +1 -0
  140. package/dist/viewer/{lt-LT-XHIRWOB4-CaPQXWaa.js → lt-LT-XHIRWOB4-vvKpbejg.js} +1 -1
  141. package/dist/viewer/{lv-LV-5QDEKY6T-CWmJ_HNo.js → lv-LV-5QDEKY6T-BSM4MzKc.js} +1 -1
  142. package/dist/viewer/{mermaid-parser.core-Dq72O3lo.js → mermaid-parser.core-Bj6JAkmh.js} +3 -3
  143. package/dist/viewer/{mindmap-definition-YA3MSWOX-B5ND0SS0.js → mindmap-definition-YA3MSWOX-CCiNFisT.js} +1 -1
  144. package/dist/viewer/{mr-IN-CRQNXWMA-ClPq9z9c.js → mr-IN-CRQNXWMA-DXzOwWpa.js} +1 -1
  145. package/dist/viewer/{my-MM-5M5IBNSE-BgvPEMQG.js → my-MM-5M5IBNSE-Dn_OAz2K.js} +1 -1
  146. package/dist/viewer/{nb-NO-T6EIAALU-f4YcrpZO.js → nb-NO-T6EIAALU-fMPessoz.js} +1 -1
  147. package/dist/viewer/{nl-NL-IS3SIHDZ-51w_0F9O.js → nl-NL-IS3SIHDZ-DnTNhgqn.js} +1 -1
  148. package/dist/viewer/{nn-NO-6E72VCQL-C-asnGQd.js → nn-NO-6E72VCQL-8Yii387T.js} +1 -1
  149. package/dist/viewer/{oc-FR-POXYY2M6-CNXcOCrh.js → oc-FR-POXYY2M6-3ioiiCNK.js} +1 -1
  150. package/dist/viewer/{pa-IN-N4M65BXN-D2sTi4tB.js → pa-IN-N4M65BXN-B4yi3y3p.js} +1 -1
  151. package/dist/viewer/{packet-AYTQ26CC-C5eStsUT.js → packet-AYTQ26CC-4dovYoGN.js} +1 -1
  152. package/dist/viewer/{parseTrigger-Dpx4xwme.js → parseTrigger-BgQHa_Nx.js} +1 -1
  153. package/dist/viewer/{pegDiagram-XKGWAZYB-AfpuhbMK.js → pegDiagram-XKGWAZYB-CVV6hVF8.js} +1 -1
  154. package/dist/viewer/percentages-BXMCSKIN-DdTdqxCn.js +1 -0
  155. package/dist/viewer/{pie-WAS4IAKB-BuIit_wP.js → pie-WAS4IAKB-BuHK79R3.js} +1 -1
  156. package/dist/viewer/{pieDiagram-E7YTZNPT-CRSbhyv1.js → pieDiagram-E7YTZNPT-CEhHpuzY.js} +1 -1
  157. package/dist/viewer/{pl-PL-T2D74RX3-CaatC1Ad.js → pl-PL-T2D74RX3-OpiYmyBs.js} +1 -1
  158. package/dist/viewer/preview.html +4 -4
  159. package/dist/viewer/preview.js +1 -1
  160. package/dist/viewer/{prod-DdmJv0MO.js → prod-D0vYYRO1.js} +9 -9
  161. package/dist/viewer/{pt-BR-5N22H2LF-Cl2reV9F.js → pt-BR-5N22H2LF-D8F6ooYC.js} +1 -1
  162. package/dist/viewer/{pt-PT-UZXXM6DQ-Dl1E3lVz.js → pt-PT-UZXXM6DQ-D3mGarXo.js} +1 -1
  163. package/dist/viewer/{quadrantDiagram-AXDQQJYC-x1Uf4NVM.js → quadrantDiagram-AXDQQJYC-BeTd5Owh.js} +1 -1
  164. package/dist/viewer/{radar-RG4KPBEZ-DQGD6mHG.js → radar-RG4KPBEZ-Bs5JYSqQ.js} +1 -1
  165. package/dist/viewer/{railroad-74A4TZTK-_jyPADpx.js → railroad-74A4TZTK-60ZhIRvO.js} +1 -1
  166. package/dist/viewer/{railroad-abnf-HS5TGJTU-BbeCaDR8.js → railroad-abnf-HS5TGJTU-crN_5FSb.js} +1 -1
  167. package/dist/viewer/{railroad-ebnf-LZEXJU2U-0u5eXsT9.js → railroad-ebnf-LZEXJU2U-Cq5MpEFr.js} +1 -1
  168. package/dist/viewer/{railroad-peg-WCYAUIDC-DfdmN9rz.js → railroad-peg-WCYAUIDC-3_b7NLcX.js} +1 -1
  169. package/dist/viewer/{railroadDiagram-O6MQD6OU-Bss7JqQV.js → railroadDiagram-O6MQD6OU-Vy-0n1VR.js} +1 -1
  170. package/dist/viewer/ref-DBHRFrMN.js +1 -0
  171. package/dist/viewer/{requirementDiagram-BXWQKSXE-T8cs3e3U.js → requirementDiagram-BXWQKSXE-3UTyJ8ZV.js} +1 -1
  172. package/dist/viewer/{ro-RO-JPDTUUEW-LJoACXW2.js → ro-RO-JPDTUUEW-ukAakPc_.js} +1 -1
  173. package/dist/viewer/{route-DDEGqDvB.js → route-Cvbs0pMv.js} +2 -2
  174. package/dist/viewer/route-messages-9SZM1864.js +1 -0
  175. package/dist/viewer/{ru-RU-B4JR7IUQ-Dr1RnL66.js → ru-RU-B4JR7IUQ-DsKKiTcC.js} +1 -1
  176. package/dist/viewer/{sankeyDiagram-P5KCCOFB-uvLee9BZ.js → sankeyDiagram-P5KCCOFB-DS3TrrxP.js} +1 -1
  177. package/dist/viewer/{selection-A2YAIJTR.js → selection-DuzBGS_K.js} +1 -1
  178. package/dist/viewer/{sequenceDiagram-WJ2MYXX4-DcTFNs19.js → sequenceDiagram-WJ2MYXX4-C-MQ1r66.js} +1 -1
  179. package/dist/viewer/settings-dialog-DcUSfYHj.js +1 -0
  180. package/dist/viewer/{si-LK-N5RQ5JYF-BLq3al5N.js → si-LK-N5RQ5JYF-fd9skMWt.js} +1 -1
  181. package/dist/viewer/{sk-SK-C5VTKIMK-a-IIZ4GT.js → sk-SK-C5VTKIMK-94yPrt-v.js} +1 -1
  182. package/dist/viewer/{sl-SI-NN7IZMDC-o1isoOWW.js → sl-SI-NN7IZMDC-CXyf9Y_h.js} +1 -1
  183. package/dist/viewer/{split-url-BDMlmdjs.js → split-url-DCXSi810.js} +2 -2
  184. package/dist/viewer/{stateDiagram-D77RDMKH-BZM8bgzK.js → stateDiagram-D77RDMKH-uLNLMbA4.js} +1 -1
  185. package/dist/viewer/stateDiagram-v2-MP3YSRHH-4X9ufUCL.js +1 -0
  186. package/dist/viewer/subset-shared.chunk-ByQ-gvtV.js +1 -0
  187. package/dist/viewer/{subset-worker.chunk-26hNkxyu.js → subset-worker.chunk-CCjlZvyE.js} +1 -1
  188. package/dist/viewer/{sv-SE-XGPEYMSR-B_D5ChEk.js → sv-SE-XGPEYMSR-DPbLSv0c.js} +1 -1
  189. package/dist/viewer/{swimlanes-42K2YHIH-Dg0qxOws.js → swimlanes-42K2YHIH-y-2hdIuq.js} +1 -1
  190. package/dist/viewer/swimlanesDiagram-VR7AAH4N-BThkkUgr.js +8 -0
  191. package/dist/viewer/{ta-IN-2NMHFXQM-ClGBXdV4.js → ta-IN-2NMHFXQM-BK3L3kDX.js} +1 -1
  192. package/dist/viewer/{th-TH-HPSO5L25-DAJ8sOl3.js → th-TH-HPSO5L25-CFBmFkzs.js} +1 -1
  193. package/dist/viewer/{timeline-definition-24CTP7MA-DXaemj2u.js → timeline-definition-24CTP7MA-erBEzv25.js} +1 -1
  194. package/dist/viewer/{tr-TR-DEFEU3FU-BzHu5pEn.js → tr-TR-DEFEU3FU-Cy9-JU8k.js} +1 -1
  195. package/dist/viewer/{treeView-Q6P3EWNA-C_VbpbNe.js → treeView-Q6P3EWNA-1tNBreej.js} +1 -1
  196. package/dist/viewer/{treemap-WGGIJYW6-BGL5LSgs.js → treemap-WGGIJYW6-DbqYBKFh.js} +1 -1
  197. package/dist/viewer/{uk-UA-QMV73CPH-BPDqw53G.js → uk-UA-QMV73CPH-DwAQPx1c.js} +1 -1
  198. package/dist/viewer/useAriaLabelledBy-1TFrbqTT.js +1 -0
  199. package/dist/viewer/useOpenInteractionType-B7ZAWZlS.js +1 -0
  200. package/dist/viewer/{useTranslation-BcipDuhp.js → useTranslation-DczhMFuq.js} +1 -1
  201. package/dist/viewer/useTypeFavicon-fHGk7fhQ.js +1 -0
  202. package/dist/viewer/{vennDiagram-4TSXK5OY-DZKcEaHf.js → vennDiagram-4TSXK5OY-gxGufpuC.js} +1 -1
  203. package/dist/viewer/verdicts-B9EpSu2Q.js +1 -0
  204. package/dist/viewer/{vi-VN-M7AON7JQ-CJEuQOxR.js → vi-VN-M7AON7JQ-C8FCmKmt.js} +1 -1
  205. package/dist/viewer/{view-CJUgyKGY.js → view-CX7yv-Pv.js} +1 -1
  206. package/dist/viewer/{viewport-CFJHn_Y6-BGH6hsZG.js → viewport-CFJHn_Y6-C1jXsfyM.js} +1 -1
  207. package/dist/viewer/{wardley-WFR3VGLG-Dkp_-AaL.js → wardley-WFR3VGLG-BeUHBiNR.js} +1 -1
  208. package/dist/viewer/{wardleyDiagram-VM6X3IG4-86pEJitp.js → wardleyDiagram-VM6X3IG4-BEH6ZNYM.js} +1 -1
  209. package/dist/viewer/{xychartDiagram-S5SC5T6Z-CAsfEZ7P.js → xychartDiagram-S5SC5T6Z-Sb2wN887.js} +1 -1
  210. package/dist/viewer/{zh-CN-LNUGB5OW-m354m4Nb.js → zh-CN-LNUGB5OW-CjcOJMLB.js} +1 -1
  211. package/dist/viewer/{zh-HK-E62DVLB3-HnR0Htak.js → zh-HK-E62DVLB3-C2ghlkfZ.js} +1 -1
  212. package/dist/viewer/{zh-TW-RAJ6MFWO-BUClvKp2.js → zh-TW-RAJ6MFWO-CDfhTlX4.js} +1 -1
  213. package/dist/viewer-lib/{Canvas-XtRYXIEb.js → Canvas-BSA0o7dK.js} +3 -3
  214. package/dist/viewer-lib/{PhoneArtboardBar-DfzvB3QO.js → PhoneArtboardBar-BAYT7ihY.js} +2 -2
  215. package/dist/viewer-lib/{PreviewView-lLevZBla.js → PreviewView-C7t7ZIzk.js} +2 -2
  216. package/dist/viewer-lib/{ReadOnlyWhiteboard-D0CZ0LdG.js → ReadOnlyWhiteboard-CWflWeSo.js} +3 -3
  217. package/dist/viewer-lib/{SnapshotDocument-T_gyY6JJ.js → SnapshotDocument-CgnqSKkP.js} +13631 -13624
  218. package/dist/viewer-lib/{VirtualizedEditor-D9Ivycdp-Blh2vJwo.js → VirtualizedEditor-D9Ivycdp-CRIrE_5w.js} +2 -2
  219. package/dist/viewer-lib/{VirtualizedRenderer-C_d95FXi-BOJs6MXx.js → VirtualizedRenderer-C_d95FXi-Zicvc4ph.js} +3 -3
  220. package/dist/viewer-lib/{WarningsBadge-BtnTIfpB.js → WarningsBadge-D5jWxCxT.js} +1 -1
  221. package/dist/viewer-lib/{agentLook-DWANryek.js → agentLook-B23cR9K4.js} +1 -1
  222. package/dist/viewer-lib/{ar-SA-G6X2FPQ2-DSCh8zTd.js → ar-SA-G6X2FPQ2-Duv5zla_.js} +1 -1
  223. package/dist/viewer-lib/{az-AZ-76LH7QW2-CNdNs8nj.js → az-AZ-76LH7QW2-BlP0W-O3.js} +1 -1
  224. package/dist/viewer-lib/{bg-BG-XCXSNQG7-PU2ZxsGw.js → bg-BG-XCXSNQG7-8U63f6nC.js} +1 -1
  225. package/dist/viewer-lib/{bn-BD-2XOGV67Q-XLdOhNaI.js → bn-BD-2XOGV67Q-C-NXsQHr.js} +1 -1
  226. package/dist/viewer-lib/{ca-ES-6MX7JW3Y-UY8MZC4L.js → ca-ES-6MX7JW3Y-CRMSXAX-.js} +1 -1
  227. package/dist/viewer-lib/{chunk-EIO257PC-C1U1qIlr.js → chunk-EIO257PC-Bn-GD-Zt.js} +1 -1
  228. package/dist/viewer-lib/core.js +3 -3
  229. package/dist/viewer-lib/{cs-CZ-2BRQDIVT-BFfwha5e.js → cs-CZ-2BRQDIVT-Dz9S_d4x.js} +1 -1
  230. package/dist/viewer-lib/{da-DK-5WZEPLOC-DDviq7_M.js → da-DK-5WZEPLOC-CHcNiE6q.js} +1 -1
  231. package/dist/viewer-lib/{de-DE-XR44H4JA-C9myJh7C.js → de-DE-XR44H4JA-NcoEL-P8.js} +1 -1
  232. package/dist/viewer-lib/{dist-DQlRNM1V.js → dist-5GpEJ-bH.js} +3 -3
  233. package/dist/viewer-lib/{dist-D0AhZFIx.js → dist-BQdzYH0T.js} +2 -2
  234. package/dist/viewer-lib/{dist-Bb9R9QlE.js → dist-BTwBk5SA.js} +3 -3
  235. package/dist/viewer-lib/{dist-D9t2NKPt.js → dist-BUAaHyRl.js} +3 -3
  236. package/dist/viewer-lib/{dist-C0iQb-kP.js → dist-BUPma0-6.js} +2 -2
  237. package/dist/viewer-lib/{dist-CAoIkY40.js → dist-BeRdUOTO.js} +2 -2
  238. package/dist/viewer-lib/{dist-BsTwyJB3.js → dist-BmR1ILj9.js} +2 -2
  239. package/dist/viewer-lib/{dist-5qRQAgi-.js → dist-Bnu-2VVl.js} +3 -3
  240. package/dist/viewer-lib/{dist-C-R9SWz_.js → dist-Bs3YnXsj.js} +4 -4
  241. package/dist/viewer-lib/{dist-DaJwO7Xc.js → dist-C773LAGa.js} +2 -2
  242. package/dist/viewer-lib/{dist-Bal1GKlv.js → dist-CQMnJ128.js} +1 -1
  243. package/dist/viewer-lib/{dist-DTqMZxNq.js → dist-CjjfbMFL.js} +3 -3
  244. package/dist/viewer-lib/{dist-Dli815JZ.js → dist-CkvV3vBQ.js} +2 -2
  245. package/dist/viewer-lib/{dist-CvyyocBe.js → dist-CpOPVqpt.js} +3 -3
  246. package/dist/viewer-lib/{dist-D85VCWJe.js → dist-DADVpqjr.js} +3 -3
  247. package/dist/viewer-lib/{dist-D3y43SEU.js → dist-DQ73SSla.js} +1 -1
  248. package/dist/viewer-lib/{dist-D6SeV1Ef.js → dist-DaIYYQw6.js} +2 -2
  249. package/dist/viewer-lib/{dist-CTxT1PXe.js → dist-Dh-J-Rgq.js} +4 -4
  250. package/dist/viewer-lib/{dist-BAZg8tW9.js → dist-DjolX4i2.js} +3 -3
  251. package/dist/viewer-lib/{dist-CEezXcL4.js → dist-DthLTMm5.js} +2 -2
  252. package/dist/viewer-lib/{dist-Mng5zZmU.js → dist-DyGv52rq.js} +3 -3
  253. package/dist/viewer-lib/{dist-CKL7I9Qx.js → dist-PFn-QQ_s.js} +4 -4
  254. package/dist/viewer-lib/{dist-wAvEq47e.js → dist-lX8KxHAX.js} +3 -3
  255. package/dist/viewer-lib/document.js +787 -785
  256. package/dist/viewer-lib/{el-GR-BZB4AONW-GpnZgGUN.js → el-GR-BZB4AONW-Ckitl9ll.js} +1 -1
  257. package/dist/viewer-lib/{en-B4ZKOASM-CFqMifHo.js → en-B4ZKOASM-DDOXe6SM.js} +1 -1
  258. package/dist/viewer-lib/{es-ES-U4NZUMDT-DRdVwGjw.js → es-ES-U4NZUMDT-D5Il9sGa.js} +1 -1
  259. package/dist/viewer-lib/{eu-ES-A7QVB2H4-BkyvJflk.js → eu-ES-A7QVB2H4-DzVr94jH.js} +1 -1
  260. package/dist/viewer-lib/{fa-IR-HGAKTJCU-BwsYAcy8.js → fa-IR-HGAKTJCU-j4IP_Edo.js} +1 -1
  261. package/dist/viewer-lib/{fi-FI-Z5N7JZ37-CBeMgc4e.js → fi-FI-Z5N7JZ37-B0DDhQ1Z.js} +1 -1
  262. package/dist/viewer-lib/{fr-FR-RHASNOE6-CSCzRtsr.js → fr-FR-RHASNOE6-DWknbOF7.js} +1 -1
  263. package/dist/viewer-lib/{gl-ES-HMX3MZ6V-Dsd9rhFU.js → gl-ES-HMX3MZ6V-shg10h_v.js} +1 -1
  264. package/dist/viewer-lib/{he-IL-6SHJWFNN-BzbqaoiX.js → he-IL-6SHJWFNN-Ed04ekIs.js} +1 -1
  265. package/dist/viewer-lib/{hi-IN-IWLTKZ5I-DW-xTmxl.js → hi-IN-IWLTKZ5I-DjdOFRmR.js} +1 -1
  266. package/dist/viewer-lib/{hu-HU-A5ZG7DT2-DFcambMZ.js → hu-HU-A5ZG7DT2-n8QpqZ4Z.js} +1 -1
  267. package/dist/viewer-lib/{i18n-AbkxQTcI.js → i18n-CqqLJ6Bn.js} +92 -10
  268. package/dist/viewer-lib/{id-ID-SAP4L64H-tTBC6jhJ.js → id-ID-SAP4L64H-s-M00021.js} +1 -1
  269. package/dist/viewer-lib/{image-GAAHSSAO-DYWFpM2G.js → image-GAAHSSAO-BJML0bqE.js} +1 -1
  270. package/dist/viewer-lib/index.js +2509 -1988
  271. package/dist/viewer-lib/{it-IT-JPQ66NNP-D_dRrUXm.js → it-IT-JPQ66NNP-CDsG32dJ.js} +1 -1
  272. package/dist/viewer-lib/{ja-JP-DBVTYXUO-Bg7zRyCt.js → ja-JP-DBVTYXUO-DbxhxSyk.js} +1 -1
  273. package/dist/viewer-lib/{kaa-6HZHGXH3-C3jbC37K.js → kaa-6HZHGXH3-DJomTlzL.js} +1 -1
  274. package/dist/viewer-lib/{kab-KAB-ZGHBKWFO-3wPaJGNV.js → kab-KAB-ZGHBKWFO-CI0oP3Bj.js} +1 -1
  275. package/dist/viewer-lib/{kk-KZ-P5N5QNE5-CxV-rOti.js → kk-KZ-P5N5QNE5-7CjRJsra.js} +1 -1
  276. package/dist/viewer-lib/{km-KH-HSX4SM5Z-CjWW8EnV.js → km-KH-HSX4SM5Z-CoNkwzsI.js} +1 -1
  277. package/dist/viewer-lib/{ko-KR-MTYHY66A-DYgqutRt.js → ko-KR-MTYHY66A-DFQinSan.js} +1 -1
  278. package/dist/viewer-lib/{ku-TR-6OUDTVRD-BKEfJRQu.js → ku-TR-6OUDTVRD-bVcYOoDk.js} +1 -1
  279. package/dist/viewer-lib/{lib-BWIKhY0u.js → lib-CoXZilpj.js} +125 -125
  280. package/dist/viewer-lib/{lt-LT-XHIRWOB4-C40q3QcD.js → lt-LT-XHIRWOB4-BIsiqKj8.js} +1 -1
  281. package/dist/viewer-lib/{lv-LV-5QDEKY6T-C8cvmasQ.js → lv-LV-5QDEKY6T-CPC7ylaV.js} +1 -1
  282. package/dist/viewer-lib/{mr-IN-CRQNXWMA-B5iL27vN.js → mr-IN-CRQNXWMA-CiY-592d.js} +1 -1
  283. package/dist/viewer-lib/{my-MM-5M5IBNSE-BIaP8rPS.js → my-MM-5M5IBNSE-CqJsVoJu.js} +1 -1
  284. package/dist/viewer-lib/{nb-NO-T6EIAALU-D2L2JYb0.js → nb-NO-T6EIAALU-BBLgzHfY.js} +1 -1
  285. package/dist/viewer-lib/{nl-NL-IS3SIHDZ-BF9POnBF.js → nl-NL-IS3SIHDZ-vencjWhM.js} +1 -1
  286. package/dist/viewer-lib/{nn-NO-6E72VCQL-DtL4ep0j.js → nn-NO-6E72VCQL-BWHOGPEl.js} +1 -1
  287. package/dist/viewer-lib/{oc-FR-POXYY2M6-CM0au5Lk.js → oc-FR-POXYY2M6-BYL_PQLS.js} +1 -1
  288. package/dist/viewer-lib/{pa-IN-N4M65BXN-D-jLm3EK.js → pa-IN-N4M65BXN-Cv4ZB-QP.js} +1 -1
  289. package/dist/viewer-lib/percentages-BXMCSKIN-BdIkw9ta.js +1 -0
  290. package/dist/viewer-lib/{pl-PL-T2D74RX3-rTHmzHqx.js → pl-PL-T2D74RX3-2YdY7WUN.js} +1 -1
  291. package/dist/viewer-lib/{plugin-_bGVeqI0-BPW31nnw.js → plugin-_bGVeqI0-DaWymUTi.js} +1 -1
  292. package/dist/viewer-lib/{prod-D2rw6WFD.js → prod-BrZ_Nr0-.js} +59 -59
  293. package/dist/viewer-lib/{pt-BR-5N22H2LF-DBo3zEkE.js → pt-BR-5N22H2LF-BgPsrxRG.js} +1 -1
  294. package/dist/viewer-lib/{pt-PT-UZXXM6DQ-CinObC39.js → pt-PT-UZXXM6DQ-4FPiYyES.js} +1 -1
  295. package/dist/viewer-lib/{ro-RO-JPDTUUEW-BJvdgr_5.js → ro-RO-JPDTUUEW-BwoX9h84.js} +1 -1
  296. package/dist/viewer-lib/{route-messages-DTiEU_zp.js → route-messages-CqMvUkfR.js} +279 -241
  297. package/dist/viewer-lib/{ru-RU-B4JR7IUQ-C8RoEcU9.js → ru-RU-B4JR7IUQ-Bd9s4exj.js} +1 -1
  298. package/dist/viewer-lib/{si-LK-N5RQ5JYF-CmH33jvB.js → si-LK-N5RQ5JYF-COjPyEJf.js} +1 -1
  299. package/dist/viewer-lib/{sk-SK-C5VTKIMK-DbX5YK4x.js → sk-SK-C5VTKIMK-DY61Iqus.js} +1 -1
  300. package/dist/viewer-lib/{sl-SI-NN7IZMDC-GaQJzO11.js → sl-SI-NN7IZMDC-CoLAIrA-.js} +1 -1
  301. package/dist/viewer-lib/{stylex-CnT-Ts3D.css → stylex-B2Kji6ve.css} +32 -0
  302. package/dist/viewer-lib/subset-shared.chunk-BT3koTww.js +2 -0
  303. package/dist/viewer-lib/{subset-worker.chunk-DaNQ8W3O.js → subset-worker.chunk-1lo51MmF.js} +2 -2
  304. package/dist/viewer-lib/{sv-SE-XGPEYMSR-C4cib1qC.js → sv-SE-XGPEYMSR-DghaMqt3.js} +1 -1
  305. package/dist/viewer-lib/{ta-IN-2NMHFXQM-COXiexro.js → ta-IN-2NMHFXQM-GfsHy3fq.js} +1 -1
  306. package/dist/viewer-lib/{th-TH-HPSO5L25-DZu-t4j-.js → th-TH-HPSO5L25-Dp7xyi9G.js} +1 -1
  307. package/dist/viewer-lib/{tr-TR-DEFEU3FU-CJMaRH7e.js → tr-TR-DEFEU3FU-BaJOrAUy.js} +1 -1
  308. package/dist/viewer-lib/types/src/shared/artifact-kinds.d.ts +34 -0
  309. package/dist/viewer-lib/types/src/shared/backlinks.d.ts +2 -1
  310. package/dist/viewer-lib/types/src/shared/cascade.d.ts +40 -0
  311. package/dist/viewer-lib/types/src/shared/ref-status.d.ts +9 -1
  312. package/dist/viewer-lib/types/src/shared/ref.d.ts +5 -9
  313. package/dist/viewer-lib/types/src/viewer/components/CascadeList.d.ts +13 -0
  314. package/dist/viewer-lib/types/src/viewer/components/SharePanel.d.ts +15 -0
  315. package/dist/viewer-lib/types/src/viewer/document/useCloudRefBoard.d.ts +5 -0
  316. package/dist/viewer-lib/types/src/viewer/library/index.d.ts +4 -1
  317. package/dist/viewer-lib/types/src/viewer/split/messages.d.ts +3 -0
  318. package/dist/viewer-lib/types/src/viewer/split/route-messages.d.ts +3 -1
  319. package/dist/viewer-lib/types/src/viewer/split/split-url.d.ts +9 -2
  320. package/dist/viewer-lib/types/src/viewer/split/usePaneStage.d.ts +16 -0
  321. package/dist/viewer-lib/types/src/viewer/split/useSplitRouting.d.ts +8 -5
  322. package/dist/viewer-lib/{uk-UA-QMV73CPH-BNjGwvPi.js → uk-UA-QMV73CPH-Dg_TFHUA.js} +1 -1
  323. package/dist/viewer-lib/{vi-VN-M7AON7JQ-CFAjVdhW.js → vi-VN-M7AON7JQ-BbasR-kZ.js} +1 -1
  324. package/dist/viewer-lib/{viewport-CFJHn_Y6-C-nOAUOA.js → viewport-CFJHn_Y6-rsrJTmFz.js} +1 -1
  325. package/dist/viewer-lib/{zh-CN-LNUGB5OW-CJGcookC.js → zh-CN-LNUGB5OW-DP1552am.js} +1 -1
  326. package/dist/viewer-lib/{zh-HK-E62DVLB3-DbKlJaOJ.js → zh-HK-E62DVLB3-DMsDsoF6.js} +1 -1
  327. package/dist/viewer-lib/{zh-TW-RAJ6MFWO-6xqeRDl-.js → zh-TW-RAJ6MFWO-D1mbuuHb.js} +1 -1
  328. package/package.json +1 -1
  329. package/dist/viewer/ArtboardLayout-CL7CeJtR.js +0 -12
  330. package/dist/viewer/ArtifactList-C9WYHhVD.js +0 -2
  331. package/dist/viewer/Avatar-TFwLueDr.js +0 -1
  332. package/dist/viewer/CompositeItem-DYLRmrE_.js +0 -1
  333. package/dist/viewer/DocumentLayout-BbmdEZ-E.js +0 -2
  334. package/dist/viewer/DocumentPage-Cv3CsvrN.js +0 -4
  335. package/dist/viewer/MenuSubmenuTrigger-CbXQxNH6.js +0 -1
  336. package/dist/viewer/MenuTrigger-DUDnBy5x.js +0 -1
  337. package/dist/viewer/Popover-Df89KUPH.js +0 -1
  338. package/dist/viewer/Select-C5fhFls_.js +0 -1
  339. package/dist/viewer/SelectScrollUpArrow-ekubXj7Y.js +0 -1
  340. package/dist/viewer/SettingsDialog-DyvJKJ-o.js +0 -1
  341. package/dist/viewer/SplitShell-Dm7Po2-x.js +0 -1
  342. package/dist/viewer/TooltipPopup-Bkov4dq9.js +0 -1
  343. package/dist/viewer/WhiteboardLayout-Bobg7qpA.js +0 -3
  344. package/dist/viewer/channel-Bs9FsVFX.js +0 -1
  345. package/dist/viewer/classDiagram-ZZMXUADV-BWwOjUTg.js +0 -1
  346. package/dist/viewer/classDiagram-v2-VYDZK3BY-BWwOjUTg.js +0 -1
  347. package/dist/viewer/flowDiagram-HODETNUW-DyOrsOBQ.js +0 -1
  348. package/dist/viewer/local-split-host-BGIN8Z8E.js +0 -1
  349. package/dist/viewer/messages-D-DLzi0K.js +0 -1
  350. package/dist/viewer/percentages-BXMCSKIN-DR7Xa-V1.js +0 -1
  351. package/dist/viewer/route-messages-Cw5rlOIe.js +0 -1
  352. package/dist/viewer/settings-dialog-CI1cXQbx.js +0 -1
  353. package/dist/viewer/stateDiagram-v2-MP3YSRHH-2e0z4X46.js +0 -1
  354. package/dist/viewer/subset-shared.chunk-DYPlDRg8.js +0 -1
  355. package/dist/viewer/swimlanesDiagram-VR7AAH4N-CikAcpC5.js +0 -8
  356. package/dist/viewer/useControlledState-D_GlZYtL.js +0 -1
  357. package/dist/viewer/useOpenInteractionType-7AMeX8Ol.js +0 -1
  358. package/dist/viewer/useTypeFavicon-Dw5tQpxT.js +0 -1
  359. package/dist/viewer/verdicts-DXrETzvP.js +0 -1
  360. package/dist/viewer-lib/percentages-BXMCSKIN-BX16aURg.js +0 -1
  361. 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 import_node_fs45 = __toESM(require("node:fs"), 1);
48381
+ var import_node_fs46 = __toESM(require("node:fs"), 1);
48382
48382
  var import_node_os2 = __toESM(require("node:os"), 1);
48383
- var import_node_path41 = __toESM(require("node:path"), 1);
48383
+ var import_node_path42 = __toESM(require("node:path"), 1);
48384
48384
 
48385
48385
  // package.json
48386
- var version = "1.66.0";
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 import_node_fs42 = __toESM(require("node:fs"), 1);
49192
+ var import_node_fs43 = __toESM(require("node:fs"), 1);
49193
49193
  var import_node_http2 = __toESM(require("node:http"), 1);
49194
- var import_node_path39 = __toESM(require("node:path"), 1);
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 import_node_fs39 = __toESM(require("node:fs"), 1);
49221
+ var import_node_fs40 = __toESM(require("node:fs"), 1);
49222
49222
  var import_node_http = __toESM(require("node:http"), 1);
49223
- var import_node_path36 = __toESM(require("node:path"), 1);
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, path44, ownOrigin) {
49629
+ function contentCsp(type, path45, ownOrigin) {
49630
49630
  if (type === "html") return PAGE_CSP;
49631
- if (type === "document") return path44.endsWith(".html") ? PAGE_CSP : DOCUMENT_ASSET_CSP;
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 import_node_fs35 = __toESM(require("node:fs"), 1);
49660
- var import_node_path32 = __toESM(require("node:path"), 1);
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 refTarget = (node) => ({
50861
- ...node.artboard !== void 0 ? { artboard: node.artboard } : {},
50862
- ...node.whiteboard ? { whiteboard: node.whiteboard } : {},
50863
- ...node.to ? { to: node.to } : {},
50864
- ...node.group ? { group: node.group } : {},
50865
- ...node.board ? { board: node.board } : {},
50866
- ...node.frame ? { frame: node.frame } : {},
50867
- ...node.page ? { page: node.page } : {},
50868
- ...node.label ? { label: node.label } : {}
50869
- });
50870
- var refKind = (ref) => ref.whiteboard ? "whiteboard" : "artboard";
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({ document: document2, blockId: ref.blockId });
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
- ({ document: document2, blockId: blockId2 }) => `document ${document2} block ${blockId2} references ${key2}, which this artboard no longer has`
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 import_node_fs16 = __toESM(require("node:fs"), 1);
52145
- var import_node_path13 = __toESM(require("node:path"), 1);
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 = import_node_fs16.default.readFileSync(file, "utf8");
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 = import_node_path13.default.join(dir, ".gitignore");
52330
+ const file = import_node_path14.default.join(dir, ".gitignore");
52202
52331
  let current = "";
52203
52332
  try {
52204
- current = import_node_fs16.default.readFileSync(file, "utf8");
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
- import_node_fs16.default.writeFileSync(file, `${current}${current === "" || current.endsWith("\n") ? "" : "\n"}${missing.join("\n")}
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
- import_node_fs16.default.mkdirSync(import_node_path13.default.dirname(file), { recursive: true });
52215
- ensureGitignore(import_node_path13.default.dirname(file));
52216
- if (!import_node_fs16.default.existsSync(file)) writeJsonAtomic(file, defaults());
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
- import_node_fs16.default.mkdirSync(import_node_path13.default.dirname(file), { recursive: true });
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 import_node_fs17 = __toESM(require("node:fs"), 1);
52242
- var import_node_path14 = __toESM(require("node:path"), 1);
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 = import_node_path14.default.join(import_node_path14.default.dirname(credentialsFile2), "host-id");
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
- import_node_fs17.default.mkdirSync(import_node_path14.default.dirname(file), { recursive: true, mode: 448 });
52249
- import_node_fs17.default.writeFileSync(file, `${id3}
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 import_node_fs18 = __toESM(require("node:fs"), 1);
52256
- var import_node_path15 = __toESM(require("node:path"), 1);
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(import_node_fs18.default.readFileSync(import_node_path15.default.join(dir, PAGES_FILE), "utf8")).pages;
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 = import_node_fs18.default.realpathSync(dir);
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 import_node_fs18.default.readdirSync(current, { withFileTypes: true })) {
52417
+ for (const entry of import_node_fs19.default.readdirSync(current, { withFileTypes: true })) {
52289
52418
  if (entry.name.startsWith(".")) continue;
52290
- const full = import_node_path15.default.join(current, entry.name);
52419
+ const full = import_node_path16.default.join(current, entry.name);
52291
52420
  let real;
52292
52421
  try {
52293
- real = import_node_fs18.default.realpathSync(full);
52422
+ real = import_node_fs19.default.realpathSync(full);
52294
52423
  } catch {
52295
52424
  continue;
52296
52425
  }
52297
- if (!real.startsWith(rootReal + import_node_path15.default.sep)) continue;
52298
- const stat = import_node_fs18.default.statSync(real);
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 = import_node_path15.default.relative(dir, full).split(import_node_path15.default.sep).join("/");
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: import_node_fs18.default.readFileSync(file.real) })),
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 import_node_fs20 = __toESM(require("node:fs"), 1);
52327
- var import_node_path17 = __toESM(require("node:path"), 1);
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 attr = (name) => el3.getAttribute(name) ?? void 0;
64876
- return {
64877
- type: "ref",
64878
- version: 1,
64879
- ...refTarget({
64880
- artboard: attr("artboard"),
64881
- whiteboard: attr("whiteboard"),
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
- [MARK3]: "1",
64895
- ...ref.artboard !== void 0 ? { artboard: ref.artboard } : {},
64896
- ...ref.whiteboard ? { whiteboard: ref.whiteboard } : {},
64897
- ...ref.to ? { to: ref.to } : {},
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
- if (ref.artboard && ref.whiteboard)
64909
- return `<ref> names either an artboard or a whiteboard, not both`;
64910
- if (ref.whiteboard !== void 0) {
64911
- if (!isArtifactId(ref.whiteboard))
64912
- return `<ref whiteboard="${ref.whiteboard}"> is not a whiteboard slug: lowercase letters, digits and hyphens`;
64913
- if (ref.group || ref.board)
64914
- return `<ref whiteboard="${ref.whiteboard}"> points at a frame with frame="\u2026", not a group or a board`;
64915
- if (ref.page && ref.frame)
64916
- return `<ref whiteboard="${ref.whiteboard}"> names either a page or a frame, not both`;
64917
- if (ref.page !== void 0 && !isPageId(ref.page))
64918
- return `<ref whiteboard="${ref.whiteboard}" page="${ref.page}"> is not a page id: lowercase letters, digits and hyphens`;
64919
- return null;
64920
- }
64921
- if (ref.page !== void 0)
64922
- return `<ref artboard="${ref.artboard ?? ""}" page="${ref.page}">: page belongs to whiteboard references`;
64923
- if (ref.frame && ref.artboard)
64924
- return `<ref artboard="${ref.artboard}" frame="${ref.frame}">: frame belongs to whiteboard references`;
64925
- if (!ref.artboard && ref.frame)
64926
- return "<ref> needs an artboard or a whiteboard: the slug of one in this project";
64927
- if (!ref.artboard) return "<ref> needs an artboard: the slug of an artboard in this project";
64928
- if (!isArtifactId(ref.artboard))
64929
- return `<ref artboard="${ref.artboard}"> is not an artboard slug: lowercase letters, digits and hyphens`;
64930
- if (ref.group && ref.board)
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 import_node_fs19 = __toESM(require("node:fs"), 1);
66229
- var import_node_path16 = __toESM(require("node:path"), 1);
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 import_node_fs19.default.readFileSync(file, "utf8");
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 import_node_fs19.default.readdirSync(import_node_path16.default.join(dir, PAGES_DIR)).filter((name) => name.endsWith(".excalidraw")).map((name) => name.slice(0, -".excalidraw".length)).sort();
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(import_node_path16.default.join(dir, PAGES_FILE))).pages,
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(import_node_path16.default.join(dir, pageFileOf(page.id)));
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(import_node_fs20.default.readFileSync(import_node_path17.default.join(dir, "doc.xml"), "utf8")),
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(import_node_fs20.default.readFileSync(import_node_path17.default.join(dir, "scene.excalidraw"), "utf8"));
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 import_node_fs21 = __toESM(require("node:fs"), 1);
66321
- var import_node_path18 = __toESM(require("node:path"), 1);
66322
- var settingsFileFor = (credentialsFile2) => import_node_path18.default.join(import_node_path18.default.dirname(credentialsFile2), "config.json");
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(import_node_fs21.default.readFileSync(file, "utf8"));
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
- import_node_fs21.default.mkdirSync(import_node_path18.default.dirname(file), { recursive: true, mode: 448 });
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
- import_node_fs21.default.mkdirSync(import_node_path18.default.dirname(file), { recursive: true, mode: 448 });
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, path44, body) => {
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}${path44}`, { method, headers, body: payload });
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: path44, hash: hash2 }) => ({ path: path44, hash: hash2 }))
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
- const visibility = result.body.visibility;
66905
- sendJson(
66906
- res,
66907
- result.status,
66908
- result.status === 200 && ref.type === "document" ? { ...result.body, boards: referencedBoards(ref, visibility) } : result.body
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 import_node_fs22 = __toESM(require("node:fs"), 1);
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(import_node_fs22.default.readFileSync(agentFile, "utf8"))
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 import_node_fs24 = __toESM(require("node:fs"), 1);
67240
- var import_node_path20 = __toESM(require("node:path"), 1);
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 import_node_fs23 = __toESM(require("node:fs"), 1);
67244
- var import_node_path19 = __toESM(require("node:path"), 1);
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 = import_node_fs23.default.readdirSync(dir, { withFileTypes: true });
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 = import_node_path19.default.join(dir, entry.name);
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) : import_node_fs23.default.statSync(full).mtimeMs
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 = import_node_fs23.default.readFileSync(import_node_path19.default.join(dir, ENTRY_FILE.html), "utf8");
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 = import_node_fs24.default.readFileSync(import_node_path20.default.join(dir, ENTRY_FILE.document), "utf8");
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 import_node_fs27 = __toESM(require("node:fs"), 1);
67294
- var import_node_path24 = __toESM(require("node:path"), 1);
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 import_node_fs25 = __toESM(require("node:fs"), 1);
67298
- var import_node_path21 = __toESM(require("node:path"), 1);
67299
- var cursorsFile2 = (stateDir, id3) => import_node_path21.default.join(stateDir, "document", id3, "change-cursors.json");
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(import_node_fs25.default.readFileSync(file, "utf8"));
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 import_node_fs26 = __toESM(require("node:fs"), 1);
67326
- var import_node_path22 = __toESM(require("node:path"), 1);
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 = import_node_path22.default.join(stateDir, "document", id3, "asks.json");
67372
- if (!asks.length && !import_node_fs26.default.existsSync(file)) return;
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 path44 = [];
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
- path44.push(i7);
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 path44.reverse();
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 path44 = event.composedPath();
78106
- if (path44.length > 0) {
78107
- return path44[0];
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 fs27 = /* @__PURE__ */ Symbol("INTERNAL_SKIP_AFTER_CLONE_FROM");
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, fs27);
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, fs27);
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 !== fs27 && o10.afterCloneFrom(e7), o10;
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 path44 = placeOf(frame);
120242
- let id3 = derivePositionalId(documentKey, path44);
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, `${path44}#${attempt}`);
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 fs28(e5, t7, n8) {
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 = fs28(e5, t7, false);
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 = fs28(e5, t7, false), t7 >= e5.length) throw new Or2("YAML: unexpected end of the stream within a flow collection");
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 = fs28(e5, t7, false);
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 = fs28(e5, t7, false), i7 = e5[t7] === ",", i7 && 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 = fs28(e5, t7, false), t7 >= e5.length) throw new Or2("YAML: unexpected end of the stream within a flow collection");
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 = fs28(e5, t7, false), i7 = e5[t7] === ",", i7 && 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 (fs28(t7, s7, false) === t7.length) return o8;
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 path44 = "";
153226
+ var path45 = "";
152999
153227
  switch (size) {
153000
153228
  case "sqrtMain":
153001
- path44 = sqrtMain(extraVinculum, hLinePad);
153229
+ path45 = sqrtMain(extraVinculum, hLinePad);
153002
153230
  break;
153003
153231
  case "sqrtSize1":
153004
- path44 = sqrtSize1(extraVinculum, hLinePad);
153232
+ path45 = sqrtSize1(extraVinculum, hLinePad);
153005
153233
  break;
153006
153234
  case "sqrtSize2":
153007
- path44 = sqrtSize2(extraVinculum, hLinePad);
153235
+ path45 = sqrtSize2(extraVinculum, hLinePad);
153008
153236
  break;
153009
153237
  case "sqrtSize3":
153010
- path44 = sqrtSize3(extraVinculum, hLinePad);
153238
+ path45 = sqrtSize3(extraVinculum, hLinePad);
153011
153239
  break;
153012
153240
  case "sqrtSize4":
153013
- path44 = sqrtSize4(extraVinculum, hLinePad);
153241
+ path45 = sqrtSize4(extraVinculum, hLinePad);
153014
153242
  break;
153015
153243
  case "sqrtTall":
153016
- path44 = sqrtTall(extraVinculum, hLinePad, viewBoxHeight);
153244
+ path45 = sqrtTall(extraVinculum, hLinePad, viewBoxHeight);
153017
153245
  }
153018
- return path44;
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 path24 = {
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", path24[this.pathName]);
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(path24[this.pathName]) + '"/>';
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 path44 = new PathNode(pathName);
157233
- var svgNode = new SvgNode([path44], {
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 path44 = new PathNode(pathName);
158377
- var svgNode = new SvgNode([path44], {
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 path44 = new PathNode("inner", innerPath(ch4, Math.round(1e3 * height)));
159592
- var svgNode = new SvgNode([path44], {
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 path44 = new PathNode(svgLabel, pathStr);
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([path44], {
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 path44 = sqrtPath(sqrtName, extraVinculum, viewBoxHeight);
159806
- var pathNode = new PathNode(sqrtName, path44);
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 path44 = phasePath(viewBoxHeight);
160306
- var svgNode = new SvgNode([new PathNode("phase", path44)], {
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 import_node_path23 = __toESM(require("node:path"), 1);
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 fs49 = null;
166847
- var path44 = null;
167074
+ var fs50 = null;
167075
+ var path45 = null;
166848
167076
  return new Promise((resolve, reject) => {
166849
- fs49.readFile(path44.resolve(__dirname, filepath), (error, buffer) => {
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(path44) {
168380
+ getByPath(path45) {
168153
168381
  try {
168154
168382
  const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
168155
- const ptr0 = passStringToWasm0(path44, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
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(path44, added, removed, oldPosInc, options2) {
175777
- const last = path44.lastComponent;
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: path44.oldPos + oldPosInc,
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: path44.oldPos + oldPosInc,
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(import_node_path23.default.dirname(file), { recursive: true });
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 = import_node_path23.default.join(import_node_path23.default.dirname(snapshotFile), "agent-active");
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
- if (refKind(ref) === "whiteboard") return whiteboardWarnings(ref, at7, lookup2);
180932
- const slug = ref.artboard ?? "";
180933
- const id3 = lookup2.idOf(slug);
180934
- if (!id3) return [`${at7}<ref artboard="${slug}"> names an artboard that is not in this project`];
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 artboard="${slug}"> points at ${ref.to}, but ${slug} is now ${id3}; delete to= to point the reference at it`
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 whiteboardWarnings(ref, at7, lookup2) {
180953
- const slug = ref.whiteboard;
180954
- const id3 = lookup2.idOf(slug, "whiteboard");
180955
- if (!id3)
180956
- return [`${at7}<ref whiteboard="${slug}"> names a whiteboard that is not in this project`];
180957
- if (ref.to && ref.to !== id3)
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 whiteboard="${slug}"> points at ${ref.to}, but ${slug} is now ${id3}; delete to= to point the reference at it`
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 slugs = (kind) => [
181015
- ...new Set(all.filter((ref) => refKind(ref) === kind).map(refSlug))
181016
- ];
181017
- options2.onRefsChange?.(id3, slugs("artboard"), slugs("whiteboard"));
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) => import_node_path24.default.join(options2.root, "document", id3, "doc.xml");
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
- import_node_path24.default.join(options2.root, "document", id3, "comments.json"),
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 (!import_node_fs27.default.existsSync(docFile(id3))) return null;
181304
+ if (!import_node_fs28.default.existsSync(docFile(id3))) return null;
181067
181305
  const session = await createDocumentSession({
181068
181306
  file: docFile(id3),
181069
- snapshotFile: import_node_path24.default.join(options2.stateDir, "document", id3, "doc.loro"),
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
- import_node_fs27.default.readFile(docFile(id3), "utf8", (err, text5) => {
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 import_node_fs28 = __toESM(require("node:fs"), 1);
181229
- var import_node_path25 = __toESM(require("node:path"), 1);
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 import_node_fs28.default.statSync(file).mtimeMs;
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(import_node_path25.default.join(dir, file));
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 = import_node_fs28.default.readFileSync(import_node_path25.default.join(dir, "doc.xml"), "utf8");
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(import_node_path25.default.join(dir, file))) map.delete(file);
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 (!import_node_fs28.default.existsSync(import_node_path25.default.join(dir, url))) warnings.push(`${url} not found`);
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 import_node_fs29 = __toESM(require("node:fs"), 1);
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 (import_node_fs29.default.statSync(target).size > maxBytes) throw new RangeError("too large");
181327
- data = import_node_fs29.default.readFileSync(target);
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 import_node_fs30 = __toESM(require("node:fs"), 1);
181523
- var import_node_path26 = __toESM(require("node:path"), 1);
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) => import_node_path26.default.join(stateDir, kind, id3, "selection.json");
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) import_node_fs30.default.rmSync(fileOf2(kind, id3), { force: true });
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 = import_node_fs30.default.readdirSync(import_node_path26.default.join(stateDir, kind));
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) import_node_fs30.default.rmSync(fileOf2(kind, id3), { force: true });
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 import_node_fs32 = __toESM(require("node:fs"), 1);
181731
- var import_node_path28 = __toESM(require("node:path"), 1);
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 import_node_fs31 = __toESM(require("node:fs"), 1);
181736
- var import_node_path27 = __toESM(require("node:path"), 1);
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 || import_node_fs31.default.existsSync(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 = import_node_fs31.default.mkdtempSync(import_node_path27.default.join(import_node_path27.default.dirname(output), ".trim-"));
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 = import_node_path27.default.join(temporary, "clip.mp4");
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
- import_node_fs31.default.linkSync(encoded, output);
182118
+ import_node_fs32.default.linkSync(encoded, output);
181867
182119
  } finally {
181868
- import_node_fs31.default.rmSync(temporary, { recursive: true, force: true });
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 = import_node_fs32.default.statSync(file);
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 = import_node_path28.default.join(options2.stateDir, "recordings");
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 import_node_fs32.default.promises.readFile(job.file);
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 = import_node_path28.default.join(cacheDir, key2);
181911
- const output = import_node_path28.default.join(dir, "clip.mp4");
181912
- const metadata = import_node_path28.default.join(dir, "result.json");
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(import_node_fs32.default.readFileSync(metadata, "utf8"));
181916
- if (saved.result.status !== "trimmed" || import_node_fs32.default.existsSync(output) && saved.hash === digest2(import_node_fs32.default.readFileSync(output)))
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
- import_node_fs32.default.mkdirSync(cacheDir, { recursive: true });
181922
- temporary = import_node_fs32.default.mkdtempSync(import_node_path28.default.join(cacheDir, ".prepare-"));
181923
- const input = import_node_path28.default.join(temporary, "capture");
181924
- const prepared = import_node_path28.default.join(temporary, "clip.mp4");
181925
- import_node_fs32.default.writeFileSync(input, bytes);
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
- import_node_fs32.default.mkdirSync(dir, { recursive: true });
181938
- const hash2 = result.status === "trimmed" ? digest2(import_node_fs32.default.readFileSync(prepared)) : void 0;
181939
- if (result.status === "trimmed") import_node_fs32.default.copyFileSync(prepared, output);
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) import_node_fs32.default.rmSync(temporary, { recursive: true, force: true });
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] = import_node_fs32.default.statSync(job.output).mtimeMs;
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, import_node_fs32.default.readFileSync(job.output));
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 import_node_fs33 = __toESM(require("node:fs"), 1);
182082
- var import_node_path29 = __toESM(require("node:path"), 1);
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 path44 = [];
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
- path44.push([(element.x ?? 0) + point2[0], (element.y ?? 0) + point2[1]]);
182388
+ path45.push([(element.x ?? 0) + point2[0], (element.y ?? 0) + point2[1]]);
182137
182389
  }
182138
- return path44;
182390
+ return path45;
182139
182391
  };
182140
- var segmentsOf = (path44) => path44.slice(1).map((end, index) => [path44[index], end]);
182141
- var lengthOf = (path44) => segmentsOf(path44).reduce((sum2, [a5, b6]) => sum2 + Math.hypot(b6[0] - a5[0], b6[1] - a5[1]), 0);
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 path44 = pathOf(element);
182179
- return path44 ? [{ element, path: path44, bound: boundIds(element) }] : [];
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: path44 } of arrows) {
182183
- const ends = [path44[0], path44.at(-1)];
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(path44).some(([a5, b6]) => segmentHits(a5, b6, box2)))
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(path44);
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 = import_node_fs33.default.readFileSync(import_node_path29.default.join(dir, ENTRY_FILE.whiteboard), "utf8");
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 import_node_path30 = __toESM(require("node:path"), 1);
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
- import_node_path30.default.join(options2.root, "whiteboard", id3, "comments.json"),
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 import_node_fs34 = __toESM(require("node:fs"), 1);
182584
- var import_node_path31 = __toESM(require("node:path"), 1);
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 import_node_fs34.default.readFileSync(file, "utf8");
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
- import_node_fs34.default.writeFileSync(tmp, text5);
182730
- import_node_fs34.default.renameSync(tmp, file);
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 ?? import_node_path31.default.join(opts.root, ".state");
182740
- const stateOf = (id3) => import_node_path31.default.join(stateDir, "whiteboard", id3);
182741
- const pageStateOf = (id3, page) => import_node_path31.default.join(stateOf(id3), "pages", 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 = import_node_path31.default.join(dir, PAGES_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 = import_node_path31.default.join(dir, pageFileOf(page));
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
- import_node_fs34.default.mkdirSync(import_node_path31.default.dirname(session.file), { recursive: true });
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
- import_node_fs34.default.rmSync(import_node_path31.default.join(stateOf(id3), name), { force: true });
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(import_node_path31.default.join(pageStateOf(id3, page), "geometry.json"), geometry);
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) => import_node_path31.default.join(pageStateOf(id3, page), "render.png"),
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
- import_node_fs34.default.mkdirSync(pageStateOf(id3, page), { recursive: true });
182956
- writeTextAtomic(import_node_path31.default.join(pageStateOf(id3, page), "render.png"), png);
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(import_node_path31.default.join(pageStateOf(id3, page), "render.json"), meta);
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 = import_node_path32.default.resolve(options2.root);
183015
- const viewerDir = import_node_path32.default.resolve(options2.viewerDir);
183016
- const runtimeDir = options2.runtimeDir ? import_node_path32.default.resolve(options2.runtimeDir) : null;
183017
- const stateDir = import_node_path32.default.join(root, ".state");
183018
- import_node_fs35.default.mkdirSync(stateDir, { recursive: true, mode: 448 });
183019
- import_node_fs35.default.writeFileSync(import_node_path32.default.join(stateDir, ".gitignore"), "*\n");
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 = import_node_path32.default.join(stateDir, ".last-port");
183022
- const tokenFile = import_node_path32.default.join(stateDir, ".last-token");
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) import_node_fs35.default.writeFileSync(tokenFile, `${token}
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 = import_node_fs35.default.statSync(import_node_path32.default.join(dir, pageFileOf(page.id)), { throwIfNoEntry: false })?.size ?? 0;
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: import_node_path32.default.join(stateDir, "agent"),
183129
- projectDir: import_node_path32.default.resolve(root, "../.."),
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, artboards, whiteboards2) => {
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: import_node_path32.default.basename(import_node_path32.default.resolve(root, "../..")),
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: import_node_path32.default.join(stateDir, "auto-publish.json"),
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
- } : ref.type === "whiteboard" ? { backlinks: backlinksOf(ref.id, "whiteboard") } : {},
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
- if (ref.type === "artboard" || ref.type === "whiteboard")
183324
- writeJsonAtomic(
183325
- import_node_path32.default.join(stateDir, ref.type, ref.id, "backlinks.json"),
183326
- backlinksOf(ref.id, ref.type)
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) => import_node_path32.default.basename(import_node_path32.default.dirname(import_node_path32.default.dirname(ctx.root)));
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 import_node_fs36 = __toESM(require("node:fs"), 1);
183595
- var import_node_path33 = __toESM(require("node:path"), 1);
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
- import_node_fs36.default.readFile(target, "utf8", (err, source) => {
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, import_node_path33.default.join(ctx.viewerDir, "robots.txt"));
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 import_node_fs37 = __toESM(require("node:fs"), 1);
183731
- var import_node_path34 = __toESM(require("node:path"), 1);
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(import_node_fs37.default.readFileSync(import_node_path34.default.join(dir, "doc.xml"), "utf8"));
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 import_node_fs37.default.promises.readFile(import_node_path34.default.join(dir, "doc.xml"), "utf8").catch(() => null);
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 import_node_fs37.default.promises.readFile(import_node_path34.default.join(stateDir, ref.type, ref.id, "warnings.json"), "utf8")
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(import_node_path34.default.join(ctx.stateDir, "whiteboard", id3, "selection.json"));
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(import_node_fs37.default.readFileSync(file, "utf8"));
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 path44 = points(element).map(([dx2, dy2]) => at7(x9 + dx2, y5 + dy2).join(",")).join(" ");
184552
- return path44 ? `<polyline points="${path44}" stroke="${stroke}" stroke-width="1.4" fill="none" stroke-linecap="round"/>` : "";
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 import_node_fs38 = __toESM(require("node:fs"), 1);
185089
- var import_node_path35 = __toESM(require("node:path"), 1);
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 && import_node_fs38.default.existsSync(import_node_path35.default.join(viewerDir, "preview.html")) ? "preview.html" : "index.html";
185219
- void import_node_fs38.default.promises.readFile(import_node_path35.default.join(viewerDir, entry), "utf8").then((template) => {
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
- import_node_fs39.default.writeFileSync(ctx.portFile, `${ctx.port}
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 = import_node_path36.default.join(stateDir, BOARD_PORT_FILE);
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
- import_node_fs39.default.writeFileSync(boardPortFile, `${ctx.boardPort}
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(import_node_path36.default.join(stateDir, "server-info"), {
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) import_node_fs39.default.rmSync(import_node_path36.default.join(stateDir, "server-info"), { force: true });
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 import_node_fs41 = __toESM(require("node:fs"), 1);
185702
- var import_node_path38 = __toESM(require("node:path"), 1);
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 import_node_fs40 = __toESM(require("node:fs"), 1);
185945
+ var import_node_fs41 = __toESM(require("node:fs"), 1);
185706
185946
  var import_node_os = __toESM(require("node:os"), 1);
185707
- var import_node_path37 = __toESM(require("node:path"), 1);
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 || import_node_path37.default.join(homedir, ".ryugi", "server");
185950
+ const home = env.RYUGI_SERVER_HOME || import_node_path38.default.join(homedir, ".ryugi", "server");
185711
185951
  return {
185712
185952
  home,
185713
- pid: import_node_path37.default.join(home, "server.pid"),
185714
- serverId: import_node_path37.default.join(home, "server-instance-id"),
185715
- info: import_node_path37.default.join(home, "server-info"),
185716
- log: import_node_path37.default.join(home, "server.log"),
185717
- version: import_node_path37.default.join(home, "server-version"),
185718
- lock: import_node_path37.default.join(home, "start.lock"),
185719
- key: import_node_path37.default.join(home, "key"),
185720
- projects: import_node_path37.default.join(home, "projects.json"),
185721
- settings: import_node_path37.default.join(home, "settings.json"),
185722
- stopped: import_node_path37.default.join(home, "server-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
- import_node_fs40.default.mkdirSync(home, { recursive: true, mode: 448 });
185727
- import_node_fs40.default.chmodSync(home, 448);
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 import_node_fs40.default.realpathSync(import_node_path37.default.resolve(dir));
185971
+ return import_node_fs41.default.realpathSync(import_node_path38.default.resolve(dir));
185732
185972
  } catch {
185733
- return import_node_path37.default.resolve(dir);
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" && import_node_path37.default.isAbsolute(entry.dir) && Number.isFinite(entry.registeredAt) && Number.isFinite(entry.lastUsedAt);
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(import_node_fs40.default.readFileSync(file, "utf8"));
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(import_node_path37.default.dirname(file));
185989
+ ensureHome(import_node_path38.default.dirname(file));
185750
185990
  const tmp = `${file}.${process.pid}.tmp`;
185751
- import_node_fs40.default.writeFileSync(tmp, `${JSON.stringify({ projects }, null, 2)}
185991
+ import_node_fs41.default.writeFileSync(tmp, `${JSON.stringify({ projects }, null, 2)}
185752
185992
  `, { mode: 384 });
185753
- import_node_fs40.default.renameSync(tmp, file);
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) => import_node_path37.default.join(projectDir, ".ryugi", "artifacts");
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) => import_node_fs40.default.existsSync(artifactsRootOf(entry.dir)));
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 = import_node_fs41.default.readFileSync(import_node_path38.default.join(dir, ".artifact-id"), "utf8").trim();
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 import_node_fs41.default.statSync(dir).mtimeMs;
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 import_node_fs42.default.realpathSync(import_node_path39.default.resolve(dir));
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: import_node_path39.default.join(project, ".ryugi", "config.json"),
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) => import_node_path39.default.join(project, ".ryugi", "config.json");
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) => import_node_path39.default.join(artifactsRootOf(project), ".state", "server-info");
186249
+ const infoFileOf = (project) => import_node_path40.default.join(artifactsRootOf(project), ".state", "server-info");
186010
186250
  const writeCompatInfo = (project) => {
186011
186251
  try {
186012
- import_node_fs42.default.mkdirSync(import_node_path39.default.dirname(infoFileOf(project)), { recursive: true, mode: 448 });
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: import_node_path39.default.basename(entry.dir),
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(`${import_node_path39.default.basename(entry.dir)}: ${warning}`);
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(import_node_path39.default.join(project, ".ryugi", "config.json")).config;
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
- import_node_fs42.default.mkdirSync(artifactsRootOf(real), { recursive: true });
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) ?? import_node_path39.default.resolve(dir);
186408
+ const real = realDir2(dir) ?? import_node_path40.default.resolve(dir);
186169
186409
  removeProject(projectsFile, real);
186170
186410
  index.rescan();
186171
- import_node_fs42.default.rmSync(infoFileOf(real), { force: true });
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 = import_node_fs42.default.openSync(options2.paths.log, "r");
186419
+ const fd3 = import_node_fs43.default.openSync(options2.paths.log, "r");
186180
186420
  try {
186181
- const size = import_node_fs42.default.fstatSync(fd3).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
- import_node_fs42.default.readSync(fd3, buffer, 0, length, size - length);
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
- import_node_fs42.default.closeSync(fd3);
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()) import_node_fs42.default.rmSync(infoFileOf(entry.dir), { force: true });
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 import_node_fs43 = __toESM(require("node:fs"), 1);
186337
- var import_node_path40 = __toESM(require("node:path"), 1);
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 = import_node_path40.default.join(serverDir, "cli.cjs");
186352
- return import_node_fs43.default.existsSync(cli) ? [process.execPath, cli] : null;
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 = import_node_path40.default.join(
186356
- env.XDG_CACHE_HOME || import_node_path40.default.join(homedir, ".cache"),
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
- import_node_fs43.default.mkdirSync(releases, { recursive: true });
186361
- const file = import_node_path40.default.join(releases, "latest.json");
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
- import_node_fs43.default.writeFileSync(tmp, JSON.stringify({ version: version3, checkedAt: now }));
186364
- import_node_fs43.default.renameSync(tmp, file);
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 import_node_fs44 = __toESM(require("node:fs"), 1);
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(import_node_fs44.default.readFileSync(file, "utf8"));
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
- import_node_fs44.default.writeFileSync(options2.cacheFile, `${JSON.stringify(cached)}
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 = import_node_fs45.default.readFileSync(file, "utf8").trim();
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
- import_node_fs45.default.writeFileSync(file, `${key2}
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: import_node_path41.default.join(paths.home, "latest.json"),
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: import_node_path41.default.join(__dirname, "viewer"),
186450
- runtimeDir: import_node_path41.default.join(__dirname, "runtime"),
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
- import_node_fs45.default.rmSync(paths.info, { force: true });
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 import_node_fs45.default.readFileSync(paths.version, "utf8").trim() || version;
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
- import_node_fs45.default.rmSync(paths.stopped, { force: true });
186777
+ import_node_fs46.default.rmSync(paths.stopped, { force: true });
186538
186778
  const started = {
186539
186779
  type: "server-started",
186540
186780
  url: hub.url,