ryugi-artifacts 1.66.0 → 1.68.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 (368) hide show
  1. package/dist/cli.cjs +114 -70
  2. package/dist/output-bootstrap.cjs +1 -1
  3. package/dist/server.cjs +968 -569
  4. package/dist/viewer/{AgentStatusPill-B6X8KYhc.js → AgentStatusPill-BnKps9Zr.js} +1 -1
  5. package/dist/viewer/ArtboardLayout-Cz1MWCu8.js +12 -0
  6. package/dist/viewer/ArtifactList-CCxCNWid.js +2 -0
  7. package/dist/viewer/{AutoPublishPrompt-BSofyZTo.js → AutoPublishPrompt-BrUfQWmW.js} +1 -1
  8. package/dist/viewer/Avatar-CBcHKq6_.js +1 -0
  9. package/dist/viewer/{Avatar-Cp_i6ALh.js → Avatar-ChKkUO4F.js} +1 -1
  10. package/dist/viewer/{BottomSheet-BD-1fVgU.js → BottomSheet-ZdnjIGxe.js} +1 -1
  11. package/dist/viewer/{Canvas-DYRPeGj4.js → Canvas-CqxEk0B7.js} +1 -1
  12. package/dist/viewer/CompositeItem-Dc1pE-Dd.js +1 -0
  13. package/dist/viewer/DocumentLayout-B1bQT74s.js +2 -0
  14. package/dist/viewer/DocumentPage-DFTrEydU.js +4 -0
  15. package/dist/viewer/{DropdownMenu-DZ0qcmvX.js → DropdownMenu-MN8aSs-T.js} +1 -1
  16. package/dist/viewer/{HtmlLayout-DOCRj2nS.js → HtmlLayout-DhjuMVfU.js} +1 -1
  17. package/dist/viewer/MenuSubmenuTrigger-6b5C_OEY.js +1 -0
  18. package/dist/viewer/MenuTrigger-C80SSxV1.js +1 -0
  19. package/dist/viewer/{PhoneArtboardBar-ZHSm-rmy.js → PhoneArtboardBar-Bzeyu7RL.js} +1 -1
  20. package/dist/viewer/{PhoneSheet-DxyGiHhE.js → PhoneSheet-BqNn1A8k.js} +1 -1
  21. package/dist/viewer/Popover-Mq50eaGz.js +1 -0
  22. package/dist/viewer/{PreviewLayout-8f_FSu9n.js → PreviewLayout-CBXgXFHd.js} +2 -2
  23. package/dist/viewer/Segmented-Dn3tMkJ1.js +1 -0
  24. package/dist/viewer/Select-B3iVUwhL.js +1 -0
  25. package/dist/viewer/SelectScrollUpArrow-PZIGiE5i.js +1 -0
  26. package/dist/viewer/SettingsDialog-Di1DIjuU.js +1 -0
  27. package/dist/viewer/{SnapshotDocument-BfYSAQoy.js → SnapshotDocument-CZ9_zlbN.js} +1 -1
  28. package/dist/viewer/SplitShell-1kQWIUbB.js +1 -0
  29. package/dist/viewer/{ThreadView-BUtexgWc.js → ThreadView-DhKDuMXE.js} +1 -1
  30. package/dist/viewer/TooltipPopup-DIfQd51a.js +1 -0
  31. package/dist/viewer/{VirtualizedEditor-D9Ivycdp-BNgnIRWE.js → VirtualizedEditor-D9Ivycdp-BS6qVQKi.js} +1 -1
  32. package/dist/viewer/{VirtualizedRenderer-C_d95FXi-CLurmXlj.js → VirtualizedRenderer-C_d95FXi-Cgx30lJW.js} +1 -1
  33. package/dist/viewer/{WarningsBadge-X-rqGa7y.js → WarningsBadge-BhvEtIPf.js} +1 -1
  34. package/dist/viewer/WhiteboardLayout-BLUnPC_j.js +3 -0
  35. package/dist/viewer/{WritingCursor-trMEG3IR.js → WritingCursor-D8-ImQmN.js} +1 -1
  36. package/dist/viewer/{abnfDiagram-VCTEODGH-ODz2u-Tc.js → abnfDiagram-VCTEODGH-CAaQSsKr.js} +1 -1
  37. package/dist/viewer/{agentLook-BWWdg3j_.js → agentLook-GSv6M_4b.js} +1 -1
  38. package/dist/viewer/{anchor-DfNlik1u.js → anchor-cpflnjH6.js} +1 -1
  39. package/dist/viewer/{ar-SA-G6X2FPQ2-_MwLvkMh.js → ar-SA-G6X2FPQ2-CRJustU_.js} +1 -1
  40. package/dist/viewer/{architecture-7GRP2DOG-iSQ3-M8E.js → architecture-7GRP2DOG-Df-BWMMn.js} +1 -1
  41. package/dist/viewer/{architectureDiagram-5GKGNRK7-BL5B1Cwd.js → architectureDiagram-5GKGNRK7-slFJ5pNz.js} +1 -1
  42. package/dist/viewer/{az-AZ-76LH7QW2-DoVas4wb.js → az-AZ-76LH7QW2-BZXNMAjr.js} +1 -1
  43. package/dist/viewer/{bg-BG-XCXSNQG7-CYg_Nqhh.js → bg-BG-XCXSNQG7-D942OHJ1.js} +1 -1
  44. package/dist/viewer/{blockDiagram-I7D4REHJ-1893qd6O.js → blockDiagram-I7D4REHJ-D7tnOUmG.js} +1 -1
  45. package/dist/viewer/{bn-BD-2XOGV67Q-B3yYegfy.js → bn-BD-2XOGV67Q-CnUziB-N.js} +1 -1
  46. package/dist/viewer/{c4Diagram-7LVT6UL2-DLFhWMfM.js → c4Diagram-7LVT6UL2-A90PS1Zn.js} +1 -1
  47. package/dist/viewer/{ca-ES-6MX7JW3Y-C3CynyTA.js → ca-ES-6MX7JW3Y-fV3kI3by.js} +1 -1
  48. package/dist/viewer/channel-DpF2FNj7.js +1 -0
  49. package/dist/viewer/{channel-gGfhtVCU.js → channel-Y8cPWVH2.js} +158 -158
  50. package/dist/viewer/{chunk-4HAMMTFA-BOUTaKFB.js → chunk-4HAMMTFA-Dtev5uNX.js} +1 -1
  51. package/dist/viewer/{chunk-75Z2AOVW-AtKWqbsp.js → chunk-75Z2AOVW-Br59Z0N6.js} +1 -1
  52. package/dist/viewer/{chunk-DU6HZSFF-dg0wiFNr.js → chunk-DU6HZSFF-DTVWCdhx.js} +1 -1
  53. package/dist/viewer/{chunk-EIO257PC-CiuVQ5tC.js → chunk-EIO257PC-BJo1mhGf.js} +1 -1
  54. package/dist/viewer/{chunk-F27PBJKO-C3v6jBrH.js → chunk-F27PBJKO-CqXtkDh_.js} +1 -1
  55. package/dist/viewer/{chunk-GMAD6QVW-7o8gxuzy.js → chunk-GMAD6QVW-C_mtYAsp.js} +1 -1
  56. package/dist/viewer/{chunk-GVQU2GXP-DYfPE_kP.js → chunk-GVQU2GXP-Dnn5H2Ee.js} +1 -1
  57. package/dist/viewer/{chunk-IMKFNOWR-aN-toW4j.js → chunk-IMKFNOWR-CBTdwY_-.js} +1 -1
  58. package/dist/viewer/{chunk-L3NEJ4N5-CnyBfeWQ.js → chunk-L3NEJ4N5-RIzLHntK.js} +1 -1
  59. package/dist/viewer/{chunk-OSK3NFVY-Dx0uAOLK.js → chunk-OSK3NFVY-CK41dOkH.js} +1 -1
  60. package/dist/viewer/{chunk-P2QGCYS3-CAUxyWiK.js → chunk-P2QGCYS3-BL4CYLWw.js} +1 -1
  61. package/dist/viewer/{chunk-POPQ4Y6H-cr_OqW9b.js → chunk-POPQ4Y6H-CJsQjBoH.js} +1 -1
  62. package/dist/viewer/{chunk-PWAF6VOD-BMYvIGbv.js → chunk-PWAF6VOD-DeuKxCvN.js} +1 -1
  63. package/dist/viewer/{chunk-SHT3W25Y-BIhh6C-D.js → chunk-SHT3W25Y-1ctnl-w3.js} +1 -1
  64. package/dist/viewer/{chunk-SVP7TREG-CA39sTgF.js → chunk-SVP7TREG-0tebC1pj.js} +1 -1
  65. package/dist/viewer/{chunk-TICWLB2K-ByYHKmi7.js → chunk-TICWLB2K-BxhvtMAu.js} +1 -1
  66. package/dist/viewer/classDiagram-ZZMXUADV-BCUwkMkD.js +1 -0
  67. package/dist/viewer/classDiagram-v2-VYDZK3BY-BCUwkMkD.js +1 -0
  68. package/dist/viewer/{cs-CZ-2BRQDIVT-XNDLvq55.js → cs-CZ-2BRQDIVT-DKXyGqNH.js} +1 -1
  69. package/dist/viewer/{cynefin-OW5HDTMX-DpVSlbHP.js → cynefin-OW5HDTMX-BUe484ye.js} +1 -1
  70. package/dist/viewer/{cynefinDiagram-5FMLGOSQ-dHtfu-cX.js → cynefinDiagram-5FMLGOSQ-CWdVGsBk.js} +1 -1
  71. package/dist/viewer/{da-DK-5WZEPLOC-gGE6wcsX.js → da-DK-5WZEPLOC-b4IEozFV.js} +1 -1
  72. package/dist/viewer/{dagre-GXQ25YYZ-_49K5ME-.js → dagre-GXQ25YYZ-DCuEklTp.js} +1 -1
  73. package/dist/viewer/{de-DE-XR44H4JA-xIn9zjsb.js → de-DE-XR44H4JA-C7sc34_X.js} +1 -1
  74. package/dist/viewer/{diagram-S7CK7UJ4-DnOVKbi8.js → diagram-S7CK7UJ4-CsxaHH4I.js} +1 -1
  75. package/dist/viewer/{diagram-UQ7AKVKN-fXoq3ttg.js → diagram-UQ7AKVKN-Ct8242ZE.js} +1 -1
  76. package/dist/viewer/{diagram-VSXAHHWV-6LRIw8JH.js → diagram-VSXAHHWV-C1nroriz.js} +1 -1
  77. package/dist/viewer/{diagram-VX7I27RA-Co4MGh3a.js → diagram-VX7I27RA-DEWRSmDx.js} +1 -1
  78. package/dist/viewer/{diagram-Z3DM3KII-CLydqyhw.js → diagram-Z3DM3KII-B1SxmMm9.js} +1 -1
  79. package/dist/viewer/{dist-aG5n-ukt.js → dist-1xzhgjrK.js} +1 -1
  80. package/dist/viewer/{dist-BD0n8L2H.js → dist-B0ahrRmN.js} +1 -1
  81. package/dist/viewer/{dist-b6Q8lY9Z.js → dist-B3kJb0_U.js} +1 -1
  82. package/dist/viewer/{dist-8rAEP2kA.js → dist-B4M9sgR9.js} +1 -1
  83. package/dist/viewer/{dist-tlg8Gs4P.js → dist-B6-aAGQA.js} +1 -1
  84. package/dist/viewer/{dist-C8dsmt7M.js → dist-B9Rn0Zrs.js} +1 -1
  85. package/dist/viewer/{dist-Mwa2JYhN.js → dist-C4zEBXjK.js} +1 -1
  86. package/dist/viewer/{dist-Bh7I-jIz.js → dist-C8JtF2VW.js} +1 -1
  87. package/dist/viewer/{dist-DzGJipXU.js → dist-CA2_d8WP.js} +1 -1
  88. package/dist/viewer/{dist-mvJ-AbtV.js → dist-CBB6_G5_.js} +1 -1
  89. package/dist/viewer/{dist-6KUMXJHX.js → dist-CUWoav31.js} +1 -1
  90. package/dist/viewer/{dist-BUCcrdqC.js → dist-CXasQug3.js} +1 -1
  91. package/dist/viewer/{dist-CLkvS-96.js → dist-Cse2aOfa.js} +1 -1
  92. package/dist/viewer/{dist-D8aaHNbP.js → dist-Cy8NldSx.js} +4 -4
  93. package/dist/viewer/{dist-CEQ8CIP-.js → dist-D2yfyCbT.js} +1 -1
  94. package/dist/viewer/{dist-BMJTKaNs.js → dist-DKLouXV5.js} +1 -1
  95. package/dist/viewer/{dist-Bz_w4503.js → dist-DKkW9dU5.js} +1 -1
  96. package/dist/viewer/{dist-PX2c5w5B.js → dist-Ds6VFWTz.js} +1 -1
  97. package/dist/viewer/{dist-CbgyqbcE.js → dist-VAycv_3i.js} +1 -1
  98. package/dist/viewer/{dist-CXkT6bXz.js → dist-fyPnRLSz.js} +1 -1
  99. package/dist/viewer/{dist-Be1Fe9dm.js → dist-kyCI0GjD.js} +1 -1
  100. package/dist/viewer/{dist-DVH2k1zy.js → dist-lH8EGddX.js} +1 -1
  101. package/dist/viewer/{dist-DQ3KAbgk.js → dist-rHgXqZ3U.js} +1 -1
  102. package/dist/viewer/{dist-uRinEKZF.js → dist-xKtvXW_M.js} +1 -1
  103. package/dist/viewer/{ebnfDiagram-PWID7BFC-eRw9PImL.js → ebnfDiagram-PWID7BFC-BwAXcSMu.js} +1 -1
  104. package/dist/viewer/{el-GR-BZB4AONW-ydMLjdVd.js → el-GR-BZB4AONW-DO8FKq0o.js} +1 -1
  105. package/dist/viewer/{en-B4ZKOASM-u6OniCbC.js → en-B4ZKOASM-BGb9Jd7F.js} +1 -1
  106. package/dist/viewer/{erDiagram-RLTQ6QDP-DUfKaOXm.js → erDiagram-RLTQ6QDP-BU0oilOu.js} +1 -1
  107. package/dist/viewer/{es-ES-U4NZUMDT-CCvOElHW.js → es-ES-U4NZUMDT-C8my4jC1.js} +1 -1
  108. package/dist/viewer/{eu-ES-A7QVB2H4-C_WD5IZg.js → eu-ES-A7QVB2H4-7y6iA3PQ.js} +1 -1
  109. package/dist/viewer/{eventmodeling-NTZA5JFV-C0rYyF74.js → eventmodeling-NTZA5JFV-soHgkZ82.js} +1 -1
  110. package/dist/viewer/{fa-IR-HGAKTJCU-BIkl-rJS.js → fa-IR-HGAKTJCU-oCdmxr1e.js} +1 -1
  111. package/dist/viewer/{fi-FI-Z5N7JZ37-6HM4TKYa.js → fi-FI-Z5N7JZ37-X3VK0x3c.js} +1 -1
  112. package/dist/viewer/flowDiagram-HODETNUW-A3kbYb0D.js +1 -0
  113. package/dist/viewer/{fr-FR-RHASNOE6-Br__REnh.js → fr-FR-RHASNOE6-zrXrM79-.js} +1 -1
  114. package/dist/viewer/{ganttDiagram-EL5Y4UJY-DHQPmBwq.js → ganttDiagram-EL5Y4UJY-bHjB1qlT.js} +1 -1
  115. package/dist/viewer/{gitGraph-4MIJSDKK-Duos0FcC.js → gitGraph-4MIJSDKK-CjGC-mW6.js} +1 -1
  116. package/dist/viewer/{gitGraphDiagram-WWUBYQGX-BlhH29yu.js → gitGraphDiagram-WWUBYQGX-DUqXPpCq.js} +1 -1
  117. package/dist/viewer/{gl-ES-HMX3MZ6V-CSlRksGt.js → gl-ES-HMX3MZ6V-BUnj3HlN.js} +1 -1
  118. package/dist/viewer/{he-IL-6SHJWFNN-7fwBpcZp.js → he-IL-6SHJWFNN-281kRBUf.js} +1 -1
  119. package/dist/viewer/{hi-IN-IWLTKZ5I-liiwbLNI.js → hi-IN-IWLTKZ5I-DIuMdRpK.js} +1 -1
  120. package/dist/viewer/{hu-HU-A5ZG7DT2-DdiFF2-_.js → hu-HU-A5ZG7DT2-nmQyfjlR.js} +1 -1
  121. package/dist/viewer/{id-ID-SAP4L64H-BbyroKKj.js → id-ID-SAP4L64H-BiViI6m_.js} +1 -1
  122. package/dist/viewer/{image-GAAHSSAO-Bl6iT5Xi.js → image-GAAHSSAO-yI0Lg6gi.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 +32 -0
  126. package/dist/viewer/{info-A6RAGUB7-BayhR2hO.js → info-A6RAGUB7-B0l9mAY4.js} +1 -1
  127. package/dist/viewer/{infoDiagram-27XIBGKW-B7gYXKyi.js → infoDiagram-27XIBGKW-BTxMqmhS.js} +1 -1
  128. package/dist/viewer/{ishikawaDiagram-5VMMS53U-BCeyxXmy.js → ishikawaDiagram-5VMMS53U-BunWcUgG.js} +1 -1
  129. package/dist/viewer/{it-IT-JPQ66NNP-Dl5XaFPJ.js → it-IT-JPQ66NNP-DpwQuK5q.js} +1 -1
  130. package/dist/viewer/{ja-JP-DBVTYXUO-Ds16kWgN.js → ja-JP-DBVTYXUO-Dg0jZ4Fr.js} +1 -1
  131. package/dist/viewer/{journeyDiagram-3NMN7TZE-BRHyu3on.js → journeyDiagram-3NMN7TZE-CH0mNNME.js} +1 -1
  132. package/dist/viewer/{kaa-6HZHGXH3-BZtk4Q-J.js → kaa-6HZHGXH3-Byd9GDLK.js} +1 -1
  133. package/dist/viewer/{kab-KAB-ZGHBKWFO-sX86-rIi.js → kab-KAB-ZGHBKWFO-a6r59Esz.js} +1 -1
  134. package/dist/viewer/{kanban-definition-UXKFOSKX-D8dXYlkf.js → kanban-definition-UXKFOSKX-Dlxx1p8m.js} +1 -1
  135. package/dist/viewer/{kk-KZ-P5N5QNE5-Kj6xbUfb.js → kk-KZ-P5N5QNE5-zq8glNLW.js} +1 -1
  136. package/dist/viewer/{km-KH-HSX4SM5Z-Du9UYSIR.js → km-KH-HSX4SM5Z-BTq35Fiu.js} +1 -1
  137. package/dist/viewer/{ko-KR-MTYHY66A-D13455tH.js → ko-KR-MTYHY66A-DlgDzRH_.js} +1 -1
  138. package/dist/viewer/{ku-TR-6OUDTVRD-CRU2T1Xq.js → ku-TR-6OUDTVRD-BVLk13SV.js} +1 -1
  139. package/dist/viewer/local-split-host-xSgjCeui.js +1 -0
  140. package/dist/viewer/{lt-LT-XHIRWOB4-CaPQXWaa.js → lt-LT-XHIRWOB4-6q0TFRDx.js} +1 -1
  141. package/dist/viewer/{lv-LV-5QDEKY6T-CWmJ_HNo.js → lv-LV-5QDEKY6T-DxyqknhI.js} +1 -1
  142. package/dist/viewer/{mermaid-parser.core-Dq72O3lo.js → mermaid-parser.core-Gvb8dIz1.js} +3 -3
  143. package/dist/viewer/{mindmap-definition-YA3MSWOX-B5ND0SS0.js → mindmap-definition-YA3MSWOX-DCPYU-48.js} +1 -1
  144. package/dist/viewer/{mr-IN-CRQNXWMA-ClPq9z9c.js → mr-IN-CRQNXWMA-D2tHgrn-.js} +1 -1
  145. package/dist/viewer/{my-MM-5M5IBNSE-BgvPEMQG.js → my-MM-5M5IBNSE-BYWw8v9n.js} +1 -1
  146. package/dist/viewer/{nb-NO-T6EIAALU-f4YcrpZO.js → nb-NO-T6EIAALU-K3IdDtSM.js} +1 -1
  147. package/dist/viewer/{nl-NL-IS3SIHDZ-51w_0F9O.js → nl-NL-IS3SIHDZ-O5S6GhQJ.js} +1 -1
  148. package/dist/viewer/{nn-NO-6E72VCQL-C-asnGQd.js → nn-NO-6E72VCQL-CG7rDNE2.js} +1 -1
  149. package/dist/viewer/{oc-FR-POXYY2M6-CNXcOCrh.js → oc-FR-POXYY2M6-DVAwA1YG.js} +1 -1
  150. package/dist/viewer/{pa-IN-N4M65BXN-D2sTi4tB.js → pa-IN-N4M65BXN-BfskjU3c.js} +1 -1
  151. package/dist/viewer/{packet-AYTQ26CC-C5eStsUT.js → packet-AYTQ26CC-V9JOIpxu.js} +1 -1
  152. package/dist/viewer/{parseTrigger-Dpx4xwme.js → parseTrigger-Bl4n5XXS.js} +1 -1
  153. package/dist/viewer/{pegDiagram-XKGWAZYB-AfpuhbMK.js → pegDiagram-XKGWAZYB-CRwdoRdU.js} +1 -1
  154. package/dist/viewer/percentages-BXMCSKIN-BDV0ZRBe.js +1 -0
  155. package/dist/viewer/{pie-WAS4IAKB-BuIit_wP.js → pie-WAS4IAKB-DD4VdSya.js} +1 -1
  156. package/dist/viewer/{pieDiagram-E7YTZNPT-CRSbhyv1.js → pieDiagram-E7YTZNPT-DtxXj_uG.js} +1 -1
  157. package/dist/viewer/{pl-PL-T2D74RX3-CaatC1Ad.js → pl-PL-T2D74RX3-aSM3OymY.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-DT6gDrhK.js} +9 -9
  161. package/dist/viewer/{pt-BR-5N22H2LF-Cl2reV9F.js → pt-BR-5N22H2LF-CoE1Brmo.js} +1 -1
  162. package/dist/viewer/{pt-PT-UZXXM6DQ-Dl1E3lVz.js → pt-PT-UZXXM6DQ-N4cE4HWd.js} +1 -1
  163. package/dist/viewer/{quadrantDiagram-AXDQQJYC-x1Uf4NVM.js → quadrantDiagram-AXDQQJYC-Bp9CaPDI.js} +1 -1
  164. package/dist/viewer/{radar-RG4KPBEZ-DQGD6mHG.js → radar-RG4KPBEZ-DjIgW5TK.js} +1 -1
  165. package/dist/viewer/{railroad-74A4TZTK-_jyPADpx.js → railroad-74A4TZTK-DJXF4Ntz.js} +1 -1
  166. package/dist/viewer/{railroad-abnf-HS5TGJTU-BbeCaDR8.js → railroad-abnf-HS5TGJTU-D2uor4gn.js} +1 -1
  167. package/dist/viewer/{railroad-ebnf-LZEXJU2U-0u5eXsT9.js → railroad-ebnf-LZEXJU2U-d-1EQm0I.js} +1 -1
  168. package/dist/viewer/{railroad-peg-WCYAUIDC-DfdmN9rz.js → railroad-peg-WCYAUIDC-VVFlD8Wt.js} +1 -1
  169. package/dist/viewer/{railroadDiagram-O6MQD6OU-Bss7JqQV.js → railroadDiagram-O6MQD6OU-DIYzZs3X.js} +1 -1
  170. package/dist/viewer/ref-DeJSmII1.js +1 -0
  171. package/dist/viewer/{requirementDiagram-BXWQKSXE-T8cs3e3U.js → requirementDiagram-BXWQKSXE-BFAS1s1U.js} +1 -1
  172. package/dist/viewer/{ro-RO-JPDTUUEW-LJoACXW2.js → ro-RO-JPDTUUEW-CXL_OLY6.js} +1 -1
  173. package/dist/viewer/{route-DDEGqDvB.js → route-B-3a8kXR.js} +2 -2
  174. package/dist/viewer/route-messages-D6nsn-yO.js +1 -0
  175. package/dist/viewer/{ru-RU-B4JR7IUQ-Dr1RnL66.js → ru-RU-B4JR7IUQ-DK0raNaa.js} +1 -1
  176. package/dist/viewer/{sankeyDiagram-P5KCCOFB-uvLee9BZ.js → sankeyDiagram-P5KCCOFB-XkkNzFLA.js} +1 -1
  177. package/dist/viewer/{selection-A2YAIJTR.js → selection-A2L_U7cp.js} +1 -1
  178. package/dist/viewer/{sequenceDiagram-WJ2MYXX4-DcTFNs19.js → sequenceDiagram-WJ2MYXX4-u1vCwsJu.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-C2C_capt.js} +1 -1
  181. package/dist/viewer/{sk-SK-C5VTKIMK-a-IIZ4GT.js → sk-SK-C5VTKIMK-CAZ_jqda.js} +1 -1
  182. package/dist/viewer/{sl-SI-NN7IZMDC-o1isoOWW.js → sl-SI-NN7IZMDC-w4mPw9Qr.js} +1 -1
  183. package/dist/viewer/{split-url-BDMlmdjs.js → split-url-Ds_SbiRI.js} +2 -2
  184. package/dist/viewer/{stateDiagram-D77RDMKH-BZM8bgzK.js → stateDiagram-D77RDMKH-CNdAB9GQ.js} +1 -1
  185. package/dist/viewer/stateDiagram-v2-MP3YSRHH-LXrhvJQE.js +1 -0
  186. package/dist/viewer/subset-shared.chunk-DR4HOb1q.js +1 -0
  187. package/dist/viewer/{subset-worker.chunk-26hNkxyu.js → subset-worker.chunk-DWr778aR.js} +1 -1
  188. package/dist/viewer/{sv-SE-XGPEYMSR-B_D5ChEk.js → sv-SE-XGPEYMSR-Cvj4W126.js} +1 -1
  189. package/dist/viewer/{swimlanes-42K2YHIH-Dg0qxOws.js → swimlanes-42K2YHIH-CRWoFAkx.js} +1 -1
  190. package/dist/viewer/swimlanesDiagram-VR7AAH4N-F15yPPv-.js +8 -0
  191. package/dist/viewer/{ta-IN-2NMHFXQM-ClGBXdV4.js → ta-IN-2NMHFXQM-pCSxo0O4.js} +1 -1
  192. package/dist/viewer/{th-TH-HPSO5L25-DAJ8sOl3.js → th-TH-HPSO5L25-DA2yXkLO.js} +1 -1
  193. package/dist/viewer/{timeline-definition-24CTP7MA-DXaemj2u.js → timeline-definition-24CTP7MA-C7cLrh2M.js} +1 -1
  194. package/dist/viewer/{tr-TR-DEFEU3FU-BzHu5pEn.js → tr-TR-DEFEU3FU-DSUJUHLi.js} +1 -1
  195. package/dist/viewer/{treeView-Q6P3EWNA-C_VbpbNe.js → treeView-Q6P3EWNA-CYMsee9z.js} +1 -1
  196. package/dist/viewer/{treemap-WGGIJYW6-BGL5LSgs.js → treemap-WGGIJYW6-BeYAJy3I.js} +1 -1
  197. package/dist/viewer/{uk-UA-QMV73CPH-BPDqw53G.js → uk-UA-QMV73CPH-CpavbdpO.js} +1 -1
  198. package/dist/viewer/useAriaLabelledBy-Ai3baFaJ.js +1 -0
  199. package/dist/viewer/useOpenInteractionType-CFrlkl-M.js +1 -0
  200. package/dist/viewer/{useTranslation-BcipDuhp.js → useTranslation-BCUMbI5g.js} +1 -1
  201. package/dist/viewer/useTypeFavicon-B4j5zCC6.js +1 -0
  202. package/dist/viewer/{vennDiagram-4TSXK5OY-DZKcEaHf.js → vennDiagram-4TSXK5OY-D-TvgzEs.js} +1 -1
  203. package/dist/viewer/verdicts-B9EpSu2Q.js +1 -0
  204. package/dist/viewer/{vi-VN-M7AON7JQ-CJEuQOxR.js → vi-VN-M7AON7JQ-149ovaXw.js} +1 -1
  205. package/dist/viewer/{view-CJUgyKGY.js → view-tN_gu_ot.js} +1 -1
  206. package/dist/viewer/{viewport-CFJHn_Y6-BGH6hsZG.js → viewport-CFJHn_Y6-gOi1FTqq.js} +1 -1
  207. package/dist/viewer/{wardley-WFR3VGLG-Dkp_-AaL.js → wardley-WFR3VGLG-Bxei-rkR.js} +1 -1
  208. package/dist/viewer/{wardleyDiagram-VM6X3IG4-86pEJitp.js → wardleyDiagram-VM6X3IG4-Behq92Qv.js} +1 -1
  209. package/dist/viewer/{xychartDiagram-S5SC5T6Z-CAsfEZ7P.js → xychartDiagram-S5SC5T6Z-WvqgiYkm.js} +1 -1
  210. package/dist/viewer/{zh-CN-LNUGB5OW-m354m4Nb.js → zh-CN-LNUGB5OW-Bh3vP78p.js} +1 -1
  211. package/dist/viewer/{zh-HK-E62DVLB3-HnR0Htak.js → zh-HK-E62DVLB3-DyLx4WST.js} +1 -1
  212. package/dist/viewer/{zh-TW-RAJ6MFWO-BUClvKp2.js → zh-TW-RAJ6MFWO-CzGpQq8F.js} +1 -1
  213. package/dist/viewer-lib/{Canvas-XtRYXIEb.js → Canvas-D1GKtdWi.js} +3 -3
  214. package/dist/viewer-lib/{PhoneArtboardBar-DfzvB3QO.js → PhoneArtboardBar-Wif7mAXi.js} +2 -2
  215. package/dist/viewer-lib/{PreviewView-lLevZBla.js → PreviewView-96hXi1zy.js} +2 -2
  216. package/dist/viewer-lib/{ReadOnlyWhiteboard-D0CZ0LdG.js → ReadOnlyWhiteboard-ByJSgs6y.js} +3 -3
  217. package/dist/viewer-lib/{SnapshotDocument-T_gyY6JJ.js → SnapshotDocument-boYf3Unu.js} +13631 -13624
  218. package/dist/viewer-lib/{VirtualizedEditor-D9Ivycdp-Blh2vJwo.js → VirtualizedEditor-D9Ivycdp-C1r2x0pX.js} +2 -2
  219. package/dist/viewer-lib/{VirtualizedRenderer-C_d95FXi-BOJs6MXx.js → VirtualizedRenderer-C_d95FXi-lZgY7VI5.js} +3 -3
  220. package/dist/viewer-lib/{WarningsBadge-BtnTIfpB.js → WarningsBadge-B8dxGKka.js} +1 -1
  221. package/dist/viewer-lib/{agentLook-DWANryek.js → agentLook-0GsgKSL-.js} +1 -1
  222. package/dist/viewer-lib/{ar-SA-G6X2FPQ2-DSCh8zTd.js → ar-SA-G6X2FPQ2-D01gdPpr.js} +1 -1
  223. package/dist/viewer-lib/{az-AZ-76LH7QW2-CNdNs8nj.js → az-AZ-76LH7QW2-C7w5r7bD.js} +1 -1
  224. package/dist/viewer-lib/{bg-BG-XCXSNQG7-PU2ZxsGw.js → bg-BG-XCXSNQG7-p2Qatdni.js} +1 -1
  225. package/dist/viewer-lib/{bn-BD-2XOGV67Q-XLdOhNaI.js → bn-BD-2XOGV67Q-DtnIWXwT.js} +1 -1
  226. package/dist/viewer-lib/{ca-ES-6MX7JW3Y-UY8MZC4L.js → ca-ES-6MX7JW3Y-BY9zZN7o.js} +1 -1
  227. package/dist/viewer-lib/{chunk-EIO257PC-C1U1qIlr.js → chunk-EIO257PC-Dn7JUPD8.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-BzjoZdth.js} +1 -1
  230. package/dist/viewer-lib/{da-DK-5WZEPLOC-DDviq7_M.js → da-DK-5WZEPLOC-TDV970j5.js} +1 -1
  231. package/dist/viewer-lib/{de-DE-XR44H4JA-C9myJh7C.js → de-DE-XR44H4JA-BjyTyKoM.js} +1 -1
  232. package/dist/viewer-lib/{dist-D85VCWJe.js → dist-BEz688xk.js} +3 -3
  233. package/dist/viewer-lib/{dist-DaJwO7Xc.js → dist-BSFDUw8i.js} +2 -2
  234. package/dist/viewer-lib/{dist-C-R9SWz_.js → dist-BTCqhvAf.js} +4 -4
  235. package/dist/viewer-lib/{dist-D3y43SEU.js → dist-C38vNQIH.js} +1 -1
  236. package/dist/viewer-lib/{dist-Bal1GKlv.js → dist-C60FpC9e.js} +1 -1
  237. package/dist/viewer-lib/{dist-D6SeV1Ef.js → dist-CBjyw6zC.js} +2 -2
  238. package/dist/viewer-lib/{dist-DTqMZxNq.js → dist-CMWQEa97.js} +3 -3
  239. package/dist/viewer-lib/{dist-Mng5zZmU.js → dist-CPnB9yKQ.js} +3 -3
  240. package/dist/viewer-lib/{dist-BsTwyJB3.js → dist-Cfk5Y4QC.js} +2 -2
  241. package/dist/viewer-lib/{dist-D9t2NKPt.js → dist-CgQmu9ki.js} +3 -3
  242. package/dist/viewer-lib/{dist-Bb9R9QlE.js → dist-Cr_rgBD9.js} +3 -3
  243. package/dist/viewer-lib/{dist-D0AhZFIx.js → dist-D36o7D7T.js} +2 -2
  244. package/dist/viewer-lib/{dist-CEezXcL4.js → dist-D778PgeW.js} +2 -2
  245. package/dist/viewer-lib/{dist-Dli815JZ.js → dist-D9IzrveE.js} +2 -2
  246. package/dist/viewer-lib/{dist-CAoIkY40.js → dist-DHEOl2TN.js} +2 -2
  247. package/dist/viewer-lib/{dist-CKL7I9Qx.js → dist-DK1Yi8I4.js} +4 -4
  248. package/dist/viewer-lib/{dist-DQlRNM1V.js → dist-DULdzKdC.js} +3 -3
  249. package/dist/viewer-lib/{dist-C0iQb-kP.js → dist-DYd0_e2w.js} +2 -2
  250. package/dist/viewer-lib/{dist-CvyyocBe.js → dist-FVtL0y1F.js} +3 -3
  251. package/dist/viewer-lib/{dist-CTxT1PXe.js → dist-bPGj_tUd.js} +4 -4
  252. package/dist/viewer-lib/{dist-BAZg8tW9.js → dist-qS7iA2eX.js} +3 -3
  253. package/dist/viewer-lib/{dist-wAvEq47e.js → dist-vd2-brQn.js} +3 -3
  254. package/dist/viewer-lib/{dist-5qRQAgi-.js → dist-xJDwc_X3.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-Be_WFnxM.js} +1 -1
  257. package/dist/viewer-lib/{en-B4ZKOASM-CFqMifHo.js → en-B4ZKOASM-CqCyVRMQ.js} +1 -1
  258. package/dist/viewer-lib/{es-ES-U4NZUMDT-DRdVwGjw.js → es-ES-U4NZUMDT-BbunaFz5.js} +1 -1
  259. package/dist/viewer-lib/{eu-ES-A7QVB2H4-BkyvJflk.js → eu-ES-A7QVB2H4-CiDfJl0F.js} +1 -1
  260. package/dist/viewer-lib/{fa-IR-HGAKTJCU-BwsYAcy8.js → fa-IR-HGAKTJCU-CLdHVNrd.js} +1 -1
  261. package/dist/viewer-lib/{fi-FI-Z5N7JZ37-CBeMgc4e.js → fi-FI-Z5N7JZ37-AInwUM2B.js} +1 -1
  262. package/dist/viewer-lib/{fr-FR-RHASNOE6-CSCzRtsr.js → fr-FR-RHASNOE6-5qcE-nn9.js} +1 -1
  263. package/dist/viewer-lib/{gl-ES-HMX3MZ6V-Dsd9rhFU.js → gl-ES-HMX3MZ6V-C_hmLe5L.js} +1 -1
  264. package/dist/viewer-lib/{he-IL-6SHJWFNN-BzbqaoiX.js → he-IL-6SHJWFNN-Bs4SMN5Y.js} +1 -1
  265. package/dist/viewer-lib/{hi-IN-IWLTKZ5I-DW-xTmxl.js → hi-IN-IWLTKZ5I-CHsG_prh.js} +1 -1
  266. package/dist/viewer-lib/{hu-HU-A5ZG7DT2-DFcambMZ.js → hu-HU-A5ZG7DT2-BpNCnfmz.js} +1 -1
  267. package/dist/viewer-lib/{i18n-AbkxQTcI.js → i18n-Bl255uFG.js} +140 -10
  268. package/dist/viewer-lib/{id-ID-SAP4L64H-tTBC6jhJ.js → id-ID-SAP4L64H-B18MP3TV.js} +1 -1
  269. package/dist/viewer-lib/{image-GAAHSSAO-DYWFpM2G.js → image-GAAHSSAO-DVKnh1wc.js} +1 -1
  270. package/dist/viewer-lib/index.js +3669 -2698
  271. package/dist/viewer-lib/{it-IT-JPQ66NNP-D_dRrUXm.js → it-IT-JPQ66NNP-BH98nLgr.js} +1 -1
  272. package/dist/viewer-lib/{ja-JP-DBVTYXUO-Bg7zRyCt.js → ja-JP-DBVTYXUO-DA2fExJg.js} +1 -1
  273. package/dist/viewer-lib/{kaa-6HZHGXH3-C3jbC37K.js → kaa-6HZHGXH3-C-82oNQ2.js} +1 -1
  274. package/dist/viewer-lib/{kab-KAB-ZGHBKWFO-3wPaJGNV.js → kab-KAB-ZGHBKWFO-CsOeYyyg.js} +1 -1
  275. package/dist/viewer-lib/{kk-KZ-P5N5QNE5-CxV-rOti.js → kk-KZ-P5N5QNE5-C5vZz2mB.js} +1 -1
  276. package/dist/viewer-lib/{km-KH-HSX4SM5Z-CjWW8EnV.js → km-KH-HSX4SM5Z-Ds8sNL7U.js} +1 -1
  277. package/dist/viewer-lib/{ko-KR-MTYHY66A-DYgqutRt.js → ko-KR-MTYHY66A-BgSaRncC.js} +1 -1
  278. package/dist/viewer-lib/{ku-TR-6OUDTVRD-BKEfJRQu.js → ku-TR-6OUDTVRD-DahxJWf5.js} +1 -1
  279. package/dist/viewer-lib/{lib-BWIKhY0u.js → lib-HJ5naU7F.js} +125 -125
  280. package/dist/viewer-lib/{lt-LT-XHIRWOB4-C40q3QcD.js → lt-LT-XHIRWOB4-BvJ2fjcP.js} +1 -1
  281. package/dist/viewer-lib/{lv-LV-5QDEKY6T-C8cvmasQ.js → lv-LV-5QDEKY6T-CfcDbPw2.js} +1 -1
  282. package/dist/viewer-lib/{mr-IN-CRQNXWMA-B5iL27vN.js → mr-IN-CRQNXWMA-C8OfBL2I.js} +1 -1
  283. package/dist/viewer-lib/{my-MM-5M5IBNSE-BIaP8rPS.js → my-MM-5M5IBNSE-BUCYgqBD.js} +1 -1
  284. package/dist/viewer-lib/{nb-NO-T6EIAALU-D2L2JYb0.js → nb-NO-T6EIAALU-BhVURg4a.js} +1 -1
  285. package/dist/viewer-lib/{nl-NL-IS3SIHDZ-BF9POnBF.js → nl-NL-IS3SIHDZ-C5NGTrjU.js} +1 -1
  286. package/dist/viewer-lib/{nn-NO-6E72VCQL-DtL4ep0j.js → nn-NO-6E72VCQL-CIOwp8RU.js} +1 -1
  287. package/dist/viewer-lib/{oc-FR-POXYY2M6-CM0au5Lk.js → oc-FR-POXYY2M6-Da6SyINm.js} +1 -1
  288. package/dist/viewer-lib/{pa-IN-N4M65BXN-D-jLm3EK.js → pa-IN-N4M65BXN-tDTX0nfg.js} +1 -1
  289. package/dist/viewer-lib/percentages-BXMCSKIN-Cvdo4-KV.js +1 -0
  290. package/dist/viewer-lib/{pl-PL-T2D74RX3-rTHmzHqx.js → pl-PL-T2D74RX3-dj1Dwz0C.js} +1 -1
  291. package/dist/viewer-lib/{plugin-_bGVeqI0-BPW31nnw.js → plugin-_bGVeqI0-D3iBrFnz.js} +1 -1
  292. package/dist/viewer-lib/{prod-D2rw6WFD.js → prod-B7QWq4m3.js} +59 -59
  293. package/dist/viewer-lib/{pt-BR-5N22H2LF-DBo3zEkE.js → pt-BR-5N22H2LF-BL2Y-MuR.js} +1 -1
  294. package/dist/viewer-lib/{pt-PT-UZXXM6DQ-CinObC39.js → pt-PT-UZXXM6DQ-BjYJ2Wd6.js} +1 -1
  295. package/dist/viewer-lib/{ro-RO-JPDTUUEW-BJvdgr_5.js → ro-RO-JPDTUUEW-D-wh7Qsh.js} +1 -1
  296. package/dist/viewer-lib/{route-messages-DTiEU_zp.js → route-messages-Cd_S7ERg.js} +279 -241
  297. package/dist/viewer-lib/{ru-RU-B4JR7IUQ-C8RoEcU9.js → ru-RU-B4JR7IUQ-Vqbdm2HB.js} +1 -1
  298. package/dist/viewer-lib/{si-LK-N5RQ5JYF-CmH33jvB.js → si-LK-N5RQ5JYF-FWjQj7wM.js} +1 -1
  299. package/dist/viewer-lib/{sk-SK-C5VTKIMK-DbX5YK4x.js → sk-SK-C5VTKIMK-CPdKjgc0.js} +1 -1
  300. package/dist/viewer-lib/{sl-SI-NN7IZMDC-GaQJzO11.js → sl-SI-NN7IZMDC-Cfsizmp1.js} +1 -1
  301. package/dist/viewer-lib/{stylex-CnT-Ts3D.css → stylex-H52XSOyN.css} +36 -0
  302. package/dist/viewer-lib/subset-shared.chunk-C7qUh7WH.js +2 -0
  303. package/dist/viewer-lib/{subset-worker.chunk-DaNQ8W3O.js → subset-worker.chunk-ockc4DfZ.js} +2 -2
  304. package/dist/viewer-lib/{sv-SE-XGPEYMSR-C4cib1qC.js → sv-SE-XGPEYMSR-CkNdCBoc.js} +1 -1
  305. package/dist/viewer-lib/{ta-IN-2NMHFXQM-COXiexro.js → ta-IN-2NMHFXQM-Cqhx65Sb.js} +1 -1
  306. package/dist/viewer-lib/{th-TH-HPSO5L25-DZu-t4j-.js → th-TH-HPSO5L25-Cz6Qzk1K.js} +1 -1
  307. package/dist/viewer-lib/{tr-TR-DEFEU3FU-CJMaRH7e.js → tr-TR-DEFEU3FU-CCCN9YIS.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/shared/referrers.d.ts +36 -0
  314. package/dist/viewer-lib/types/src/viewer/components/BesideCard.d.ts +17 -0
  315. package/dist/viewer-lib/types/src/viewer/components/CascadeList.d.ts +13 -0
  316. package/dist/viewer-lib/types/src/viewer/components/ReferrerList.d.ts +14 -0
  317. package/dist/viewer-lib/types/src/viewer/components/SharePanel.d.ts +19 -0
  318. package/dist/viewer-lib/types/src/viewer/components/beside-state.d.ts +3 -0
  319. package/dist/viewer-lib/types/src/viewer/components/cascade-styles.d.ts +128 -0
  320. package/dist/viewer-lib/types/src/viewer/document/useCloudRefBoard.d.ts +5 -0
  321. package/dist/viewer-lib/types/src/viewer/library/index.d.ts +9 -1
  322. package/dist/viewer-lib/types/src/viewer/split/SplitShell.d.ts +3 -1
  323. package/dist/viewer-lib/types/src/viewer/split/messages.d.ts +11 -1
  324. package/dist/viewer-lib/types/src/viewer/split/route-messages.d.ts +3 -1
  325. package/dist/viewer-lib/types/src/viewer/split/split-url.d.ts +9 -2
  326. package/dist/viewer-lib/types/src/viewer/split/usePaneStage.d.ts +16 -0
  327. package/dist/viewer-lib/types/src/viewer/split/useSplitRoles.d.ts +6 -0
  328. package/dist/viewer-lib/types/src/viewer/split/useSplitRouting.d.ts +8 -5
  329. package/dist/viewer-lib/{uk-UA-QMV73CPH-BNjGwvPi.js → uk-UA-QMV73CPH-CP4wZTK4.js} +1 -1
  330. package/dist/viewer-lib/{vi-VN-M7AON7JQ-CFAjVdhW.js → vi-VN-M7AON7JQ-DQsgQGd7.js} +1 -1
  331. package/dist/viewer-lib/{viewport-CFJHn_Y6-C-nOAUOA.js → viewport-CFJHn_Y6-LGEa8Vm0.js} +1 -1
  332. package/dist/viewer-lib/{zh-CN-LNUGB5OW-CJGcookC.js → zh-CN-LNUGB5OW-Cp6CD9iP.js} +1 -1
  333. package/dist/viewer-lib/{zh-HK-E62DVLB3-DbKlJaOJ.js → zh-HK-E62DVLB3-B_z5KWS4.js} +1 -1
  334. package/dist/viewer-lib/{zh-TW-RAJ6MFWO-6xqeRDl-.js → zh-TW-RAJ6MFWO-BgUsVK92.js} +1 -1
  335. package/package.json +1 -1
  336. package/dist/viewer/ArtboardLayout-CL7CeJtR.js +0 -12
  337. package/dist/viewer/ArtifactList-C9WYHhVD.js +0 -2
  338. package/dist/viewer/Avatar-TFwLueDr.js +0 -1
  339. package/dist/viewer/CompositeItem-DYLRmrE_.js +0 -1
  340. package/dist/viewer/DocumentLayout-BbmdEZ-E.js +0 -2
  341. package/dist/viewer/DocumentPage-Cv3CsvrN.js +0 -4
  342. package/dist/viewer/MenuSubmenuTrigger-CbXQxNH6.js +0 -1
  343. package/dist/viewer/MenuTrigger-DUDnBy5x.js +0 -1
  344. package/dist/viewer/Popover-Df89KUPH.js +0 -1
  345. package/dist/viewer/Select-C5fhFls_.js +0 -1
  346. package/dist/viewer/SelectScrollUpArrow-ekubXj7Y.js +0 -1
  347. package/dist/viewer/SettingsDialog-DyvJKJ-o.js +0 -1
  348. package/dist/viewer/SplitShell-Dm7Po2-x.js +0 -1
  349. package/dist/viewer/TooltipPopup-Bkov4dq9.js +0 -1
  350. package/dist/viewer/WhiteboardLayout-Bobg7qpA.js +0 -3
  351. package/dist/viewer/channel-Bs9FsVFX.js +0 -1
  352. package/dist/viewer/classDiagram-ZZMXUADV-BWwOjUTg.js +0 -1
  353. package/dist/viewer/classDiagram-v2-VYDZK3BY-BWwOjUTg.js +0 -1
  354. package/dist/viewer/flowDiagram-HODETNUW-DyOrsOBQ.js +0 -1
  355. package/dist/viewer/local-split-host-BGIN8Z8E.js +0 -1
  356. package/dist/viewer/messages-D-DLzi0K.js +0 -1
  357. package/dist/viewer/percentages-BXMCSKIN-DR7Xa-V1.js +0 -1
  358. package/dist/viewer/route-messages-Cw5rlOIe.js +0 -1
  359. package/dist/viewer/settings-dialog-CI1cXQbx.js +0 -1
  360. package/dist/viewer/stateDiagram-v2-MP3YSRHH-2e0z4X46.js +0 -1
  361. package/dist/viewer/subset-shared.chunk-DYPlDRg8.js +0 -1
  362. package/dist/viewer/swimlanesDiagram-VR7AAH4N-CikAcpC5.js +0 -8
  363. package/dist/viewer/useControlledState-D_GlZYtL.js +0 -1
  364. package/dist/viewer/useOpenInteractionType-7AMeX8Ol.js +0 -1
  365. package/dist/viewer/useTypeFavicon-Dw5tQpxT.js +0 -1
  366. package/dist/viewer/verdicts-DXrETzvP.js +0 -1
  367. package/dist/viewer-lib/percentages-BXMCSKIN-BX16aURg.js +0 -1
  368. 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.68.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);
@@ -50270,10 +50270,10 @@ function blocksOf(diff) {
50270
50270
  }
50271
50271
  function countStates(items) {
50272
50272
  const summary = /* @__PURE__ */ new Map();
50273
- for (const item2 of items) {
50274
- const status = item2.kind === "choose" ? item2.choice ? "chosen" : "empty" : String(item2.state ?? item2.verdict ?? item2.status ?? "unknown");
50273
+ for (const item3 of items) {
50274
+ const status = item3.kind === "choose" ? item3.choice ? "chosen" : "empty" : String(item3.state ?? item3.verdict ?? item3.status ?? "unknown");
50275
50275
  summary.set(status, (summary.get(status) ?? 0) + 1);
50276
- if (item2.waitingOn === "agent")
50276
+ if (item3.waitingOn === "agent")
50277
50277
  summary.set("waitingOnAgent", (summary.get("waitingOnAgent") ?? 0) + 1);
50278
50278
  }
50279
50279
  return Object.fromEntries(summary);
@@ -50391,7 +50391,7 @@ function createAgentReview(stateDir, options2 = {}) {
50391
50391
  throw new ReviewError("E_ARGUMENT_INVALID", "limit must be between 1 and 100.");
50392
50392
  let values = snap.value.items ?? [];
50393
50393
  if (input.thread) {
50394
- values = values.filter((item2) => item2.id === input.thread);
50394
+ values = values.filter((item3) => item3.id === input.thread);
50395
50395
  if (!values.length)
50396
50396
  throw new ReviewError("E_THREAD_NOT_FOUND", "Thread not found in this snapshot.", 404);
50397
50397
  }
@@ -50404,12 +50404,12 @@ function createAgentReview(stateDir, options2 = {}) {
50404
50404
  }) : null;
50405
50405
  let receipt;
50406
50406
  if (detail && !input.all && !snap.value.all && !input.fields && snap.value.kind === "threads" && selected.length) {
50407
- const tokens = selected.flatMap((item2) => snap.value.tokens?.[String(item2.id)] ?? []);
50407
+ const tokens = selected.flatMap((item3) => snap.value.tokens?.[String(item3.id)] ?? []);
50408
50408
  if (tokens.length) receipt = lease("receipt", input, { kind: "threads", tokens });
50409
50409
  }
50410
- const materialized = selected.map((item2) => {
50411
- if (detail || snap.value.kind !== "threads") return item2;
50412
- const thread = item2;
50410
+ const materialized = selected.map((item3) => {
50411
+ if (detail || snap.value.kind !== "threads") return item3;
50412
+ const thread = item3;
50413
50413
  const messages = thread.messages.filter((message2) => !message2.deleted);
50414
50414
  const last = messages.filter((message2) => message2.author === "human").at(-1) ?? messages.at(-1);
50415
50415
  return {
@@ -50417,10 +50417,10 @@ function createAgentReview(stateDir, options2 = {}) {
50417
50417
  status: thread.status,
50418
50418
  waitingOn: waitingOn(thread),
50419
50419
  anchor: thread.anchor,
50420
- stale: item2.stale ?? false,
50421
- ...item2.orphan === true ? { orphan: true } : {},
50422
- ...item2.draft === true ? { draft: true } : {},
50423
- ...typeof item2.page === "string" ? { page: item2.page } : {},
50420
+ stale: item3.stale ?? false,
50421
+ ...item3.orphan === true ? { orphan: true } : {},
50422
+ ...item3.draft === true ? { draft: true } : {},
50423
+ ...typeof item3.page === "string" ? { page: item3.page } : {},
50424
50424
  preview: preview(
50425
50425
  last?.text ?? (thread.messages.some((message2) => message2.deleted) ? "[deleted]" : "")
50426
50426
  ),
@@ -50430,8 +50430,8 @@ function createAgentReview(stateDir, options2 = {}) {
50430
50430
  });
50431
50431
  const required = snap.value.kind === "changes" ? ["id"] : requiredReviewFields[snap.value.kind];
50432
50432
  const items = input.fields ? materialized.map(
50433
- (item2) => Object.fromEntries(
50434
- Object.entries(item2).filter(
50433
+ (item3) => Object.fromEntries(
50434
+ Object.entries(item3).filter(
50435
50435
  ([key2]) => input.fields.includes(key2) || required.includes(key2)
50436
50436
  )
50437
50437
  )
@@ -50480,7 +50480,7 @@ function createAgentReview(stateDir, options2 = {}) {
50480
50480
  const snap = snapshot2(input, input.section, () => ({
50481
50481
  counts: countStates(input.items),
50482
50482
  items: input.items.filter(
50483
- (item2) => keep(item2) && (!input.filters?.status || item2.state === input.filters.status || item2.verdict === input.filters.status) && (!input.filters?.kind || item2.kind === input.filters.kind) && (!input.filters?.choiceState || (input.filters.choiceState === "chosen" ? !!item2.choice : !item2.choice))
50483
+ (item3) => keep(item3) && (!input.filters?.status || item3.state === input.filters.status || item3.verdict === input.filters.status) && (!input.filters?.kind || item3.kind === input.filters.kind) && (!input.filters?.choiceState || (input.filters.choiceState === "chosen" ? !!item3.choice : !item3.choice))
50484
50484
  )
50485
50485
  }));
50486
50486
  return page(input, snap, !!input.detail);
@@ -50522,7 +50522,7 @@ function createAgentReview(stateDir, options2 = {}) {
50522
50522
  { ...snap, value: { ...snap.value, items: blocks.map((block) => ({ ...block })) } },
50523
50523
  false
50524
50524
  );
50525
- const selected = summary ? new Set(summary.items.map((item2) => item2.id)) : void 0;
50525
+ const selected = summary ? new Set(summary.items.map((item3) => item3.id)) : void 0;
50526
50526
  let receipt;
50527
50527
  if (input.detail && !input.all && !snap.value.all && !input.fields && !snap.value.empty)
50528
50528
  receipt = lease("receipt", input, { kind: "changes", to: snap.value.to });
@@ -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,47 @@ 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
+ function referrersOf(root, key2) {
51865
+ const found = [];
51866
+ for (const each of listArtifacts(root).artifacts) {
51867
+ const extract = REFERENCES_OF[each.type];
51868
+ const from = `${each.type}/${each.id}`;
51869
+ if (!extract || from === key2) continue;
51870
+ const uses = extract(each.dir).filter((target) => target === key2).length;
51871
+ if (uses > 0) found.push({ key: from, uses });
51872
+ }
51873
+ return found.sort((a5, b6) => a5.key.localeCompare(b6.key));
51874
+ }
51875
+
51814
51876
  // src/server/cloud.ts
51815
51877
  var import_node_crypto10 = __toESM(require("node:crypto"), 1);
51816
51878
 
@@ -51826,6 +51888,84 @@ function formatBytes(bytes) {
51826
51888
  return `${unit === 0 ? value : Number(value.toFixed(1))} ${UNITS[unit]}`;
51827
51889
  }
51828
51890
 
51891
+ // src/shared/cascade.ts
51892
+ var ACTIONABLE = ["unpublished", "stale", "private", "withdrawn"];
51893
+ var CHECKED_BY_DEFAULT = ["unpublished", "stale"];
51894
+ function stateOf(status, visibility) {
51895
+ const needed = !status.published ? status.withdrawn ? "withdrawn" : "unpublished" : visibility === "public" && status.visibility === "private" ? "private" : status.stale ? "stale" : "ready";
51896
+ return status.blocked && needed !== "private" && needed !== "ready" ? "blocked" : needed;
51897
+ }
51898
+ var visibleNow = (status, visibility) => status.published && (visibility === "private" || status.visibility === "public");
51899
+ async function buildCascade(root, visibility, deps) {
51900
+ const items = /* @__PURE__ */ new Map();
51901
+ const queue = [root];
51902
+ for (let at7 = 0; at7 < queue.length; at7++) {
51903
+ const from = queue[at7];
51904
+ for (const key2 of new Set(await deps.referencesOf(from))) {
51905
+ if (key2 === root) continue;
51906
+ const known = items.get(key2);
51907
+ if (known) {
51908
+ if (!known.parents.includes(from)) known.parents.push(from);
51909
+ continue;
51910
+ }
51911
+ const status = await deps.statusOf(key2);
51912
+ if (!status) continue;
51913
+ const state2 = stateOf(status, visibility);
51914
+ items.set(key2, {
51915
+ artifact: key2,
51916
+ title: status.title,
51917
+ via: from === root ? null : from,
51918
+ parents: [from],
51919
+ state: state2,
51920
+ open: visibleNow(status, visibility),
51921
+ checked: CHECKED_BY_DEFAULT.includes(state2),
51922
+ selectable: ACTIONABLE.includes(state2),
51923
+ ...state2 === "blocked" && status.blocked ? { blocked: status.blocked } : {},
51924
+ ...status.stale && !status.blocked ? { changed: true } : {}
51925
+ });
51926
+ queue.push(key2);
51927
+ }
51928
+ }
51929
+ return resolveSelection([...items.values()], {}, root);
51930
+ }
51931
+ function resolveSelection(items, overrides, root) {
51932
+ const byKey = new Map(items.map((item3) => [item3.artifact, item3]));
51933
+ const wanted = (item3) => ACTIONABLE.includes(item3.state) && (overrides[item3.artifact] ?? CHECKED_BY_DEFAULT.includes(item3.state));
51934
+ const isRoot = (key2) => root ? key2 === root : !byKey.has(key2);
51935
+ const reachable = /* @__PURE__ */ new Set();
51936
+ const opens = (key2) => {
51937
+ if (isRoot(key2)) return true;
51938
+ const item3 = byKey.get(key2);
51939
+ return !!item3 && reachable.has(key2) && (item3.open || wanted(item3));
51940
+ };
51941
+ for (let changed = true; changed; ) {
51942
+ changed = false;
51943
+ for (const item3 of items) {
51944
+ if (reachable.has(item3.artifact) || !item3.parents.some(opens)) continue;
51945
+ reachable.add(item3.artifact);
51946
+ changed = true;
51947
+ }
51948
+ }
51949
+ return items.map((item3) => {
51950
+ const { reason: _reason, upstream: _upstream, ...rest } = item3;
51951
+ const reason = item3.state === "blocked" ? item3.blocked : void 0;
51952
+ if (!reachable.has(item3.artifact))
51953
+ return {
51954
+ ...rest,
51955
+ checked: false,
51956
+ selectable: false,
51957
+ reason: "upstream",
51958
+ upstream: item3.via ?? item3.parents[0]
51959
+ };
51960
+ return {
51961
+ ...rest,
51962
+ checked: wanted(item3),
51963
+ selectable: ACTIONABLE.includes(item3.state),
51964
+ ...reason ? { reason } : {}
51965
+ };
51966
+ });
51967
+ }
51968
+
51829
51969
  // src/shared/cloud-error.ts
51830
51970
  function cloudErrorDetails(value) {
51831
51971
  if (!value || typeof value !== "object") return {};
@@ -51846,6 +51986,53 @@ function cloudErrorDetails(value) {
51846
51986
  return details;
51847
51987
  }
51848
51988
 
51989
+ // src/shared/referrers.ts
51990
+ var SELECTABLE = ["private", "unpublished", "unlinked"];
51991
+ var item = (base) => ({
51992
+ ...base,
51993
+ selectable: SELECTABLE.includes(base.state),
51994
+ checked: false
51995
+ });
51996
+ function localState(status, cloudKnown) {
51997
+ if (!status.published) {
51998
+ if (status.withdrawn) return { state: "withdrawn" };
51999
+ if (status.blocked) return { state: "blocked", reason: status.blocked };
52000
+ return { state: "unpublished" };
52001
+ }
52002
+ const isPrivate = status.visibility === "private";
52003
+ if (!cloudKnown) return { state: isPrivate ? "private" : "ready" };
52004
+ return isPrivate ? { state: "private", needsUpdate: true } : { state: "unlinked" };
52005
+ }
52006
+ function mergeReferrers({
52007
+ cloud,
52008
+ local
52009
+ }) {
52010
+ const byCloudId = new Map(
52011
+ local.filter((each) => each.cloudId).map((each) => [each.cloudId, each])
52012
+ );
52013
+ const fromCloud = (cloud ?? []).map((each) => {
52014
+ const match = byCloudId.get(each.cloudId);
52015
+ return item({
52016
+ artifact: match?.key ?? `cloud:${each.cloudId}`,
52017
+ cloudId: each.cloudId,
52018
+ title: match?.status.title ?? each.title,
52019
+ uses: each.uses,
52020
+ state: each.visibility === "private" ? "private" : "ready"
52021
+ });
52022
+ });
52023
+ const known = new Set((cloud ?? []).map((each) => each.cloudId));
52024
+ const fromLocal = local.filter((each) => !each.cloudId || !known.has(each.cloudId)).map(
52025
+ (each) => item({
52026
+ artifact: each.key,
52027
+ cloudId: each.cloudId,
52028
+ title: each.status.title,
52029
+ uses: each.uses,
52030
+ ...localState(each.status, cloud !== null)
52031
+ })
52032
+ );
52033
+ return [...fromCloud, ...fromLocal];
52034
+ }
52035
+
51849
52036
  // src/shared/brand.ts
51850
52037
  var RYUGI_MARK_VIEWBOX = "0 0 512 512";
51851
52038
  var RYUGI_MARK_BODY = '<g transform="translate(82 136.317460) scale(0.613756614)"><g transform="translate(0.000000,390.000000) scale(0.100000,-0.100000)" stroke="none"><path d="M4945 3889 c-339 -44 -682 -239 -905 -517 -139 -172 -232 -355 -365 -717 -136 -368 -285 -735 -360 -890 -219 -449 -524 -768 -849 -887 -121 -44 -215 -60 -356 -60 -162 0 -244 18 -450 97 -291 111 -420 144 -650 166 -257 24 -637 -19 -772 -87 -148 -75 -249 -247 -235 -399 19 -197 186 -344 392 -346 40 -1 127 11 205 27 115 23 160 28 300 28 242 1 372 -29 671 -155 226 -95 467 -149 662 -149 252 0 548 74 789 197 394 201 708 521 988 1008 83 144 271 529 405 830 220 493 300 632 436 759 121 112 226 162 424 201 44 9 108 29 143 45 165 77 274 285 244 467 -31 188 -168 334 -354 378 -70 16 -249 18 -363 4z M765 3139 c-202 -11 -415 -48 -497 -86 -91 -44 -151 -101 -193 -186 -123 -248 31 -525 307 -554 38 -4 99 3 204 23 137 27 167 29 384 29 205 0 249 -3 347 -23 225 -45 387 -106 658 -247 182 -94 308 -144 463 -182 138 -35 350 -39 447 -9 174 53 275 152 305 299 26 130 -40 267 -158 323 -52 25 -72 28 -227 35 -248 11 -328 37 -576 187 -232 140 -384 213 -585 281 -283 95 -541 127 -879 110z M620 2104 c-273 -32 -384 -65 -471 -143 -235 -208 -136 -589 172 -660 68 -16 129 -13 272 14 400 73 702 31 1167 -163 239 -99 350 -125 535 -125 193 0 338 51 448 157 117 113 139 261 56 375 -50 69 -99 85 -294 92 -245 10 -332 35 -563 163 -224 123 -456 211 -693 262 -111 23 -149 26 -359 29 -129 2 -251 1 -270 -1z"/></g></g>';
@@ -52093,7 +52280,7 @@ footer { display: flex; align-items: center; gap: 8px; margin-top: 28px; font-si
52093
52280
  h1 { margin-top: 16px; font-size: 26px; line-height: 1.22; }
52094
52281
  }
52095
52282
  `;
52096
- var item = (lead, title, detail) => `<li>${lead}<div><b>${title}</b><span>${detail}</span></div></li>`;
52283
+ var item2 = (lead, title, detail) => `<li>${lead}<div><b>${title}</b><span>${detail}</span></div></li>`;
52097
52284
  var autoPublishCard = (t7, on6, ticket) => `<section class="card auto"><form method="post" action="/api/cloud/callback/auto-publish">
52098
52285
  <input type="hidden" name="ticket" value="${escapeHtml(ticket)}">
52099
52286
  <span class="text"><b>${on6 ? t7("callback.autoPublishOn") : t7("callback.autoPublishOff")}</b><span>${t7("callback.autoPublishDetail")}</span></span>
@@ -52104,13 +52291,13 @@ var signedInBody = (t7, result) => `<p class="pill">${CIRCLE_CHECK}${t7("callbac
52104
52291
  <p class="lead">${t7("callback.lead")}</p>
52105
52292
  ${autoPublishCard(t7, result.autoPublish, result.ticket)}
52106
52293
  <p class="label">${t7("callback.whatNext")}</p>
52107
- <ul class="card">${item(`<span class="icon">${PANEL}</span>`, t7("callback.fromPage"), t7("callback.fromPageDetail"))}${item(`<span class="icon">${TERMINAL}</span>`, t7("callback.fromAgent"), t7("callback.fromAgentDetail"))}</ul>
52294
+ <ul class="card">${item2(`<span class="icon">${PANEL}</span>`, t7("callback.fromPage"), t7("callback.fromPageDetail"))}${item2(`<span class="icon">${TERMINAL}</span>`, t7("callback.fromAgent"), t7("callback.fromAgentDetail"))}</ul>
52108
52295
  <footer>${CHECK}<span>${t7("callback.closeOk")}</span></footer>`;
52109
52296
  var failedBody = (t7, result) => `<p class="pill">${CIRCLE_ALERT}${t7("callback.notConnected")}</p>
52110
52297
  <h1>${t7("callback.titleFailed")}</h1>
52111
52298
  <p class="lead">${escapeHtml(result.detail)}</p>
52112
52299
  <p class="label">${t7("callback.toTryAgain")}</p>
52113
- <ol class="card">${item('<span class="step">1</span>', t7("callback.stepBack"), t7("callback.stepBackDetail"))}${item('<span class="step">2</span>', t7("callback.stepSignIn"), t7("callback.stepSignInDetail"))}</ol>
52300
+ <ol class="card">${item2('<span class="step">1</span>', t7("callback.stepBack"), t7("callback.stepBackDetail"))}${item2('<span class="step">2</span>', t7("callback.stepSignIn"), t7("callback.stepSignInDetail"))}</ol>
52114
52301
  <details><summary>${t7("callback.otherReasons")}</summary><ul><li>${t7("callback.reasonUnreachable")}</li><li>${t7("callback.reasonRefused")}</li></ul></details>
52115
52302
  <footer><span>${t7("callback.closeFailed")}</span></footer>`;
52116
52303
  function callbackPage(result, locale = "en") {
@@ -52141,8 +52328,8 @@ function callbackPage(result, locale = "en") {
52141
52328
  }
52142
52329
 
52143
52330
  // src/server/config.ts
52144
- var import_node_fs16 = __toESM(require("node:fs"), 1);
52145
- var import_node_path13 = __toESM(require("node:path"), 1);
52331
+ var import_node_fs17 = __toESM(require("node:fs"), 1);
52332
+ var import_node_path14 = __toESM(require("node:path"), 1);
52146
52333
  var defaults = () => ({ version: 1, artifacts: {} });
52147
52334
  function isCloudRecord(value) {
52148
52335
  if (typeof value !== "object" || value === null) return false;
@@ -52183,7 +52370,7 @@ function normalize(raw) {
52183
52370
  function readConfig(file) {
52184
52371
  let text5;
52185
52372
  try {
52186
- text5 = import_node_fs16.default.readFileSync(file, "utf8");
52373
+ text5 = import_node_fs17.default.readFileSync(file, "utf8");
52187
52374
  } catch {
52188
52375
  return { config: defaults() };
52189
52376
  }
@@ -52198,22 +52385,22 @@ function readConfig(file) {
52198
52385
  }
52199
52386
  var IGNORED = ["config.json", "artifacts/*", "!artifacts/document/", "artifacts/document/*/.artifact-id"];
52200
52387
  function ensureGitignore(dir) {
52201
- const file = import_node_path13.default.join(dir, ".gitignore");
52388
+ const file = import_node_path14.default.join(dir, ".gitignore");
52202
52389
  let current = "";
52203
52390
  try {
52204
- current = import_node_fs16.default.readFileSync(file, "utf8");
52391
+ current = import_node_fs17.default.readFileSync(file, "utf8");
52205
52392
  } catch {
52206
52393
  }
52207
52394
  const present = new Set(current.split(/\r?\n/).map((line2) => line2.trim()));
52208
52395
  const missing = IGNORED.filter((line2) => !present.has(line2));
52209
52396
  if (missing.length === 0) return;
52210
- import_node_fs16.default.writeFileSync(file, `${current}${current === "" || current.endsWith("\n") ? "" : "\n"}${missing.join("\n")}
52397
+ import_node_fs17.default.writeFileSync(file, `${current}${current === "" || current.endsWith("\n") ? "" : "\n"}${missing.join("\n")}
52211
52398
  `);
52212
52399
  }
52213
52400
  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());
52401
+ import_node_fs17.default.mkdirSync(import_node_path14.default.dirname(file), { recursive: true });
52402
+ ensureGitignore(import_node_path14.default.dirname(file));
52403
+ if (!import_node_fs17.default.existsSync(file)) writeJsonAtomic(file, defaults());
52217
52404
  }
52218
52405
  function updateArtifactConfig(file, key2, patch) {
52219
52406
  const { config, warning } = readConfig(file);
@@ -52233,27 +52420,27 @@ function setProjectAutoPublish(file, value) {
52233
52420
  if (warning) throw new Error(warning);
52234
52421
  if (value === null) delete config.autoPublish;
52235
52422
  else config.autoPublish = value;
52236
- import_node_fs16.default.mkdirSync(import_node_path13.default.dirname(file), { recursive: true });
52423
+ import_node_fs17.default.mkdirSync(import_node_path14.default.dirname(file), { recursive: true });
52237
52424
  writeJsonAtomic(file, config);
52238
52425
  }
52239
52426
 
52240
52427
  // 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);
52428
+ var import_node_fs18 = __toESM(require("node:fs"), 1);
52429
+ var import_node_path15 = __toESM(require("node:path"), 1);
52243
52430
  function hostIdFor(credentialsFile2) {
52244
- const file = import_node_path14.default.join(import_node_path14.default.dirname(credentialsFile2), "host-id");
52431
+ const file = import_node_path15.default.join(import_node_path15.default.dirname(credentialsFile2), "host-id");
52245
52432
  const saved = readPersisted(file);
52246
52433
  if (/^[\w-]{16,64}$/.test(saved)) return saved;
52247
52434
  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}
52435
+ import_node_fs18.default.mkdirSync(import_node_path15.default.dirname(file), { recursive: true, mode: 448 });
52436
+ import_node_fs18.default.writeFileSync(file, `${id3}
52250
52437
  `, { mode: 384 });
52251
52438
  return id3;
52252
52439
  }
52253
52440
 
52254
52441
  // src/server/pack.ts
52255
- var import_node_fs18 = __toESM(require("node:fs"), 1);
52256
- var import_node_path15 = __toESM(require("node:path"), 1);
52442
+ var import_node_fs19 = __toESM(require("node:fs"), 1);
52443
+ var import_node_path16 = __toESM(require("node:path"), 1);
52257
52444
  var ArtifactTooLarge = class extends Error {
52258
52445
  };
52259
52446
  var excluded = (type, relative) => (type === "document" || type === "artboard" || type === "whiteboard") && relative === "comments.json";
@@ -52262,7 +52449,7 @@ var pageListOf = (dir, type, overrides) => {
52262
52449
  if (overrides?.has(PAGES_FILE))
52263
52450
  return parsePages(overrides.get(PAGES_FILE)?.toString("utf8") ?? null).pages;
52264
52451
  try {
52265
- return parsePages(import_node_fs18.default.readFileSync(import_node_path15.default.join(dir, PAGES_FILE), "utf8")).pages;
52452
+ return parsePages(import_node_fs19.default.readFileSync(import_node_path16.default.join(dir, PAGES_FILE), "utf8")).pages;
52266
52453
  } catch {
52267
52454
  return [];
52268
52455
  }
@@ -52272,7 +52459,7 @@ function packArtifact(dir, type, {
52272
52459
  maxBytes = MAX_ARTIFACT_BYTES,
52273
52460
  overrides: given
52274
52461
  } = {}) {
52275
- const rootReal = import_node_fs18.default.realpathSync(dir);
52462
+ const rootReal = import_node_fs19.default.realpathSync(dir);
52276
52463
  const pages = pageListOf(dir, type, given);
52277
52464
  const deletedPages = new Set(
52278
52465
  pages.filter((page) => isDeletedPage(page) && isPageId(page.id)).map((page) => pageFileOf(page.id))
@@ -52285,17 +52472,17 @@ function packArtifact(dir, type, {
52285
52472
  const visited = /* @__PURE__ */ new Set([rootReal]);
52286
52473
  let total = 0;
52287
52474
  const walk = (current) => {
52288
- for (const entry of import_node_fs18.default.readdirSync(current, { withFileTypes: true })) {
52475
+ for (const entry of import_node_fs19.default.readdirSync(current, { withFileTypes: true })) {
52289
52476
  if (entry.name.startsWith(".")) continue;
52290
- const full = import_node_path15.default.join(current, entry.name);
52477
+ const full = import_node_path16.default.join(current, entry.name);
52291
52478
  let real;
52292
52479
  try {
52293
- real = import_node_fs18.default.realpathSync(full);
52480
+ real = import_node_fs19.default.realpathSync(full);
52294
52481
  } catch {
52295
52482
  continue;
52296
52483
  }
52297
- if (!real.startsWith(rootReal + import_node_path15.default.sep)) continue;
52298
- const stat = import_node_fs18.default.statSync(real);
52484
+ if (!real.startsWith(rootReal + import_node_path16.default.sep)) continue;
52485
+ const stat = import_node_fs19.default.statSync(real);
52299
52486
  if (stat.isDirectory()) {
52300
52487
  if (visited.has(real)) continue;
52301
52488
  visited.add(real);
@@ -52303,7 +52490,7 @@ function packArtifact(dir, type, {
52303
52490
  continue;
52304
52491
  }
52305
52492
  if (!stat.isFile()) continue;
52306
- const relative = import_node_path15.default.relative(dir, full).split(import_node_path15.default.sep).join("/");
52493
+ const relative = import_node_path16.default.relative(dir, full).split(import_node_path16.default.sep).join("/");
52307
52494
  if (excluded(type, relative) || deletedPages.has(relative)) continue;
52308
52495
  if (!overrides?.has(relative)) total += stat.size;
52309
52496
  found.push({ path: relative, real });
@@ -52317,14 +52504,14 @@ function packArtifact(dir, type, {
52317
52504
  );
52318
52505
  }
52319
52506
  return [
52320
- ...found.filter((file) => !overrides?.has(file.path)).map((file) => ({ path: file.path, data: import_node_fs18.default.readFileSync(file.real) })),
52507
+ ...found.filter((file) => !overrides?.has(file.path)).map((file) => ({ path: file.path, data: import_node_fs19.default.readFileSync(file.real) })),
52321
52508
  ...[...overrides ?? []].flatMap(([file, data]) => data ? [{ path: file, data }] : [])
52322
52509
  ];
52323
52510
  }
52324
52511
 
52325
52512
  // 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);
52513
+ var import_node_fs21 = __toESM(require("node:fs"), 1);
52514
+ var import_node_path18 = __toESM(require("node:path"), 1);
52328
52515
 
52329
52516
  // src/shared/whiteboard/scene.ts
52330
52517
  var BOOKKEEPING = /* @__PURE__ */ new Set(["version", "versionNonce", "updated", "seed", "customData"]);
@@ -52373,8 +52560,8 @@ function parseScene(text5, file = "scene.excalidraw") {
52373
52560
  const elements = body.elements ?? [];
52374
52561
  if (!Array.isArray(elements)) return { error: `${file}: elements must be an array` };
52375
52562
  for (const [index, element] of elements.entries()) {
52376
- const item2 = record(element);
52377
- if (typeof item2.id !== "string" || typeof item2.type !== "string")
52563
+ const item3 = record(element);
52564
+ if (typeof item3.id !== "string" || typeof item3.type !== "string")
52378
52565
  return { error: `${file}: element ${index} needs a string id and type` };
52379
52566
  }
52380
52567
  return {
@@ -53737,17 +53924,17 @@ function escapeXml(text5) {
53737
53924
  function buildAttrs(attrs) {
53738
53925
  return Object.entries(attrs).filter(([, v6]) => v6 !== void 0 && v6 !== "").map(([k4, v6]) => ` ${k4}="${escapeXml(v6)}"`).join("");
53739
53926
  }
53740
- function isCdata(item2) {
53741
- return typeof item2 === "object" && "cdata" in item2;
53927
+ function isCdata(item3) {
53928
+ return typeof item3 === "object" && "cdata" in item3;
53742
53929
  }
53743
- function renderCdata(item2) {
53744
- return `<![CDATA[${item2.cdata}]]>`;
53930
+ function renderCdata(item3) {
53931
+ return `<![CDATA[${item3.cdata}]]>`;
53745
53932
  }
53746
53933
  function renderXml(content, indent = 0, options2 = {}) {
53747
53934
  const lines = [];
53748
- for (const item2 of content) if (typeof item2 === "string") lines.push(escapeXml(item2));
53749
- else if (isCdata(item2)) lines.push(renderCdata(item2));
53750
- else lines.push(renderElement(item2, indent, options2));
53935
+ for (const item3 of content) if (typeof item3 === "string") lines.push(escapeXml(item3));
53936
+ else if (isCdata(item3)) lines.push(renderCdata(item3));
53937
+ else lines.push(renderElement(item3, indent, options2));
53751
53938
  return lines.join("");
53752
53939
  }
53753
53940
  function renderElement(el3, indent, options2) {
@@ -54016,12 +54203,12 @@ function serializeToXml(state2, registry2, options2 = {}) {
54016
54203
  if (!selectedBlockIds?.size) return items;
54017
54204
  const blockId2 = child.$?.blockId;
54018
54205
  if (!blockId2 || !selectedBlockIds.has(blockId2)) return items;
54019
- return items.map((item2) => {
54020
- if (typeof item2 === "string" || "cdata" in item2) return item2;
54206
+ return items.map((item3) => {
54207
+ if (typeof item3 === "string" || "cdata" in item3) return item3;
54021
54208
  return {
54022
- ...item2,
54209
+ ...item3,
54023
54210
  attrs: {
54024
- ...item2.attrs,
54211
+ ...item3.attrs,
54025
54212
  selected: "true"
54026
54213
  }
54027
54214
  };
@@ -57428,9 +57615,9 @@ function getAtomFeed(feedRoot) {
57428
57615
  const childs = feedRoot.children;
57429
57616
  const feed = {
57430
57617
  type: "atom",
57431
- items: getElementsByTagName("entry", childs).map((item2) => {
57618
+ items: getElementsByTagName("entry", childs).map((item3) => {
57432
57619
  var _a6;
57433
- const { children: children2 } = item2;
57620
+ const { children: children2 } = item3;
57434
57621
  const entry = { media: getMediaElements(children2) };
57435
57622
  addConditionally(entry, "id", "id", children2);
57436
57623
  addConditionally(entry, "title", "title", children2);
@@ -57469,8 +57656,8 @@ function getRssFeed(feedRoot) {
57469
57656
  const feed = {
57470
57657
  type: feedRoot.name.substr(0, 3),
57471
57658
  id: "",
57472
- items: getElementsByTagName("item", feedRoot.children).map((item2) => {
57473
- const { children: children2 } = item2;
57659
+ items: getElementsByTagName("item", feedRoot.children).map((item3) => {
57660
+ const { children: children2 } = item3;
57474
57661
  const entry = { media: getMediaElements(children2) };
57475
57662
  addConditionally(entry, "id", "guid", children2);
57476
57663
  addConditionally(entry, "title", "title", children2);
@@ -59677,8 +59864,8 @@ function getAtomFeed2(feedRoot) {
59677
59864
  const childs = feedRoot.children;
59678
59865
  const feed = {
59679
59866
  type: "atom",
59680
- items: getElementsByTagName2("entry", childs).map((item2) => {
59681
- const { children: children2 } = item2;
59867
+ items: getElementsByTagName2("entry", childs).map((item3) => {
59868
+ const { children: children2 } = item3;
59682
59869
  const entry = { media: getMediaElements2(children2) };
59683
59870
  addConditionally2(entry, "id", "id", children2);
59684
59871
  addConditionally2(entry, "title", "title", children2);
@@ -59716,8 +59903,8 @@ function getRssFeed2(feedRoot) {
59716
59903
  const feed = {
59717
59904
  type: feedRoot.name.substr(0, 3),
59718
59905
  id: "",
59719
- items: getElementsByTagName2("item", feedRoot.children).map((item2) => {
59720
- const { children: children2 } = item2;
59906
+ items: getElementsByTagName2("item", feedRoot.children).map((item3) => {
59907
+ const { children: children2 } = item3;
59721
59908
  const entry = { media: getMediaElements2(children2) };
59722
59909
  addConditionally2(entry, "id", "guid", children2);
59723
59910
  addConditionally2(entry, "title", "title", children2);
@@ -61810,9 +61997,9 @@ var NamedNodeMap = class extends Array {
61810
61997
  this.unshift(attr);
61811
61998
  }
61812
61999
  removeNamedItem(name) {
61813
- const item2 = this.getNamedItem(name);
62000
+ const item3 = this.getNamedItem(name);
61814
62001
  this.ownerElement.removeAttribute(name);
61815
- this.splice(this.indexOf(item2), 1);
62002
+ this.splice(this.indexOf(item3), 1);
61816
62003
  }
61817
62004
  item(index) {
61818
62005
  return index < this.length ? this[index] : null;
@@ -64872,63 +65059,57 @@ function registerRef(registry2) {
64872
65059
  const previous = registry2.getReader(CARRIER);
64873
65060
  registry2.registerReader(CARRIER, (el3, ctx) => {
64874
65061
  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
- };
65062
+ const target = {};
65063
+ for (const name of [...REF_KIND_NAMES, "to", ...REF_SUB_TARGETS]) {
65064
+ const value = el3.getAttribute(name);
65065
+ if (value !== null) target[name] = value;
65066
+ }
65067
+ target.label = el3.textContent ?? void 0;
65068
+ return { type: "ref", version: 1, ...refTarget(target) };
64890
65069
  });
64891
65070
  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
- };
65071
+ const ref = refTarget(node);
65072
+ const attrs = { [MARK3]: "1" };
65073
+ for (const name of [...REF_KIND_NAMES, "to", ...REF_SUB_TARGETS]) {
65074
+ const value = ref[name];
65075
+ if (value !== void 0) attrs[name] = value;
65076
+ }
64903
65077
  if (!ref.label) return { tag: CARRIER, attrs, selfClosing: true };
64904
65078
  return { tag: CARRIER, attrs, children: [ref.label] };
64905
65079
  });
64906
65080
  }
65081
+ var NOUN = {
65082
+ document: "a document",
65083
+ artboard: "an artboard",
65084
+ whiteboard: "a whiteboard",
65085
+ html: "an html page"
65086
+ };
65087
+ var NEEDS = ["artboard", "whiteboard", "document", "html"];
65088
+ var either = (items) => items.length === 1 ? items[0] : `${items.slice(0, -1).join(", ")} or ${items.at(-1)}`;
64907
65089
  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`;
65090
+ const kinds2 = refKinds(ref);
65091
+ if (kinds2.length > 1)
65092
+ return `<ref> names one target: either ${either(kinds2.map((kind2) => NOUN[kind2]))}, not both`;
65093
+ const kind = kinds2[0];
65094
+ if (!kind)
65095
+ return `<ref> needs ${either(NEEDS.map((name) => NOUN[name]))}: the slug of one in this project`;
65096
+ const slug = ref[kind] ?? "";
65097
+ const at7 = `<ref ${kind}="${slug}">`;
65098
+ if (!isArtifactId(slug))
65099
+ return `${at7} is not ${NOUN[kind].replace(/ page$/, "")} slug: lowercase letters, digits and hyphens`;
65100
+ const allowed = artifactKind(kind)?.subTargets ?? [];
65101
+ const named3 = REF_SUB_TARGETS.filter((sub2) => ref[sub2] !== void 0);
65102
+ for (const sub2 of named3) {
65103
+ if (allowed.includes(sub2)) continue;
65104
+ const owners = ARTIFACT_KINDS.filter(
65105
+ (each) => each.subTargets.includes(sub2)
65106
+ ).map((each) => each.type);
65107
+ const takes = allowed.length ? `${NOUN[kind]} reference takes ${either(allowed)}` : `${NOUN[kind]} reference takes no sub-target`;
65108
+ return `${at7} has no ${sub2}: ${sub2} belongs to ${either(owners)} references; ${takes}`;
65109
+ }
65110
+ if (named3.length > 1) return `${at7} names either a ${named3[0]} or a ${named3[1]}, not both`;
65111
+ if (ref.page !== void 0 && !isPageId(ref.page))
65112
+ return `<ref ${kind}="${slug}" page="${ref.page}"> is not a page id: lowercase letters, digits and hyphens`;
64932
65113
  return null;
64933
65114
  }
64934
65115
  function badRefs(state2) {
@@ -66225,31 +66406,31 @@ function injectRuntime(html, options2 = {}) {
66225
66406
  }
66226
66407
 
66227
66408
  // 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);
66409
+ var import_node_fs20 = __toESM(require("node:fs"), 1);
66410
+ var import_node_path17 = __toESM(require("node:path"), 1);
66230
66411
  var readText = (file) => {
66231
66412
  try {
66232
- return import_node_fs19.default.readFileSync(file, "utf8");
66413
+ return import_node_fs20.default.readFileSync(file, "utf8");
66233
66414
  } catch {
66234
66415
  return null;
66235
66416
  }
66236
66417
  };
66237
66418
  function pageFilesIn(dir) {
66238
66419
  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();
66420
+ 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
66421
  } catch {
66241
66422
  return [];
66242
66423
  }
66243
66424
  }
66244
66425
  function readBoardIndex(dir) {
66245
66426
  const { pages } = normalizePages(
66246
- parsePages(readText(import_node_path16.default.join(dir, PAGES_FILE))).pages,
66427
+ parsePages(readText(import_node_path17.default.join(dir, PAGES_FILE))).pages,
66247
66428
  pageFilesIn(dir)
66248
66429
  );
66249
66430
  const frames = {};
66250
66431
  const scenes = {};
66251
66432
  for (const page of pages) {
66252
- const text5 = readText(import_node_path16.default.join(dir, pageFileOf(page.id)));
66433
+ const text5 = readText(import_node_path17.default.join(dir, pageFileOf(page.id)));
66253
66434
  const parsed = text5 === null ? null : parseScene(text5);
66254
66435
  if (!parsed || "error" in parsed) continue;
66255
66436
  scenes[page.id] = parsed.scene;
@@ -66279,11 +66460,11 @@ function publishPayload(ref, dir, title, payload, comments = emptyComments()) {
66279
66460
  if (ref.type === "document")
66280
66461
  return {
66281
66462
  title,
66282
- state: parseDocument2(import_node_fs20.default.readFileSync(import_node_path17.default.join(dir, "doc.xml"), "utf8")),
66463
+ state: parseDocument2(import_node_fs21.default.readFileSync(import_node_path18.default.join(dir, "doc.xml"), "utf8")),
66283
66464
  comments: sharedComments(comments)
66284
66465
  };
66285
66466
  if (ref.type === "whiteboard") {
66286
- const parsed = parseScene(import_node_fs20.default.readFileSync(import_node_path17.default.join(dir, "scene.excalidraw"), "utf8"));
66467
+ const parsed = parseScene(import_node_fs21.default.readFileSync(import_node_path18.default.join(dir, "scene.excalidraw"), "utf8"));
66287
66468
  if ("error" in parsed) throw new Error(parsed.error);
66288
66469
  const pages = livePages(readBoardIndex(dir).pages);
66289
66470
  return {
@@ -66317,12 +66498,12 @@ function withCloudRuntime(type, files) {
66317
66498
  }
66318
66499
 
66319
66500
  // 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");
66501
+ var import_node_fs22 = __toESM(require("node:fs"), 1);
66502
+ var import_node_path19 = __toESM(require("node:path"), 1);
66503
+ var settingsFileFor = (credentialsFile2) => import_node_path19.default.join(import_node_path19.default.dirname(credentialsFile2), "config.json");
66323
66504
  function readSettings(file) {
66324
66505
  try {
66325
- const raw = JSON.parse(import_node_fs21.default.readFileSync(file, "utf8"));
66506
+ const raw = JSON.parse(import_node_fs22.default.readFileSync(file, "utf8"));
66326
66507
  return typeof raw === "object" && raw !== null && !Array.isArray(raw) ? raw : {};
66327
66508
  } catch {
66328
66509
  return {};
@@ -66333,7 +66514,7 @@ function readGlobalAutoPublish(file) {
66333
66514
  return typeof value === "boolean" ? value : void 0;
66334
66515
  }
66335
66516
  function writeGlobalAutoPublish(file, value) {
66336
- import_node_fs21.default.mkdirSync(import_node_path18.default.dirname(file), { recursive: true, mode: 448 });
66517
+ import_node_fs22.default.mkdirSync(import_node_path19.default.dirname(file), { recursive: true, mode: 448 });
66337
66518
  writeJsonAtomic(file, { ...readSettings(file), autoPublish: value });
66338
66519
  }
66339
66520
  function postponeGlobalAutoPublish(file) {
@@ -66342,7 +66523,7 @@ function postponeGlobalAutoPublish(file) {
66342
66523
  writeGlobalAutoPublish(file, false);
66343
66524
  return "off";
66344
66525
  }
66345
- import_node_fs21.default.mkdirSync(import_node_path18.default.dirname(file), { recursive: true, mode: 448 });
66526
+ import_node_fs22.default.mkdirSync(import_node_path19.default.dirname(file), { recursive: true, mode: 448 });
66346
66527
  writeJsonAtomic(file, { ...settings, autoPublishPostponed: true });
66347
66528
  return "postponed";
66348
66529
  }
@@ -66362,7 +66543,7 @@ var CALLBACK_TICKET_TTL_MS = 30 * 60 * 1e3;
66362
66543
  var UPLOAD_CONCURRENCY = 6;
66363
66544
  var MAX_JSON_BODY = 4096;
66364
66545
  var CLOUD_ID = /^[\w-]{1,64}$/;
66365
- var ROUTE = /^\/api\/cloud\/(status|login|logout|artifacts|publish|publication|reserve|visibility|auto-publish|sync)(?:\/([^/]+)(?:\/([^/]+))?)?$/;
66546
+ var ROUTE = /^\/api\/cloud\/(status|login|logout|artifacts|publish|publish-refs|publish-referrers|publication|refs|reserve|visibility|auto-publish|sync)(?:\/([^/]+)(?:\/([^/]+))?)?$/;
66366
66547
  var SignedOut = class extends Error {
66367
66548
  };
66368
66549
  var CloudRefused = class extends Error {
@@ -66479,7 +66660,7 @@ function createCloudRoutes(options2) {
66479
66660
  const challenge = import_node_crypto10.default.createHash("sha256").update(verifier).digest("base64url");
66480
66661
  return `${origin}/auth/cli?port=${options2.port()}&state=${state2}&challenge=${challenge}`;
66481
66662
  };
66482
- const cloudFetch = async (method, path44, body) => {
66663
+ const cloudFetch = async (method, path45, body) => {
66483
66664
  const credentials = readCredentials(credentialsFile2, origin);
66484
66665
  if (!credentials) throw new SignedOut();
66485
66666
  const headers = { Authorization: `Bearer ${credentials.token}` };
@@ -66493,7 +66674,7 @@ function createCloudRoutes(options2) {
66493
66674
  }
66494
66675
  let res;
66495
66676
  try {
66496
- res = await fetch(`${origin}${path44}`, { method, headers, body: payload });
66677
+ res = await fetch(`${origin}${path45}`, { method, headers, body: payload });
66497
66678
  } catch (err) {
66498
66679
  throw new CloudRefused(502, `could not reach ${origin}: ${err.message}`);
66499
66680
  }
@@ -66522,21 +66703,6 @@ function createCloudRoutes(options2) {
66522
66703
  return res;
66523
66704
  };
66524
66705
  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
66706
  const publications = /* @__PURE__ */ new Map();
66541
66707
  const changedDuringPublish = /* @__PURE__ */ new Set();
66542
66708
  const snapshot2 = (key2) => ({
@@ -66629,7 +66795,7 @@ function createCloudRoutes(options2) {
66629
66795
  const content = {
66630
66796
  title: inspected.title,
66631
66797
  payload: inspected.payload,
66632
- files: hashed.map(({ path: path44, hash: hash2 }) => ({ path: path44, hash: hash2 }))
66798
+ files: hashed.map(({ path: path45, hash: hash2 }) => ({ path: path45, hash: hash2 }))
66633
66799
  };
66634
66800
  const fingerprint = sha(
66635
66801
  JSON.stringify({
@@ -66840,6 +67006,182 @@ function createCloudRoutes(options2) {
66840
67006
  return { kind: "failed", message: err.message };
66841
67007
  }
66842
67008
  };
67009
+ const cascadeStatus = async (key2) => {
67010
+ const ref = artifactKeyOf(key2);
67011
+ const inspected = ref && await options2.inspect(ref);
67012
+ if (!ref || !inspected) return null;
67013
+ const entry = artifactEntry(key2);
67014
+ const published = !!entry.cloud?.publishedAt;
67015
+ let blocked = null;
67016
+ let fingerprint = null;
67017
+ try {
67018
+ const prepared = await prepare(ref);
67019
+ if (prepared.ready) fingerprint = prepared.fingerprint;
67020
+ else blocked = prepared.reasons.join("; ");
67021
+ } catch (err) {
67022
+ if (err instanceof SignedOut) throw err;
67023
+ blocked = err.message.replace(/^cloud refused \(\d+\): /, "");
67024
+ }
67025
+ return {
67026
+ title: inspected.title,
67027
+ published,
67028
+ withdrawn: !entry.cloud && entry.autoPublish === false,
67029
+ stale: published && fingerprint !== null && fingerprint !== entry.cloud?.fingerprint,
67030
+ visibility: published ? entry.cloud?.visibility ?? publishState(entry).visibility : null,
67031
+ blocked
67032
+ };
67033
+ };
67034
+ const cascadeOf = (ref, visibility) => buildCascade(`${ref.type}/${ref.id}`, visibility, {
67035
+ referencesOf: (key2) => {
67036
+ const each = artifactKeyOf(key2);
67037
+ return each ? options2.references?.(each) ?? [] : [];
67038
+ },
67039
+ statusOf: cascadeStatus
67040
+ });
67041
+ const cloudReferrers = async (cloudId) => {
67042
+ try {
67043
+ const res = await cloudFetch("GET", `/api/a/${cloudId}/refs`);
67044
+ if (!res.ok) return null;
67045
+ const body = await res.json();
67046
+ return Array.isArray(body.referrers) ? body.referrers : null;
67047
+ } catch {
67048
+ return null;
67049
+ }
67050
+ };
67051
+ const referrersOf2 = async (ref) => {
67052
+ const local = [];
67053
+ for (const { key: key2, uses } of options2.referrers?.(ref) ?? []) {
67054
+ const status = await cascadeStatus(key2);
67055
+ if (status) local.push({ key: key2, uses, status, cloudId: artifactEntry(key2).cloud?.id ?? null });
67056
+ }
67057
+ const root = artifactEntry(`${ref.type}/${ref.id}`).cloud;
67058
+ const cloud = root?.publishedAt ? await cloudReferrers(root.id) : null;
67059
+ const cloudUnavailable = !!root?.publishedAt && cloud === null;
67060
+ return {
67061
+ referrers: mergeReferrers({ cloud, local }),
67062
+ ...cloudUnavailable ? { cloudUnavailable: true } : {}
67063
+ };
67064
+ };
67065
+ const publishReferrers = async (ref, publishKeys, makePublic) => {
67066
+ const rootKey = `${ref.type}/${ref.id}`;
67067
+ const root = artifactEntry(rootKey);
67068
+ if (!root.cloud?.publishedAt || publishState(root).visibility !== "public")
67069
+ throw new CloudRefused(400, `${rootKey} is not public`);
67070
+ const { referrers } = await referrersOf2(ref);
67071
+ const known = new Map(referrers.map((item3) => [item3.artifact, item3]));
67072
+ for (const key2 of makePublic)
67073
+ if (known.get(key2)?.state !== "private")
67074
+ throw new CloudRefused(400, `${key2} is not a private document that references ${rootKey}`);
67075
+ for (const key2 of publishKeys) {
67076
+ const state2 = known.get(key2)?.state;
67077
+ if (state2 !== "unpublished" && state2 !== "unlinked")
67078
+ throw new CloudRefused(400, `${key2} is not a document ${rootKey} can publish`);
67079
+ }
67080
+ const results = [];
67081
+ for (const key2 of [...makePublic, ...publishKeys]) {
67082
+ const item3 = known.get(key2);
67083
+ const action = makePublic.includes(key2) ? "make-public" : item3.state === "unlinked" ? "update" : "publish";
67084
+ try {
67085
+ if (!artifactKeyOf(key2)) {
67086
+ await expectOk(
67087
+ await cloudFetch("PATCH", `/api/artifacts/${item3.cloudId}`, { visibility: "public" })
67088
+ );
67089
+ } else
67090
+ await serialized(key2, async () => {
67091
+ const target = artifactKeyOf(key2);
67092
+ if (action === "make-public") {
67093
+ await setVisibility(target, "public");
67094
+ if (!item3.needsUpdate) return;
67095
+ }
67096
+ const result = await publish(target, "public");
67097
+ if (result.status !== 200)
67098
+ throw new CloudRefused(
67099
+ 409,
67100
+ (result.body.reasons ?? []).join("; ") || "not ready to publish"
67101
+ );
67102
+ updateArtifactConfig(configFile, key2, { autoPublish: null });
67103
+ });
67104
+ results.push({ artifact: key2, action, status: "published" });
67105
+ } catch (err) {
67106
+ if (err instanceof SignedOut) throw err;
67107
+ const httpStatus = err instanceof CloudRefused ? err.status : void 0;
67108
+ results.push({
67109
+ artifact: key2,
67110
+ action,
67111
+ status: httpStatus !== void 0 && httpStatus < 500 ? "failed" : "unknown",
67112
+ error: {
67113
+ error: err.message.replace(/^cloud refused \(\d+\): /, ""),
67114
+ ...httpStatus === void 0 ? {} : { httpStatus }
67115
+ }
67116
+ });
67117
+ }
67118
+ }
67119
+ return { results };
67120
+ };
67121
+ const publishRefs = async (ref, refs3, makePublic, requested) => {
67122
+ const rootKey = `${ref.type}/${ref.id}`;
67123
+ const visibility = requested ?? publishState(artifactEntry(rootKey)).visibility;
67124
+ const listed = await cascadeOf(ref, visibility);
67125
+ const overrides = Object.fromEntries(
67126
+ listed.map((item3) => [item3.artifact, false])
67127
+ );
67128
+ for (const key2 of [...refs3, ...makePublic]) overrides[key2] = true;
67129
+ const items = resolveSelection(listed, overrides);
67130
+ const known = new Map(items.map((item3) => [item3.artifact, item3]));
67131
+ for (const key2 of [...refs3, ...makePublic]) {
67132
+ const item3 = known.get(key2);
67133
+ if (!item3?.selectable)
67134
+ throw new CloudRefused(400, `${key2} is not a reference ${rootKey} can publish`);
67135
+ if (makePublic.includes(key2) !== (item3.state === "private"))
67136
+ throw new CloudRefused(
67137
+ 400,
67138
+ item3.state === "private" ? `${key2} is private: list it in makePublic` : `${key2} is not private: list it in refs`
67139
+ );
67140
+ }
67141
+ const results = [];
67142
+ let stopped = false;
67143
+ for (const item3 of items.filter((each) => each.checked)) {
67144
+ const action = item3.state === "private" ? "make-public" : item3.state === "stale" ? "update" : "publish";
67145
+ if (stopped) {
67146
+ results.push({ artifact: item3.artifact, action, status: "not_attempted" });
67147
+ continue;
67148
+ }
67149
+ const target = artifactKeyOf(item3.artifact);
67150
+ try {
67151
+ await serialized(item3.artifact, async () => {
67152
+ if (action === "make-public") {
67153
+ await setVisibility(target, "public");
67154
+ if (!item3.changed) return;
67155
+ }
67156
+ const result = await publish(target, action === "publish" ? visibility : void 0, {
67157
+ skipUnchanged: true
67158
+ });
67159
+ if (result.status !== 200)
67160
+ throw new CloudRefused(
67161
+ 409,
67162
+ (result.body.reasons ?? []).join("; ") || "not ready to publish"
67163
+ );
67164
+ updateArtifactConfig(configFile, item3.artifact, { autoPublish: null });
67165
+ });
67166
+ results.push({ artifact: item3.artifact, action, status: "published" });
67167
+ } catch (err) {
67168
+ if (err instanceof SignedOut) throw err;
67169
+ const httpStatus = err instanceof CloudRefused ? err.status : void 0;
67170
+ results.push({
67171
+ artifact: item3.artifact,
67172
+ action,
67173
+ status: httpStatus !== void 0 && httpStatus < 500 ? "failed" : "unknown",
67174
+ error: {
67175
+ error: err.message.replace(/^cloud refused \(\d+\): /, ""),
67176
+ ...err instanceof CloudRefused ? err.details : {},
67177
+ ...httpStatus === void 0 ? {} : { httpStatus }
67178
+ }
67179
+ });
67180
+ stopped = true;
67181
+ }
67182
+ }
67183
+ return { status: stopped ? "partial" : "published", results };
67184
+ };
66843
67185
  const route = async (req, res, match) => {
66844
67186
  const [, action, first, second2] = match;
66845
67187
  const method = req.method ?? "GET";
@@ -66877,9 +67219,7 @@ function createCloudRoutes(options2) {
66877
67219
  if (action === "artifacts" && method === "GET" && !first) {
66878
67220
  const query2 = new URL(req.url ?? "/", "http://localhost").searchParams;
66879
67221
  query2.delete("key");
66880
- const listed = await (await expectOk(
66881
- await cloudFetch("GET", `/api/artifacts${query2.size ? `?${query2}` : ""}`)
66882
- )).json();
67222
+ const listed = await (await expectOk(await cloudFetch("GET", `/api/artifacts${query2.size ? `?${query2}` : ""}`))).json();
66883
67223
  adoptCloudVisibility(listed.artifacts);
66884
67224
  sendJson(res, 200, listed);
66885
67225
  return;
@@ -66901,12 +67241,38 @@ function createCloudRoutes(options2) {
66901
67241
  if (published.status === 200) updateArtifactConfig(configFile, key2, { autoPublish: null });
66902
67242
  return published;
66903
67243
  });
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
- );
67244
+ sendJson(res, result.status, result.body);
67245
+ return;
67246
+ }
67247
+ if (action === "refs" && ref && method === "GET") {
67248
+ const query2 = new URL(req.url ?? "/", "http://hub").searchParams;
67249
+ const requested = query2.get("visibility");
67250
+ if (requested !== null && !isVisibility(requested))
67251
+ throw new CloudRefused(400, 'visibility must be "public" or "private"');
67252
+ const visibility = requested ?? publishState(artifactEntry(`${ref.type}/${ref.id}`)).visibility;
67253
+ sendJson(res, 200, {
67254
+ visibility,
67255
+ items: await cascadeOf(ref, visibility),
67256
+ ...query2.get("referrers") === "0" ? {} : await referrersOf2(ref)
67257
+ });
67258
+ return;
67259
+ }
67260
+ if (action === "publish-referrers" && ref && method === "POST") {
67261
+ const body = await readJsonBody(req);
67262
+ const list2 = (value) => Array.isArray(value) ? value.filter((each) => typeof each === "string") : [];
67263
+ sendJson(res, 200, await publishReferrers(ref, list2(body?.publish), list2(body?.makePublic)));
67264
+ return;
67265
+ }
67266
+ if (action === "publish-refs" && ref && method === "POST") {
67267
+ const body = await readJsonBody(req);
67268
+ if (body?.visibility !== void 0 && !isVisibility(body.visibility))
67269
+ throw new CloudRefused(400, 'visibility must be "public" or "private"');
67270
+ const list2 = (value) => Array.isArray(value) && value.every((each) => typeof each === "string") ? value : null;
67271
+ const refs3 = list2(body?.refs ?? []);
67272
+ const makePublic = list2(body?.makePublic ?? []);
67273
+ if (!refs3 || !makePublic)
67274
+ throw new CloudRefused(400, "refs and makePublic must be lists of <type>/<id>");
67275
+ sendJson(res, 200, await publishRefs(ref, refs3, makePublic, body?.visibility));
66910
67276
  return;
66911
67277
  }
66912
67278
  if (action === "sync" && ref && method === "GET") {
@@ -67040,6 +67406,22 @@ function createCloudRoutes(options2) {
67040
67406
  }
67041
67407
  return snapshot2(key2);
67042
67408
  },
67409
+ async cascade(key2, visibility) {
67410
+ const ref = artifactKeyOf(key2);
67411
+ if (!ref) throw new CloudRefused(404, "artifact not found");
67412
+ const shown = visibility ?? publishState(artifactEntry(key2)).visibility;
67413
+ return { visibility: shown, items: await cascadeOf(ref, shown), ...await referrersOf2(ref) };
67414
+ },
67415
+ publishRefsNow(key2, refs3, makePublic, visibility) {
67416
+ const ref = artifactKeyOf(key2);
67417
+ if (!ref) throw new CloudRefused(404, "artifact not found");
67418
+ return publishRefs(ref, refs3, makePublic, visibility);
67419
+ },
67420
+ publishReferrersNow(key2, publishKeys, makePublic) {
67421
+ const ref = artifactKeyOf(key2);
67422
+ if (!ref) throw new CloudRefused(404, "artifact not found");
67423
+ return publishReferrers(ref, publishKeys, makePublic);
67424
+ },
67043
67425
  autoPublishEnabled: () => autoPublishState().enabled,
67044
67426
  token: () => readCredentials(credentialsFile2, origin)?.token ?? null,
67045
67427
  async handle(req, res, match) {
@@ -67063,7 +67445,7 @@ function createCloudRoutes(options2) {
67063
67445
 
67064
67446
  // src/server/comment-names.ts
67065
67447
  var import_node_child_process2 = require("node:child_process");
67066
- var import_node_fs22 = __toESM(require("node:fs"), 1);
67448
+ var import_node_fs23 = __toESM(require("node:fs"), 1);
67067
67449
 
67068
67450
  // src/server/agent.ts
67069
67451
  var NAMES = {
@@ -67156,7 +67538,7 @@ function commentNames({ agentFile, projectDir, cloud }) {
67156
67538
  agent: () => {
67157
67539
  try {
67158
67540
  return detectAgent(
67159
- JSON.parse(import_node_fs22.default.readFileSync(agentFile, "utf8"))
67541
+ JSON.parse(import_node_fs23.default.readFileSync(agentFile, "utf8"))
67160
67542
  );
67161
67543
  } catch {
67162
67544
  return void 0;
@@ -67236,28 +67618,28 @@ function createDirectRelay(options2) {
67236
67618
  }
67237
67619
 
67238
67620
  // src/server/document.ts
67239
- var import_node_fs24 = __toESM(require("node:fs"), 1);
67240
- var import_node_path20 = __toESM(require("node:path"), 1);
67621
+ var import_node_fs25 = __toESM(require("node:fs"), 1);
67622
+ var import_node_path21 = __toESM(require("node:path"), 1);
67241
67623
 
67242
67624
  // src/server/html.ts
67243
- var import_node_fs23 = __toESM(require("node:fs"), 1);
67244
- var import_node_path19 = __toESM(require("node:path"), 1);
67625
+ var import_node_fs24 = __toESM(require("node:fs"), 1);
67626
+ var import_node_path20 = __toESM(require("node:path"), 1);
67245
67627
  var TITLE = /<title[^>]*>([\s\S]*?)<\/title>/i;
67246
67628
  function latestMtime(dir) {
67247
67629
  let latest2 = 0;
67248
67630
  let entries2;
67249
67631
  try {
67250
- entries2 = import_node_fs23.default.readdirSync(dir, { withFileTypes: true });
67632
+ entries2 = import_node_fs24.default.readdirSync(dir, { withFileTypes: true });
67251
67633
  } catch {
67252
67634
  return latest2;
67253
67635
  }
67254
67636
  for (const entry of entries2) {
67255
67637
  if (entry.name.startsWith(".")) continue;
67256
- const full = import_node_path19.default.join(dir, entry.name);
67638
+ const full = import_node_path20.default.join(dir, entry.name);
67257
67639
  try {
67258
67640
  latest2 = Math.max(
67259
67641
  latest2,
67260
- entry.isDirectory() ? latestMtime(full) : import_node_fs23.default.statSync(full).mtimeMs
67642
+ entry.isDirectory() ? latestMtime(full) : import_node_fs24.default.statSync(full).mtimeMs
67261
67643
  );
67262
67644
  } catch {
67263
67645
  continue;
@@ -67268,7 +67650,7 @@ function latestMtime(dir) {
67268
67650
  function readHtml(dir, id3) {
67269
67651
  let source;
67270
67652
  try {
67271
- source = import_node_fs23.default.readFileSync(import_node_path19.default.join(dir, ENTRY_FILE.html), "utf8");
67653
+ source = import_node_fs24.default.readFileSync(import_node_path20.default.join(dir, ENTRY_FILE.html), "utf8");
67272
67654
  } catch {
67273
67655
  return { title: id3, warnings: ["index.html not found"], version: latestMtime(dir) };
67274
67656
  }
@@ -67281,7 +67663,7 @@ var FIRST_HEADING = /<h[1-6]\b[^>]*>([\s\S]*?)<\/h[1-6]>/i;
67281
67663
  function readDocument(dir, id3) {
67282
67664
  let source;
67283
67665
  try {
67284
- source = import_node_fs24.default.readFileSync(import_node_path20.default.join(dir, ENTRY_FILE.document), "utf8");
67666
+ source = import_node_fs25.default.readFileSync(import_node_path21.default.join(dir, ENTRY_FILE.document), "utf8");
67285
67667
  } catch {
67286
67668
  return { title: id3, warnings: ["doc.xml not found"], version: latestMtime(dir) };
67287
67669
  }
@@ -67290,17 +67672,17 @@ function readDocument(dir, id3) {
67290
67672
  }
67291
67673
 
67292
67674
  // src/server/documents.ts
67293
- var import_node_fs27 = __toESM(require("node:fs"), 1);
67294
- var import_node_path24 = __toESM(require("node:path"), 1);
67675
+ var import_node_fs28 = __toESM(require("node:fs"), 1);
67676
+ var import_node_path25 = __toESM(require("node:path"), 1);
67295
67677
 
67296
67678
  // 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");
67679
+ var import_node_fs26 = __toESM(require("node:fs"), 1);
67680
+ var import_node_path22 = __toESM(require("node:path"), 1);
67681
+ var cursorsFile2 = (stateDir, id3) => import_node_path22.default.join(stateDir, "document", id3, "change-cursors.json");
67300
67682
  var isOpId = (value) => typeof value === "object" && value !== null && typeof value.peer === "string" && Number.isInteger(value.counter);
67301
67683
  function read2(file) {
67302
67684
  try {
67303
- const value = JSON.parse(import_node_fs25.default.readFileSync(file, "utf8"));
67685
+ const value = JSON.parse(import_node_fs26.default.readFileSync(file, "utf8"));
67304
67686
  if (typeof value !== "object" || value === null || Array.isArray(value)) return {};
67305
67687
  return Object.fromEntries(
67306
67688
  Object.entries(value).filter(
@@ -67322,8 +67704,8 @@ function createChangeCursors(stateDir) {
67322
67704
  }
67323
67705
 
67324
67706
  // 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);
67707
+ var import_node_fs27 = __toESM(require("node:fs"), 1);
67708
+ var import_node_path23 = __toESM(require("node:path"), 1);
67327
67709
  var blockOf = (asks, ask) => asks.find((a5) => a5.id === ask)?.blockId ?? "*";
67328
67710
  function humanAskOp(asks, threads2, op3) {
67329
67711
  if (op3.op !== "create") {
@@ -67368,8 +67750,8 @@ function askListing(asks, threads2) {
67368
67750
  };
67369
67751
  }
67370
67752
  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;
67753
+ const file = import_node_path23.default.join(stateDir, "document", id3, "asks.json");
67754
+ if (!asks.length && !import_node_fs27.default.existsSync(file)) return;
67373
67755
  const latest2 = latestSubmission(threads2);
67374
67756
  writeJsonAtomic(file, {
67375
67757
  latest: latest2 ? { id: latest2.id, at: latest2.at, withdrawn: latest2.withdrawn } : null
@@ -68730,19 +69112,19 @@ var ElementDOMSlot = class _ElementDOMSlot extends DOMSlot {
68730
69112
  }
68731
69113
  };
68732
69114
  function indexPath(root, child) {
68733
- const path44 = [];
69115
+ const path45 = [];
68734
69116
  let node = child;
68735
69117
  for (; node !== root && node !== null; node = node.parentNode) {
68736
69118
  let i7 = 0;
68737
69119
  for (let sibling = node.previousSibling; sibling !== null; sibling = sibling.previousSibling) {
68738
69120
  i7++;
68739
69121
  }
68740
- path44.push(i7);
69122
+ path45.push(i7);
68741
69123
  }
68742
69124
  if (!(node === root)) {
68743
69125
  formatDevErrorMessage(`indexPath: root is not a parent of child`);
68744
69126
  }
68745
- return path44.reverse();
69127
+ return path45.reverse();
68746
69128
  }
68747
69129
  var TEXT_MUTATION_VARIANCE = 100;
68748
69130
  var isProcessingMutations = false;
@@ -69631,8 +70013,8 @@ function rawValue() {
69631
70013
  );
69632
70014
  }
69633
70015
  // @__NO_SIDE_EFFECTS__
69634
- function arrayValue(item2) {
69635
- undeclared("arrayValue", item2);
70016
+ function arrayValue(item3) {
70017
+ undeclared("arrayValue", item3);
69636
70018
  return makeSchema(
69637
70019
  (value) => {
69638
70020
  if (!Array.isArray(value)) {
@@ -69640,12 +70022,12 @@ function arrayValue(item2) {
69640
70022
  }
69641
70023
  const result = new Array(value.length);
69642
70024
  for (let i7 = 0; i7 < value.length; i7++) {
69643
- result[i7] = item2(value[i7]);
70025
+ result[i7] = item3(value[i7]);
69644
70026
  }
69645
70027
  return result;
69646
70028
  },
69647
70029
  {
69648
- item: item2,
70030
+ item: item3,
69649
70031
  kind: "array"
69650
70032
  },
69651
70033
  void 0,
@@ -69661,7 +70043,7 @@ function arrayValue(item2) {
69661
70043
  return false;
69662
70044
  }
69663
70045
  for (let i7 = 0; i7 < a5.length; i7++) {
69664
- if (!isSchemaEqual(item2, a5[i7], b6[i7])) {
70046
+ if (!isSchemaEqual(item3, a5[i7], b6[i7])) {
69665
70047
  return false;
69666
70048
  }
69667
70049
  }
@@ -69697,10 +70079,10 @@ function arrayValue(item2) {
69697
70079
  );
69698
70080
  }
69699
70081
  // @__NO_SIDE_EFFECTS__
69700
- function arraySetValue(item2) {
69701
- undeclared("arraySetValue", item2);
70082
+ function arraySetValue(item3) {
70083
+ undeclared("arraySetValue", item3);
69702
70084
  {
69703
- if (!(typeof item2.defaultValue === "string")) {
70085
+ if (!(typeof item3.defaultValue === "string")) {
69704
70086
  formatDevErrorMessage(`arraySetValue: the item schema must produce strings`);
69705
70087
  }
69706
70088
  }
@@ -69708,14 +70090,14 @@ function arraySetValue(item2) {
69708
70090
  if (!Array.isArray(value)) {
69709
70091
  return Object.freeze([]);
69710
70092
  }
69711
- if (Object.isFrozen(value) && $isCanonicalSet(item2, value)) {
70093
+ if (Object.isFrozen(value) && $isCanonicalSet(item3, value)) {
69712
70094
  return value;
69713
70095
  }
69714
70096
  const members = [];
69715
70097
  for (let i7 = 0; i7 < value.length; i7++) {
69716
70098
  const member = value[i7];
69717
- if (member !== void 0 && $acceptsValue(item2, member)) {
69718
- members.push(item2(member));
70099
+ if (member !== void 0 && $acceptsValue(item3, member)) {
70100
+ members.push(item3(member));
69719
70101
  }
69720
70102
  }
69721
70103
  members.sort();
@@ -69727,14 +70109,14 @@ function arraySetValue(item2) {
69727
70109
  }
69728
70110
  return Object.freeze(result);
69729
70111
  }, {
69730
- item: item2,
70112
+ item: item3,
69731
70113
  kind: "set"
69732
70114
  }, void 0, isArraySetEqual, (value) => Array.isArray(value));
69733
70115
  }
69734
- function $isCanonicalSet(item2, value) {
70116
+ function $isCanonicalSet(item3, value) {
69735
70117
  for (let i7 = 0; i7 < value.length; i7++) {
69736
70118
  const member = value[i7];
69737
- if (typeof member !== "string" || i7 > 0 && !(value[i7 - 1] < member) || !$acceptsValue(item2, member) || item2(member) !== member) {
70119
+ if (typeof member !== "string" || i7 > 0 && !(value[i7 - 1] < member) || !$acceptsValue(item3, member) || item3(member) !== member) {
69738
70120
  return false;
69739
70121
  }
69740
70122
  }
@@ -72947,8 +73329,8 @@ function mergingChildNotInline(klass, children2) {
72947
73329
  if (entry === "inline") {
72948
73330
  continue;
72949
73331
  }
72950
- const item2 = declaredChildren(entry);
72951
- const ok = item2 === "inline" || Array.isArray(item2) && item2.includes("inline") && item2.every((e5) => e5 === "inline" || e5 === klass || klass.prototype instanceof e5);
73332
+ const item3 = declaredChildren(entry);
73333
+ const ok = item3 === "inline" || Array.isArray(item3) && item3.includes("inline") && item3.every((e5) => e5 === "inline" || e5 === klass || klass.prototype instanceof e5);
72952
73334
  if (!ok) {
72953
73335
  return entry;
72954
73336
  }
@@ -74016,9 +74398,9 @@ function validateNodeStructure(klass) {
74016
74398
  formatDevErrorMessage(`${name}: mergeAdjacent.by names the derived NodeState ${invalid.entry}`);
74017
74399
  }
74018
74400
  }
74019
- const item2 = mergingChildNotInline(klass, declared.children);
74020
- if (!(item2 === null)) {
74021
- formatDevErrorMessage(`${name}: a merging class that lists child classes must list classes that hold inline content (${item2 === null ? "" : item2.name} does not)`);
74401
+ const item3 = mergingChildNotInline(klass, declared.children);
74402
+ if (!(item3 === null)) {
74403
+ formatDevErrorMessage(`${name}: a merging class that lists child classes must list classes that hold inline content (${item3 === null ? "" : item3.name} does not)`);
74022
74404
  }
74023
74405
  }
74024
74406
  if (declared.inline !== void 0 && declared.declaredBy.inline === klass) {
@@ -78102,9 +78484,9 @@ function getActiveElementDeep(root) {
78102
78484
  function getComposedEventTarget(event) {
78103
78485
  const target = event.target;
78104
78486
  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];
78487
+ const path45 = event.composedPath();
78488
+ if (path45.length > 0) {
78489
+ return path45[0];
78108
78490
  }
78109
78491
  }
78110
78492
  return target;
@@ -90398,7 +90780,7 @@ var as = null;
90398
90780
  function us(t7) {
90399
90781
  as = t7;
90400
90782
  }
90401
- var fs27 = /* @__PURE__ */ Symbol("INTERNAL_SKIP_AFTER_CLONE_FROM");
90783
+ var fs28 = /* @__PURE__ */ Symbol("INTERNAL_SKIP_AFTER_CLONE_FROM");
90402
90784
  var ds = 1;
90403
90785
  function hs() {
90404
90786
  ds = 1;
@@ -90870,7 +91252,7 @@ function Il(t7) {
90870
91252
  return ci(t7) || Fl(t7);
90871
91253
  }
90872
91254
  function Ll(t7, e5 = false) {
90873
- const n8 = t7.constructor.clone(t7, fs27);
91255
+ const n8 = t7.constructor.clone(t7, fs28);
90874
91256
  return Ds(n8, null), n8.afterCloneFrom(t7), e5 || n8.resetOnCopyNodeFrom(t7), n8;
90875
91257
  }
90876
91258
  function Kl(t7) {
@@ -91115,7 +91497,7 @@ function wc(t7) {
91115
91497
  })(t7), Tc.set(t7, n8)), n8;
91116
91498
  }
91117
91499
  function Ec(t7) {
91118
- const e5 = t7.constructor.clone(t7, fs27);
91500
+ const e5 = t7.constructor.clone(t7, fs28);
91119
91501
  return e5.afterCloneFrom(t7), e5;
91120
91502
  }
91121
91503
  function Ac(t7) {
@@ -91262,7 +91644,7 @@ function Bc(t7) {
91262
91644
  if (Kc(t9, "clone") || (t9.clone = (e7, n12) => {
91263
91645
  us(e7);
91264
91646
  const o10 = new t9();
91265
- return n12 !== fs27 && o10.afterCloneFrom(e7), o10;
91647
+ return n12 !== fs28 && o10.afterCloneFrom(e7), o10;
91266
91648
  }), Kc(t9, "importJSON") || (t9.importJSON = o9 && o9.$importJSON || /* @__PURE__ */ (function(t10) {
91267
91649
  return (e7) => {
91268
91650
  const n12 = ga(t10);
@@ -104911,8 +105293,8 @@ function registerRovingTabIndex(container, options2 = {}) {
104911
105293
  const selector = options2.itemSelector ?? DEFAULT_ROVING_SELECTOR;
104912
105294
  const getItems = () => Array.from(container.querySelectorAll(selector));
104913
105295
  const applyTabIndex = (items, activeIndex) => {
104914
- items.forEach((item2, i7) => {
104915
- item2.tabIndex = i7 === activeIndex ? 0 : -1;
105296
+ items.forEach((item3, i7) => {
105297
+ item3.tabIndex = i7 === activeIndex ? 0 : -1;
104916
105298
  });
104917
105299
  };
104918
105300
  const init = () => {
@@ -104984,8 +105366,8 @@ function registerRovingTabIndex(container, options2 = {}) {
104984
105366
  };
104985
105367
  return mergeRegister2(registerEventListener2(container, "keydown", handler5), () => {
104986
105368
  const items = getItems();
104987
- items.forEach((item2) => {
104988
- item2.tabIndex = 0;
105369
+ items.forEach((item3) => {
105370
+ item3.tabIndex = 0;
104989
105371
  });
104990
105372
  });
104991
105373
  }
@@ -105000,8 +105382,8 @@ function registerFocusManager(editor, toolbar, options2 = {}) {
105000
105382
  if (isHTMLElement2(target)) {
105001
105383
  const items = toolbar.querySelectorAll(selector);
105002
105384
  let isRovingItem = false;
105003
- for (const item2 of items) {
105004
- if (item2 === target || containsComposed(item2, target)) {
105385
+ for (const item3 of items) {
105386
+ if (item3 === target || containsComposed(item3, target)) {
105005
105387
  isRovingItem = true;
105006
105388
  break;
105007
105389
  }
@@ -120238,10 +120620,10 @@ function $placeBlocks(runtime, $isTarget) {
120238
120620
  }
120239
120621
  const documentKey = $documentKey();
120240
120622
  for (const [key2, frame] of targets) {
120241
- const path44 = placeOf(frame);
120242
- let id3 = derivePositionalId(documentKey, path44);
120623
+ const path45 = placeOf(frame);
120624
+ let id3 = derivePositionalId(documentKey, path45);
120243
120625
  for (let attempt = 1; taken.has(id3); attempt++) {
120244
- id3 = derivePositionalId(documentKey, `${path44}#${attempt}`);
120626
+ id3 = derivePositionalId(documentKey, `${path45}#${attempt}`);
120245
120627
  }
120246
120628
  taken.add(id3);
120247
120629
  placed.set(key2, id3);
@@ -126675,8 +127057,8 @@ function $pointsAround(parent, items) {
126675
127057
  if (offset <= first) {
126676
127058
  point2.set(parentKey, offset, "element");
126677
127059
  } else if (offset < first + items.length) {
126678
- const item2 = items[offset - first - 1];
126679
- point2.set(item2.getKey(), item2.getChildrenSize(), "element");
127060
+ const item3 = items[offset - first - 1];
127061
+ point2.set(item3.getKey(), item3.getChildrenSize(), "element");
126680
127062
  } else {
126681
127063
  point2.set(parentKey, offset - items.length + 1, "element");
126682
127064
  }
@@ -127886,20 +128268,20 @@ function $buildWordListTree(ctx, items) {
127886
128268
  level: items[0].level,
127887
128269
  list: root
127888
128270
  }];
127889
- for (const item2 of items) {
127890
- while (stack2.length > 1 && stack2[stack2.length - 1].level > item2.level) {
128271
+ for (const item3 of items) {
128272
+ while (stack2.length > 1 && stack2[stack2.length - 1].level > item3.level) {
127891
128273
  stack2.pop();
127892
128274
  }
127893
- if (item2.level > stack2[stack2.length - 1].level) {
127894
- const sub2 = $createListNode(classifyWordListType(item2.marker));
128275
+ if (item3.level > stack2[stack2.length - 1].level) {
128276
+ const sub2 = $createListNode(classifyWordListType(item3.marker));
127895
128277
  stack2[stack2.length - 1].list.append($createListItemNode().append(sub2));
127896
128278
  stack2.push({
127897
- level: item2.level,
128279
+ level: item3.level,
127898
128280
  list: sub2
127899
128281
  });
127900
128282
  }
127901
- stripWordMarker(item2.el);
127902
- stack2[stack2.length - 1].list.append($createListItemNode().splice(0, 0, ctx.$importChildren(item2.el, {
128283
+ stripWordMarker(item3.el);
128284
+ stack2[stack2.length - 1].list.append($createListItemNode().splice(0, 0, ctx.$importChildren(item3.el, {
127903
128285
  schema: InlineSchema2
127904
128286
  })));
127905
128287
  }
@@ -132457,7 +132839,7 @@ function Vx(e5) {
132457
132839
  }
132458
132840
  return t7;
132459
132841
  }
132460
- function fs28(e5, t7, n8) {
132842
+ function fs29(e5, t7, n8) {
132461
132843
  for (; t7 < e5.length; ) {
132462
132844
  let r8 = e5[t7];
132463
132845
  if (r8 === " " || r8 === `
@@ -132476,20 +132858,20 @@ function Rp(e5, t7) {
132476
132858
  }
132477
132859
  function Xs2(e5, t7, n8, r8 = 0) {
132478
132860
  if (r8 > Tp) throw new Error("YAML: nesting is too deep");
132479
- t7 = fs28(e5, t7, false);
132861
+ t7 = fs29(e5, t7, false);
132480
132862
  let o8 = e5[t7];
132481
132863
  if (o8 === "{") {
132482
132864
  let a5 = {};
132483
132865
  t7++;
132484
132866
  let i7 = true;
132485
132867
  for (; ; ) {
132486
- if (t7 = fs28(e5, t7, false), t7 >= e5.length) throw new Or2("YAML: unexpected end of the stream within a flow collection");
132868
+ if (t7 = fs29(e5, t7, false), t7 >= e5.length) throw new Or2("YAML: unexpected end of the stream within a flow collection");
132487
132869
  if (e5[t7] === "}") return [a5, t7 + 1];
132488
132870
  Rp(e5[t7], i7);
132489
132871
  let c10;
132490
- [c10, t7] = Xs2(e5, t7, ":,}", r8 + 1), t7 = fs28(e5, t7, false);
132872
+ [c10, t7] = Xs2(e5, t7, ":,}", r8 + 1), t7 = fs29(e5, t7, false);
132491
132873
  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++;
132874
+ 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
132875
  }
132494
132876
  }
132495
132877
  if (o8 === "[") {
@@ -132497,11 +132879,11 @@ function Xs2(e5, t7, n8, r8 = 0) {
132497
132879
  t7++;
132498
132880
  let i7 = true;
132499
132881
  for (; ; ) {
132500
- if (t7 = fs28(e5, t7, false), t7 >= e5.length) throw new Or2("YAML: unexpected end of the stream within a flow collection");
132882
+ if (t7 = fs29(e5, t7, false), t7 >= e5.length) throw new Or2("YAML: unexpected end of the stream within a flow collection");
132501
132883
  if (e5[t7] === "]") return [a5, t7 + 1];
132502
132884
  Rp(e5[t7], i7);
132503
132885
  let c10;
132504
- [c10, t7] = Xs2(e5, t7, ",]", r8 + 1), a5.push(c10), t7 = fs28(e5, t7, false), i7 = e5[t7] === ",", i7 && t7++;
132886
+ [c10, t7] = Xs2(e5, t7, ",]", r8 + 1), a5.push(c10), t7 = fs29(e5, t7, false), i7 = e5[t7] === ",", i7 && t7++;
132505
132887
  }
132506
132888
  }
132507
132889
  if (o8 === '"') {
@@ -132661,7 +133043,7 @@ function Hn3(e5) {
132661
133043
  let t7 = e5.trim();
132662
133044
  if (t7[0] === "{" || t7[0] === "[") try {
132663
133045
  let [o8, s7] = Xs2(t7, 0, "");
132664
- if (fs28(t7, s7, false) === t7.length) return o8;
133046
+ if (fs29(t7, s7, false) === t7.length) return o8;
132665
133047
  } catch (o8) {
132666
133048
  throw o8 instanceof Or2 ? new Error(o8.message) : o8;
132667
133049
  }
@@ -152995,27 +153377,27 @@ var sqrtTall = function sqrtTall2(extraVinculum, hLinePad2, viewBoxHeight) {
152995
153377
  };
152996
153378
  var sqrtPath = function sqrtPath2(size, extraVinculum, viewBoxHeight) {
152997
153379
  extraVinculum = 1e3 * extraVinculum;
152998
- var path44 = "";
153380
+ var path45 = "";
152999
153381
  switch (size) {
153000
153382
  case "sqrtMain":
153001
- path44 = sqrtMain(extraVinculum, hLinePad);
153383
+ path45 = sqrtMain(extraVinculum, hLinePad);
153002
153384
  break;
153003
153385
  case "sqrtSize1":
153004
- path44 = sqrtSize1(extraVinculum, hLinePad);
153386
+ path45 = sqrtSize1(extraVinculum, hLinePad);
153005
153387
  break;
153006
153388
  case "sqrtSize2":
153007
- path44 = sqrtSize2(extraVinculum, hLinePad);
153389
+ path45 = sqrtSize2(extraVinculum, hLinePad);
153008
153390
  break;
153009
153391
  case "sqrtSize3":
153010
- path44 = sqrtSize3(extraVinculum, hLinePad);
153392
+ path45 = sqrtSize3(extraVinculum, hLinePad);
153011
153393
  break;
153012
153394
  case "sqrtSize4":
153013
- path44 = sqrtSize4(extraVinculum, hLinePad);
153395
+ path45 = sqrtSize4(extraVinculum, hLinePad);
153014
153396
  break;
153015
153397
  case "sqrtTall":
153016
- path44 = sqrtTall(extraVinculum, hLinePad, viewBoxHeight);
153398
+ path45 = sqrtTall(extraVinculum, hLinePad, viewBoxHeight);
153017
153399
  }
153018
- return path44;
153400
+ return path45;
153019
153401
  };
153020
153402
  var innerPath = function innerPath2(name, height) {
153021
153403
  switch (name) {
@@ -153041,7 +153423,7 @@ var innerPath = function innerPath2(name, height) {
153041
153423
  return "";
153042
153424
  }
153043
153425
  };
153044
- var path24 = {
153426
+ var path25 = {
153045
153427
  // The doubleleftarrow geometry is from glyph U+21D0 in the font KaTeX Main
153046
153428
  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
153429
  // doublerightarrow is from glyph U+21D2 in font KaTeX Main
@@ -153570,7 +153952,7 @@ var PathNode = class {
153570
153952
  if (this.alternate) {
153571
153953
  node.setAttribute("d", this.alternate);
153572
153954
  } else {
153573
- node.setAttribute("d", path24[this.pathName]);
153955
+ node.setAttribute("d", path25[this.pathName]);
153574
153956
  }
153575
153957
  return node;
153576
153958
  }
@@ -153578,7 +153960,7 @@ var PathNode = class {
153578
153960
  if (this.alternate) {
153579
153961
  return '<path d="' + escape4(this.alternate) + '"/>';
153580
153962
  } else {
153581
- return '<path d="' + escape4(path24[this.pathName]) + '"/>';
153963
+ return '<path d="' + escape4(path25[this.pathName]) + '"/>';
153582
153964
  }
153583
153965
  }
153584
153966
  };
@@ -157229,8 +157611,8 @@ var svgData = {
157229
157611
  };
157230
157612
  var staticSvg = function staticSvg2(value, options2) {
157231
157613
  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], {
157614
+ var path45 = new PathNode(pathName);
157615
+ var svgNode = new SvgNode([path45], {
157234
157616
  "width": makeEm(width),
157235
157617
  "height": makeEm(height),
157236
157618
  // Override CSS rule `.katex svg { width: 100% }`
@@ -158373,8 +158755,8 @@ var stretchySvg = function stretchySvg2(group, options2) {
158373
158755
  pathName = "tilde" + imgIndex;
158374
158756
  }
158375
158757
  }
158376
- var path44 = new PathNode(pathName);
158377
- var svgNode = new SvgNode([path44], {
158758
+ var path45 = new PathNode(pathName);
158759
+ var svgNode = new SvgNode([path45], {
158378
158760
  "width": "100%",
158379
158761
  "height": makeEm(_height),
158380
158762
  "viewBox": "0 0 " + viewBoxWidth + " " + viewBoxHeight,
@@ -159588,8 +159970,8 @@ var makeGlyphSpan = function makeGlyphSpan2(symbol, font, mode, options2) {
159588
159970
  };
159589
159971
  var makeInner = function makeInner2(ch4, height, options2) {
159590
159972
  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], {
159973
+ var path45 = new PathNode("inner", innerPath(ch4, Math.round(1e3 * height)));
159974
+ var svgNode = new SvgNode([path45], {
159593
159975
  "width": makeEm(width),
159594
159976
  "height": makeEm(height),
159595
159977
  // Override CSS rule `.katex svg { width: 100% }`
@@ -159758,10 +160140,10 @@ var makeStackedDelim = function makeStackedDelim2(delim, heightTotal, center, op
159758
160140
  var midHeight = realHeightTotal - topHeightTotal - bottomHeightTotal;
159759
160141
  var viewBoxHeight = Math.round(realHeightTotal * 1e3);
159760
160142
  var pathStr = tallDelim(svgLabel, Math.round(midHeight * 1e3));
159761
- var path44 = new PathNode(svgLabel, pathStr);
160143
+ var path45 = new PathNode(svgLabel, pathStr);
159762
160144
  var width = makeEm(viewBoxWidth / 1e3);
159763
160145
  var height = makeEm(viewBoxHeight / 1e3);
159764
- var svg = new SvgNode([path44], {
160146
+ var svg = new SvgNode([path45], {
159765
160147
  "width": width,
159766
160148
  "height": height,
159767
160149
  "viewBox": "0 0 " + viewBoxWidth + " " + viewBoxHeight
@@ -159802,8 +160184,8 @@ var makeStackedDelim = function makeStackedDelim2(delim, heightTotal, center, op
159802
160184
  var vbPad = 80;
159803
160185
  var emPad = 0.08;
159804
160186
  var sqrtSvg = function sqrtSvg2(sqrtName, height, viewBoxHeight, extraVinculum, options2) {
159805
- var path44 = sqrtPath(sqrtName, extraVinculum, viewBoxHeight);
159806
- var pathNode = new PathNode(sqrtName, path44);
160187
+ var path45 = sqrtPath(sqrtName, extraVinculum, viewBoxHeight);
160188
+ var pathNode = new PathNode(sqrtName, path45);
159807
160189
  var svg = new SvgNode([pathNode], {
159808
160190
  // Note: 1000:1 ratio of viewBox to document em width.
159809
160191
  "width": "400em",
@@ -160302,8 +160684,8 @@ var htmlBuilder$7 = (group, options2) => {
160302
160684
  var angleHeight = inner2.height + inner2.depth + lineWeight + clearance;
160303
160685
  inner2.style.paddingLeft = makeEm(angleHeight / 2 + lineWeight);
160304
160686
  var viewBoxHeight = Math.floor(1e3 * angleHeight * scale);
160305
- var path44 = phasePath(viewBoxHeight);
160306
- var svgNode = new SvgNode([new PathNode("phase", path44)], {
160687
+ var path45 = phasePath(viewBoxHeight);
160688
+ var svgNode = new SvgNode([new PathNode("phase", path45)], {
160307
160689
  "width": "400em",
160308
160690
  "height": makeEm(viewBoxHeight / 1e3),
160309
160691
  "viewBox": "0 0 400000 " + viewBoxHeight,
@@ -162251,13 +162633,13 @@ defineFunction({
162251
162633
  }
162252
162634
  data.push(current);
162253
162635
  for (var _i6 = 0; _i6 < data.length; _i6++) {
162254
- var item2 = data[_i6];
162255
- var firstEquals = item2.indexOf("=");
162636
+ var item3 = data[_i6];
162637
+ var firstEquals = item3.indexOf("=");
162256
162638
  if (firstEquals < 0) {
162257
- throw new ParseError("\\htmlData key/value '" + item2 + "' missing equals sign");
162639
+ throw new ParseError("\\htmlData key/value '" + item3 + "' missing equals sign");
162258
162640
  }
162259
- var key2 = item2.slice(0, firstEquals);
162260
- var _value = item2.slice(firstEquals + 1);
162641
+ var key2 = item3.slice(0, firstEquals);
162642
+ var _value = item3.slice(firstEquals + 1);
162261
162643
  attributes["data-" + key2.trim()] = _value;
162262
162644
  }
162263
162645
  trustContext = {
@@ -166827,7 +167209,7 @@ function renderProblems(state2) {
166827
167209
 
166828
167210
  // src/server/document-session.ts
166829
167211
  var import_promises = __toESM(require("node:fs/promises"), 1);
166830
- var import_node_path23 = __toESM(require("node:path"), 1);
167212
+ var import_node_path24 = __toESM(require("node:path"), 1);
166831
167213
 
166832
167214
  // ../../node_modules/.pnpm/loro-crdt@1.16.4/node_modules/loro-crdt/base64/index.js
166833
167215
  function _loadWasmModule(sync, filepath, src, imports2) {
@@ -166843,10 +167225,10 @@ function _loadWasmModule(sync, filepath, src, imports2) {
166843
167225
  var buf = null;
166844
167226
  var isNode2 = typeof process !== "undefined" && process.versions != null && process.versions.node != null;
166845
167227
  if (filepath && isNode2) {
166846
- var fs49 = null;
166847
- var path44 = null;
167228
+ var fs50 = null;
167229
+ var path45 = null;
166848
167230
  return new Promise((resolve, reject) => {
166849
- fs49.readFile(path44.resolve(__dirname, filepath), (error, buffer) => {
167231
+ fs50.readFile(path45.resolve(__dirname, filepath), (error, buffer) => {
166850
167232
  if (error != null) {
166851
167233
  reject(error);
166852
167234
  } else {
@@ -168149,10 +168531,10 @@ var LoroDoc = class _LoroDoc {
168149
168531
  * @param {string} path
168150
168532
  * @returns {Value | Container | undefined}
168151
168533
  */
168152
- getByPath(path44) {
168534
+ getByPath(path45) {
168153
168535
  try {
168154
168536
  const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
168155
- const ptr0 = passStringToWasm0(path44, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
168537
+ const ptr0 = passStringToWasm0(path45, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
168156
168538
  const len0 = WASM_VECTOR_LEN;
168157
168539
  wasm.lorodoc_getByPath(retptr, this.__wbg_ptr, ptr0, len0);
168158
168540
  var r02 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
@@ -175247,9 +175629,9 @@ LoroDoc.prototype.toJsonWithReplacer = function(replacer) {
175247
175629
  };
175248
175630
  const run3 = (layer2) => {
175249
175631
  if (Array.isArray(layer2)) {
175250
- return layer2.map((item2, index) => {
175251
- return m11(index, item2);
175252
- }).filter((item2) => item2 !== void 0);
175632
+ return layer2.map((item3, index) => {
175633
+ return m11(index, item3);
175634
+ }).filter((item3) => item3 !== void 0);
175253
175635
  }
175254
175636
  const result = {};
175255
175637
  for (const [key2, value] of Object.entries(layer2)) {
@@ -175773,16 +176155,16 @@ var Diff = class {
175773
176155
  }
175774
176156
  }
175775
176157
  }
175776
- addToPath(path44, added, removed, oldPosInc, options2) {
175777
- const last = path44.lastComponent;
176158
+ addToPath(path45, added, removed, oldPosInc, options2) {
176159
+ const last = path45.lastComponent;
175778
176160
  if (last && !options2.oneChangePerToken && last.added === added && last.removed === removed) {
175779
176161
  return {
175780
- oldPos: path44.oldPos + oldPosInc,
176162
+ oldPos: path45.oldPos + oldPosInc,
175781
176163
  lastComponent: { count: last.count + 1, added, removed, previousComponent: last.previousComponent }
175782
176164
  };
175783
176165
  } else {
175784
176166
  return {
175785
- oldPos: path44.oldPos + oldPosInc,
176167
+ oldPos: path45.oldPos + oldPosInc,
175786
176168
  lastComponent: { count: 1, added, removed, previousComponent: last }
175787
176169
  };
175788
176170
  }
@@ -176219,15 +176601,15 @@ __export(LexicalMarkdown_dev_exports, {
176219
176601
  });
176220
176602
  function indexBy(list2, callback) {
176221
176603
  const index = {};
176222
- for (const item2 of list2) {
176223
- const key2 = callback(item2);
176604
+ for (const item3 of list2) {
176605
+ const key2 = callback(item3);
176224
176606
  if (!key2) {
176225
176607
  continue;
176226
176608
  }
176227
176609
  if (index[key2]) {
176228
- index[key2].push(item2);
176610
+ index[key2].push(item3);
176229
176611
  } else {
176230
- index[key2] = [item2];
176612
+ index[key2] = [item3];
176231
176613
  }
176232
176614
  }
176233
176615
  return index;
@@ -180666,7 +181048,7 @@ async function readText2(file) {
180666
181048
  }
180667
181049
  }
180668
181050
  async function writeAtomic(file, data) {
180669
- await import_promises.default.mkdir(import_node_path23.default.dirname(file), { recursive: true });
181051
+ await import_promises.default.mkdir(import_node_path24.default.dirname(file), { recursive: true });
180670
181052
  const tmp = `${file}.${process.pid}.tmp`;
180671
181053
  await import_promises.default.writeFile(tmp, data);
180672
181054
  await import_promises.default.rename(tmp, file);
@@ -180700,7 +181082,7 @@ async function createDocumentSession(options2) {
180700
181082
  let lastGoodText = null;
180701
181083
  let lastAgentText = null;
180702
181084
  let lastFileText = await readText2(file) ?? "";
180703
- const activityFile = import_node_path23.default.join(import_node_path23.default.dirname(snapshotFile), "agent-active");
181085
+ const activityFile = import_node_path24.default.join(import_node_path24.default.dirname(snapshotFile), "agent-active");
180704
181086
  let agentActiveAt = await lastAgentWrite(activityFile, file);
180705
181087
  let activitySaved = Promise.resolve();
180706
181088
  const emitStatus = () => emit({ type: "status", outcome, streaming: streaming > 0, agentActiveAt });
@@ -180925,39 +181307,45 @@ function fillRefIds(state2, lookup2) {
180925
181307
  const children2 = state2.root.children.map(fill);
180926
181308
  return { ...state2, root: { ...state2.root, children: children2 } };
180927
181309
  }
181310
+ var NOUN2 = {
181311
+ document: "a document",
181312
+ artboard: "an artboard",
181313
+ whiteboard: "a whiteboard",
181314
+ html: "an html page"
181315
+ };
180928
181316
  function refWarnings(refs3, lookup2) {
180929
181317
  return refs3.flatMap((ref) => {
180930
181318
  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`];
181319
+ const kind = refKind(ref);
181320
+ const slug = refSlug(ref);
181321
+ const id3 = lookup2.idOf(slug, kind);
181322
+ if (!id3)
181323
+ return [`${at7}<ref ${kind}="${slug}"> names ${NOUN2[kind]} that is not in this project`];
180935
181324
  if (ref.to && ref.to !== id3)
180936
181325
  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}`
181326
+ `${at7}<ref ${kind}="${slug}"> points at ${ref.to}, but ${slug} is now ${id3}; delete to= to point the reference at it`
180948
181327
  ];
181328
+ if (kind === "whiteboard") return whiteboardWarnings(ref, at7, lookup2);
181329
+ if (kind === "artboard") return artboardWarnings(ref, at7, lookup2);
180949
181330
  return [];
180950
181331
  });
180951
181332
  }
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)
181333
+ function artboardWarnings(ref, at7, lookup2) {
181334
+ const slug = ref.artboard;
181335
+ const canvas = lookup2.canvasOf(slug);
181336
+ if (!canvas) return [];
181337
+ if (ref.group && !canvas.groups.includes(ref.group))
180958
181338
  return [
180959
- `${at7}<ref whiteboard="${slug}"> points at ${ref.to}, but ${slug} is now ${id3}; delete to= to point the reference at it`
181339
+ `${at7}<ref artboard="${slug}" group="${ref.group}">: the artboard has no group ${ref.group}`
180960
181340
  ];
181341
+ if (ref.board && !canvas.boards.includes(ref.board))
181342
+ return [
181343
+ `${at7}<ref artboard="${slug}" board="${ref.board}">: the artboard has no board ${ref.board}`
181344
+ ];
181345
+ return [];
181346
+ }
181347
+ function whiteboardWarnings(ref, at7, lookup2) {
181348
+ const slug = ref.whiteboard;
180961
181349
  const index = lookup2.framesOf(slug);
180962
181350
  if (!index) return [];
180963
181351
  if (ref.page) {
@@ -181011,10 +181399,14 @@ function createDocumentRegistry(options2) {
181011
181399
  const before2 = JSON.parse(lastArtboards.get(id3) ?? "[]");
181012
181400
  lastArtboards.set(id3, key2);
181013
181401
  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"));
181402
+ const keys2 = [...new Set(all.map((ref) => `${refKind(ref)}/${refSlug(ref)}`))];
181403
+ options2.onRefsChange?.(
181404
+ id3,
181405
+ keys2.map((key3) => {
181406
+ const [type, slug] = key3.split("/");
181407
+ return { type, id: slug };
181408
+ })
181409
+ );
181018
181410
  };
181019
181411
  const liveRefWarnings = (id3) => {
181020
181412
  const session = ready.get(id3);
@@ -181022,7 +181414,7 @@ function createDocumentRegistry(options2) {
181022
181414
  };
181023
181415
  const warnings = /* @__PURE__ */ new Map();
181024
181416
  const rechecks = /* @__PURE__ */ new Map();
181025
- const docFile = (id3) => import_node_path24.default.join(options2.root, "document", id3, "doc.xml");
181417
+ const docFile = (id3) => import_node_path25.default.join(options2.root, "document", id3, "doc.xml");
181026
181418
  const commentStores = /* @__PURE__ */ new Map();
181027
181419
  const cursors = createCommentCursors(options2.stateDir);
181028
181420
  const changeCursors = createChangeCursors(options2.stateDir);
@@ -181030,7 +181422,7 @@ function createDocumentRegistry(options2) {
181030
181422
  let store = commentStores.get(id3);
181031
181423
  if (!store) {
181032
181424
  store = createCommentStore(
181033
- import_node_path24.default.join(options2.root, "document", id3, "comments.json"),
181425
+ import_node_path25.default.join(options2.root, "document", id3, "comments.json"),
181034
181426
  options2.names
181035
181427
  );
181036
181428
  commentStores.set(id3, store);
@@ -181063,10 +181455,10 @@ function createDocumentRegistry(options2) {
181063
181455
  if (JSON.stringify(store.warnings()) !== before2) options2.onWarningsChange(id3);
181064
181456
  };
181065
181457
  const create3 = async (id3) => {
181066
- if (!import_node_fs27.default.existsSync(docFile(id3))) return null;
181458
+ if (!import_node_fs28.default.existsSync(docFile(id3))) return null;
181067
181459
  const session = await createDocumentSession({
181068
181460
  file: docFile(id3),
181069
- snapshotFile: import_node_path24.default.join(options2.stateDir, "document", id3, "doc.loro"),
181461
+ snapshotFile: import_node_path25.default.join(options2.stateDir, "document", id3, "doc.loro"),
181070
181462
  fillRefs: (state2) => fillRefIds(state2, refLookup),
181071
181463
  ...options2.timing,
181072
181464
  log: options2.log
@@ -181144,7 +181536,7 @@ function createDocumentRegistry(options2) {
181144
181536
  const known = sessions.has(id3);
181145
181537
  void open2(id3).then((session) => {
181146
181538
  if (!session || !known) return;
181147
- import_node_fs27.default.readFile(docFile(id3), "utf8", (err, text5) => {
181539
+ import_node_fs28.default.readFile(docFile(id3), "utf8", (err, text5) => {
181148
181540
  if (!err) session.onFileText(text5);
181149
181541
  });
181150
181542
  });
@@ -181225,8 +181617,8 @@ function createDocumentRegistry(options2) {
181225
181617
  }
181226
181618
 
181227
181619
  // 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);
181620
+ var import_node_fs29 = __toESM(require("node:fs"), 1);
181621
+ var import_node_path26 = __toESM(require("node:path"), 1);
181230
181622
  function dynamicUrls(xml) {
181231
181623
  const urls = /* @__PURE__ */ new Set();
181232
181624
  for (const match of stripOpaque(xml).matchAll(TAG)) {
@@ -181239,7 +181631,7 @@ function dynamicUrls(xml) {
181239
181631
  }
181240
181632
  var mtimeOf = (file) => {
181241
181633
  try {
181242
- return import_node_fs28.default.statSync(file).mtimeMs;
181634
+ return import_node_fs29.default.statSync(file).mtimeMs;
181243
181635
  } catch {
181244
181636
  return -1;
181245
181637
  }
@@ -181256,7 +181648,7 @@ function createDynamicBlocks(limits) {
181256
181648
  };
181257
181649
  const entry = (id3, dir, file) => {
181258
181650
  const map = files(id3);
181259
- const mtime = mtimeOf(import_node_path25.default.join(dir, file));
181651
+ const mtime = mtimeOf(import_node_path26.default.join(dir, file));
181260
181652
  let state2 = map.get(file);
181261
181653
  if (!state2 || state2.mtime !== mtime) {
181262
181654
  state2 = { mtime, errors: [], ran: false };
@@ -181281,19 +181673,19 @@ function createDynamicBlocks(limits) {
181281
181673
  state(id3, dir) {
181282
181674
  let xml;
181283
181675
  try {
181284
- xml = import_node_fs28.default.readFileSync(import_node_path25.default.join(dir, "doc.xml"), "utf8");
181676
+ xml = import_node_fs29.default.readFileSync(import_node_path26.default.join(dir, "doc.xml"), "utf8");
181285
181677
  } catch {
181286
181678
  return { warnings: [], dynamic: {} };
181287
181679
  }
181288
181680
  const urls = dynamicUrls(xml);
181289
181681
  const map = files(id3);
181290
181682
  for (const [file, state2] of map) {
181291
- if (!urls.includes(file) || state2.mtime !== mtimeOf(import_node_path25.default.join(dir, file))) map.delete(file);
181683
+ if (!urls.includes(file) || state2.mtime !== mtimeOf(import_node_path26.default.join(dir, file))) map.delete(file);
181292
181684
  }
181293
181685
  const warnings = [];
181294
181686
  const dynamic = {};
181295
181687
  for (const url of urls) {
181296
- if (!import_node_fs28.default.existsSync(import_node_path25.default.join(dir, url))) warnings.push(`${url} not found`);
181688
+ if (!import_node_fs29.default.existsSync(import_node_path26.default.join(dir, url))) warnings.push(`${url} not found`);
181297
181689
  const state2 = map.get(url);
181298
181690
  for (const error of state2?.errors ?? []) warnings.push(`runtime: ${url}: ${error}`);
181299
181691
  dynamic[url] = { ran: state2?.ran ?? false };
@@ -181309,7 +181701,7 @@ var MAX_COMMENT_OP = 64 * 1024;
181309
181701
  var MAX_DOCUMENT_UPDATE = 8 * 1024 * 1024;
181310
181702
 
181311
181703
  // src/server/artifact-file.ts
181312
- var import_node_fs29 = __toESM(require("node:fs"), 1);
181704
+ var import_node_fs30 = __toESM(require("node:fs"), 1);
181313
181705
  var RESOLVE = {
181314
181706
  artboard: resolveBoardFile,
181315
181707
  document: resolveDocumentAsset,
@@ -181323,8 +181715,8 @@ function readArtifactFile(dir, type, relative, uiRuntimeUrl, maxBytes = Infinity
181323
181715
  if (!target) return null;
181324
181716
  let data;
181325
181717
  try {
181326
- if (import_node_fs29.default.statSync(target).size > maxBytes) throw new RangeError("too large");
181327
- data = import_node_fs29.default.readFileSync(target);
181718
+ if (import_node_fs30.default.statSync(target).size > maxBytes) throw new RangeError("too large");
181719
+ data = import_node_fs30.default.readFileSync(target);
181328
181720
  } catch (err) {
181329
181721
  if (err instanceof RangeError) throw err;
181330
181722
  return null;
@@ -181460,6 +181852,24 @@ async function handleRelay(ctx, key2, body, conn, contentOrigin = "") {
181460
181852
  const request = typeof body === "object" && body !== null ? body : {};
181461
181853
  if (request.op === "publication" && ctx.cloud) return ctx.cloud.publication(key2);
181462
181854
  if (request.op === "publish" && ctx.cloud) return ctx.cloud.publishNow(key2);
181855
+ if (request.op === "refs" && ctx.cloud)
181856
+ return ctx.cloud.cascade(
181857
+ key2,
181858
+ request.visibility === "public" || request.visibility === "private" ? request.visibility : void 0
181859
+ );
181860
+ if (request.op === "publish-referrers" && ctx.cloud) {
181861
+ const list2 = (value) => Array.isArray(value) ? value.filter((each) => typeof each === "string") : [];
181862
+ return ctx.cloud.publishReferrersNow(key2, list2(request.publish), list2(request.makePublic));
181863
+ }
181864
+ if (request.op === "publish-refs" && ctx.cloud) {
181865
+ const list2 = (value) => Array.isArray(value) ? value.filter((each) => typeof each === "string") : [];
181866
+ return ctx.cloud.publishRefsNow(
181867
+ key2,
181868
+ list2(request.refs),
181869
+ list2(request.makePublic),
181870
+ request.visibility === "public" || request.visibility === "private" ? request.visibility : void 0
181871
+ );
181872
+ }
181463
181873
  if (request.op === "meta") return ctx.artifactMeta(ref, dir, contentOrigin);
181464
181874
  if (request.op === "file") {
181465
181875
  const file = typeof request.path === "string" ? readArtifactFile(
@@ -181519,8 +181929,8 @@ async function handleRelay(ctx, key2, body, conn, contentOrigin = "") {
181519
181929
  }
181520
181930
 
181521
181931
  // src/server/selection.ts
181522
- var import_node_fs30 = __toESM(require("node:fs"), 1);
181523
- var import_node_path26 = __toESM(require("node:path"), 1);
181932
+ var import_node_fs31 = __toESM(require("node:fs"), 1);
181933
+ var import_node_path27 = __toESM(require("node:path"), 1);
181524
181934
 
181525
181935
  // src/shared/selection.ts
181526
181936
  var SELECTION_FULL_NODES = 20;
@@ -181566,9 +181976,9 @@ function readChange(value) {
181566
181976
  function readAll(values, read3) {
181567
181977
  const out = [];
181568
181978
  for (const value of values) {
181569
- const item2 = read3(value);
181570
- if (!item2) return null;
181571
- out.push(item2);
181979
+ const item3 = read3(value);
181980
+ if (!item3) return null;
181981
+ out.push(item3);
181572
181982
  }
181573
181983
  return out;
181574
181984
  }
@@ -181580,16 +181990,16 @@ function readSelectionMessage(value) {
181580
181990
  return null;
181581
181991
  if (!list(value.selected, SELECTION_FULL_NODES) || !list(value.tweaks, SELECTION_MAX_NODES) || !list(value.nodes, SELECTION_MAX_NODES))
181582
181992
  return null;
181583
- const selected = readAll(value.selected, (item2) => {
181584
- const node = readNode(item2);
181585
- if (!node || !object(item2) || !text2(item2.text, SELECTION_LIMITS.text) || !text2(item2.html, SELECTION_LIMITS.html) || !list(item2.tweaks, INSPECTOR_PROPERTIES.length))
181993
+ const selected = readAll(value.selected, (item3) => {
181994
+ const node = readNode(item3);
181995
+ if (!node || !object(item3) || !text2(item3.text, SELECTION_LIMITS.text) || !text2(item3.html, SELECTION_LIMITS.html) || !list(item3.tweaks, INSPECTOR_PROPERTIES.length))
181586
181996
  return null;
181587
- const tweaks2 = readAll(item2.tweaks, readChange);
181588
- return tweaks2 && { ...node, text: item2.text, html: item2.html, tweaks: tweaks2 };
181997
+ const tweaks2 = readAll(item3.tweaks, readChange);
181998
+ return tweaks2 && { ...node, text: item3.text, html: item3.html, tweaks: tweaks2 };
181589
181999
  });
181590
- const tweaks = readAll(value.tweaks, (item2) => {
181591
- const node = readNode(item2);
181592
- const change = readChange(item2);
182000
+ const tweaks = readAll(value.tweaks, (item3) => {
182001
+ const node = readNode(item3);
182002
+ const change = readChange(item3);
181593
182003
  return node && change && { ...node, ...change };
181594
182004
  });
181595
182005
  const nodes = readAll(value.nodes, readNode);
@@ -181625,17 +182035,17 @@ function readWhiteboardSelectionMessage(value) {
181625
182035
  return null;
181626
182036
  const id3 = value.artifact.slice("whiteboard/".length);
181627
182037
  if (!value.artifact.startsWith("whiteboard/") || !isArtifactId(id3)) return null;
181628
- const optional3 = (item2, max) => typeof item2 === "string" ? item2.slice(0, max) : null;
182038
+ const optional3 = (item3, max) => typeof item3 === "string" ? item3.slice(0, max) : null;
181629
182039
  const selected = [];
181630
- for (const item2 of value.selected) {
181631
- if (!object(item2) || !text2(item2.id, WHITEBOARD_SELECTION_LIMITS.id) || !item2.id || !text2(item2.type, WHITEBOARD_SELECTION_LIMITS.type))
182040
+ for (const item3 of value.selected) {
182041
+ if (!object(item3) || !text2(item3.id, WHITEBOARD_SELECTION_LIMITS.id) || !item3.id || !text2(item3.type, WHITEBOARD_SELECTION_LIMITS.type))
181632
182042
  return null;
181633
182043
  selected.push({
181634
- id: item2.id,
181635
- type: item2.type,
181636
- text: optional3(item2.text, WHITEBOARD_SELECTION_LIMITS.text),
181637
- frameId: optional3(item2.frameId, WHITEBOARD_SELECTION_LIMITS.id),
181638
- author: item2.author === "human" || item2.author === "agent" ? item2.author : null
182044
+ id: item3.id,
182045
+ type: item3.type,
182046
+ text: optional3(item3.text, WHITEBOARD_SELECTION_LIMITS.text),
182047
+ frameId: optional3(item3.frameId, WHITEBOARD_SELECTION_LIMITS.id),
182048
+ author: item3.author === "human" || item3.author === "agent" ? item3.author : null
181639
182049
  });
181640
182050
  }
181641
182051
  const page = isPageId(value.page) ? { page: value.page } : {};
@@ -181665,7 +182075,7 @@ function readAnySelection(value) {
181665
182075
  function createSelectionStore(stateDir, exists) {
181666
182076
  const tabs = /* @__PURE__ */ new Map();
181667
182077
  let clock = 0;
181668
- const fileOf2 = (kind, id3) => import_node_path26.default.join(stateDir, kind, id3, "selection.json");
182078
+ const fileOf2 = (kind, id3) => import_node_path27.default.join(stateDir, kind, id3, "selection.json");
181669
182079
  const write = (kind, id3) => {
181670
182080
  let winner;
181671
182081
  for (const tab of tabs.values()) {
@@ -181673,7 +182083,7 @@ function createSelectionStore(stateDir, exists) {
181673
182083
  if (!winner || tab.humanAt > winner.humanAt || tab.humanAt === winner.humanAt && tab.seenAt > winner.seenAt)
181674
182084
  winner = tab;
181675
182085
  }
181676
- if (!winner?.state) import_node_fs30.default.rmSync(fileOf2(kind, id3), { force: true });
182086
+ if (!winner?.state) import_node_fs31.default.rmSync(fileOf2(kind, id3), { force: true });
181677
182087
  else
181678
182088
  writeJsonAtomic(fileOf2(kind, id3), {
181679
182089
  artifact: `${kind}/${id3}`,
@@ -181715,11 +182125,11 @@ function createSelectionStore(stateDir, exists) {
181715
182125
  for (const kind of ["artboard", "document", "whiteboard"]) {
181716
182126
  let ids;
181717
182127
  try {
181718
- ids = import_node_fs30.default.readdirSync(import_node_path26.default.join(stateDir, kind));
182128
+ ids = import_node_fs31.default.readdirSync(import_node_path27.default.join(stateDir, kind));
181719
182129
  } catch {
181720
182130
  continue;
181721
182131
  }
181722
- for (const id3 of ids) import_node_fs30.default.rmSync(fileOf2(kind, id3), { force: true });
182132
+ for (const id3 of ids) import_node_fs31.default.rmSync(fileOf2(kind, id3), { force: true });
181723
182133
  }
181724
182134
  }
181725
182135
  };
@@ -181727,13 +182137,13 @@ function createSelectionStore(stateDir, exists) {
181727
182137
 
181728
182138
  // src/server/verify-recordings.ts
181729
182139
  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);
182140
+ var import_node_fs33 = __toESM(require("node:fs"), 1);
182141
+ var import_node_path29 = __toESM(require("node:path"), 1);
181732
182142
 
181733
182143
  // src/server/recording-trim.ts
181734
182144
  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);
182145
+ var import_node_fs32 = __toESM(require("node:fs"), 1);
182146
+ var import_node_path28 = __toESM(require("node:path"), 1);
181737
182147
  function run2(command, args, signal3) {
181738
182148
  return new Promise((resolve, reject) => {
181739
182149
  (0, import_node_child_process3.execFile)(
@@ -181753,7 +182163,7 @@ function run2(command, args, signal3) {
181753
182163
  });
181754
182164
  }
181755
182165
  async function trimRecording(input, output, signal3) {
181756
- if (input === output || import_node_fs31.default.existsSync(output))
182166
+ if (input === output || import_node_fs32.default.existsSync(output))
181757
182167
  throw new Error("Choose a new output path; existing files are never overwritten.");
181758
182168
  const probe = JSON.parse(
181759
182169
  (await run2(
@@ -181825,9 +182235,9 @@ async function trimRecording(input, output, signal3) {
181825
182235
  if (start > 0 || end < duration) status = "trimmed";
181826
182236
  }
181827
182237
  if (status === "trimmed") {
181828
- const temporary = import_node_fs31.default.mkdtempSync(import_node_path27.default.join(import_node_path27.default.dirname(output), ".trim-"));
182238
+ const temporary = import_node_fs32.default.mkdtempSync(import_node_path28.default.join(import_node_path28.default.dirname(output), ".trim-"));
181829
182239
  try {
181830
- const encoded = import_node_path27.default.join(temporary, "clip.mp4");
182240
+ const encoded = import_node_path28.default.join(temporary, "clip.mp4");
181831
182241
  await run2(
181832
182242
  "ffmpeg",
181833
182243
  [
@@ -181863,9 +182273,9 @@ async function trimRecording(input, output, signal3) {
181863
182273
  ],
181864
182274
  signal3
181865
182275
  );
181866
- import_node_fs31.default.linkSync(encoded, output);
182276
+ import_node_fs32.default.linkSync(encoded, output);
181867
182277
  } finally {
181868
- import_node_fs31.default.rmSync(temporary, { recursive: true, force: true });
182278
+ import_node_fs32.default.rmSync(temporary, { recursive: true, force: true });
181869
182279
  }
181870
182280
  }
181871
182281
  return { duration, start, end, removed: duration - (end - start), status };
@@ -181876,7 +182286,7 @@ var POLICY = "idle-ends-v2";
181876
182286
  var STABLE_MS = 750;
181877
182287
  var digest2 = (data) => import_node_crypto11.default.createHash("sha256").update(data).digest("hex");
181878
182288
  var stamp2 = (file) => {
181879
- const stat = import_node_fs32.default.statSync(file);
182289
+ const stat = import_node_fs33.default.statSync(file);
181880
182290
  return `${stat.dev}:${stat.ino}:${stat.size}:${stat.mtimeMs}:${stat.ctimeMs}`;
181881
182291
  };
181882
182292
  function createVerifyRecordings(options2) {
@@ -181890,7 +182300,7 @@ function createVerifyRecordings(options2) {
181890
182300
  const notify = (job) => {
181891
182301
  if (current(job)) options2.onChange(job.artifact);
181892
182302
  };
181893
- const cacheDir = import_node_path28.default.join(options2.stateDir, "recordings");
182303
+ const cacheDir = import_node_path29.default.join(options2.stateDir, "recordings");
181894
182304
  async function process2(job) {
181895
182305
  let temporary;
181896
182306
  try {
@@ -181899,7 +182309,7 @@ function createVerifyRecordings(options2) {
181899
182309
  options2.onChange(job.artifact);
181900
182310
  return;
181901
182311
  }
181902
- const bytes = await import_node_fs32.default.promises.readFile(job.file);
182312
+ const bytes = await import_node_fs33.default.promises.readFile(job.file);
181903
182313
  if (!current(job)) return;
181904
182314
  if (stamp2(job.file) !== job.stamp) {
181905
182315
  jobs.delete(job.key);
@@ -181907,22 +182317,22 @@ function createVerifyRecordings(options2) {
181907
182317
  return;
181908
182318
  }
181909
182319
  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");
182320
+ const dir = import_node_path29.default.join(cacheDir, key2);
182321
+ const output = import_node_path29.default.join(dir, "clip.mp4");
182322
+ const metadata = import_node_path29.default.join(dir, "result.json");
181913
182323
  let cached;
181914
182324
  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)))
182325
+ const saved = JSON.parse(import_node_fs33.default.readFileSync(metadata, "utf8"));
182326
+ if (saved.result.status !== "trimmed" || import_node_fs33.default.existsSync(output) && saved.hash === digest2(import_node_fs33.default.readFileSync(output)))
181917
182327
  cached = saved;
181918
182328
  } catch {
181919
182329
  }
181920
182330
  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);
182331
+ import_node_fs33.default.mkdirSync(cacheDir, { recursive: true });
182332
+ temporary = import_node_fs33.default.mkdtempSync(import_node_path29.default.join(cacheDir, ".prepare-"));
182333
+ const input = import_node_path29.default.join(temporary, "capture");
182334
+ const prepared = import_node_path29.default.join(temporary, "clip.mp4");
182335
+ import_node_fs33.default.writeFileSync(input, bytes);
181926
182336
  const result = await (options2.prepare ?? trimRecording)(
181927
182337
  input,
181928
182338
  prepared,
@@ -181934,9 +182344,9 @@ function createVerifyRecordings(options2) {
181934
182344
  options2.onChange(job.artifact);
181935
182345
  return;
181936
182346
  }
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);
182347
+ import_node_fs33.default.mkdirSync(dir, { recursive: true });
182348
+ const hash2 = result.status === "trimmed" ? digest2(import_node_fs33.default.readFileSync(prepared)) : void 0;
182349
+ if (result.status === "trimmed") import_node_fs33.default.copyFileSync(prepared, output);
181940
182350
  cached = { result, ...hash2 ? { hash: hash2 } : {} };
181941
182351
  writeJsonAtomic(metadata, cached);
181942
182352
  }
@@ -181969,7 +182379,7 @@ function createVerifyRecordings(options2) {
181969
182379
  };
181970
182380
  notify(job);
181971
182381
  } finally {
181972
- if (temporary) import_node_fs32.default.rmSync(temporary, { recursive: true, force: true });
182382
+ if (temporary) import_node_fs33.default.rmSync(temporary, { recursive: true, force: true });
181973
182383
  }
181974
182384
  }
181975
182385
  function pump() {
@@ -182035,7 +182445,7 @@ function createVerifyRecordings(options2) {
182035
182445
  if (job.state.status === "processing") pending.add(boardId);
182036
182446
  if (job.virtual && job.output) {
182037
182447
  canvas.boards[boardId] = { ...board, file: job.virtual, src: job.virtual };
182038
- versions[job.virtual] = import_node_fs32.default.statSync(job.output).mtimeMs;
182448
+ versions[job.virtual] = import_node_fs33.default.statSync(job.output).mtimeMs;
182039
182449
  }
182040
182450
  }
182041
182451
  for (const job of jobs.values()) if (job.artifact === id3 && !active.has(job.key)) stop(job);
@@ -182064,7 +182474,7 @@ function createVerifyRecordings(options2) {
182064
182474
  continue;
182065
182475
  const original = job.key.slice(id3.length + 1);
182066
182476
  if (!referenced.has(original)) overrides.set(original, null);
182067
- overrides.set(job.virtual, import_node_fs32.default.readFileSync(job.output));
182477
+ overrides.set(job.virtual, import_node_fs33.default.readFileSync(job.output));
182068
182478
  }
182069
182479
  if (overrides.size) overrides.set("canvas.json", Buffer.from(JSON.stringify(payload.canvas)));
182070
182480
  return overrides;
@@ -182078,8 +182488,8 @@ function createVerifyRecordings(options2) {
182078
182488
  }
182079
182489
 
182080
182490
  // src/server/whiteboard.ts
182081
- var import_node_fs33 = __toESM(require("node:fs"), 1);
182082
- var import_node_path29 = __toESM(require("node:path"), 1);
182491
+ var import_node_fs34 = __toESM(require("node:fs"), 1);
182492
+ var import_node_path30 = __toESM(require("node:path"), 1);
182083
182493
 
182084
182494
  // src/server/whiteboard-lint.ts
182085
182495
  var LINE_TYPES = /* @__PURE__ */ new Set(["arrow", "line"]);
@@ -182129,16 +182539,16 @@ var segmentsCross = (a5, b6, c10, d10) => side(a5, b6, c10) * side(a5, b6, d10)
182129
182539
  var pathOf = (element) => {
182130
182540
  const { points: points2 } = element;
182131
182541
  if (!Array.isArray(points2) || points2.length < 2) return null;
182132
- const path44 = [];
182542
+ const path45 = [];
182133
182543
  for (const point2 of points2) {
182134
182544
  if (!Array.isArray(point2) || typeof point2[0] !== "number" || typeof point2[1] !== "number")
182135
182545
  return null;
182136
- path44.push([(element.x ?? 0) + point2[0], (element.y ?? 0) + point2[1]]);
182546
+ path45.push([(element.x ?? 0) + point2[0], (element.y ?? 0) + point2[1]]);
182137
182547
  }
182138
- return path44;
182548
+ return path45;
182139
182549
  };
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);
182550
+ var segmentsOf = (path45) => path45.slice(1).map((end, index) => [path45[index], end]);
182551
+ var lengthOf = (path45) => segmentsOf(path45).reduce((sum2, [a5, b6]) => sum2 + Math.hypot(b6[0] - a5[0], b6[1] - a5[1]), 0);
182142
182552
  var boundIds = (element) => [element.startBinding?.elementId, element.endBinding?.elementId].filter(
182143
182553
  (id3) => typeof id3 === "string"
182144
182554
  );
@@ -182175,18 +182585,18 @@ function arrowWarnings(live3, geometry) {
182175
182585
  );
182176
182586
  const arrows = live3.flatMap((element) => {
182177
182587
  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) }] : [];
182588
+ const path45 = pathOf(element);
182589
+ return path45 ? [{ element, path: path45, bound: boundIds(element) }] : [];
182180
182590
  });
182181
182591
  const warnings = [];
182182
- for (const { element, path: path44 } of arrows) {
182183
- const ends = [path44[0], path44.at(-1)];
182592
+ for (const { element, path: path45 } of arrows) {
182593
+ const ends = [path45[0], path45.at(-1)];
182184
182594
  const around = obstacles.filter(
182185
182595
  (shape2) => !ends.some((end) => holds(geometry[shape2.id], end))
182186
182596
  );
182187
182597
  for (const shape2 of around) {
182188
182598
  const box2 = inset(geometry[shape2.id], GRAZE);
182189
- if (segmentsOf(path44).some(([a5, b6]) => segmentHits(a5, b6, box2)))
182599
+ if (segmentsOf(path45).some(([a5, b6]) => segmentHits(a5, b6, box2)))
182190
182600
  warnings.push(
182191
182601
  `arrow ${element.id} crosses ${shape2.id} \u2014 move ${shape2.id} or bend the arrow around it`
182192
182602
  );
@@ -182204,7 +182614,7 @@ function arrowWarnings(live3, geometry) {
182204
182614
  const need = Math.ceil(
182205
182615
  (Math.abs(dx2) * label.w + Math.abs(dy2) * label.h) / chord + LABEL_MARGIN
182206
182616
  );
182207
- const length = lengthOf(path44);
182617
+ const length = lengthOf(path45);
182208
182618
  if (length < need)
182209
182619
  warnings.push(
182210
182620
  `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 +182646,7 @@ function readWhiteboard(dir, id3) {
182236
182646
  const version3 = latestMtime(dir);
182237
182647
  let source;
182238
182648
  try {
182239
- source = import_node_fs33.default.readFileSync(import_node_path29.default.join(dir, ENTRY_FILE.whiteboard), "utf8");
182649
+ source = import_node_fs34.default.readFileSync(import_node_path30.default.join(dir, ENTRY_FILE.whiteboard), "utf8");
182240
182650
  } catch {
182241
182651
  return {
182242
182652
  title: id3,
@@ -182359,7 +182769,7 @@ function onlyPage(result, page, pages) {
182359
182769
  }
182360
182770
 
182361
182771
  // src/server/whiteboard-comments.ts
182362
- var import_node_path30 = __toESM(require("node:path"), 1);
182772
+ var import_node_path31 = __toESM(require("node:path"), 1);
182363
182773
 
182364
182774
  // src/shared/whiteboard/comments.ts
182365
182775
  var MAX_ELEMENTS = 50;
@@ -182484,7 +182894,7 @@ function createWhiteboardComments(options2) {
182484
182894
  let found = stores.get(id3);
182485
182895
  if (!found) {
182486
182896
  found = createStore(
182487
- import_node_path30.default.join(options2.root, "whiteboard", id3, "comments.json"),
182897
+ import_node_path31.default.join(options2.root, "whiteboard", id3, "comments.json"),
182488
182898
  rules,
182489
182899
  options2.names
182490
182900
  );
@@ -182580,8 +182990,8 @@ function createWhiteboardComments(options2) {
182580
182990
  }
182581
182991
 
182582
182992
  // src/server/whiteboards.ts
182583
- var import_node_fs34 = __toESM(require("node:fs"), 1);
182584
- var import_node_path31 = __toESM(require("node:path"), 1);
182993
+ var import_node_fs35 = __toESM(require("node:fs"), 1);
182994
+ var import_node_path32 = __toESM(require("node:path"), 1);
182585
182995
 
182586
182996
  // src/server/whiteboard-merge.ts
182587
182997
  var nonce = () => Math.floor(Math.random() * 2 ** 31);
@@ -182711,7 +183121,7 @@ var emptyScene = () => ({
182711
183121
  });
182712
183122
  var readText3 = (file) => {
182713
183123
  try {
182714
- return import_node_fs34.default.readFileSync(file, "utf8");
183124
+ return import_node_fs35.default.readFileSync(file, "utf8");
182715
183125
  } catch {
182716
183126
  return null;
182717
183127
  }
@@ -182726,8 +183136,8 @@ var validGeometry = (value) => {
182726
183136
  };
182727
183137
  function writeTextAtomic(file, text5) {
182728
183138
  const tmp = `${file}.${process.pid}.tmp`;
182729
- import_node_fs34.default.writeFileSync(tmp, text5);
182730
- import_node_fs34.default.renameSync(tmp, file);
183139
+ import_node_fs35.default.writeFileSync(tmp, text5);
183140
+ import_node_fs35.default.renameSync(tmp, file);
182731
183141
  }
182732
183142
  function createWhiteboards(opts) {
182733
183143
  const writeDelayMs = opts.writeDelayMs ?? 500;
@@ -182736,9 +183146,9 @@ function createWhiteboards(opts) {
182736
183146
  const geometries = /* @__PURE__ */ new Map();
182737
183147
  const renders = /* @__PURE__ */ new Map();
182738
183148
  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);
183149
+ const stateDir = opts.stateDir ?? import_node_path32.default.join(opts.root, ".state");
183150
+ const stateOf2 = (id3) => import_node_path32.default.join(stateDir, "whiteboard", id3);
183151
+ const pageStateOf = (id3, page) => import_node_path32.default.join(stateOf2(id3), "pages", page);
182742
183152
  const keyOf = (id3, page) => `${id3}
182743
183153
  ${page}`;
182744
183154
  const list2 = (id3) => {
@@ -182746,7 +183156,7 @@ ${page}`;
182746
183156
  if (existing) return existing;
182747
183157
  const dir = resolveArtifactDir(opts.root, "whiteboard", id3);
182748
183158
  if (!dir) return null;
182749
- const file = import_node_path31.default.join(dir, PAGES_FILE);
183159
+ const file = import_node_path32.default.join(dir, PAGES_FILE);
182750
183160
  const text5 = readText3(file);
182751
183161
  const parsed = parsePages(text5);
182752
183162
  const created = {
@@ -182780,7 +183190,7 @@ ${page}`;
182780
183190
  if (existing) return existing;
182781
183191
  const dir = resolveArtifactDir(opts.root, "whiteboard", id3);
182782
183192
  if (!dir) return null;
182783
- const file = import_node_path31.default.join(dir, pageFileOf(page));
183193
+ const file = import_node_path32.default.join(dir, pageFileOf(page));
182784
183194
  const text5 = readText3(file);
182785
183195
  const parsed = text5 === null ? { scene: emptyScene() } : parseScene(text5, pageFileOf(page));
182786
183196
  const session = {
@@ -182809,7 +183219,7 @@ ${page}`;
182809
183219
  session.pending = false;
182810
183220
  const text5 = serializeScene(session.scene);
182811
183221
  if (text5 === session.written) return;
182812
- import_node_fs34.default.mkdirSync(import_node_path31.default.dirname(session.file), { recursive: true });
183222
+ import_node_fs35.default.mkdirSync(import_node_path32.default.dirname(session.file), { recursive: true });
182813
183223
  writeTextAtomic(session.file, text5);
182814
183224
  session.written = text5;
182815
183225
  };
@@ -182875,7 +183285,7 @@ ${page}`;
182875
183285
  if (legacyCleared.has(id3)) return;
182876
183286
  legacyCleared.add(id3);
182877
183287
  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 });
183288
+ import_node_fs35.default.rmSync(import_node_path32.default.join(stateOf2(id3), name), { force: true });
182879
183289
  };
182880
183290
  const known = (id3, page) => isPageId(page) && resolveArtifactDir(opts.root, "whiteboard", id3) !== null;
182881
183291
  const live3 = (id3) => livePages(normalized2(id3)?.pages ?? []);
@@ -182944,19 +183354,19 @@ ${page}`;
182944
183354
  reportGeometry(id3, geometry, page = MAIN_PAGE) {
182945
183355
  if (!validGeometry(geometry) || !known(id3, page)) return false;
182946
183356
  geometries.set(keyOf(id3, page), geometry);
182947
- writeJsonAtomic(import_node_path31.default.join(pageStateOf(id3, page), "geometry.json"), geometry);
183357
+ writeJsonAtomic(import_node_path32.default.join(pageStateOf(id3, page), "geometry.json"), geometry);
182948
183358
  stateWritten(id3);
182949
183359
  return true;
182950
183360
  },
182951
183361
  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"),
183362
+ renderPathOf: (id3, page = MAIN_PAGE) => import_node_path32.default.join(pageStateOf(id3, page), "render.png"),
182953
183363
  reportRender(id3, png, sceneVersion, page = MAIN_PAGE) {
182954
183364
  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);
183365
+ import_node_fs35.default.mkdirSync(pageStateOf(id3, page), { recursive: true });
183366
+ writeTextAtomic(import_node_path32.default.join(pageStateOf(id3, page), "render.png"), png);
182957
183367
  const meta = { sceneVersion, at: (/* @__PURE__ */ new Date()).toISOString() };
182958
183368
  renders.set(keyOf(id3, page), meta);
182959
- writeJsonAtomic(import_node_path31.default.join(pageStateOf(id3, page), "render.json"), meta);
183369
+ writeJsonAtomic(import_node_path32.default.join(pageStateOf(id3, page), "render.json"), meta);
182960
183370
  stateWritten(id3);
182961
183371
  return true;
182962
183372
  },
@@ -182981,7 +183391,6 @@ ${page}`;
182981
183391
  }
182982
183392
 
182983
183393
  // src/server/context.ts
182984
- var REF_ARTBOARD = /<ref\b[^>]*?\bartboard="([^"]+)"/g;
182985
183394
  function readArtifactSource(dir, ref, runtime = []) {
182986
183395
  if (ref.type === "artboard") {
182987
183396
  const payload2 = readCanvas(dir);
@@ -183011,18 +183420,18 @@ function titleOf(payload) {
183011
183420
  return "Untitled artifact";
183012
183421
  }
183013
183422
  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");
183423
+ const root = import_node_path33.default.resolve(options2.root);
183424
+ const viewerDir = import_node_path33.default.resolve(options2.viewerDir);
183425
+ const runtimeDir = options2.runtimeDir ? import_node_path33.default.resolve(options2.runtimeDir) : null;
183426
+ const stateDir = import_node_path33.default.join(root, ".state");
183427
+ import_node_fs36.default.mkdirSync(stateDir, { recursive: true, mode: 448 });
183428
+ import_node_fs36.default.writeFileSync(import_node_path33.default.join(stateDir, ".gitignore"), "*\n");
183020
183429
  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");
183430
+ const portFile = import_node_path33.default.join(stateDir, ".last-port");
183431
+ const tokenFile = import_node_path33.default.join(stateDir, ".last-token");
183023
183432
  const mount = options2.mount;
183024
183433
  const token = mount?.token ?? (readPersisted(tokenFile) || randomToken());
183025
- if (!mount) import_node_fs35.default.writeFileSync(tokenFile, `${token}
183434
+ if (!mount) import_node_fs36.default.writeFileSync(tokenFile, `${token}
183026
183435
  `, { mode: 384 });
183027
183436
  const contentToken = randomToken();
183028
183437
  const loopback = isLoopbackHost(options2.host);
@@ -183052,7 +183461,7 @@ function createServerContext(options2) {
183052
183461
  const pages = whiteboards.livePages(id3).flatMap((page) => {
183053
183462
  const scene = whiteboards.scene(id3, page.id);
183054
183463
  if (!scene) return [];
183055
- const bytes = import_node_fs35.default.statSync(import_node_path32.default.join(dir, pageFileOf(page.id)), { throwIfNoEntry: false })?.size ?? 0;
183464
+ const bytes = import_node_fs36.default.statSync(import_node_path33.default.join(dir, pageFileOf(page.id)), { throwIfNoEntry: false })?.size ?? 0;
183056
183465
  return [
183057
183466
  {
183058
183467
  id: page.id,
@@ -183125,8 +183534,8 @@ function createServerContext(options2) {
183125
183534
  });
183126
183535
  const avatars = createAvatars(options2.fetch);
183127
183536
  const names = commentNames({
183128
- agentFile: import_node_path32.default.join(stateDir, "agent"),
183129
- projectDir: import_node_path32.default.resolve(root, "../.."),
183537
+ agentFile: import_node_path33.default.join(stateDir, "agent"),
183538
+ projectDir: import_node_path33.default.resolve(root, "../.."),
183130
183539
  cloud: options2.cloud
183131
183540
  });
183132
183541
  const whiteboardComments = createWhiteboardComments({
@@ -183184,11 +183593,7 @@ function createServerContext(options2) {
183184
183593
  writeState({ type: "document", id: id3 }, dir);
183185
183594
  broadcast({ type: "change", artifact: `document/${id3}`, files: [] });
183186
183595
  },
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
- ];
183596
+ onRefsChange: (_id, targets) => {
183192
183597
  for (const ref of targets) {
183193
183598
  const dir = resolveArtifactDir(root, ref.type, ref.id);
183194
183599
  if (!dir) continue;
@@ -183244,15 +183649,10 @@ function createServerContext(options2) {
183244
183649
  const cloud = options2.cloud && options2.configFile ? createCloudRoutes({
183245
183650
  ...options2.cloud,
183246
183651
  configFile: options2.configFile,
183247
- project: import_node_path32.default.basename(import_node_path32.default.resolve(root, "../..")),
183652
+ project: import_node_path33.default.basename(import_node_path33.default.resolve(root, "../..")),
183248
183653
  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
- },
183654
+ references: (ref) => referencesOf(root, `${ref.type}/${ref.id}`),
183655
+ referrers: (ref) => referrersOf(root, `${ref.type}/${ref.id}`),
183256
183656
  port: () => ctx.port,
183257
183657
  inspect,
183258
183658
  onPublication: (key2, publication) => {
@@ -183260,7 +183660,7 @@ function createServerContext(options2) {
183260
183660
  }
183261
183661
  }) : null;
183262
183662
  const autoPublisher = cloud ? createAutoPublisher({
183263
- stateFile: import_node_path32.default.join(stateDir, "auto-publish.json"),
183663
+ stateFile: import_node_path33.default.join(stateDir, "auto-publish.json"),
183264
183664
  enabled: cloud.autoPublishEnabled,
183265
183665
  token: cloud.token,
183266
183666
  publish: async (key2) => {
@@ -183306,7 +183706,7 @@ function createServerContext(options2) {
183306
183706
  staleThreads: boardComments.stale(ref.id),
183307
183707
  listening: boardComments.listening(ref.id),
183308
183708
  backlinks: backlinksOf(ref.id)
183309
- } : ref.type === "whiteboard" ? { backlinks: backlinksOf(ref.id, "whiteboard") } : {},
183709
+ } : { backlinks: backlinksOf(ref.id, ref.type) },
183310
183710
  contentBase: `${contentOrigin}${contentPrefix}${ref.type}/${ref.id}/`
183311
183711
  });
183312
183712
  const signatures = /* @__PURE__ */ new Map();
@@ -183320,11 +183720,10 @@ function createServerContext(options2) {
183320
183720
  payload,
183321
183721
  ref.type === "artboard" ? { ...extra, ...artboardHints(ref.id) } : extra
183322
183722
  );
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
- );
183723
+ writeJsonAtomic(
183724
+ import_node_path33.default.join(stateDir, ref.type, ref.id, "backlinks.json"),
183725
+ backlinksOf(ref.id, ref.type)
183726
+ );
183328
183727
  } catch (err) {
183329
183728
  console.error(JSON.stringify({ type: "state-write-error", error: err.message }));
183330
183729
  }
@@ -183417,7 +183816,7 @@ function createServerContext(options2) {
183417
183816
  };
183418
183817
  return ctx;
183419
183818
  }
183420
- var projectName = (ctx) => import_node_path32.default.basename(import_node_path32.default.dirname(import_node_path32.default.dirname(ctx.root)));
183819
+ var projectName = (ctx) => import_node_path33.default.basename(import_node_path33.default.dirname(import_node_path33.default.dirname(ctx.root)));
183421
183820
 
183422
183821
  // ../../node_modules/.pnpm/ws@8.18.3/node_modules/ws/wrapper.mjs
183423
183822
  var import_stream = __toESM(require_stream(), 1);
@@ -183591,8 +183990,8 @@ function createRelayClient(options2) {
183591
183990
  }
183592
183991
 
183593
183992
  // 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);
183993
+ var import_node_fs37 = __toESM(require("node:fs"), 1);
183994
+ var import_node_path34 = __toESM(require("node:path"), 1);
183596
183995
  function serveContent(ctx, res, rest, range, mode = "main") {
183597
183996
  const { root, runtimeDir, recordings, options: options2 } = ctx;
183598
183997
  if (rest.startsWith("runtime/")) {
@@ -183644,7 +184043,7 @@ function serveContent(ctx, res, rest, range, mode = "main") {
183644
184043
  sendFile(res, target, headers, range);
183645
184044
  return;
183646
184045
  }
183647
- import_node_fs36.default.readFile(target, "utf8", (err, source) => {
184046
+ import_node_fs37.default.readFile(target, "utf8", (err, source) => {
183648
184047
  if (err) send(res, 404, "Not found");
183649
184048
  else {
183650
184049
  const uiRuntimeUrl = runtimeDir ? `${mode === "board" ? "/c/" : ctx.contentPrefix}runtime/ryugi-ui.js` : void 0;
@@ -183680,7 +184079,7 @@ var robotsRoute = {
183680
184079
  path: "/robots.txt",
183681
184080
  auth: "public",
183682
184081
  handle: (_req, res, ctx) => {
183683
- sendFile(res, import_node_path33.default.join(ctx.viewerDir, "robots.txt"));
184082
+ sendFile(res, import_node_path34.default.join(ctx.viewerDir, "robots.txt"));
183684
184083
  }
183685
184084
  };
183686
184085
  var contentRoute = {
@@ -183727,8 +184126,8 @@ var createBoardRequestHandler = (ctx) => (req, res) => {
183727
184126
  };
183728
184127
 
183729
184128
  // 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);
184129
+ var import_node_fs38 = __toESM(require("node:fs"), 1);
184130
+ var import_node_path35 = __toESM(require("node:path"), 1);
183732
184131
 
183733
184132
  // src/shared/whiteboard/summary.ts
183734
184133
  var STICKY_FILL = "#ffec99";
@@ -183746,7 +184145,7 @@ function summarize(scene, opts = {}) {
183746
184145
  if (element.type === "text" && element.containerId && typeof element.text === "string")
183747
184146
  labels.set(element.containerId, element.text);
183748
184147
  const frameOf = new Map(live3.map((element) => [element.id, element.frameId ?? null]));
183749
- const item2 = (element) => ({
184148
+ const item3 = (element) => ({
183750
184149
  id: element.id,
183751
184150
  type: element.type,
183752
184151
  text: labels.get(element.id) ?? (typeof element.text === "string" ? element.text : null),
@@ -183760,9 +184159,9 @@ function summarize(scene, opts = {}) {
183760
184159
  const frames = live3.filter((element) => element.type === "frame" && (!opts.frame || element.id === opts.frame)).map((frame) => ({
183761
184160
  id: frame.id,
183762
184161
  name: typeof frame.name === "string" ? frame.name : frame.id,
183763
- items: shapes.filter((element) => element.frameId === frame.id).map(item2)
184162
+ items: shapes.filter((element) => element.frameId === frame.id).map(item3)
183764
184163
  }));
183765
- const loose = opts.frame ? [] : shapes.filter((element) => !element.frameId).map(item2);
184164
+ const loose = opts.frame ? [] : shapes.filter((element) => !element.frameId).map(item3);
183766
184165
  const inFrame = (id3) => id3 !== null && frameOf.get(id3) === opts.frame;
183767
184166
  const arrows = live3.filter((element) => LINE_TYPES3.has(element.type)).map((arrow) => ({
183768
184167
  arrow,
@@ -183781,7 +184180,7 @@ function summarize(scene, opts = {}) {
183781
184180
  }
183782
184181
  var oneLine2 = (text5) => text5.replaceAll(/\s*\n\s*/g, " / ");
183783
184182
  var credit = ({ author, editedBy }) => author ? ` \xB7 ${author}${editedBy ? `, ${editedBy} edited` : ""}` : "";
183784
- var itemLine = (item2) => ` ${item2.id} ${item2.sticky ? "sticky" : item2.type}${item2.text ? ` "${oneLine2(item2.text)}"` : ""}${credit(item2)}`;
184183
+ var itemLine = (item3) => ` ${item3.id} ${item3.sticky ? "sticky" : item3.type}${item3.text ? ` "${oneLine2(item3.text)}"` : ""}${credit(item3)}`;
183785
184184
  function formatSummary(summary) {
183786
184185
  const lines = [];
183787
184186
  for (const frame of summary.frames) {
@@ -183859,7 +184258,7 @@ var CHECK_BROWSER_WAIT_MS = 1e4;
183859
184258
  var agentName = (fields) => typeof fields.agent === "string" && fields.agent.length > 0 && fields.agent.length <= 100 ? fields.agent : void 0;
183860
184259
  var blockIdsOf = async (ctx, id3, dir) => {
183861
184260
  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"));
184261
+ const state2 = parseDocument2(import_node_fs38.default.readFileSync(import_node_path35.default.join(dir, "doc.xml"), "utf8"));
183863
184262
  return new Set(
183864
184263
  state2.root.children.flatMap(
183865
184264
  (block) => block.$?.blockId ? [block.$.blockId] : []
@@ -184044,7 +184443,7 @@ async function serveAgentCheck(res, ctx, type, id3, page = null) {
184044
184443
  let merging = false;
184045
184444
  if (ref.type === "document") {
184046
184445
  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);
184446
+ const text5 = await import_node_fs38.default.promises.readFile(import_node_path35.default.join(dir, "doc.xml"), "utf8").catch(() => null);
184048
184447
  if (session && text5 !== null) {
184049
184448
  session.onFileText(text5);
184050
184449
  const timeout = new Promise(
@@ -184057,7 +184456,7 @@ async function serveAgentCheck(res, ctx, type, id3, page = null) {
184057
184456
  if (ref.type === "whiteboard") await whiteboardCaughtUp(ctx, ref.id, checkedPages);
184058
184457
  const payload = ctx.writeState(ref, dir);
184059
184458
  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")
184459
+ await import_node_fs38.default.promises.readFile(import_node_path35.default.join(stateDir, ref.type, ref.id, "warnings.json"), "utf8")
184061
184460
  );
184062
184461
  const state2 = page === null ? written : {
184063
184462
  ...written,
@@ -184224,7 +184623,7 @@ async function serveAgentWhiteboardScene(req, res, ctx, id3) {
184224
184623
  sendJson(res, 404, { error: `whiteboard/${id3} not found` });
184225
184624
  return;
184226
184625
  }
184227
- const selection = readSelectedIds(import_node_path34.default.join(ctx.stateDir, "whiteboard", id3, "selection.json"));
184626
+ const selection = readSelectedIds(import_node_path35.default.join(ctx.stateDir, "whiteboard", id3, "selection.json"));
184228
184627
  const summary = summarize(scene, { ...frame ? { frame } : {}, selected: selection });
184229
184628
  sendJson(res, 200, {
184230
184629
  artifact: `whiteboard/${id3}`,
@@ -184238,9 +184637,9 @@ async function serveAgentWhiteboardScene(req, res, ctx, id3) {
184238
184637
  }
184239
184638
  function readSelectedIds(file) {
184240
184639
  try {
184241
- const parsed = JSON.parse(import_node_fs37.default.readFileSync(file, "utf8"));
184640
+ const parsed = JSON.parse(import_node_fs38.default.readFileSync(file, "utf8"));
184242
184641
  return (parsed.selected ?? []).flatMap(
184243
- (item2) => typeof item2.id === "string" ? [item2.id] : []
184642
+ (item3) => typeof item3.id === "string" ? [item3.id] : []
184244
184643
  );
184245
184644
  } catch {
184246
184645
  return [];
@@ -184289,12 +184688,12 @@ var agentEventRoute = {
184289
184688
 
184290
184689
  // src/server/review-defaults.ts
184291
184690
  function actionable(section, rounds) {
184292
- if (section === "asks") return (item2) => item2.state === "submitted";
184293
- if (section === "rounds") return (item2) => item2.state === "open" || item2.state === "submitted";
184691
+ if (section === "asks") return (item3) => item3.state === "submitted";
184692
+ if (section === "rounds") return (item3) => item3.state === "open" || item3.state === "submitted";
184294
184693
  const submitted = new Set(
184295
184694
  rounds.filter((round) => round.state === "submitted").map((round) => round.id)
184296
184695
  );
184297
- return (item2) => item2.kind === "verify" ? item2.verdict === "reject" : submitted.has(item2.round);
184696
+ return (item3) => item3.kind === "verify" ? item3.verdict === "reject" : submitted.has(item3.round);
184298
184697
  }
184299
184698
 
184300
184699
  // src/server/routes/agent-review.ts
@@ -184427,7 +184826,7 @@ async function serve(req, res, ctx, type, id3, operation) {
184427
184826
  if (body.op === "read" && !input.thread)
184428
184827
  throw new ReviewError("E_ARGUMENT_INVALID", "A thread ID is required.");
184429
184828
  if (body.sections !== void 0) {
184430
- if (body.op !== "list" || !Array.isArray(body.sections) || !body.sections.every((item2) => typeof item2 === "string"))
184829
+ if (body.op !== "list" || !Array.isArray(body.sections) || !body.sections.every((item3) => typeof item3 === "string"))
184431
184830
  throw new ReviewError(
184432
184831
  "E_ARGUMENT_INVALID",
184433
184832
  "sections requires a list of collection names and op=list."
@@ -184548,8 +184947,8 @@ function shape(element, at7, scale) {
184548
184947
  case "arrow":
184549
184948
  case "line":
184550
184949
  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"/>` : "";
184950
+ const path45 = points(element).map(([dx2, dy2]) => at7(x9 + dx2, y5 + dy2).join(",")).join(" ");
184951
+ return path45 ? `<polyline points="${path45}" stroke="${stroke}" stroke-width="1.4" fill="none" stroke-linecap="round"/>` : "";
184553
184952
  }
184554
184953
  case "text": {
184555
184954
  const size = Math.max(4, Math.min(28, h9 || 12 * scale));
@@ -184675,9 +185074,9 @@ function documentDrawing(title, payload) {
184675
185074
  });
184676
185075
  y5 += rows.length * 22 + 10;
184677
185076
  } else if (type === "list") {
184678
- children(block.children).slice(0, 4).forEach((item2, i7) => {
185077
+ children(block.children).slice(0, 4).forEach((item3, i7) => {
184679
185078
  parts.push(text4(104, y5, block.listType === "number" ? `${i7 + 1}.` : "\u2022"));
184680
- lines(nodeText(item2), 9, 2, 13);
185079
+ lines(nodeText(item3), 9, 2, 13);
184681
185080
  });
184682
185081
  y5 += 8;
184683
185082
  } else if (type === "alert-quote") {
@@ -185085,8 +185484,8 @@ var clientSocketRoute = {
185085
185484
  };
185086
185485
 
185087
185486
  // 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);
185487
+ var import_node_fs39 = __toESM(require("node:fs"), 1);
185488
+ var import_node_path36 = __toESM(require("node:path"), 1);
185090
185489
 
185091
185490
  // src/shared/type-icons.ts
185092
185491
  var TYPE_GLYPHS = {
@@ -185215,8 +185614,8 @@ function serveShell(req, res, ctx, { pathname, key: key2 }, embedded) {
185215
185614
  if (ref) headers["Referrer-Policy"] = "same-origin";
185216
185615
  if (key2 !== null && !loopback)
185217
185616
  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) => {
185617
+ const entry = preview2 && import_node_fs39.default.existsSync(import_node_path36.default.join(viewerDir, "preview.html")) ? "preview.html" : "index.html";
185618
+ void import_node_fs39.default.promises.readFile(import_node_path36.default.join(viewerDir, entry), "utf8").then((template) => {
185220
185619
  const html = viewerPage(template, {
185221
185620
  title,
185222
185621
  description,
@@ -185568,7 +185967,7 @@ async function startArtifactsServer(options2) {
185568
185967
  } catch {
185569
185968
  ctx.port = await listen(server, options2.host, 0);
185570
185969
  }
185571
- import_node_fs39.default.writeFileSync(ctx.portFile, `${ctx.port}
185970
+ import_node_fs40.default.writeFileSync(ctx.portFile, `${ctx.port}
185572
185971
  `, { mode: 384 });
185573
185972
  }
185574
185973
  const port = ctx.port;
@@ -185577,7 +185976,7 @@ async function startArtifactsServer(options2) {
185577
185976
  const boardServer = import_node_http.default.createServer(handleBoardRequest);
185578
185977
  if (mount) ctx.boardPort = mount.boardPort;
185579
185978
  else if (loopback) {
185580
- const boardPortFile = import_node_path36.default.join(stateDir, BOARD_PORT_FILE);
185979
+ const boardPortFile = import_node_path37.default.join(stateDir, BOARD_PORT_FILE);
185581
185980
  const previousBoardPort = Number(readPersisted(boardPortFile));
185582
185981
  try {
185583
185982
  ctx.boardPort = await listen(
@@ -185588,7 +185987,7 @@ async function startArtifactsServer(options2) {
185588
185987
  } catch {
185589
185988
  ctx.boardPort = await listen(boardServer, options2.host, 0);
185590
185989
  }
185591
- import_node_fs39.default.writeFileSync(boardPortFile, `${ctx.boardPort}
185990
+ import_node_fs40.default.writeFileSync(boardPortFile, `${ctx.boardPort}
185592
185991
  `, { mode: 384 });
185593
185992
  }
185594
185993
  const boardPort = ctx.boardPort;
@@ -185607,7 +186006,7 @@ async function startArtifactsServer(options2) {
185607
186006
  initialChanges.push({ ref: entry, payload, files: [] });
185608
186007
  if (entry.type === "document") void ctx.documents.open(entry.id);
185609
186008
  }
185610
- writeJsonAtomic(import_node_path36.default.join(stateDir, "server-info"), {
186009
+ writeJsonAtomic(import_node_path37.default.join(stateDir, "server-info"), {
185611
186010
  type: "server-started",
185612
186011
  url,
185613
186012
  port,
@@ -185691,66 +186090,66 @@ async function startArtifactsServer(options2) {
185691
186090
  });
185692
186091
  await ctx.documents.close().catch(() => void 0);
185693
186092
  ctx.whiteboards.close();
185694
- if (mount) import_node_fs39.default.rmSync(import_node_path36.default.join(stateDir, "server-info"), { force: true });
186093
+ if (mount) import_node_fs40.default.rmSync(import_node_path37.default.join(stateDir, "server-info"), { force: true });
185695
186094
  }
185696
186095
  };
185697
186096
  }
185698
186097
  var mountArtifactsProject = (options2) => startArtifactsServer(options2);
185699
186098
 
185700
186099
  // 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);
186100
+ var import_node_fs42 = __toESM(require("node:fs"), 1);
186101
+ var import_node_path39 = __toESM(require("node:path"), 1);
185703
186102
 
185704
186103
  // src/server/machine.ts
185705
- var import_node_fs40 = __toESM(require("node:fs"), 1);
186104
+ var import_node_fs41 = __toESM(require("node:fs"), 1);
185706
186105
  var import_node_os = __toESM(require("node:os"), 1);
185707
- var import_node_path37 = __toESM(require("node:path"), 1);
186106
+ var import_node_path38 = __toESM(require("node:path"), 1);
185708
186107
  var DORMANT_AFTER_MS = 7 * 24 * 60 * 60 * 1e3;
185709
186108
  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");
186109
+ const home = env.RYUGI_SERVER_HOME || import_node_path38.default.join(homedir, ".ryugi", "server");
185711
186110
  return {
185712
186111
  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")
186112
+ pid: import_node_path38.default.join(home, "server.pid"),
186113
+ serverId: import_node_path38.default.join(home, "server-instance-id"),
186114
+ info: import_node_path38.default.join(home, "server-info"),
186115
+ log: import_node_path38.default.join(home, "server.log"),
186116
+ version: import_node_path38.default.join(home, "server-version"),
186117
+ lock: import_node_path38.default.join(home, "start.lock"),
186118
+ key: import_node_path38.default.join(home, "key"),
186119
+ projects: import_node_path38.default.join(home, "projects.json"),
186120
+ settings: import_node_path38.default.join(home, "settings.json"),
186121
+ stopped: import_node_path38.default.join(home, "server-stopped")
185723
186122
  };
185724
186123
  }
185725
186124
  function ensureHome(home) {
185726
- import_node_fs40.default.mkdirSync(home, { recursive: true, mode: 448 });
185727
- import_node_fs40.default.chmodSync(home, 448);
186125
+ import_node_fs41.default.mkdirSync(home, { recursive: true, mode: 448 });
186126
+ import_node_fs41.default.chmodSync(home, 448);
185728
186127
  }
185729
186128
  var realDir = (dir) => {
185730
186129
  try {
185731
- return import_node_fs40.default.realpathSync(import_node_path37.default.resolve(dir));
186130
+ return import_node_fs41.default.realpathSync(import_node_path38.default.resolve(dir));
185732
186131
  } catch {
185733
- return import_node_path37.default.resolve(dir);
186132
+ return import_node_path38.default.resolve(dir);
185734
186133
  }
185735
186134
  };
185736
186135
  var validEntry = (value) => {
185737
186136
  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);
186137
+ return !!entry && typeof entry.dir === "string" && import_node_path38.default.isAbsolute(entry.dir) && Number.isFinite(entry.registeredAt) && Number.isFinite(entry.lastUsedAt);
185739
186138
  };
185740
186139
  function readProjects(file) {
185741
186140
  try {
185742
- const value = JSON.parse(import_node_fs40.default.readFileSync(file, "utf8"));
186141
+ const value = JSON.parse(import_node_fs41.default.readFileSync(file, "utf8"));
185743
186142
  return Array.isArray(value.projects) ? value.projects.filter(validEntry) : [];
185744
186143
  } catch {
185745
186144
  return [];
185746
186145
  }
185747
186146
  }
185748
186147
  function writeProjects(file, projects) {
185749
- ensureHome(import_node_path37.default.dirname(file));
186148
+ ensureHome(import_node_path38.default.dirname(file));
185750
186149
  const tmp = `${file}.${process.pid}.tmp`;
185751
- import_node_fs40.default.writeFileSync(tmp, `${JSON.stringify({ projects }, null, 2)}
186150
+ import_node_fs41.default.writeFileSync(tmp, `${JSON.stringify({ projects }, null, 2)}
185752
186151
  `, { mode: 384 });
185753
- import_node_fs40.default.renameSync(tmp, file);
186152
+ import_node_fs41.default.renameSync(tmp, file);
185754
186153
  }
185755
186154
  function registerProject(file, projectDir, now = Date.now()) {
185756
186155
  const dir = realDir(projectDir);
@@ -185767,10 +186166,10 @@ function removeProject(file, projectDir) {
185767
186166
  const kept = projects.filter((entry) => entry.dir !== dir);
185768
186167
  if (kept.length !== projects.length) writeProjects(file, kept);
185769
186168
  }
185770
- var artifactsRootOf = (projectDir) => import_node_path37.default.join(projectDir, ".ryugi", "artifacts");
186169
+ var artifactsRootOf = (projectDir) => import_node_path38.default.join(projectDir, ".ryugi", "artifacts");
185771
186170
  function pruneProjects(file) {
185772
186171
  const projects = readProjects(file);
185773
- const kept = projects.filter((entry) => import_node_fs40.default.existsSync(artifactsRootOf(entry.dir)));
186172
+ const kept = projects.filter((entry) => import_node_fs41.default.existsSync(artifactsRootOf(entry.dir)));
185774
186173
  if (kept.length !== projects.length) writeProjects(file, kept);
185775
186174
  return kept;
185776
186175
  }
@@ -185779,7 +186178,7 @@ var isDormant = (entry, now = Date.now()) => now - entry.lastUsedAt > DORMANT_AF
185779
186178
  // src/server/artifact-index.ts
185780
186179
  var readAddress = (dir) => {
185781
186180
  try {
185782
- const value = import_node_fs41.default.readFileSync(import_node_path38.default.join(dir, ".artifact-id"), "utf8").trim();
186181
+ const value = import_node_fs42.default.readFileSync(import_node_path39.default.join(dir, ".artifact-id"), "utf8").trim();
185783
186182
  return isArtifactAddress(value) ? value : null;
185784
186183
  } catch {
185785
186184
  return null;
@@ -185787,7 +186186,7 @@ var readAddress = (dir) => {
185787
186186
  };
185788
186187
  var mtimeOf2 = (dir) => {
185789
186188
  try {
185790
- return import_node_fs41.default.statSync(dir).mtimeMs;
186189
+ return import_node_fs42.default.statSync(dir).mtimeMs;
185791
186190
  } catch {
185792
186191
  return 0;
185793
186192
  }
@@ -185886,7 +186285,7 @@ var ARTIFACT_KEY = /^(?:artboard|document|html)\/[a-z0-9][a-z0-9-]*$/;
185886
186285
  var SEP = "\n";
185887
186286
  var realDir2 = (dir) => {
185888
186287
  try {
185889
- return import_node_fs42.default.realpathSync(import_node_path39.default.resolve(dir));
186288
+ return import_node_fs43.default.realpathSync(import_node_path40.default.resolve(dir));
185890
186289
  } catch {
185891
186290
  return null;
185892
186291
  }
@@ -185944,7 +186343,7 @@ async function startHub(options2) {
185944
186343
  runtimeDir: options2.runtimeDir,
185945
186344
  host: options2.host,
185946
186345
  urlHost: options2.urlHost,
185947
- configFile: import_node_path39.default.join(project, ".ryugi", "config.json"),
186346
+ configFile: import_node_path40.default.join(project, ".ryugi", "config.json"),
185948
186347
  cloud: options2.cloud,
185949
186348
  fetch: options2.fetch,
185950
186349
  debounceMs: options2.debounceMs,
@@ -185959,7 +186358,7 @@ async function startHub(options2) {
185959
186358
  }
185960
186359
  return pending;
185961
186360
  };
185962
- const configFileOf = (project) => import_node_path39.default.join(project, ".ryugi", "config.json");
186361
+ const configFileOf = (project) => import_node_path40.default.join(project, ".ryugi", "config.json");
185963
186362
  const servedBy = (project) => {
185964
186363
  const mounted = ready.get(project);
185965
186364
  if (mounted) return mounted.served();
@@ -186006,10 +186405,10 @@ async function startHub(options2) {
186006
186405
  }) : null;
186007
186406
  const origin = `http://${urlHostForHttp(options2.urlHost)}:${port}`;
186008
186407
  const url = loopback ? `${origin}/` : `${origin}/?key=${options2.token}`;
186009
- const infoFileOf = (project) => import_node_path39.default.join(artifactsRootOf(project), ".state", "server-info");
186408
+ const infoFileOf = (project) => import_node_path40.default.join(artifactsRootOf(project), ".state", "server-info");
186010
186409
  const writeCompatInfo = (project) => {
186011
186410
  try {
186012
- import_node_fs42.default.mkdirSync(import_node_path39.default.dirname(infoFileOf(project)), { recursive: true, mode: 448 });
186411
+ import_node_fs43.default.mkdirSync(import_node_path40.default.dirname(infoFileOf(project)), { recursive: true, mode: 448 });
186013
186412
  writeJsonAtomic(infoFileOf(project), {
186014
186413
  type: "server-started",
186015
186414
  url,
@@ -186028,7 +186427,7 @@ async function startHub(options2) {
186028
186427
  counts.set(entry.project, (counts.get(entry.project) ?? 0) + 1);
186029
186428
  return ordered3().map((entry) => ({
186030
186429
  dir: entry.dir,
186031
- name: import_node_path39.default.basename(entry.dir),
186430
+ name: import_node_path40.default.basename(entry.dir),
186032
186431
  lastUsedAt: entry.lastUsedAt,
186033
186432
  dormant: isDormant(entry),
186034
186433
  artifacts: counts.get(entry.dir) ?? 0
@@ -186041,7 +186440,7 @@ async function startHub(options2) {
186041
186440
  const root = artifactsRootOf(entry.dir);
186042
186441
  const listed = listArtifacts(root);
186043
186442
  for (const warning of listed.warnings)
186044
- warnings.push(`${import_node_path39.default.basename(entry.dir)}: ${warning}`);
186443
+ warnings.push(`${import_node_path40.default.basename(entry.dir)}: ${warning}`);
186045
186444
  for (const artifact of listed.artifacts) {
186046
186445
  try {
186047
186446
  artifacts.push({
@@ -186092,7 +186491,7 @@ async function startHub(options2) {
186092
186491
  };
186093
186492
  const publishedIn = (project, cloudId) => {
186094
186493
  try {
186095
- const { artifacts } = readConfig(import_node_path39.default.join(project, ".ryugi", "config.json")).config;
186494
+ const { artifacts } = readConfig(import_node_path40.default.join(project, ".ryugi", "config.json")).config;
186096
186495
  return Object.values(artifacts).some((entry) => entry.cloud?.id === cloudId);
186097
186496
  } catch {
186098
186497
  return false;
@@ -186155,7 +186554,7 @@ async function startHub(options2) {
186155
186554
  const register = async (dir, open2) => {
186156
186555
  const real = realDir2(dir);
186157
186556
  if (!real) throw new Error(`Project directory not found: ${dir}`);
186158
- import_node_fs42.default.mkdirSync(artifactsRootOf(real), { recursive: true });
186557
+ import_node_fs43.default.mkdirSync(artifactsRootOf(real), { recursive: true });
186159
186558
  const entry = registerProject(projectsFile, real);
186160
186559
  index.rescan();
186161
186560
  writeCompatInfo(real);
@@ -186165,10 +186564,10 @@ async function startHub(options2) {
186165
186564
  return entry;
186166
186565
  };
186167
186566
  const remove2 = async (dir) => {
186168
- const real = realDir2(dir) ?? import_node_path39.default.resolve(dir);
186567
+ const real = realDir2(dir) ?? import_node_path40.default.resolve(dir);
186169
186568
  removeProject(projectsFile, real);
186170
186569
  index.rescan();
186171
- import_node_fs42.default.rmSync(infoFileOf(real), { force: true });
186570
+ import_node_fs43.default.rmSync(infoFileOf(real), { force: true });
186172
186571
  const pending = mounts.get(real);
186173
186572
  mounts.delete(real);
186174
186573
  ready.delete(real);
@@ -186176,17 +186575,17 @@ async function startHub(options2) {
186176
186575
  };
186177
186576
  const logTail = (project) => {
186178
186577
  try {
186179
- const fd3 = import_node_fs42.default.openSync(options2.paths.log, "r");
186578
+ const fd3 = import_node_fs43.default.openSync(options2.paths.log, "r");
186180
186579
  try {
186181
- const size = import_node_fs42.default.fstatSync(fd3).size;
186580
+ const size = import_node_fs43.default.fstatSync(fd3).size;
186182
186581
  const length = Math.min(size, LOG_TAIL_BYTES);
186183
186582
  const buffer = Buffer.alloc(length);
186184
- import_node_fs42.default.readSync(fd3, buffer, 0, length, size - length);
186583
+ import_node_fs43.default.readSync(fd3, buffer, 0, length, size - length);
186185
186584
  const lines = buffer.toString("utf8").split("\n").filter(Boolean);
186186
186585
  if (length < size) lines.shift();
186187
186586
  return lines.filter((line2) => !project || line2.includes(project)).slice(-LOG_TAIL_LINES);
186188
186587
  } finally {
186189
- import_node_fs42.default.closeSync(fd3);
186588
+ import_node_fs43.default.closeSync(fd3);
186190
186589
  }
186191
186590
  } catch {
186192
186591
  return [];
@@ -186324,7 +186723,7 @@ async function startHub(options2) {
186324
186723
  mounts.clear();
186325
186724
  ready.clear();
186326
186725
  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 });
186726
+ for (const entry of ordered3()) import_node_fs43.default.rmSync(infoFileOf(entry.dir), { force: true });
186328
186727
  for (const server of [front, board]) server.closeAllConnections();
186329
186728
  await Promise.all(stopped);
186330
186729
  }
@@ -186333,8 +186732,8 @@ async function startHub(options2) {
186333
186732
 
186334
186733
  // src/server/relaunch.ts
186335
186734
  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);
186735
+ var import_node_fs44 = __toESM(require("node:fs"), 1);
186736
+ var import_node_path41 = __toESM(require("node:path"), 1);
186338
186737
  var LAUNCHER_COMMAND = /^node "(.+)"$/;
186339
186738
  var WAIT_THEN_RUN = `
186340
186739
  const [pid, file, ...args] = process.argv.slice(1);
@@ -186348,20 +186747,20 @@ tick();
186348
186747
  function relaunchCommand(env, serverDir) {
186349
186748
  const launcher = LAUNCHER_COMMAND.exec(env.RYUGI_ARTIFACTS_LAUNCHER ?? "")?.[1];
186350
186749
  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;
186750
+ const cli = import_node_path41.default.join(serverDir, "cli.cjs");
186751
+ return import_node_fs44.default.existsSync(cli) ? [process.execPath, cli] : null;
186353
186752
  }
186354
186753
  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"),
186754
+ const releases = import_node_path41.default.join(
186755
+ env.XDG_CACHE_HOME || import_node_path41.default.join(homedir, ".cache"),
186357
186756
  "ryugi",
186358
186757
  "artifacts"
186359
186758
  );
186360
- import_node_fs43.default.mkdirSync(releases, { recursive: true });
186361
- const file = import_node_path40.default.join(releases, "latest.json");
186759
+ import_node_fs44.default.mkdirSync(releases, { recursive: true });
186760
+ const file = import_node_path41.default.join(releases, "latest.json");
186362
186761
  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);
186762
+ import_node_fs44.default.writeFileSync(tmp, JSON.stringify({ version: version3, checkedAt: now }));
186763
+ import_node_fs44.default.renameSync(tmp, file);
186365
186764
  }
186366
186765
  function spawnAfterExit(pid, argv, env = process.env) {
186367
186766
  const [file, ...args] = argv;
@@ -186375,7 +186774,7 @@ function spawnAfterExit(pid, argv, env = process.env) {
186375
186774
  }
186376
186775
 
186377
186776
  // src/server/update-check.ts
186378
- var import_node_fs44 = __toESM(require("node:fs"), 1);
186777
+ var import_node_fs45 = __toESM(require("node:fs"), 1);
186379
186778
  var REGISTRY_URL = "https://registry.npmjs.org/ryugi-artifacts/latest";
186380
186779
  var DAY_MS = 24 * 60 * 60 * 1e3;
186381
186780
  var TIMEOUT_MS2 = 5e3;
@@ -186390,7 +186789,7 @@ function newerVersion(candidate, current) {
186390
186789
  }
186391
186790
  function readCache(file) {
186392
186791
  try {
186393
- const value = JSON.parse(import_node_fs44.default.readFileSync(file, "utf8"));
186792
+ const value = JSON.parse(import_node_fs45.default.readFileSync(file, "utf8"));
186394
186793
  return typeof value.version === "string" && Number.isFinite(value.checkedAt) ? value : null;
186395
186794
  } catch {
186396
186795
  return null;
@@ -186414,7 +186813,7 @@ function createUpdateCheck(options2) {
186414
186813
  const { version: version3 } = await res.json();
186415
186814
  if (typeof version3 !== "string") return;
186416
186815
  cached = { version: version3, checkedAt: now() };
186417
- import_node_fs44.default.writeFileSync(options2.cacheFile, `${JSON.stringify(cached)}
186816
+ import_node_fs45.default.writeFileSync(options2.cacheFile, `${JSON.stringify(cached)}
186418
186817
  `, { mode: 384 });
186419
186818
  } catch {
186420
186819
  }
@@ -186426,12 +186825,12 @@ function createUpdateCheck(options2) {
186426
186825
  var UPDATE_POLL_MS = 60 * 60 * 1e3;
186427
186826
  function machineKey(file) {
186428
186827
  try {
186429
- const key3 = import_node_fs45.default.readFileSync(file, "utf8").trim();
186828
+ const key3 = import_node_fs46.default.readFileSync(file, "utf8").trim();
186430
186829
  if (/^[a-f0-9]{48}$/.test(key3)) return key3;
186431
186830
  } catch {
186432
186831
  }
186433
186832
  const key2 = import_node_crypto13.default.randomBytes(24).toString("hex");
186434
- import_node_fs45.default.writeFileSync(file, `${key2}
186833
+ import_node_fs46.default.writeFileSync(file, `${key2}
186435
186834
  `, { mode: 384 });
186436
186835
  return key2;
186437
186836
  }
@@ -186440,14 +186839,14 @@ async function main2() {
186440
186839
  const paths = machinePaths();
186441
186840
  ensureHome(paths.home);
186442
186841
  const updates = createUpdateCheck({
186443
- cacheFile: import_node_path41.default.join(paths.home, "latest.json"),
186842
+ cacheFile: import_node_path42.default.join(paths.home, "latest.json"),
186444
186843
  current: version
186445
186844
  });
186446
186845
  const hub = await startHub({
186447
186846
  host: config.host,
186448
186847
  urlHost: config.urlHost,
186449
- viewerDir: import_node_path41.default.join(__dirname, "viewer"),
186450
- runtimeDir: import_node_path41.default.join(__dirname, "runtime"),
186848
+ viewerDir: import_node_path42.default.join(__dirname, "viewer"),
186849
+ runtimeDir: import_node_path42.default.join(__dirname, "runtime"),
186451
186850
  ports: config.ports,
186452
186851
  boardPorts: config.boardPorts,
186453
186852
  paths,
@@ -186484,14 +186883,14 @@ async function main2() {
186484
186883
  if (stopping) return;
186485
186884
  stopping = true;
186486
186885
  console.info(JSON.stringify({ type: "server-stopped", reason, at: (/* @__PURE__ */ new Date()).toISOString() }));
186487
- import_node_fs45.default.rmSync(paths.info, { force: true });
186886
+ import_node_fs46.default.rmSync(paths.info, { force: true });
186488
186887
  if (intended) writeJsonAtomic(paths.stopped, { reason, timestamp: Date.now() });
186489
186888
  await hub.close();
186490
186889
  process.exit(0);
186491
186890
  }
186492
186891
  function readRunningVersion() {
186493
186892
  try {
186494
- return import_node_fs45.default.readFileSync(paths.version, "utf8").trim() || version;
186893
+ return import_node_fs46.default.readFileSync(paths.version, "utf8").trim() || version;
186495
186894
  } catch {
186496
186895
  return version;
186497
186896
  }
@@ -186534,7 +186933,7 @@ async function main2() {
186534
186933
  process.on("SIGTERM", () => void shutdown("SIGTERM"));
186535
186934
  process.on("SIGINT", () => void shutdown("SIGINT"));
186536
186935
  process.on("SIGHUP", () => void shutdown("SIGHUP"));
186537
- import_node_fs45.default.rmSync(paths.stopped, { force: true });
186936
+ import_node_fs46.default.rmSync(paths.stopped, { force: true });
186538
186937
  const started = {
186539
186938
  type: "server-started",
186540
186939
  url: hub.url,