ryugi-artifacts 1.46.4 → 1.48.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 (408) hide show
  1. package/dist/cli.cjs +34 -83
  2. package/dist/server.cjs +381 -148
  3. package/dist/viewer/ArtboardLayout-KQmamERB.js +12 -0
  4. package/dist/viewer/ArtifactList-BX7uyG0a.js +1 -0
  5. package/dist/viewer/AutoPublishPrompt-hLdShrr1.js +1 -0
  6. package/dist/viewer/Avatar-dVuGXaGv.js +1 -0
  7. package/dist/viewer/Canvas-DR9g_0g-.js +1 -0
  8. package/dist/viewer/DocumentLayout-BGmMGPWu.js +2 -0
  9. package/dist/viewer/DocumentPage-C7pveaCL.js +4 -0
  10. package/dist/viewer/{HtmlLayout-JbFepfOx.js → HtmlLayout-DN_RC8ER.js} +1 -1
  11. package/dist/viewer/MenuSubmenuTrigger-COtUZ7rK.js +1 -0
  12. package/dist/viewer/PopoverPopup-DbicV8QT.js +1 -0
  13. package/dist/viewer/PreviewLayout-bKeGBF-n.js +2 -0
  14. package/dist/viewer/Select-CyQRjxXp.js +1 -0
  15. package/dist/viewer/SelectScrollUpArrow-BquMl3kO.js +1 -0
  16. package/dist/viewer/SettingsDialog-DALEpAnA.js +1 -0
  17. package/dist/viewer/{SnapshotDocument-ClAWTjeM.js → SnapshotDocument-B4d-X_r-.js} +1 -1
  18. package/dist/viewer/Switch-C9DrBYMm.js +29 -0
  19. package/dist/viewer/TooltipPopup-BRiHjngV.js +1 -0
  20. package/dist/viewer/{VirtualizedEditor-D9Ivycdp-BLz9FUd_.js → VirtualizedEditor-D9Ivycdp-D5vZigul.js} +1 -1
  21. package/dist/viewer/{VirtualizedRenderer-C_d95FXi-lxFTJrCM.js → VirtualizedRenderer-C_d95FXi-jDSvsO_S.js} +1 -1
  22. package/dist/viewer/{WarningsBadge-CncFp0uo.js → WarningsBadge-Dq9MCOka.js} +1 -1
  23. package/dist/viewer/{abnfDiagram-VCTEODGH-mEPSnGnu.js → abnfDiagram-VCTEODGH-DvH3n-ag.js} +1 -1
  24. package/dist/viewer/{ar-SA-G6X2FPQ2-Cp857egn.js → ar-SA-G6X2FPQ2-D11wBsfI.js} +1 -1
  25. package/dist/viewer/{architecture-7GRP2DOG-BPphpWPh.js → architecture-7GRP2DOG-getNBIXu.js} +1 -1
  26. package/dist/viewer/{architectureDiagram-5GKGNRK7-udE5sVLB.js → architectureDiagram-5GKGNRK7-DacvQVV0.js} +1 -1
  27. package/dist/viewer/atoms-DfNSS4CQ.js +9 -0
  28. package/dist/viewer/{az-AZ-76LH7QW2-Bem2LSSt.js → az-AZ-76LH7QW2-DmjLQk0z.js} +1 -1
  29. package/dist/viewer/{bg-BG-XCXSNQG7-axI5dGVJ.js → bg-BG-XCXSNQG7-Dq5qUQzr.js} +1 -1
  30. package/dist/viewer/{blockDiagram-I7D4REHJ-BQzF8TVP.js → blockDiagram-I7D4REHJ-DYFZvVtR.js} +1 -1
  31. package/dist/viewer/{bn-BD-2XOGV67Q-YVYcHPPL.js → bn-BD-2XOGV67Q-CB5ihzW3.js} +1 -1
  32. package/dist/viewer/{c4Diagram-7LVT6UL2-CNYKrMr7.js → c4Diagram-7LVT6UL2-CItIeFst.js} +1 -1
  33. package/dist/viewer/{ca-ES-6MX7JW3Y-DyYMU4L7.js → ca-ES-6MX7JW3Y-B1vvpFRz.js} +1 -1
  34. package/dist/viewer/{channel-pL0Dn2nF.js → channel-NSE57aBD.js} +66 -66
  35. package/dist/viewer/channel-tQ-5o9x1.js +1 -0
  36. package/dist/viewer/{chunk-4HAMMTFA-CqdJF1HV.js → chunk-4HAMMTFA-BXjvEkTf.js} +1 -1
  37. package/dist/viewer/{chunk-75Z2AOVW-Cy-8N6eQ.js → chunk-75Z2AOVW-Cp5QYgru.js} +1 -1
  38. package/dist/viewer/{chunk-DU6HZSFF-BzTpxqAJ.js → chunk-DU6HZSFF-Co37jFu9.js} +1 -1
  39. package/dist/viewer/{chunk-EIO257PC-DXrO1LJ_.js → chunk-EIO257PC-BzoJi82T.js} +1 -1
  40. package/dist/viewer/{chunk-F27PBJKO-B_qZ0RYo.js → chunk-F27PBJKO-SOAeS3VX.js} +1 -1
  41. package/dist/viewer/{chunk-GMAD6QVW-5lCfV5dP.js → chunk-GMAD6QVW-Ozh-1h9J.js} +1 -1
  42. package/dist/viewer/{chunk-GVQU2GXP-DYfSQF-7.js → chunk-GVQU2GXP-DPXdyMxy.js} +1 -1
  43. package/dist/viewer/{chunk-IMKFNOWR-CxMz4Mtt.js → chunk-IMKFNOWR-D3-fYgRw.js} +1 -1
  44. package/dist/viewer/{chunk-L3NEJ4N5-DhiPR2id.js → chunk-L3NEJ4N5-CsXfjxgF.js} +1 -1
  45. package/dist/viewer/{chunk-OSK3NFVY-CO7KyC2S.js → chunk-OSK3NFVY-33dYvZp0.js} +1 -1
  46. package/dist/viewer/{chunk-P2QGCYS3-CCqOjUfu.js → chunk-P2QGCYS3-3KdzOSkK.js} +1 -1
  47. package/dist/viewer/{chunk-POPQ4Y6H-CMRQsjfW.js → chunk-POPQ4Y6H-DLxpEPms.js} +1 -1
  48. package/dist/viewer/{chunk-PWAF6VOD-So7CXUcO.js → chunk-PWAF6VOD-JePqG5w3.js} +1 -1
  49. package/dist/viewer/{chunk-SHT3W25Y-CWX2acMq.js → chunk-SHT3W25Y-D83tEMVR.js} +1 -1
  50. package/dist/viewer/{chunk-SVP7TREG-Cl29hMU_.js → chunk-SVP7TREG-B1VK1C1g.js} +1 -1
  51. package/dist/viewer/{chunk-TICWLB2K-C8GlShVX.js → chunk-TICWLB2K-Cn0lQFgz.js} +1 -1
  52. package/dist/viewer/classDiagram-ZZMXUADV-CbZZST1l.js +1 -0
  53. package/dist/viewer/classDiagram-v2-VYDZK3BY-CbZZST1l.js +1 -0
  54. package/dist/viewer/cloud-upload-Bjo_kLnp.js +1 -0
  55. package/dist/viewer/{cs-CZ-2BRQDIVT-DJH-JJF7.js → cs-CZ-2BRQDIVT-CMWJYUvu.js} +1 -1
  56. package/dist/viewer/{cynefin-OW5HDTMX-Lwpnu8BJ.js → cynefin-OW5HDTMX-Cg5yzGfm.js} +1 -1
  57. package/dist/viewer/{cynefinDiagram-5FMLGOSQ-DJmfTgH6.js → cynefinDiagram-5FMLGOSQ-DosdMrh6.js} +1 -1
  58. package/dist/viewer/{da-DK-5WZEPLOC-DSGDp-gX.js → da-DK-5WZEPLOC-D64URQaK.js} +1 -1
  59. package/dist/viewer/{dagre-GXQ25YYZ-DG__k9Q6.js → dagre-GXQ25YYZ-CTCCaVFG.js} +1 -1
  60. package/dist/viewer/{de-DE-XR44H4JA-DGlaIFnH.js → de-DE-XR44H4JA-41XC-cAS.js} +1 -1
  61. package/dist/viewer/{diagram-S7CK7UJ4-JMLjEgab.js → diagram-S7CK7UJ4-CxwnLwpO.js} +1 -1
  62. package/dist/viewer/{diagram-UQ7AKVKN-CbXj62Bz.js → diagram-UQ7AKVKN-AcI8HsSg.js} +1 -1
  63. package/dist/viewer/{diagram-VSXAHHWV-CCP_qXmC.js → diagram-VSXAHHWV-DlvGSQbP.js} +1 -1
  64. package/dist/viewer/{diagram-VX7I27RA-fPZSR2A3.js → diagram-VX7I27RA-BbKISGj6.js} +1 -1
  65. package/dist/viewer/{diagram-Z3DM3KII-CMld_a9M.js → diagram-Z3DM3KII-DNwxN4s8.js} +1 -1
  66. package/dist/viewer/{dist-DF_C3tPP.js → dist-BAhKEC7v.js} +1 -1
  67. package/dist/viewer/{dist-Dmcq26kl.js → dist-BPuOQwgt.js} +1 -1
  68. package/dist/viewer/{dist-DNsaADyM.js → dist-BR3etSjd.js} +1 -1
  69. package/dist/viewer/{dist-B73-AOMp.js → dist-BtMYPQ-R.js} +4 -4
  70. package/dist/viewer/{dist-D7p7PX97.js → dist-Bxn9izx8.js} +1 -1
  71. package/dist/viewer/{dist-DHH9S5VN.js → dist-C89I1Syb.js} +1 -1
  72. package/dist/viewer/{dist-DvZQ33zO.js → dist-C8gjGXlt.js} +1 -1
  73. package/dist/viewer/{dist-CKG9NFxz.js → dist-CCpihLKc.js} +1 -1
  74. package/dist/viewer/{dist-CttJDa2Y.js → dist-CaHvwSHf.js} +1 -1
  75. package/dist/viewer/{dist-DJPefqEH.js → dist-Cd5E_SnD.js} +1 -1
  76. package/dist/viewer/{dist-DO7f7LQh.js → dist-ChkKwRhM.js} +1 -1
  77. package/dist/viewer/{dist-Dqtlnhfg.js → dist-CjRmmbjs.js} +1 -1
  78. package/dist/viewer/{dist-HhgeDoR0.js → dist-Cl-9gKYC.js} +1 -1
  79. package/dist/viewer/{dist-C4r1juVz.js → dist-CsaZKHv_.js} +1 -1
  80. package/dist/viewer/{dist-C0frS6Eh.js → dist-D5nVsU3q.js} +1 -1
  81. package/dist/viewer/{dist-B9XcSkup.js → dist-D8In6BWy.js} +1 -1
  82. package/dist/viewer/{dist-DcJsVzc8.js → dist-DHiNxYl_.js} +1 -1
  83. package/dist/viewer/{dist-DSDVZsDP.js → dist-DY-Y4Me7.js} +1 -1
  84. package/dist/viewer/{dist-DgYPiJkH.js → dist-DfgStcdq.js} +1 -1
  85. package/dist/viewer/{dist-Br-YwkkI.js → dist-Do_avVXy.js} +1 -1
  86. package/dist/viewer/{dist-Bi6-eRhC.js → dist-DznxxRh9.js} +1 -1
  87. package/dist/viewer/{dist-CobzO6KF.js → dist-WPS0bgUa.js} +1 -1
  88. package/dist/viewer/{dist-BX_edK72.js → dist-u7oPbGhJ.js} +1 -1
  89. package/dist/viewer/{dist-CMWEZ8zE.js → dist-wui1iR0t.js} +1 -1
  90. package/dist/viewer/{ebnfDiagram-PWID7BFC-DIby0EeC.js → ebnfDiagram-PWID7BFC-LIQ-mL74.js} +1 -1
  91. package/dist/viewer/{el-GR-BZB4AONW-CkYn8ZGs.js → el-GR-BZB4AONW-nf4SIDWy.js} +1 -1
  92. package/dist/viewer/{en-B4ZKOASM-D307ZksO.js → en-B4ZKOASM-C3uSsrzN.js} +1 -1
  93. package/dist/viewer/{erDiagram-RLTQ6QDP-BKVkOLml.js → erDiagram-RLTQ6QDP-CtP4cA8a.js} +1 -1
  94. package/dist/viewer/{es-ES-U4NZUMDT-D3C8J_Fi.js → es-ES-U4NZUMDT-D83QBRdb.js} +1 -1
  95. package/dist/viewer/{eu-ES-A7QVB2H4-DCeKepff.js → eu-ES-A7QVB2H4-C1SzxCFV.js} +1 -1
  96. package/dist/viewer/{eventmodeling-NTZA5JFV-BWIuNKEz.js → eventmodeling-NTZA5JFV-Dzz8QjX3.js} +1 -1
  97. package/dist/viewer/{fa-IR-HGAKTJCU-CGv30knD.js → fa-IR-HGAKTJCU-DJ75mace.js} +1 -1
  98. package/dist/viewer/{fi-FI-Z5N7JZ37-C1g2EYnX.js → fi-FI-Z5N7JZ37-D0oIoDPa.js} +1 -1
  99. package/dist/viewer/flowDiagram-HODETNUW-Z8rwwmKe.js +1 -0
  100. package/dist/viewer/{fr-FR-RHASNOE6-dQ7Nbbew.js → fr-FR-RHASNOE6-CxrYpwSQ.js} +1 -1
  101. package/dist/viewer/{ganttDiagram-EL5Y4UJY-w6lIWxCW.js → ganttDiagram-EL5Y4UJY-Dm_GsqHo.js} +1 -1
  102. package/dist/viewer/{gitGraph-4MIJSDKK-C-eiy-ig.js → gitGraph-4MIJSDKK-Cmsi3QFW.js} +1 -1
  103. package/dist/viewer/{gitGraphDiagram-WWUBYQGX-sMknvoE_.js → gitGraphDiagram-WWUBYQGX-pE4QOFt6.js} +1 -1
  104. package/dist/viewer/{gl-ES-HMX3MZ6V-CZwfJ4WD.js → gl-ES-HMX3MZ6V-W_AoCFMi.js} +1 -1
  105. package/dist/viewer/{he-IL-6SHJWFNN-DCGNu7uR.js → he-IL-6SHJWFNN-iVqaubIb.js} +1 -1
  106. package/dist/viewer/{hi-IN-IWLTKZ5I-B8a_rStg.js → hi-IN-IWLTKZ5I-BCJYxdcu.js} +1 -1
  107. package/dist/viewer/{hu-HU-A5ZG7DT2-YP15l7aH.js → hu-HU-A5ZG7DT2-D_ufjwGq.js} +1 -1
  108. package/dist/viewer/{id-ID-SAP4L64H-Bh8n7Y-L.js → id-ID-SAP4L64H-ByGvK2Qg.js} +1 -1
  109. package/dist/viewer/{image-GAAHSSAO-CJ5UCWdJ.js → image-GAAHSSAO-DIF9SQU_.js} +1 -1
  110. package/dist/viewer/imperative-ChsionQQ.js +1 -0
  111. package/dist/viewer/index.html +7 -5
  112. package/dist/viewer/index.js +2 -2
  113. package/dist/viewer/index3.css +4 -0
  114. package/dist/viewer/{info-A6RAGUB7-4nZfUeGY.js → info-A6RAGUB7-CNgClLVH.js} +1 -1
  115. package/dist/viewer/{infoDiagram-27XIBGKW-B7BzPKF3.js → infoDiagram-27XIBGKW-BZqe2QYh.js} +1 -1
  116. package/dist/viewer/isElementDisabled-f0m04fH6.js +1 -0
  117. package/dist/viewer/{ishikawaDiagram-5VMMS53U-DRcTz2hp.js → ishikawaDiagram-5VMMS53U-DVh4zNCI.js} +1 -1
  118. package/dist/viewer/{it-IT-JPQ66NNP-Dlu6GmWL.js → it-IT-JPQ66NNP-Dv6_nr0a.js} +1 -1
  119. package/dist/viewer/{ja-JP-DBVTYXUO-jnhjV5V3.js → ja-JP-DBVTYXUO-KZ9e7KAQ.js} +1 -1
  120. package/dist/viewer/{journeyDiagram-3NMN7TZE-BsBEfZoO.js → journeyDiagram-3NMN7TZE-Hrs-56h0.js} +1 -1
  121. package/dist/viewer/{kaa-6HZHGXH3-BdkJfivx.js → kaa-6HZHGXH3-D811ofJi.js} +1 -1
  122. package/dist/viewer/{kab-KAB-ZGHBKWFO-Db5uHxJJ.js → kab-KAB-ZGHBKWFO-8_E4WiNI.js} +1 -1
  123. package/dist/viewer/{kanban-definition-UXKFOSKX-pkqloG2a.js → kanban-definition-UXKFOSKX-DDV_2Nle.js} +1 -1
  124. package/dist/viewer/{kk-KZ-P5N5QNE5-Euws25LL.js → kk-KZ-P5N5QNE5-XH-ncBcx.js} +1 -1
  125. package/dist/viewer/{km-KH-HSX4SM5Z-qX1KZZnO.js → km-KH-HSX4SM5Z-DfuMBSsH.js} +1 -1
  126. package/dist/viewer/{ko-KR-MTYHY66A-eEz94B_i.js → ko-KR-MTYHY66A-UTuAQHeO.js} +1 -1
  127. package/dist/viewer/{ku-TR-6OUDTVRD-Db7raW_I.js → ku-TR-6OUDTVRD-B6cXUJdZ.js} +1 -1
  128. package/dist/viewer/{lt-LT-XHIRWOB4-Omy4Er-_.js → lt-LT-XHIRWOB4-osfVDYh4.js} +1 -1
  129. package/dist/viewer/{lv-LV-5QDEKY6T-DT_-jlPU.js → lv-LV-5QDEKY6T-owEwthaJ.js} +1 -1
  130. package/dist/viewer/maximize-2-DcJIGEuQ.js +1 -0
  131. package/dist/viewer/{mermaid-parser.core-D3Vwhy2j.js → mermaid-parser.core-D7qGh1wC.js} +3 -3
  132. package/dist/viewer/{mindmap-definition-YA3MSWOX-CE0aLnZo.js → mindmap-definition-YA3MSWOX-CEjQFlyO.js} +1 -1
  133. package/dist/viewer/motion-i-14Q28p.js +1 -0
  134. package/dist/viewer/{mr-IN-CRQNXWMA-lU1Qm4EM.js → mr-IN-CRQNXWMA-Ble9F94R.js} +1 -1
  135. package/dist/viewer/{my-MM-5M5IBNSE-DzVy_UPC.js → my-MM-5M5IBNSE-CaN6NJFL.js} +1 -1
  136. package/dist/viewer/{nb-NO-T6EIAALU-DVT8FWIM.js → nb-NO-T6EIAALU-BDiEiYiE.js} +1 -1
  137. package/dist/viewer/{nl-NL-IS3SIHDZ-Cw652awd.js → nl-NL-IS3SIHDZ-C0QmOZo_.js} +1 -1
  138. package/dist/viewer/{nn-NO-6E72VCQL-lx1YxRiP.js → nn-NO-6E72VCQL-CQAbAV7N.js} +1 -1
  139. package/dist/viewer/{oc-FR-POXYY2M6-CsbQrAqy.js → oc-FR-POXYY2M6-00g3KTwj.js} +1 -1
  140. package/dist/viewer/{pa-IN-N4M65BXN-CtU0dHq3.js → pa-IN-N4M65BXN-zKA1yqPY.js} +1 -1
  141. package/dist/viewer/{packet-AYTQ26CC-BVY2voP5.js → packet-AYTQ26CC-Bbo7YLwV.js} +1 -1
  142. package/dist/viewer/{pegDiagram-XKGWAZYB-DEULzWAS.js → pegDiagram-XKGWAZYB-Bva2VVTO.js} +1 -1
  143. package/dist/viewer/percentages-BXMCSKIN-B9m0MHwS.js +1 -0
  144. package/dist/viewer/{pie-WAS4IAKB-Dkbj85g_.js → pie-WAS4IAKB-DR-1NEAB.js} +1 -1
  145. package/dist/viewer/{pieDiagram-E7YTZNPT-GG3jKLf1.js → pieDiagram-E7YTZNPT-DHxiq9Xw.js} +1 -1
  146. package/dist/viewer/{pl-PL-T2D74RX3-Cm4_j4mv.js → pl-PL-T2D74RX3-Ds5hI1PP.js} +1 -1
  147. package/dist/viewer/preview.html +4 -4
  148. package/dist/viewer/preview.js +1 -1
  149. package/dist/viewer/{prod-Dwrvp17C.js → prod-Bxq8Vdzv.js} +12 -12
  150. package/dist/viewer/{pt-BR-5N22H2LF-B6hDNCqf.js → pt-BR-5N22H2LF-D7XJA5jJ.js} +1 -1
  151. package/dist/viewer/{pt-PT-UZXXM6DQ-CUGC3Mx9.js → pt-PT-UZXXM6DQ-uJtX9Kj1.js} +1 -1
  152. package/dist/viewer/{quadrantDiagram-AXDQQJYC-4NnxPPkB.js → quadrantDiagram-AXDQQJYC-C8X4P0Un.js} +1 -1
  153. package/dist/viewer/{radar-RG4KPBEZ-CofsEHXw.js → radar-RG4KPBEZ-B2Nkysmm.js} +1 -1
  154. package/dist/viewer/{railroad-74A4TZTK-bsKEFfSz.js → railroad-74A4TZTK-CqyegNhY.js} +1 -1
  155. package/dist/viewer/{railroad-abnf-HS5TGJTU-Dzzcb9uT.js → railroad-abnf-HS5TGJTU-D437JbRt.js} +1 -1
  156. package/dist/viewer/{railroad-ebnf-LZEXJU2U-Det0-uSh.js → railroad-ebnf-LZEXJU2U-Cfjp24wu.js} +1 -1
  157. package/dist/viewer/{railroad-peg-WCYAUIDC-rXx5CKvp.js → railroad-peg-WCYAUIDC-DFKq1m4V.js} +1 -1
  158. package/dist/viewer/{railroadDiagram-O6MQD6OU-CiZzvw7p.js → railroadDiagram-O6MQD6OU-Bi0WDKNl.js} +1 -1
  159. package/dist/viewer/{requirementDiagram-BXWQKSXE-BEEWtFb-.js → requirementDiagram-BXWQKSXE-CPxbWN0o.js} +1 -1
  160. package/dist/viewer/{ro-RO-JPDTUUEW-2FdsNvh2.js → ro-RO-JPDTUUEW-CahCeDzl.js} +1 -1
  161. package/dist/viewer/{route-B-SV0Ufv.js → route-w3PXrIFf.js} +2 -2
  162. package/dist/viewer/{ru-RU-B4JR7IUQ-zY6mVYxz.js → ru-RU-B4JR7IUQ-CqoxmaXz.js} +1 -1
  163. package/dist/viewer/{sankeyDiagram-P5KCCOFB-DWe55lkp.js → sankeyDiagram-P5KCCOFB-DZw6r51H.js} +1 -1
  164. package/dist/viewer/{selection-BY4kx6qJ.js → selection-BWAAa3tl.js} +1 -1
  165. package/dist/viewer/{sequenceDiagram-WJ2MYXX4-CXuFPeac.js → sequenceDiagram-WJ2MYXX4-Thge-udC.js} +1 -1
  166. package/dist/viewer/settings-dialog-CsUVMGkR.js +1 -0
  167. package/dist/viewer/{si-LK-N5RQ5JYF-LCDQxPDU.js → si-LK-N5RQ5JYF-LdkAa2Ul.js} +1 -1
  168. package/dist/viewer/{sk-SK-C5VTKIMK-CT_QcC4j.js → sk-SK-C5VTKIMK-CKX2GUNt.js} +1 -1
  169. package/dist/viewer/{sl-SI-NN7IZMDC-f8D9KUki.js → sl-SI-NN7IZMDC-CzFyYKkG.js} +1 -1
  170. package/dist/viewer/{stateDiagram-D77RDMKH-eKfvcty_.js → stateDiagram-D77RDMKH-BIRU_cq9.js} +1 -1
  171. package/dist/viewer/stateDiagram-v2-MP3YSRHH-W6GM4mdH.js +1 -0
  172. package/dist/viewer/subset-shared.chunk-e43yvG81.js +1 -0
  173. package/dist/viewer/{subset-worker.chunk-BTmfsIdP.js → subset-worker.chunk-DnTcanba.js} +1 -1
  174. package/dist/viewer/{sv-SE-XGPEYMSR-DzPKng61.js → sv-SE-XGPEYMSR-DNC_mUSl.js} +1 -1
  175. package/dist/viewer/{swimlanes-42K2YHIH-B3Txfjzn.js → swimlanes-42K2YHIH-CjgoNxpA.js} +1 -1
  176. package/dist/viewer/swimlanesDiagram-VR7AAH4N-D5-PU8Pf.js +8 -0
  177. package/dist/viewer/{ta-IN-2NMHFXQM-ClWUqutl.js → ta-IN-2NMHFXQM-CYr9ZGr1.js} +1 -1
  178. package/dist/viewer/{th-TH-HPSO5L25-5YdWslH5.js → th-TH-HPSO5L25-C6bnXArK.js} +1 -1
  179. package/dist/viewer/{timeline-definition-24CTP7MA-BcQK4Zvc.js → timeline-definition-24CTP7MA-B9JpbwqJ.js} +1 -1
  180. package/dist/viewer/{tokens.stylex-DTpSQPzO.js → tokens.stylex-B6EH-D98.js} +1 -1
  181. package/dist/viewer/{tr-TR-DEFEU3FU-1cLBB9jW.js → tr-TR-DEFEU3FU-BYGOia6c.js} +1 -1
  182. package/dist/viewer/{treeView-Q6P3EWNA-BvEOsBta.js → treeView-Q6P3EWNA-Ak-ne88N.js} +1 -1
  183. package/dist/viewer/{treemap-WGGIJYW6-DdrABzv3.js → treemap-WGGIJYW6-DXjq0Uxk.js} +1 -1
  184. package/dist/viewer/type-icons-DfzR1Nvz.js +1 -0
  185. package/dist/viewer/{uk-UA-QMV73CPH-Fw9jveUt.js → uk-UA-QMV73CPH-Dqls9x9N.js} +1 -1
  186. package/dist/viewer/useArtifactFeed-BqkH8-F5.js +1 -0
  187. package/dist/viewer/useCloudStatus-1GLyX_cM.js +1 -0
  188. package/dist/viewer/useControlledState-BwJNbw5w.js +1 -0
  189. package/dist/viewer/useOpenInteractionType-DVZ9bVwU.js +1 -0
  190. package/dist/viewer/{useTranslation-CQxUhyeK.js → useTranslation-D91FrcSE.js} +1 -1
  191. package/dist/viewer/useTypeFavicon-DV0oFcwK.js +1 -0
  192. package/dist/viewer/{vennDiagram-4TSXK5OY-Dq69-1FP.js → vennDiagram-4TSXK5OY-CaR9-X17.js} +1 -1
  193. package/dist/viewer/{vi-VN-M7AON7JQ-DKrO5_b-.js → vi-VN-M7AON7JQ-Hm3jAJrG.js} +1 -1
  194. package/dist/viewer/view-Dzqqcsok.js +1 -0
  195. package/dist/viewer/{viewport-CFJHn_Y6-BZB106R-.js → viewport-CFJHn_Y6-CyNXuhKV.js} +1 -1
  196. package/dist/viewer/{wardley-WFR3VGLG-CcQnZwy_.js → wardley-WFR3VGLG-B8O3gzU6.js} +1 -1
  197. package/dist/viewer/{wardleyDiagram-VM6X3IG4-DLcJQWgG.js → wardleyDiagram-VM6X3IG4-CkGcY15o.js} +1 -1
  198. package/dist/viewer/{xychartDiagram-S5SC5T6Z-DtII7hKn.js → xychartDiagram-S5SC5T6Z-NfDIUsFv.js} +1 -1
  199. package/dist/viewer/{zh-CN-LNUGB5OW-BRO7tIN0.js → zh-CN-LNUGB5OW-DfOZAHSW.js} +1 -1
  200. package/dist/viewer/{zh-HK-E62DVLB3-BFPLUdPJ.js → zh-HK-E62DVLB3-BGA8Pz-Y.js} +1 -1
  201. package/dist/viewer/{zh-TW-RAJ6MFWO-Bxs4Qcmt.js → zh-TW-RAJ6MFWO-p--eir4S.js} +1 -1
  202. package/dist/viewer-lib/{Canvas-CGlzAGY2.js → Canvas-aHZz21RV.js} +224 -189
  203. package/dist/viewer-lib/{PreviewView-BuWEr0dA.js → PreviewView-Dhif0ukY.js} +64 -105
  204. package/dist/viewer-lib/{SnapshotDocument-ChRBCwGj.js → SnapshotDocument-DQoei-wY.js} +30 -30
  205. package/dist/viewer-lib/{VirtualizedEditor-D9Ivycdp-Bwb2YAAt.js → VirtualizedEditor-D9Ivycdp-Bpj7l983.js} +2 -2
  206. package/dist/viewer-lib/{VirtualizedRenderer-C_d95FXi-C9F5W34L.js → VirtualizedRenderer-C_d95FXi-DRkJ0i42.js} +3 -3
  207. package/dist/viewer-lib/{WarningsBadge-a5t1HRIQ.js → WarningsBadge-5iaPvvwB.js} +2 -2
  208. package/dist/viewer-lib/{abnfDiagram-VCTEODGH-BGAdTghi.js → abnfDiagram-VCTEODGH-2oGC_SOf.js} +2 -2
  209. package/dist/viewer-lib/{ar-SA-G6X2FPQ2-BCMxO7KZ.js → ar-SA-G6X2FPQ2-UGxMGw3Z.js} +1 -1
  210. package/dist/viewer-lib/{architectureDiagram-5GKGNRK7-D6Au97Dl.js → architectureDiagram-5GKGNRK7-aK3VEldj.js} +3 -3
  211. package/dist/viewer-lib/{az-AZ-76LH7QW2-B7Uea5Oe.js → az-AZ-76LH7QW2-Br-kWNFX.js} +1 -1
  212. package/dist/viewer-lib/{bg-BG-XCXSNQG7-BCDJP2WN.js → bg-BG-XCXSNQG7-CePxO9fZ.js} +1 -1
  213. package/dist/viewer-lib/{blockDiagram-I7D4REHJ-C2kcBkWi.js → blockDiagram-I7D4REHJ-Cy7B6_WS.js} +5 -5
  214. package/dist/viewer-lib/{bn-BD-2XOGV67Q-BsMm22Ga.js → bn-BD-2XOGV67Q-BMndDsUz.js} +1 -1
  215. package/dist/viewer-lib/{c4Diagram-7LVT6UL2-CdTb9k1X.js → c4Diagram-7LVT6UL2-Wc_dKVu0.js} +3 -3
  216. package/dist/viewer-lib/{ca-ES-6MX7JW3Y-DxAFfRh-.js → ca-ES-6MX7JW3Y-DX0wYh_m.js} +1 -1
  217. package/dist/viewer-lib/{chunk-4HAMMTFA-DKAx3up1.js → chunk-4HAMMTFA-DTiM30OK.js} +2 -2
  218. package/dist/viewer-lib/{chunk-EIO257PC-in-NFfKN.js → chunk-EIO257PC-Cl2w4hMW.js} +1 -1
  219. package/dist/viewer-lib/{chunk-GMAD6QVW-BmIwqmWI.js → chunk-GMAD6QVW-BpAAic9j.js} +1 -1
  220. package/dist/viewer-lib/{chunk-GVQU2GXP-B1F-95uf.js → chunk-GVQU2GXP-MoIByDJW.js} +1 -1
  221. package/dist/viewer-lib/{chunk-IMKFNOWR-B9jgtASu.js → chunk-IMKFNOWR-DEmuEt5u.js} +1 -1
  222. package/dist/viewer-lib/{chunk-L3NEJ4N5-HmasUpx4.js → chunk-L3NEJ4N5-CCae_om5.js} +3 -3
  223. package/dist/viewer-lib/{chunk-OSK3NFVY--lB5H4YE.js → chunk-OSK3NFVY-D6Lald9l.js} +4 -4
  224. package/dist/viewer-lib/{chunk-PWAF6VOD-BJBPoomP.js → chunk-PWAF6VOD-CoN0IeTe.js} +1 -1
  225. package/dist/viewer-lib/{chunk-SHT3W25Y-DotSVfe3.js → chunk-SHT3W25Y-DRKrPCgM.js} +2 -2
  226. package/dist/viewer-lib/{chunk-SVP7TREG-DqDym_EU.js → chunk-SVP7TREG-Dz-UpGpj.js} +1 -1
  227. package/dist/viewer-lib/{chunk-TICWLB2K-CAE--X4U.js → chunk-TICWLB2K-BKboFHm0.js} +1 -1
  228. package/dist/viewer-lib/{classDiagram-ZZMXUADV-C4ALzt-p.js → classDiagram-ZZMXUADV-B0RT3OhP.js} +8 -8
  229. package/dist/viewer-lib/{classDiagram-v2-VYDZK3BY-DEtOtdB3.js → classDiagram-v2-VYDZK3BY-DcVoUOJl.js} +8 -8
  230. package/dist/viewer-lib/core.js +3 -3
  231. package/dist/viewer-lib/{cs-CZ-2BRQDIVT-CvRGzq8g.js → cs-CZ-2BRQDIVT-D6PePaRC.js} +1 -1
  232. package/dist/viewer-lib/{cynefinDiagram-5FMLGOSQ-CKqlcbvg.js → cynefinDiagram-5FMLGOSQ-C3BffsgO.js} +1 -1
  233. package/dist/viewer-lib/{da-DK-5WZEPLOC-6YulLYfu.js → da-DK-5WZEPLOC-D-ME0_DD.js} +1 -1
  234. package/dist/viewer-lib/{dagre-GXQ25YYZ-YHmv7047.js → dagre-GXQ25YYZ-BjxNhu3R.js} +7 -7
  235. package/dist/viewer-lib/{de-DE-XR44H4JA-UiMLv8s8.js → de-DE-XR44H4JA-Bhu7D6Dv.js} +1 -1
  236. package/dist/viewer-lib/{diagram-S7CK7UJ4-BEWEaYtv.js → diagram-S7CK7UJ4-BpcdgVt8.js} +2 -2
  237. package/dist/viewer-lib/{diagram-UQ7AKVKN-6ArVweRa.js → diagram-UQ7AKVKN-BYHjP5v1.js} +1 -1
  238. package/dist/viewer-lib/{diagram-VX7I27RA-CiIs2Qw1.js → diagram-VX7I27RA-CV9KkXbE.js} +2 -2
  239. package/dist/viewer-lib/{diagram-Z3DM3KII-B2aIOSO9.js → diagram-Z3DM3KII-DOaH1tJi.js} +1 -1
  240. package/dist/viewer-lib/{dist-BsTyJi8g.js → dist-B80b1AhD.js} +3 -3
  241. package/dist/viewer-lib/{dist-CAj2xBlP.js → dist-BD9zyrsh.js} +3 -3
  242. package/dist/viewer-lib/{dist-0t6y6PUO.js → dist-BLeZty-1.js} +2 -2
  243. package/dist/viewer-lib/{dist-BnSu-IxX.js → dist-BXlobI-3.js} +2 -2
  244. package/dist/viewer-lib/{dist-BMlOy_9e.js → dist-CLTbkWsf.js} +3 -3
  245. package/dist/viewer-lib/{dist-Dbd9yAXM.js → dist-CTDrkMfV.js} +3 -3
  246. package/dist/viewer-lib/{dist-DwkDM0P-.js → dist-CVFCjsBk.js} +3 -3
  247. package/dist/viewer-lib/{dist-DMveTbVU.js → dist-CWvlUfDr.js} +2 -2
  248. package/dist/viewer-lib/{dist-BkKvKy8X.js → dist-CotkEjzY.js} +43 -43
  249. package/dist/viewer-lib/{dist-CK5l1KYD.js → dist-CyO0GXoh.js} +4 -4
  250. package/dist/viewer-lib/{dist-pMWiwB3R.js → dist-CzmNT9y_.js} +4 -4
  251. package/dist/viewer-lib/{dist-BuiCvtND.js → dist-DJY_oy_c.js} +2 -2
  252. package/dist/viewer-lib/{dist-DJyTgR15.js → dist-DQ9DWTie.js} +1 -1
  253. package/dist/viewer-lib/{dist-C1vHzwzb.js → dist-DgToSXz4.js} +2 -2
  254. package/dist/viewer-lib/{dist-ByPSjmEc.js → dist-DgaXgFE1.js} +1 -1
  255. package/dist/viewer-lib/{dist-DwvkNKkY.js → dist-DoX4WzbN.js} +3 -3
  256. package/dist/viewer-lib/{dist-CS1ylr3w.js → dist-DphbsbiY.js} +3 -3
  257. package/dist/viewer-lib/{dist-BiqYGwb3.js → dist-Dq-GuKEx.js} +4 -4
  258. package/dist/viewer-lib/{dist-BzLuw91l.js → dist-IMG8Vr9I.js} +2 -2
  259. package/dist/viewer-lib/{dist-DjB3D0Ee.js → dist-JWLNlP_m.js} +3 -3
  260. package/dist/viewer-lib/{dist-CB-taKGV.js → dist-KXzukSlV.js} +2 -2
  261. package/dist/viewer-lib/{dist-BPe0Iut1.js → dist-bM3vt8CJ.js} +2 -2
  262. package/dist/viewer-lib/{dist-Cww5Rvn0.js → dist-firtkIWN.js} +3 -3
  263. package/dist/viewer-lib/{dist-CL-A-FUV.js → dist-uWEDtK_c.js} +3 -3
  264. package/dist/viewer-lib/document.js +5 -5
  265. package/dist/viewer-lib/{ebnfDiagram-PWID7BFC-Cq5aE89w.js → ebnfDiagram-PWID7BFC-BrDC3-LV.js} +2 -2
  266. package/dist/viewer-lib/{el-GR-BZB4AONW-B6OFv_Qp.js → el-GR-BZB4AONW-0zYel3qI.js} +1 -1
  267. package/dist/viewer-lib/{en-B4ZKOASM-C4jMELVn.js → en-B4ZKOASM-DtLGkCyQ.js} +1 -1
  268. package/dist/viewer-lib/{erDiagram-RLTQ6QDP-CR8i8N1m.js → erDiagram-RLTQ6QDP-DowktsJX.js} +7 -7
  269. package/dist/viewer-lib/{es-ES-U4NZUMDT-CtkTYsR8.js → es-ES-U4NZUMDT-CTfLzrsG.js} +1 -1
  270. package/dist/viewer-lib/{eu-ES-A7QVB2H4-CD0q_VM9.js → eu-ES-A7QVB2H4-CRya35K2.js} +1 -1
  271. package/dist/viewer-lib/{fa-IR-HGAKTJCU-CmWv6Sam.js → fa-IR-HGAKTJCU-IJlsX9Ih.js} +1 -1
  272. package/dist/viewer-lib/{fi-FI-Z5N7JZ37-ZWiP3xdp.js → fi-FI-Z5N7JZ37-DaTLDE5R.js} +1 -1
  273. package/dist/viewer-lib/flowDiagram-HODETNUW-Bqrnk899.js +15 -0
  274. package/dist/viewer-lib/{fr-FR-RHASNOE6-B3G36IYS.js → fr-FR-RHASNOE6-EHKkBEx_.js} +1 -1
  275. package/dist/viewer-lib/{ganttDiagram-EL5Y4UJY-CU62ct0K.js → ganttDiagram-EL5Y4UJY-x7Vn9Glr.js} +1 -1
  276. package/dist/viewer-lib/{gl-ES-HMX3MZ6V-D9btWofF.js → gl-ES-HMX3MZ6V-DM85y0vm.js} +1 -1
  277. package/dist/viewer-lib/{he-IL-6SHJWFNN-CFG5VQFp.js → he-IL-6SHJWFNN-BuQ_9eF-.js} +1 -1
  278. package/dist/viewer-lib/{hi-IN-IWLTKZ5I-DuA7zQyY.js → hi-IN-IWLTKZ5I-DMvE0com.js} +1 -1
  279. package/dist/viewer-lib/{hu-HU-A5ZG7DT2-tjYIwSqX.js → hu-HU-A5ZG7DT2-DS1sP7wL.js} +1 -1
  280. package/dist/viewer-lib/{i18n-5m3zENwc.js → i18n-C0ysopzN.js} +42 -0
  281. package/dist/viewer-lib/{id-ID-SAP4L64H-DqU3Qkon.js → id-ID-SAP4L64H-CRfgLsSB.js} +1 -1
  282. package/dist/viewer-lib/ids.js +40 -0
  283. package/dist/viewer-lib/{image-GAAHSSAO-XIIBdtaX.js → image-GAAHSSAO-BsHmwfI_.js} +1 -1
  284. package/dist/viewer-lib/index.js +2322 -2536
  285. package/dist/viewer-lib/{infoDiagram-27XIBGKW-CZKEtT5d.js → infoDiagram-27XIBGKW-BJMCBPUi.js} +1 -1
  286. package/dist/viewer-lib/{ishikawaDiagram-5VMMS53U-B3golT3a.js → ishikawaDiagram-5VMMS53U-ByvUhsKB.js} +1 -1
  287. package/dist/viewer-lib/{it-IT-JPQ66NNP-Dz0Q22dy.js → it-IT-JPQ66NNP-CK_HA295.js} +1 -1
  288. package/dist/viewer-lib/{ja-JP-DBVTYXUO-CO-5nd02.js → ja-JP-DBVTYXUO-V6yZwl-p.js} +1 -1
  289. package/dist/viewer-lib/{journeyDiagram-3NMN7TZE-BvHvHsvO.js → journeyDiagram-3NMN7TZE-DHNZ_-p6.js} +1 -1
  290. package/dist/viewer-lib/{kaa-6HZHGXH3-DOD83F1q.js → kaa-6HZHGXH3-CVHD70WU.js} +1 -1
  291. package/dist/viewer-lib/{kab-KAB-ZGHBKWFO-CxqKLmgV.js → kab-KAB-ZGHBKWFO-BS47uT1K.js} +1 -1
  292. package/dist/viewer-lib/{kanban-definition-UXKFOSKX-BHHyeGOm.js → kanban-definition-UXKFOSKX-CJJQu2HV.js} +6 -6
  293. package/dist/viewer-lib/{kk-KZ-P5N5QNE5-CmB-r_Up.js → kk-KZ-P5N5QNE5-Bcu5hPs-.js} +1 -1
  294. package/dist/viewer-lib/{km-KH-HSX4SM5Z-Cs08ErgX.js → km-KH-HSX4SM5Z-DqS_KNtF.js} +1 -1
  295. package/dist/viewer-lib/{ko-KR-MTYHY66A-CcFjORrF.js → ko-KR-MTYHY66A-BCnIl6gm.js} +1 -1
  296. package/dist/viewer-lib/{ku-TR-6OUDTVRD-CE_ekNLF.js → ku-TR-6OUDTVRD-BrJRIwFC.js} +1 -1
  297. package/dist/viewer-lib/{lt-LT-XHIRWOB4-CTi3FMqX.js → lt-LT-XHIRWOB4-DTNZh4KC.js} +1 -1
  298. package/dist/viewer-lib/{lv-LV-5QDEKY6T-C_Vc5-m0.js → lv-LV-5QDEKY6T-DMWcZOaP.js} +1 -1
  299. package/dist/viewer-lib/{mindmap-definition-YA3MSWOX-CvL-wCLM.js → mindmap-definition-YA3MSWOX-BFaHWYtZ.js} +7 -7
  300. package/dist/viewer-lib/{motion-D-LmHwZA.js → motion-BkUMioN-.js} +1 -1
  301. package/dist/viewer-lib/{mr-IN-CRQNXWMA-B-oKF7gA.js → mr-IN-CRQNXWMA-DzScvkwn.js} +1 -1
  302. package/dist/viewer-lib/{my-MM-5M5IBNSE-LWZsqt2I.js → my-MM-5M5IBNSE-B6iUsZ1K.js} +1 -1
  303. package/dist/viewer-lib/{nb-NO-T6EIAALU-C4DmwePn.js → nb-NO-T6EIAALU-RIQOP8pT.js} +1 -1
  304. package/dist/viewer-lib/{nl-NL-IS3SIHDZ-CxaJJq-r.js → nl-NL-IS3SIHDZ-7f5uwLSs.js} +1 -1
  305. package/dist/viewer-lib/{nn-NO-6E72VCQL-CwCkdatj.js → nn-NO-6E72VCQL-BsKmNIwF.js} +1 -1
  306. package/dist/viewer-lib/{oc-FR-POXYY2M6-rcLu5C3f.js → oc-FR-POXYY2M6-BoMfenbW.js} +1 -1
  307. package/dist/viewer-lib/{pa-IN-N4M65BXN-VANjk3GV.js → pa-IN-N4M65BXN-5I9SoSYD.js} +1 -1
  308. package/dist/viewer-lib/{pegDiagram-XKGWAZYB-D6VOGhft.js → pegDiagram-XKGWAZYB-Pa26Psw5.js} +2 -2
  309. package/dist/viewer-lib/percentages-BXMCSKIN-DFm3a6gG.js +1 -0
  310. package/dist/viewer-lib/{pieDiagram-E7YTZNPT-BhC5evxk.js → pieDiagram-E7YTZNPT-Dd6_GVsW.js} +2 -2
  311. package/dist/viewer-lib/{pl-PL-T2D74RX3-CD51oHYd.js → pl-PL-T2D74RX3-LgJpn9D4.js} +1 -1
  312. package/dist/viewer-lib/{plugin-_bGVeqI0-CnfLdH0a.js → plugin-_bGVeqI0-Cn4lyhUu.js} +1 -1
  313. package/dist/viewer-lib/{prod-D7WblmUF.js → prod-VaTD1n99.js} +61 -61
  314. package/dist/viewer-lib/{pt-BR-5N22H2LF-D7GhIm4r.js → pt-BR-5N22H2LF-4t9sk55G.js} +1 -1
  315. package/dist/viewer-lib/{pt-PT-UZXXM6DQ-BffZf5Mg.js → pt-PT-UZXXM6DQ-B2P38n7-.js} +1 -1
  316. package/dist/viewer-lib/{quadrantDiagram-AXDQQJYC-BQcVQv-H.js → quadrantDiagram-AXDQQJYC-CP2L3QGv.js} +1 -1
  317. package/dist/viewer-lib/{railroadDiagram-O6MQD6OU-DViv1bb3.js → railroadDiagram-O6MQD6OU-8aKSwRcT.js} +2 -2
  318. package/dist/viewer-lib/{requirementDiagram-BXWQKSXE-CRbNBYvz.js → requirementDiagram-BXWQKSXE-CtOxPyOY.js} +7 -7
  319. package/dist/viewer-lib/{ro-RO-JPDTUUEW-Bs-sOf9x.js → ro-RO-JPDTUUEW-CkpRSUt6.js} +1 -1
  320. package/dist/viewer-lib/{ru-RU-B4JR7IUQ-DvTyRywC.js → ru-RU-B4JR7IUQ-Bz-gcOPe.js} +1 -1
  321. package/dist/viewer-lib/{sequenceDiagram-WJ2MYXX4-Dd18xexM.js → sequenceDiagram-WJ2MYXX4-s-W9J54D.js} +1 -1
  322. package/dist/viewer-lib/{si-LK-N5RQ5JYF-BMfVTTNU.js → si-LK-N5RQ5JYF-Dv5k3j26.js} +1 -1
  323. package/dist/viewer-lib/{sk-SK-C5VTKIMK-CmARane7.js → sk-SK-C5VTKIMK-CxtW6Vdm.js} +1 -1
  324. package/dist/viewer-lib/{sl-SI-NN7IZMDC-B8-fofR6.js → sl-SI-NN7IZMDC-CJ4TOjXZ.js} +1 -1
  325. package/dist/viewer-lib/{stateDiagram-D77RDMKH-DwQncAD_.js → stateDiagram-D77RDMKH-CYxCv8Qz.js} +9 -9
  326. package/dist/viewer-lib/{stateDiagram-v2-MP3YSRHH-C5k0DSQ5.js → stateDiagram-v2-MP3YSRHH-Gh3PW36k.js} +8 -8
  327. package/dist/viewer-lib/subset-shared.chunk-C8_4iTqz.js +2 -0
  328. package/dist/viewer-lib/{subset-worker.chunk-D2VG6did.js → subset-worker.chunk-DFTPi05K.js} +2 -2
  329. package/dist/viewer-lib/{sv-SE-XGPEYMSR-BXaQxg6w.js → sv-SE-XGPEYMSR-DZHmRatn.js} +1 -1
  330. package/dist/viewer-lib/{swimlanes-42K2YHIH-DDHkdc65.js → swimlanes-42K2YHIH-BiY2CFNS.js} +7 -7
  331. package/dist/viewer-lib/{swimlanesDiagram-VR7AAH4N-BceC_VQp.js → swimlanesDiagram-VR7AAH4N-C49_trC3.js} +8 -8
  332. package/dist/viewer-lib/{ta-IN-2NMHFXQM-C3zg6hbi.js → ta-IN-2NMHFXQM-CJC9nzL-.js} +1 -1
  333. package/dist/viewer-lib/{th-TH-HPSO5L25-BmHsCzgs.js → th-TH-HPSO5L25-B-kmworQ.js} +1 -1
  334. package/dist/viewer-lib/{timeline-definition-24CTP7MA-rG-yukQc.js → timeline-definition-24CTP7MA-C95kBahc.js} +2 -2
  335. package/dist/viewer-lib/{tr-TR-DEFEU3FU-DllTtani.js → tr-TR-DEFEU3FU-CdqWUy9i.js} +1 -1
  336. package/dist/viewer-lib/types/src/shared/cloud.d.ts +1 -0
  337. package/dist/viewer-lib/types/src/shared/ids.d.ts +2 -0
  338. package/dist/viewer-lib/types/src/shared/relay.d.ts +2 -1
  339. package/dist/viewer-lib/types/src/viewer/components/Canvas.d.ts +17 -9
  340. package/dist/viewer-lib/types/src/viewer/components/DebugHud.d.ts +12 -4
  341. package/dist/viewer-lib/types/src/viewer/components/EmbeddedCanvas.d.ts +6 -0
  342. package/dist/viewer-lib/types/src/viewer/components/ExpandedBoard.d.ts +2 -1
  343. package/dist/viewer-lib/types/src/viewer/components/PhoneBoard.d.ts +2 -1
  344. package/dist/viewer-lib/types/src/viewer/hooks/useBoardLifecycle.d.ts +28 -0
  345. package/dist/viewer-lib/types/src/viewer/hooks/useBoardOrigin.d.ts +8 -0
  346. package/dist/viewer-lib/types/src/viewer/hooks/useCanvasData.d.ts +2 -0
  347. package/dist/viewer-lib/types/src/viewer/hooks/useCulledBoards.d.ts +6 -0
  348. package/dist/viewer-lib/types/src/viewer/hooks/usePanZoom.d.ts +4 -1
  349. package/dist/viewer-lib/types/src/viewer/layouts/ArtboardView.d.ts +0 -1
  350. package/dist/viewer-lib/types/src/viewer/layouts/PhoneArtboard.d.ts +4 -3
  351. package/dist/viewer-lib/types/src/viewer/lib/board-lifecycle.d.ts +46 -0
  352. package/dist/viewer-lib/types/src/viewer/lib/board-origin.d.ts +21 -0
  353. package/dist/viewer-lib/types/src/viewer/lib/cull.d.ts +14 -0
  354. package/dist/viewer-lib/types/src/viewer/lib/embed-bridge.d.ts +27 -0
  355. package/dist/viewer-lib/types/src/viewer/lib/payload.d.ts +2 -0
  356. package/dist/viewer-lib/types/src/viewer/library/index.d.ts +1 -0
  357. package/dist/viewer-lib/{uk-UA-QMV73CPH-B1a-q2yd.js → uk-UA-QMV73CPH-Dazy1n5o.js} +1 -1
  358. package/dist/viewer-lib/{vennDiagram-4TSXK5OY-7QBTovZw.js → vennDiagram-4TSXK5OY-CzNkraZy.js} +1 -1
  359. package/dist/viewer-lib/{vi-VN-M7AON7JQ-DylR-eVq.js → vi-VN-M7AON7JQ-CKoZnfYq.js} +1 -1
  360. package/dist/viewer-lib/{viewport-CFJHn_Y6-_gSOkJqp.js → viewport-CFJHn_Y6-CtWxDw9u.js} +1 -1
  361. package/dist/viewer-lib/{wardleyDiagram-VM6X3IG4-DIKZjFnA.js → wardleyDiagram-VM6X3IG4-DvgOwLbB.js} +1 -1
  362. package/dist/viewer-lib/{xychartDiagram-S5SC5T6Z-Cv6MN-Tt.js → xychartDiagram-S5SC5T6Z-BXQwSzbk.js} +4 -4
  363. package/dist/viewer-lib/{zh-CN-LNUGB5OW-h3GAAXPL.js → zh-CN-LNUGB5OW-B1OE1E_k.js} +1 -1
  364. package/dist/viewer-lib/{zh-HK-E62DVLB3-DPw2ZhhP.js → zh-HK-E62DVLB3-B64W6D7s.js} +1 -1
  365. package/dist/viewer-lib/{zh-TW-RAJ6MFWO-CuWKYmJx.js → zh-TW-RAJ6MFWO-B0oGqlJb.js} +1 -1
  366. package/package.json +7 -2
  367. package/dist/viewer/ArtboardLayout-B7IicFtH.js +0 -14
  368. package/dist/viewer/ArtifactList-BcjH_Hrz.js +0 -1
  369. package/dist/viewer/AutoPublishPrompt-BnQ3fMrt.js +0 -1
  370. package/dist/viewer/Canvas-DFdPc8UR.js +0 -1
  371. package/dist/viewer/DocumentLayout-DUaBtHl-.js +0 -2
  372. package/dist/viewer/DocumentPage-B4JLDKIF.js +0 -4
  373. package/dist/viewer/PopoverPopup-Cw7nmdOO.js +0 -1
  374. package/dist/viewer/PreviewLayout-CXm3yJ0I.js +0 -2
  375. package/dist/viewer/Select-BP90ucr2.js +0 -1
  376. package/dist/viewer/SelectScrollUpArrow-DuiCMOws.js +0 -1
  377. package/dist/viewer/TooltipPopup-BELV4lQR.js +0 -1
  378. package/dist/viewer/atoms-CNn3DtI1.js +0 -9
  379. package/dist/viewer/channel-DY_L701y.js +0 -1
  380. package/dist/viewer/classDiagram-ZZMXUADV-CAZIZXmE.js +0 -1
  381. package/dist/viewer/classDiagram-v2-VYDZK3BY-CAZIZXmE.js +0 -1
  382. package/dist/viewer/common-CjbR69u7.js +0 -29
  383. package/dist/viewer/flowDiagram-HODETNUW-qzz6hufD.js +0 -1
  384. package/dist/viewer/imperative-PAe0wpHu.js +0 -1
  385. package/dist/viewer/motion-DM3HeQQ5.js +0 -1
  386. package/dist/viewer/percentages-BXMCSKIN-D2HBSZkI.js +0 -1
  387. package/dist/viewer/stateDiagram-v2-MP3YSRHH-APQ2cXaA.js +0 -1
  388. package/dist/viewer/subset-shared.chunk-azE5XCCc.js +0 -1
  389. package/dist/viewer/swimlanesDiagram-VR7AAH4N-DMJtm7N9.js +0 -8
  390. package/dist/viewer/type-icons-BZHOZTop.js +0 -1
  391. package/dist/viewer/useArtifactFeed-yUSrUl7T.js +0 -1
  392. package/dist/viewer/useArtifactSocket-L4eDpLQm.js +0 -1
  393. package/dist/viewer/useCloudStatus-DafDIfDW.js +0 -1
  394. package/dist/viewer/useControlledState-CFVCVerF.js +0 -1
  395. package/dist/viewer/useTypeFavicon-DJKmLlMH.js +0 -1
  396. package/dist/viewer/view-DvU7DFKX.js +0 -1
  397. package/dist/viewer-lib/flowDiagram-HODETNUW-D_Eiu2Sl.js +0 -15
  398. package/dist/viewer-lib/percentages-BXMCSKIN-DvjOJ0_M.js +0 -1
  399. package/dist/viewer-lib/subset-shared.chunk-DA49jqIg.js +0 -2
  400. package/dist/viewer-lib/types/src/viewer/hooks/useBoardTiers.d.ts +0 -27
  401. package/dist/viewer-lib/types/src/viewer/hooks/useHoverDwell.d.ts +0 -20
  402. package/dist/viewer-lib/types/src/viewer/hooks/useKeptBoards.d.ts +0 -2
  403. package/dist/viewer-lib/types/src/viewer/lib/board-tiers.d.ts +0 -40
  404. package/dist/viewer-lib/types/src/viewer/lib/hover-dwell.d.ts +0 -18
  405. package/dist/viewer-lib/types/src/viewer/lib/kept-boards.d.ts +0 -7
  406. package/dist/viewer-lib/types/src/viewer/lib/live-limit.d.ts +0 -33
  407. package/dist/viewer-lib/types/src/viewer/lib/snapshot-store.d.ts +0 -41
  408. package/dist/viewer-lib/types/src/viewer/lib/tier-controller.d.ts +0 -28
package/dist/server.cjs CHANGED
@@ -8798,7 +8798,7 @@ var import_node_os2 = __toESM(require("node:os"), 1);
8798
8798
  var import_node_path25 = __toESM(require("node:path"), 1);
8799
8799
 
8800
8800
  // package.json
8801
- var version = "1.46.4";
8801
+ var version = "1.48.0";
8802
8802
 
8803
8803
  // src/server/app.ts
8804
8804
  var import_node_fs26 = __toESM(require("node:fs"), 1);
@@ -8825,6 +8825,24 @@ var ADDRESS_SOURCE = "(?:[\\w-]{21}|[a-f0-9]{32})";
8825
8825
  var ARTIFACT_LOCATOR_SOURCE = `(?:${SLUG_SOURCE}|${ADDRESS_SOURCE})`;
8826
8826
  var ID_PATTERN = new RegExp(`^${SLUG_SOURCE}$`);
8827
8827
  var ADDRESS_PATTERN = new RegExp(`^${ADDRESS_SOURCE}$`);
8828
+ var MINT_ALPHABET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
8829
+ var MINT_LENGTH = 21;
8830
+ var MINTED_PATTERN = new RegExp(`^[a-z0-9]{${MINT_LENGTH}}$`, "i");
8831
+ var MINT_BYTE_LIMIT = 248;
8832
+ function mintArtifactId() {
8833
+ let id2 = "";
8834
+ const bytes = new Uint8Array(MINT_LENGTH * 2);
8835
+ while (id2.length < MINT_LENGTH) {
8836
+ crypto.getRandomValues(bytes);
8837
+ for (const byte of bytes) {
8838
+ if (byte >= MINT_BYTE_LIMIT) continue;
8839
+ id2 += MINT_ALPHABET[byte % MINT_ALPHABET.length];
8840
+ if (id2.length === MINT_LENGTH) break;
8841
+ }
8842
+ }
8843
+ return id2;
8844
+ }
8845
+ var isMintedArtifactId = (id2) => MINTED_PATTERN.test(id2);
8828
8846
  var isArtifactId = (id2) => ID_PATTERN.test(id2);
8829
8847
  var isArtifactAddress = (id2) => ADDRESS_PATTERN.test(id2);
8830
8848
  var isArtifactLocator = (id2) => ID_PATTERN.test(id2) || ADDRESS_PATTERN.test(id2);
@@ -9120,88 +9138,36 @@ function typeFaviconHref(type) {
9120
9138
  return `data:image/svg+xml,${encodeURIComponent(svg)}`;
9121
9139
  }
9122
9140
 
9141
+ // src/server/access.ts
9142
+ var LOOPBACK = /* @__PURE__ */ new Set(["localhost", "::1", "[::1]"]);
9143
+ var isLoopbackHost = (host) => LOOPBACK.has(host) || /^127\.\d+\.\d+\.\d+$/.test(host);
9144
+ var bracket = (host) => host.includes(":") && !host.startsWith("[") ? `[${host}]` : host;
9145
+ function accessPolicy({
9146
+ host,
9147
+ urlHost,
9148
+ ports,
9149
+ cloudOrigin
9150
+ }) {
9151
+ const names = [
9152
+ ...new Set(
9153
+ ["localhost", "127.0.0.1", bracket(host), bracket(urlHost)].map((name) => name.toLowerCase())
9154
+ )
9155
+ ];
9156
+ const hosts = new Set(ports.flatMap((port) => names.map((name) => `${name}:${port}`)));
9157
+ const viewerPort = ports[0];
9158
+ const origins = new Set(names.map((name) => `http://${name}:${viewerPort}`));
9159
+ return { loopback: isLoopbackHost(host), hosts, origins, cloudOrigin };
9160
+ }
9161
+ var hostAllowed = (policy, host) => !policy.loopback || host !== void 0 && policy.hosts.has(host.toLowerCase());
9162
+ var originAllowed = (policy, origin, { cloud = false } = {}) => origin === void 0 || policy.origins.has(origin) || cloud && policy.cloudOrigin !== void 0 && origin === policy.cloudOrigin;
9163
+ var navigationAllowed = (secFetchSite) => secFetchSite === void 0 || secFetchSite === "none" || secFetchSite === "same-origin";
9164
+
9123
9165
  // src/server/artifact-address.ts
9124
9166
  var import_node_fs2 = __toESM(require("node:fs"), 1);
9125
9167
  var import_node_path2 = __toESM(require("node:path"), 1);
9126
9168
 
9127
- // node_modules/.pnpm/nanoid@5.1.16/node_modules/nanoid/index.js
9128
- var import_node_crypto = require("node:crypto");
9129
-
9130
- // node_modules/.pnpm/nanoid@5.1.16/node_modules/nanoid/url-alphabet/index.js
9131
- var urlAlphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";
9132
-
9133
- // node_modules/.pnpm/nanoid@5.1.16/node_modules/nanoid/index.js
9134
- var POOL_SIZE_MULTIPLIER = 128;
9135
- var pool;
9136
- var poolOffset;
9137
- function fillPool(bytes) {
9138
- if (bytes < 0) throw new RangeError("Wrong ID size");
9139
- try {
9140
- if (!pool || pool.length < bytes) {
9141
- pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER);
9142
- import_node_crypto.webcrypto.getRandomValues(pool);
9143
- poolOffset = 0;
9144
- } else if (poolOffset + bytes > pool.length) {
9145
- import_node_crypto.webcrypto.getRandomValues(pool);
9146
- poolOffset = 0;
9147
- }
9148
- } catch (e5) {
9149
- pool = void 0;
9150
- throw e5;
9151
- }
9152
- poolOffset += bytes;
9153
- }
9154
- function random(bytes) {
9155
- fillPool(bytes |= 0);
9156
- return pool.subarray(poolOffset - bytes, poolOffset);
9157
- }
9158
- function customRandom(alphabet, defaultSize, getRandom) {
9159
- let safeByteCutoff = 256 - 256 % alphabet.length;
9160
- if (safeByteCutoff === 256) {
9161
- let mask = alphabet.length - 1;
9162
- return (size = defaultSize) => {
9163
- if (!size) return "";
9164
- let id2 = "";
9165
- while (true) {
9166
- let bytes = getRandom(size);
9167
- let i6 = size;
9168
- while (i6--) {
9169
- id2 += alphabet[bytes[i6] & mask];
9170
- if (id2.length >= size) return id2;
9171
- }
9172
- }
9173
- };
9174
- }
9175
- let step = Math.ceil(1.6 * 256 * defaultSize / safeByteCutoff);
9176
- return (size = defaultSize) => {
9177
- if (!size) return "";
9178
- let id2 = "";
9179
- while (true) {
9180
- let bytes = getRandom(step);
9181
- let i6 = step;
9182
- while (i6--) {
9183
- if (bytes[i6] < safeByteCutoff) {
9184
- id2 += alphabet[bytes[i6] % alphabet.length];
9185
- if (id2.length >= size) return id2;
9186
- }
9187
- }
9188
- }
9189
- };
9190
- }
9191
- function customAlphabet(alphabet, size = 21) {
9192
- return customRandom(alphabet, size, random);
9193
- }
9194
- function nanoid(size = 21) {
9195
- fillPool(size |= 0);
9196
- let id2 = "";
9197
- for (let i6 = poolOffset - size; i6 < poolOffset; i6++) {
9198
- id2 += urlAlphabet[pool[i6] & 63];
9199
- }
9200
- return id2;
9201
- }
9202
-
9203
9169
  // src/server/artifacts.ts
9204
- var import_node_crypto2 = __toESM(require("node:crypto"), 1);
9170
+ var import_node_crypto = __toESM(require("node:crypto"), 1);
9205
9171
  var import_node_fs = __toESM(require("node:fs"), 1);
9206
9172
  var import_node_path = __toESM(require("node:path"), 1);
9207
9173
  function subdirectories(dir) {
@@ -9273,15 +9239,11 @@ function artifactSignature(dir, type) {
9273
9239
  }
9274
9240
  };
9275
9241
  walk(dir);
9276
- const hash = import_node_crypto2.default.createHash("sha1").update(names.sort().join("\0")).digest("hex").slice(0, 12);
9242
+ const hash = import_node_crypto.default.createHash("sha1").update(names.sort().join("\0")).digest("hex").slice(0, 12);
9277
9243
  return `${names.length}:${size}:${latest}:${hash}`;
9278
9244
  }
9279
9245
 
9280
9246
  // src/server/artifact-address.ts
9281
- var newArtifactId = customAlphabet(
9282
- "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
9283
- 21
9284
- );
9285
9247
  function artifactId(dir) {
9286
9248
  const file = import_node_path2.default.join(dir, ".artifact-id");
9287
9249
  let id2;
@@ -9289,7 +9251,7 @@ function artifactId(dir) {
9289
9251
  id2 = import_node_fs2.default.readFileSync(file, "utf8").trim();
9290
9252
  } catch (err) {
9291
9253
  if (err.code !== "ENOENT") throw err;
9292
- id2 = newArtifactId();
9254
+ id2 = mintArtifactId();
9293
9255
  try {
9294
9256
  import_node_fs2.default.writeFileSync(file, `${id2}
9295
9257
  `, { flag: "wx" });
@@ -9322,7 +9284,7 @@ function resolveArtifactAddress(root, type, address) {
9322
9284
  var import_node_fs5 = __toESM(require("node:fs"), 1);
9323
9285
 
9324
9286
  // src/server/http.ts
9325
- var import_node_crypto3 = __toESM(require("node:crypto"), 1);
9287
+ var import_node_crypto2 = __toESM(require("node:crypto"), 1);
9326
9288
  var import_node_fs3 = __toESM(require("node:fs"), 1);
9327
9289
  var import_node_path3 = __toESM(require("node:path"), 1);
9328
9290
  var MIME = {
@@ -9348,11 +9310,11 @@ var MIME = {
9348
9310
  ".webm": "video/webm"
9349
9311
  };
9350
9312
  var mimeOf = (file) => MIME[import_node_path3.default.extname(file).toLowerCase()] ?? "application/octet-stream";
9351
- var randomToken = () => import_node_crypto3.default.randomBytes(24).toString("base64url");
9313
+ var randomToken = () => import_node_crypto2.default.randomBytes(24).toString("base64url");
9352
9314
  function safeEqual(a5, b6) {
9353
9315
  const ab = Buffer.from(a5);
9354
9316
  const bb = Buffer.from(b6);
9355
- return ab.length === bb.length && import_node_crypto3.default.timingSafeEqual(ab, bb);
9317
+ return ab.length === bb.length && import_node_crypto2.default.timingSafeEqual(ab, bb);
9356
9318
  }
9357
9319
  function parseCookies(header) {
9358
9320
  const cookies = {};
@@ -10559,7 +10521,7 @@ function readArtifactFile(dir, type, relative, uiRuntimeUrl, maxBytes = Infinity
10559
10521
  }
10560
10522
 
10561
10523
  // src/server/auto-publish.ts
10562
- var import_node_crypto4 = __toESM(require("node:crypto"), 1);
10524
+ var import_node_crypto3 = __toESM(require("node:crypto"), 1);
10563
10525
  var import_node_fs7 = __toESM(require("node:fs"), 1);
10564
10526
 
10565
10527
  // src/server/state.ts
@@ -10979,7 +10941,7 @@ function createAutoPublisher(options) {
10979
10941
  });
10980
10942
  const raise = (kind, message, upgradeUrl) => {
10981
10943
  if (notice?.kind !== kind)
10982
- notice = { id: import_node_crypto4.default.randomUUID(), kind, message, ...upgradeUrl ? { upgradeUrl } : {} };
10944
+ notice = { id: import_node_crypto3.default.randomUUID(), kind, message, ...upgradeUrl ? { upgradeUrl } : {} };
10983
10945
  };
10984
10946
  let idleTimer = null;
10985
10947
  let maxTimer = null;
@@ -11082,7 +11044,7 @@ function createAutoPublisher(options) {
11082
11044
  }
11083
11045
 
11084
11046
  // src/server/avatars.ts
11085
- var import_node_crypto5 = require("node:crypto");
11047
+ var import_node_crypto4 = require("node:crypto");
11086
11048
  var AVATAR_ROUTE = /^\/api\/avatar\/([a-z]+)\/([^/]+)$/;
11087
11049
  var MAX_BYTES = 512 * 1024;
11088
11050
  var TIMEOUT_MS = 5e3;
@@ -11097,7 +11059,7 @@ var SOURCES = {
11097
11059
  }
11098
11060
  };
11099
11061
  var githubAvatar = (login) => `/api/avatar/github/${login}`;
11100
- var gravatarAvatar = (email) => `/api/avatar/gravatar/${(0, import_node_crypto5.createHash)("sha256").update(email.trim().toLowerCase()).digest("hex")}`;
11062
+ var gravatarAvatar = (email) => `/api/avatar/gravatar/${(0, import_node_crypto4.createHash)("sha256").update(email.trim().toLowerCase()).digest("hex")}`;
11101
11063
  function createAvatars(fetchImpl = fetch) {
11102
11064
  const cache = /* @__PURE__ */ new Map();
11103
11065
  const fetchAvatar = async (url) => {
@@ -11608,6 +11570,44 @@ function createCommentCursors(stateDir, type = "document") {
11608
11570
 
11609
11571
  // src/server/document-comments.ts
11610
11572
  var import_node_fs9 = __toESM(require("node:fs"), 1);
11573
+
11574
+ // node_modules/.pnpm/nanoid@5.1.16/node_modules/nanoid/index.js
11575
+ var import_node_crypto5 = require("node:crypto");
11576
+
11577
+ // node_modules/.pnpm/nanoid@5.1.16/node_modules/nanoid/url-alphabet/index.js
11578
+ var urlAlphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";
11579
+
11580
+ // node_modules/.pnpm/nanoid@5.1.16/node_modules/nanoid/index.js
11581
+ var POOL_SIZE_MULTIPLIER = 128;
11582
+ var pool;
11583
+ var poolOffset;
11584
+ function fillPool(bytes) {
11585
+ if (bytes < 0) throw new RangeError("Wrong ID size");
11586
+ try {
11587
+ if (!pool || pool.length < bytes) {
11588
+ pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER);
11589
+ import_node_crypto5.webcrypto.getRandomValues(pool);
11590
+ poolOffset = 0;
11591
+ } else if (poolOffset + bytes > pool.length) {
11592
+ import_node_crypto5.webcrypto.getRandomValues(pool);
11593
+ poolOffset = 0;
11594
+ }
11595
+ } catch (e5) {
11596
+ pool = void 0;
11597
+ throw e5;
11598
+ }
11599
+ poolOffset += bytes;
11600
+ }
11601
+ function nanoid(size = 21) {
11602
+ fillPool(size |= 0);
11603
+ let id2 = "";
11604
+ for (let i6 = poolOffset - size; i6 < poolOffset; i6++) {
11605
+ id2 += urlAlphabet[pool[i6] & 63];
11606
+ }
11607
+ return id2;
11608
+ }
11609
+
11610
+ // src/server/document-comments.ts
11611
11611
  var MAX_TEXT = 2e4;
11612
11612
  var isText = (value, max = MAX_TEXT) => typeof value === "string" && value.length <= max;
11613
11613
  var isId = (value) => isText(value, 100) && value.length > 0;
@@ -11982,6 +11982,29 @@ function createBoardCommentRegistry(options) {
11982
11982
  };
11983
11983
  }
11984
11984
 
11985
+ // src/server/board-port.ts
11986
+ var BOARD_PORT_FILE = ".last-board-port";
11987
+ var BOARD_ROUTE = /^\/c\/artboard\/([^/]+)\/(.+)$/;
11988
+ var RUNTIME_ROUTE = /^\/c\/runtime\/(.+)$/;
11989
+ var loopbackHosts = (urlHost) => [
11990
+ .../* @__PURE__ */ new Set(["localhost", "127.0.0.1", urlHost.includes(":") ? `[${urlHost}]` : urlHost])
11991
+ ];
11992
+ var originsFor = (urlHost, port) => loopbackHosts(urlHost).map((host) => `http://${host}:${port}`);
11993
+ function boardCsp(urlHost, viewerPort, cloudOrigin) {
11994
+ const ancestors = [...originsFor(urlHost, viewerPort), ...cloudOrigin ? [cloudOrigin] : []];
11995
+ return `worker-src 'none'; frame-ancestors ${ancestors.join(" ")}`;
11996
+ }
11997
+ function routeBoardRequest(req, pathname) {
11998
+ if (req.method !== "GET" && req.method !== "HEAD") return { kind: "none" };
11999
+ if (pathname === "/robots.txt") return { kind: "robots" };
12000
+ const runtime = RUNTIME_ROUTE.exec(pathname);
12001
+ if (runtime) return { kind: "runtime", rest: `runtime/${runtime[1]}` };
12002
+ const board = BOARD_ROUTE.exec(pathname);
12003
+ if (board && isArtifactAddress(board[1]))
12004
+ return { kind: "board", address: board[1], rest: board[2] };
12005
+ return { kind: "none" };
12006
+ }
12007
+
11985
12008
  // src/server/cloud.ts
11986
12009
  var import_node_crypto7 = __toESM(require("node:crypto"), 1);
11987
12010
 
@@ -12043,8 +12066,12 @@ var en_default = {
12043
12066
  fromPageDetail: "Go back to Ryugi; the share panel refreshes on its own.",
12044
12067
  fromAgent: "Asked the agent to publish?",
12045
12068
  fromAgentDetail: "Have it run the publish command again.",
12046
- autoPublish: "Auto-publish is on",
12047
- autoPublishDetail: "After each agent turn, changed artifacts sync privately to Ryugi Cloud. To turn it off, run <code>ryugi-artifacts config --auto-publish off</code>.",
12069
+ autoPublishOn: "Auto-publish is on",
12070
+ autoPublishOff: "Auto-publish is off",
12071
+ autoPublishDetail: "After each agent turn, changed artifacts sync privately to Ryugi Cloud, so you can open them on another device. Only you can see them.",
12072
+ autoPublishTurnOn: "Turn on auto-publish",
12073
+ autoPublishTurnOff: "Turn off auto-publish",
12074
+ autoPublishWhere: "Change it any time in Settings, from your avatar at the top right of the artifact list.",
12048
12075
  notConnected: "Not connected",
12049
12076
  retry: "Sign in again",
12050
12077
  retryDetail: "Go back to Ryugi and click Sign in in the share panel again.",
@@ -12075,8 +12102,12 @@ var zh_default = {
12075
12102
  fromPageDetail: "\u56DE\u5230 Ryugi\uFF0C\u5206\u4EAB\u9762\u677F\u4F1A\u81EA\u52A8\u5237\u65B0\u3002",
12076
12103
  fromAgent: "\u8BA9 agent \u53D1\u5E03\u7684\uFF1F",
12077
12104
  fromAgentDetail: "\u8BA9\u5B83\u518D\u8FD0\u884C\u4E00\u6B21\u53D1\u5E03\u547D\u4EE4\u3002",
12078
- autoPublish: "\u81EA\u52A8\u53D1\u5E03\u5DF2\u6253\u5F00",
12079
- autoPublishDetail: "agent \u6BCF\u8F6E\u7ED3\u675F\u540E\uFF0C\u6539\u8FC7\u7684 artifact \u4F1A\u4EE5\u79C1\u5BC6\u65B9\u5F0F\u540C\u6B65\u5230 Ryugi Cloud\u3002\u5173\u95ED\uFF1A\u8FD0\u884C <code>ryugi-artifacts config --auto-publish off</code>\u3002",
12105
+ autoPublishOn: "\u81EA\u52A8\u53D1\u5E03\u5DF2\u6253\u5F00",
12106
+ autoPublishOff: "\u81EA\u52A8\u53D1\u5E03\u5DF2\u5173\u95ED",
12107
+ autoPublishDetail: "agent \u6BCF\u8F6E\u7ED3\u675F\u540E\uFF0C\u6539\u8FC7\u7684 artifact \u4F1A\u4EE5\u79C1\u5BC6\u65B9\u5F0F\u540C\u6B65\u5230 Ryugi Cloud\uFF0C\u6362\u53F0\u8BBE\u5907\u4E5F\u80FD\u6253\u5F00\u3002\u53EA\u6709\u4F60\u80FD\u770B\u5230\u3002",
12108
+ autoPublishTurnOn: "\u6253\u5F00\u81EA\u52A8\u53D1\u5E03",
12109
+ autoPublishTurnOff: "\u5173\u95ED\u81EA\u52A8\u53D1\u5E03",
12110
+ autoPublishWhere: "\u4EE5\u540E\u5728 Artifacts \u5217\u8868\u53F3\u4E0A\u89D2\u5934\u50CF \u203A \u8BBE\u7F6E \u91CC\u968F\u65F6\u4FEE\u6539\u3002",
12080
12111
  notConnected: "\u672A\u8FDE\u63A5",
12081
12112
  retry: "\u91CD\u65B0\u767B\u5F55",
12082
12113
  retryDetail: "\u56DE\u5230 Ryugi\uFF0C\u5728\u5206\u4EAB\u9762\u677F\u91CC\u518D\u70B9\u4E00\u6B21\u300C\u767B\u5F55\u300D\u3002",
@@ -12099,7 +12130,7 @@ var zh_default = {
12099
12130
  var serverText = (locale) => translator({ en: en_default, zh: zh_default }, locale);
12100
12131
 
12101
12132
  // src/server/callback-page.ts
12102
- var CALLBACK_PAGE_CSP = "default-src 'none'; style-src 'unsafe-inline'; img-src data:; script-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'";
12133
+ var CALLBACK_PAGE_CSP = "default-src 'none'; style-src 'unsafe-inline'; img-src data:; script-src 'none'; base-uri 'none'; form-action 'self'; frame-ancestors 'none'";
12103
12134
  var escapeHtml = (value) => value.replaceAll(
12104
12135
  /[&<>"']/g,
12105
12136
  (ch2) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" })[ch2]
@@ -12170,10 +12201,25 @@ h1 em { margin-left: 8px; font-style: normal; color: var(--name); }
12170
12201
  .rows li { padding: 16px 0; border-bottom: 1px solid var(--rule); font-size: 14px; }
12171
12202
  .rows b { display: block; margin-bottom: 3px; font-weight: 600; }
12172
12203
  .rows span { color: var(--soft); font-size: 13px; }
12204
+ .auto { margin-top: 28px; padding: 16px 18px; border: 1px solid var(--rule); border-radius: 12px; }
12205
+ .auto form { display: flex; align-items: center; gap: 16px; margin: 0; }
12206
+ .auto .text { flex: 1; }
12207
+ .auto b { display: block; margin-bottom: 4px; font-size: 15px; font-weight: 600; }
12208
+ .auto .text span { color: var(--soft); font-size: 13px; line-height: 1.7; }
12209
+ .switch { flex-shrink: 0; width: 44px; height: 24px; padding: 2px; border: 0; border-radius: 12px; background: var(--rule); cursor: pointer; display: flex; }
12210
+ .switch[aria-checked="true"] { justify-content: flex-end; background: var(--ink); }
12211
+ .switch i { width: 20px; height: 20px; border-radius: 50%; background: var(--bg); }
12212
+ .switch:focus-visible { outline: 2px solid var(--name); outline-offset: 2px; }
12213
+ .auto .where { display: block; margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--rule); color: var(--soft); font-size: 12px; }
12173
12214
  footer { display: flex; justify-content: space-between; gap: 16px; margin-top: 20px; font-size: 12px; color: var(--faint); }
12174
12215
  footer code { font: 12px var(--mono); }
12175
12216
  `;
12176
12217
  var row = (title, detail) => `<li><b>${title}</b><span>${detail}</span></li>`;
12218
+ var autoPublishCard = (t7, on5, ticket) => `<section class="auto"><form method="post" action="/api/cloud/callback/auto-publish">
12219
+ <input type="hidden" name="ticket" value="${escapeHtml(ticket)}">
12220
+ <span class="text"><b>${on5 ? t7("callback.autoPublishOn") : t7("callback.autoPublishOff")}</b><span>${t7("callback.autoPublishDetail")}</span></span>
12221
+ <button class="switch" type="submit" name="value" value="${on5 ? "off" : "on"}" role="switch" aria-checked="${on5}" aria-label="${on5 ? t7("callback.autoPublishTurnOff") : t7("callback.autoPublishTurnOn")}"><i></i></button>
12222
+ </form><span class="where">${t7("callback.autoPublishWhere")}</span></section>`;
12177
12223
  function callbackPage(result, locale = "en") {
12178
12224
  const t7 = serverText(locale);
12179
12225
  const host = escapeHtml(new URL(result.origin).host);
@@ -12181,7 +12227,8 @@ function callbackPage(result, locale = "en") {
12181
12227
  const body = result.ok ? `<p class="status">${CIRCLE_CHECK}${t7("callback.connected")}</p>
12182
12228
  <h1>${t7("callback.signedIn")}<em>${escapeHtml(result.login)}</em></h1>
12183
12229
  <p class="lead">${t7("callback.lead")}</p>
12184
- <ul class="rows">${row(t7("callback.fromPage"), t7("callback.fromPageDetail"))}${row(t7("callback.fromAgent"), t7("callback.fromAgentDetail"))}${result.autoPublish ? row(t7("callback.autoPublish"), t7("callback.autoPublishDetail")) : ""}</ul>` : `<p class="status">${CIRCLE_ALERT}${t7("callback.notConnected")}</p>
12230
+ ${autoPublishCard(t7, result.autoPublish, result.ticket)}
12231
+ <ul class="rows">${row(t7("callback.fromPage"), t7("callback.fromPageDetail"))}${row(t7("callback.fromAgent"), t7("callback.fromAgentDetail"))}</ul>` : `<p class="status">${CIRCLE_ALERT}${t7("callback.notConnected")}</p>
12185
12232
  <h1>${t7("callback.titleFailed")}</h1>
12186
12233
  <p class="lead">${escapeHtml(result.detail)}</p>
12187
12234
  <ul class="rows">${row(t7("callback.retry"), t7("callback.retryDetail"))}</ul>`;
@@ -12424,14 +12471,14 @@ function fillRandom(buffer) {
12424
12471
  from = to3;
12425
12472
  }
12426
12473
  }
12427
- function random2(bytes) {
12474
+ function random(bytes) {
12428
12475
  bytes |= 0;
12429
12476
  if (bytes < 0) throw new RangeError("Wrong ID size");
12430
12477
  let buffer = Buffer.allocUnsafe(bytes);
12431
12478
  fillRandom(buffer);
12432
12479
  return buffer;
12433
12480
  }
12434
- function customRandom2(alphabet, defaultSize, getRandom) {
12481
+ function customRandom(alphabet, defaultSize, getRandom) {
12435
12482
  let safeByteCutoff = 256 - 256 % alphabet.length;
12436
12483
  if (safeByteCutoff === 256) {
12437
12484
  let mask = alphabet.length - 1;
@@ -12465,13 +12512,13 @@ function customRandom2(alphabet, defaultSize, getRandom) {
12465
12512
  };
12466
12513
  }
12467
12514
  var POOL_MAX = GET_RANDOM_LIMIT / 2;
12468
- function customAlphabet2(alphabet, defaultSize = 21) {
12515
+ function customAlphabet(alphabet, defaultSize = 21) {
12469
12516
  if (typeof alphabet !== "string" || !alphabet || alphabet.length > 256) {
12470
- return customRandom2(alphabet, defaultSize, random2);
12517
+ return customRandom(alphabet, defaultSize, random);
12471
12518
  }
12472
12519
  for (let i6 = 0; i6 < alphabet.length; i6++) {
12473
12520
  if (alphabet.charCodeAt(i6) > 255) {
12474
- return customRandom2(alphabet, defaultSize, random2);
12521
+ return customRandom(alphabet, defaultSize, random);
12475
12522
  }
12476
12523
  }
12477
12524
  let charCodes = Uint8Array.from(alphabet, (str) => {
@@ -12518,7 +12565,7 @@ function customAlphabet2(alphabet, defaultSize = 21) {
12518
12565
  return pool2.substring(poolOffset2 - size, poolOffset2);
12519
12566
  };
12520
12567
  }
12521
- var nanoid2 = customAlphabet2(urlAlphabet2);
12568
+ var nanoid2 = customAlphabet(urlAlphabet2);
12522
12569
 
12523
12570
  // node_modules/.pnpm/@haklex+rich-litexml@0.61.1_typescript@5.9.3/node_modules/@haklex/rich-litexml/dist/src-CwO17cE7.js
12524
12571
  var impl = null;
@@ -12664,11 +12711,11 @@ function registerBuiltinReaders(registry2) {
12664
12711
  }));
12665
12712
  }
12666
12713
  var idAlphabet = "abcdefghijklmnopqrstuvwxyz0123456789";
12667
- var makePollIdSuffix = customAlphabet2(idAlphabet, 10);
12668
- var makeOptionIdSuffix = customAlphabet2(idAlphabet, 6);
12669
- var makeChatParticipantId = customAlphabet2(idAlphabet, 6);
12670
- var makeChatMessageId = customAlphabet2(idAlphabet, 8);
12671
- var makeStepId = customAlphabet2(idAlphabet, 8);
12714
+ var makePollIdSuffix = customAlphabet(idAlphabet, 10);
12715
+ var makeOptionIdSuffix = customAlphabet(idAlphabet, 6);
12716
+ var makeChatParticipantId = customAlphabet(idAlphabet, 6);
12717
+ var makeChatMessageId = customAlphabet(idAlphabet, 8);
12718
+ var makeStepId = customAlphabet(idAlphabet, 8);
12672
12719
  function extractBlockId(el2) {
12673
12720
  const id2 = el2.getAttribute("id");
12674
12721
  return id2 ? { $: { blockId: id2 } } : {};
@@ -24905,7 +24952,7 @@ function sharedComments(file) {
24905
24952
  function publishPayload(ref, dir, title, payload, comments = emptyComments()) {
24906
24953
  if (ref.type === "artboard") {
24907
24954
  const { canvas, layout, versions } = payload;
24908
- return { canvas, layout, versions, snapshots: true };
24955
+ return { canvas, layout, versions };
24909
24956
  }
24910
24957
  if (ref.type === "document")
24911
24958
  return {
@@ -24951,6 +24998,16 @@ function writeGlobalAutoPublish(file, value) {
24951
24998
  import_node_fs16.default.mkdirSync(import_node_path13.default.dirname(file), { recursive: true, mode: 448 });
24952
24999
  writeJsonAtomic(file, { ...readSettings(file), autoPublish: value });
24953
25000
  }
25001
+ function postponeGlobalAutoPublish(file) {
25002
+ const settings = readSettings(file);
25003
+ if (settings.autoPublishPostponed === true) {
25004
+ writeGlobalAutoPublish(file, false);
25005
+ return "off";
25006
+ }
25007
+ import_node_fs16.default.mkdirSync(import_node_path13.default.dirname(file), { recursive: true, mode: 448 });
25008
+ writeJsonAtomic(file, { ...settings, autoPublishPostponed: true });
25009
+ return "postponed";
25010
+ }
24954
25011
  function defaultGlobalAutoPublish(file) {
24955
25012
  if (readGlobalAutoPublish(file) === void 0) writeGlobalAutoPublish(file, true);
24956
25013
  }
@@ -24963,6 +25020,7 @@ function autoPublishEnabled({
24963
25020
 
24964
25021
  // src/server/cloud.ts
24965
25022
  var LOGIN_STATE_TTL_MS = 10 * 60 * 1e3;
25023
+ var CALLBACK_TICKET_TTL_MS = 30 * 60 * 1e3;
24966
25024
  var UPLOAD_CONCURRENCY = 6;
24967
25025
  var MAX_JSON_BODY = 4096;
24968
25026
  var CLOUD_ID = /^[\w-]{1,64}$/;
@@ -24994,7 +25052,7 @@ var CreateRefused = class extends CloudRefused {
24994
25052
  }
24995
25053
  detail;
24996
25054
  };
24997
- async function readJsonBody(req) {
25055
+ async function readBodyText(req) {
24998
25056
  const chunks = [];
24999
25057
  let size = 0;
25000
25058
  for await (const chunk of req) {
@@ -25002,8 +25060,11 @@ async function readJsonBody(req) {
25002
25060
  if (size > MAX_JSON_BODY) throw new CloudRefused(413, "request body too large");
25003
25061
  chunks.push(chunk);
25004
25062
  }
25063
+ return Buffer.concat(chunks).toString("utf8");
25064
+ }
25065
+ async function readJsonBody(req) {
25005
25066
  try {
25006
- return JSON.parse(Buffer.concat(chunks).toString("utf8") || "null");
25067
+ return JSON.parse(await readBodyText(req) || "null");
25007
25068
  } catch {
25008
25069
  return null;
25009
25070
  }
@@ -25049,7 +25110,27 @@ function createCloudRoutes(options) {
25049
25110
  project: readConfig(configFile).config.autoPublish ?? null,
25050
25111
  enabled: !!readCredentials(credentialsFile2, origin) && autoPublishEnabled({ globalFile: settingsFile, projectFile: configFile })
25051
25112
  });
25113
+ let postponed = false;
25052
25114
  const pendingStates = /* @__PURE__ */ new Map();
25115
+ const callbackTickets = /* @__PURE__ */ new Map();
25116
+ const issueTicket = (login) => {
25117
+ const now = Date.now();
25118
+ for (const [ticket2, issued] of callbackTickets)
25119
+ if (issued.expires < now) callbackTickets.delete(ticket2);
25120
+ const ticket = randomToken();
25121
+ callbackTickets.set(ticket, { expires: now + CALLBACK_TICKET_TTL_MS, login });
25122
+ return ticket;
25123
+ };
25124
+ const sendCallbackPage = (res, status, result, locale) => send(res, status, callbackPage({ ...result, origin }, locale), {
25125
+ "Content-Type": "text/html; charset=utf-8",
25126
+ "Content-Security-Policy": CALLBACK_PAGE_CSP
25127
+ });
25128
+ const signedInPage = (res, ticket, login, locale) => sendCallbackPage(
25129
+ res,
25130
+ 200,
25131
+ { ok: true, login, ticket, autoPublish: readGlobalAutoPublish(settingsFile) ?? false },
25132
+ locale
25133
+ );
25053
25134
  const loginUrl = () => {
25054
25135
  const now = Date.now();
25055
25136
  for (const [state2, pending] of pendingStates)
@@ -25112,7 +25193,14 @@ function createCloudRoutes(options) {
25112
25193
  ([, entry]) => entry.cloud?.id === cloudId
25113
25194
  )?.[0] ?? `cloud:${cloudId}`;
25114
25195
  const createRecord2 = async (ref, visibility) => {
25115
- const res = await cloudFetch("POST", "/api/artifacts", { type: ref.type, visibility, project });
25196
+ const body = { type: ref.type, visibility, project };
25197
+ const id2 = options.address?.(ref);
25198
+ let res = await cloudFetch(
25199
+ "POST",
25200
+ "/api/artifacts",
25201
+ id2 && isMintedArtifactId(id2) ? { ...body, id: id2 } : body
25202
+ );
25203
+ if (res.status === 409) res = await cloudFetch("POST", "/api/artifacts", body);
25116
25204
  if (res.status === 403) throw new CreateRefused(await errorMessage(res));
25117
25205
  const created = await (await expectOk(res)).json();
25118
25206
  updateArtifactConfig(configFile, `${ref.type}/${ref.id}`, {
@@ -25381,7 +25469,7 @@ function createCloudRoutes(options) {
25381
25469
  origin,
25382
25470
  hostId: hostIdFor(credentialsFile2),
25383
25471
  artifacts: config.artifacts,
25384
- autoPublish: autoPublishState(),
25472
+ autoPublish: { ...autoPublishState(), postponed },
25385
25473
  warning: warning ?? null
25386
25474
  });
25387
25475
  return;
@@ -25460,6 +25548,11 @@ function createCloudRoutes(options) {
25460
25548
  sendJson(res, 200, await setVisibility(ref, visibility));
25461
25549
  return;
25462
25550
  }
25551
+ if (action === "auto-publish" && method === "POST" && first === "later" && !second) {
25552
+ postponed = postponeGlobalAutoPublish(settingsFile) === "postponed";
25553
+ sendJson(res, 200, { ...autoPublishState(), postponed });
25554
+ return;
25555
+ }
25463
25556
  if (action === "auto-publish" && method === "POST" && !first) {
25464
25557
  const body = await readJsonBody(req);
25465
25558
  const value = body?.value;
@@ -25480,10 +25573,7 @@ function createCloudRoutes(options) {
25480
25573
  return {
25481
25574
  async handleCallback(url, res, locale = "en") {
25482
25575
  const t7 = serverText(locale);
25483
- const page = (status, result) => send(res, status, callbackPage({ ...result, origin }, locale), {
25484
- "Content-Type": "text/html; charset=utf-8",
25485
- "Content-Security-Policy": CALLBACK_PAGE_CSP
25486
- });
25576
+ const page = (status, result) => sendCallbackPage(res, status, result, locale);
25487
25577
  const state = url.searchParams.get("state") ?? "";
25488
25578
  const pending = pendingStates.get(state);
25489
25579
  pendingStates.delete(state);
@@ -25514,7 +25604,27 @@ function createCloudRoutes(options) {
25514
25604
  }
25515
25605
  writeCredentials(credentialsFile2, { origin, token: issued.token, login: issued.login });
25516
25606
  defaultGlobalAutoPublish(settingsFile);
25517
- page(200, { ok: true, login: issued.login, autoPublish: autoPublishState().enabled });
25607
+ signedInPage(res, issueTicket(issued.login), issued.login, locale);
25608
+ },
25609
+ async handleCallbackAutoPublish(req, res, locale = "en") {
25610
+ if (req.method !== "POST") {
25611
+ send(res, 405, "Method not allowed");
25612
+ return;
25613
+ }
25614
+ const form = new URLSearchParams(await readBodyText(req));
25615
+ const ticket = form.get("ticket") ?? "";
25616
+ const issued = callbackTickets.get(ticket);
25617
+ const value = form.get("value");
25618
+ if (!issued || issued.expires < Date.now()) {
25619
+ send(res, 403, "Forbidden");
25620
+ return;
25621
+ }
25622
+ if (value !== "on" && value !== "off") {
25623
+ send(res, 400, "value must be on or off");
25624
+ return;
25625
+ }
25626
+ writeGlobalAutoPublish(settingsFile, value === "on");
25627
+ signedInPage(res, ticket, issued.login, locale);
25518
25628
  },
25519
25629
  match: (pathname) => ROUTE.exec(pathname),
25520
25630
  autoPublish,
@@ -95188,11 +95298,11 @@ function $assignBlockIds(editor, runtime, candidates) {
95188
95298
  }
95189
95299
  }
95190
95300
  }
95191
- let random3 = needFresh;
95301
+ let random2 = needFresh;
95192
95302
  if (isLoad && needFresh.length > 0) {
95193
95303
  const fresh = new Set(needFresh.map((node) => node.getKey()));
95194
95304
  const placed = $placeBlocks(runtime, (node) => fresh.has(node.getKey()));
95195
- random3 = [];
95305
+ random2 = [];
95196
95306
  for (const node of needFresh) {
95197
95307
  const key2 = node.getKey();
95198
95308
  const id2 = placed.get(key2);
@@ -95200,11 +95310,11 @@ function $assignBlockIds(editor, runtime, candidates) {
95200
95310
  used.add(id2);
95201
95311
  $setState2(node, blockIdState, id2);
95202
95312
  } else {
95203
- random3.push(node);
95313
+ random2.push(node);
95204
95314
  }
95205
95315
  }
95206
95316
  }
95207
- for (const node of random3.sort(compareKeys)) {
95317
+ for (const node of random2.sort(compareKeys)) {
95208
95318
  const id2 = $makeFreshId(runtime, used);
95209
95319
  $setState2(node, blockIdState, id2);
95210
95320
  if (!prevNodeMap.has(node.getKey())) {
@@ -100090,7 +100200,7 @@ function viewerPage(template, page) {
100090
100200
  };
100091
100201
  return template.replace(
100092
100202
  /<html\b([^>]*)>/i,
100093
- (_tag, attributes) => `<html${attributes.replace(/\slang="[^"]*"/i, "")} lang="${HTML_LANG[locale]}"${page.artifactId ? ` data-ryugi-artifact-id="${escapeHtml2(page.artifactId)}"` : ""}>`
100203
+ (_tag, attributes) => `<html${attributes.replace(/\slang="[^"]*"/i, "")} lang="${HTML_LANG[locale]}"${page.artifactId ? ` data-ryugi-artifact-id="${escapeHtml2(page.artifactId)}"` : ""}${page.embedParent ? ` data-ryugi-embed-parent="${escapeHtml2(page.embedParent)}"` : ""}>`
100094
100204
  ).replace(/<title\b[^>]*>[\s\S]*?<\/title>/i, () => `<title>${escapeHtml2(page.title)}</title>`).replace(
100095
100205
  /(<link\b[^>]+\brel="icon"[^>]*\bhref=")[^"]*(")/i,
100096
100206
  (tag, prefix, suffix) => page.icon ? `${prefix}${escapeHtml2(page.icon)}${suffix}` : tag
@@ -100192,14 +100302,14 @@ function watchTree(root, onChange, debounceMs = 120, backupPollMs = 1e3) {
100192
100302
  }
100193
100303
 
100194
100304
  // src/server/app.ts
100195
- var VIEWER_CSP = [
100305
+ var viewerCsp = (boardOrigins) => [
100196
100306
  "default-src 'self'",
100197
100307
  "script-src 'self' 'wasm-unsafe-eval'",
100198
100308
  "style-src 'self' 'unsafe-inline'",
100199
100309
  "img-src 'self' data: blob:",
100200
100310
  "font-src 'self' data:",
100201
- "connect-src 'self'",
100202
- "frame-src 'self'",
100311
+ `connect-src 'self' ${boardOrigins.join(" ")}`,
100312
+ `frame-src 'self' ${boardOrigins.join(" ")}`,
100203
100313
  "base-uri 'self'",
100204
100314
  "form-action 'none'",
100205
100315
  "frame-ancestors 'none'"
@@ -100217,6 +100327,7 @@ var PREVIEW_ROUTE = new RegExp(
100217
100327
  `^/preview/(artboard|document|html)/${ARTIFACT_LOCATOR_SOURCE}/?$`
100218
100328
  );
100219
100329
  var API_PREVIEW_ROUTE = /^\/api\/preview\/([^/]+)\/([^/]+)$/;
100330
+ var EMBED_ROUTE = /^\/embed\/artboard\/([\w-]{1,64})\/?$/;
100220
100331
  var API_THUMBNAIL_ROUTE = /^\/api\/thumbnail\/([^/]+)\/([^/]+)\.svg$/;
100221
100332
  var API_DOCUMENT_ROUTE = /^\/api\/document\/([^/]+)\/(state|update|comments)$/;
100222
100333
  var MAX_COMMENT_OP = 64 * 1024;
@@ -100265,6 +100376,15 @@ async function startArtifactsServer(options) {
100265
100376
  import_node_fs26.default.writeFileSync(tokenFile, `${token}
100266
100377
  `, { mode: 384 });
100267
100378
  const contentToken = randomToken();
100379
+ const loopback = isLoopbackHost(options.host);
100380
+ const keyOk = (key2) => loopback || key2 !== null && safeEqual(key2, token);
100381
+ const agentOk = (req, key2) => loopback ? req.headers.origin === void 0 : key2 !== null && safeEqual(key2, token);
100382
+ let policy = accessPolicy({
100383
+ host: options.host,
100384
+ urlHost: options.urlHost,
100385
+ ports: [],
100386
+ cloudOrigin: options.cloud?.origin
100387
+ });
100268
100388
  const runtimeWarnings = /* @__PURE__ */ new Map();
100269
100389
  const ranVersions = /* @__PURE__ */ new Map();
100270
100390
  const dynamicBlocks = createDynamicBlocks({ maxErrors: MAX_RUNTIME_WARNINGS });
@@ -100285,6 +100405,8 @@ async function startArtifactsServer(options) {
100285
100405
  activityListeners.forEach((listener) => listener());
100286
100406
  };
100287
100407
  let port = 0;
100408
+ let boardPort = 0;
100409
+ const boardOrigins = () => boardPort ? originsFor(options.urlHost, boardPort) : [];
100288
100410
  let cookieName = "";
100289
100411
  let relay = null;
100290
100412
  const direct = createDirectRelay({
@@ -100385,6 +100507,7 @@ async function startArtifactsServer(options) {
100385
100507
  ...options.cloud,
100386
100508
  configFile: options.configFile,
100387
100509
  project: import_node_path23.default.basename(import_node_path23.default.resolve(root, "../..")),
100510
+ address: (ref) => artifactPath(root, ref.type, ref.id).split("/").pop(),
100388
100511
  port: () => port,
100389
100512
  inspect,
100390
100513
  onPublication: (key2, publication) => {
@@ -100612,8 +100735,8 @@ async function startArtifactsServer(options) {
100612
100735
  sendJson(res, 400, { error: err.message });
100613
100736
  }
100614
100737
  };
100615
- const isAuthorized = (req, keyFromQuery) => keyFromQuery !== null && safeEqual(keyFromQuery, token) || safeEqual(parseCookies(req.headers.cookie)[cookieName] ?? "", token);
100616
- const serveContent = (res, rest, range) => {
100738
+ const isAuthorized = (req, keyFromQuery) => loopback || keyFromQuery !== null && safeEqual(keyFromQuery, token) || safeEqual(parseCookies(req.headers.cookie)[cookieName] ?? "", token);
100739
+ const serveContent = (res, rest, range, mode = "main") => {
100617
100740
  if (rest.startsWith("runtime/")) {
100618
100741
  if (!runtimeDir) {
100619
100742
  send(res, 404, "Not found");
@@ -100655,8 +100778,8 @@ async function startArtifactsServer(options) {
100655
100778
  }
100656
100779
  const page = ref.type === "html" ? relative === "index.html" : relative.endsWith(".html");
100657
100780
  const headers = {
100658
- "Content-Security-Policy": CONTENT_CSP[page && ref.type === "document" ? "html" : ref.type],
100659
- "Access-Control-Allow-Origin": "*"
100781
+ "Content-Security-Policy": mode === "board" ? boardCsp(options.urlHost, port, options.cloud?.origin) : CONTENT_CSP[page && ref.type === "document" ? "html" : ref.type],
100782
+ ...mode === "board" ? {} : { "Access-Control-Allow-Origin": "*" }
100660
100783
  };
100661
100784
  if (!page) {
100662
100785
  sendFile(res, target, headers, range);
@@ -100665,7 +100788,7 @@ async function startArtifactsServer(options) {
100665
100788
  import_node_fs26.default.readFile(target, "utf8", (err, source) => {
100666
100789
  if (err) send(res, 404, "Not found");
100667
100790
  else {
100668
- const uiRuntimeUrl = runtimeDir ? `${contentPrefix}runtime/ryugi-ui.js` : void 0;
100791
+ const uiRuntimeUrl = runtimeDir ? `${mode === "board" ? "/c/" : contentPrefix}runtime/ryugi-ui.js` : void 0;
100669
100792
  send(
100670
100793
  res,
100671
100794
  200,
@@ -100691,7 +100814,11 @@ async function startArtifactsServer(options) {
100691
100814
  sendJson(res, 404, { warnings: [`artifact ${type}/${id2} not found`] });
100692
100815
  return;
100693
100816
  }
100694
- sendJson(res, 200, artifactMeta(artifactKeyOf(`${type}/${id2}`), dir));
100817
+ const ref = artifactKeyOf(`${type}/${id2}`);
100818
+ sendJson(res, 200, {
100819
+ ...artifactMeta(ref, dir),
100820
+ ...ref.type === "artboard" && boardPort ? { boardPort, boardPath: `/c${artifactPath(root, "artboard", ref.id)}/` } : {}
100821
+ });
100695
100822
  };
100696
100823
  const serveList = (res) => {
100697
100824
  const { artifacts, warnings } = listArtifacts(root);
@@ -100766,6 +100893,10 @@ async function startArtifactsServer(options) {
100766
100893
  }
100767
100894
  const handleRequest = (req, res) => {
100768
100895
  res.setHeader("X-Robots-Tag", "noindex, nofollow");
100896
+ if (!hostAllowed(policy, req.headers.host)) {
100897
+ send(res, 403, "Forbidden host");
100898
+ return;
100899
+ }
100769
100900
  const url2 = new URL(req.url ?? "/", "http://artifacts.local");
100770
100901
  if (url2.pathname === "/api/status") {
100771
100902
  if (!isAuthorized(req, url2.searchParams.get("key")))
@@ -100800,6 +100931,20 @@ async function startArtifactsServer(options) {
100800
100931
  });
100801
100932
  return;
100802
100933
  }
100934
+ if (cloud && pathname === "/api/cloud/callback/auto-publish") {
100935
+ void cloud.handleCallbackAutoPublish(
100936
+ req,
100937
+ res,
100938
+ resolveLocale(parseAcceptLanguage(req.headers["accept-language"]))
100939
+ ).catch((err) => {
100940
+ if (!res.headersSent) send(res, 500, `Artifacts error: ${err.message}`);
100941
+ });
100942
+ return;
100943
+ }
100944
+ if (loopback && !originAllowed(policy, req.headers.origin)) {
100945
+ send(res, 403, "Forbidden origin");
100946
+ return;
100947
+ }
100803
100948
  const key2 = url2.searchParams.get("key");
100804
100949
  if (!isAuthorized(req, key2)) {
100805
100950
  send(res, 403, "Forbidden: open the full artifact link including ?key=");
@@ -100881,7 +101026,7 @@ async function startArtifactsServer(options) {
100881
101026
  return;
100882
101027
  }
100883
101028
  if (pathname === "/api/cloud/flush") {
100884
- if (req.method !== "POST" || key2 === null || !safeEqual(key2, token)) {
101029
+ if (req.method !== "POST" || !agentOk(req, key2)) {
100885
101030
  send(res, 403, "Forbidden: agent calls need ?key=");
100886
101031
  return;
100887
101032
  }
@@ -100896,7 +101041,7 @@ async function startArtifactsServer(options) {
100896
101041
  }
100897
101042
  const cloudMatch = cloud?.match(pathname);
100898
101043
  if (cloud && cloudMatch) {
100899
- if (req.method !== "GET" && !(key2 !== null && safeEqual(key2, token)) && !sameOrigin(req)) {
101044
+ if (req.method !== "GET" && !keyOk(key2) && !sameOrigin(req)) {
100900
101045
  send(res, 403, "Forbidden");
100901
101046
  return;
100902
101047
  }
@@ -100905,7 +101050,7 @@ async function startArtifactsServer(options) {
100905
101050
  }
100906
101051
  const agentCommentsMatch = API_AGENT_COMMENTS_ROUTE.exec(pathname);
100907
101052
  if (agentCommentsMatch) {
100908
- if (req.method !== "POST" || key2 === null || !safeEqual(key2, token)) {
101053
+ if (req.method !== "POST" || !agentOk(req, key2)) {
100909
101054
  send(res, 403, "Forbidden: agent calls need ?key=");
100910
101055
  return;
100911
101056
  }
@@ -100916,7 +101061,7 @@ async function startArtifactsServer(options) {
100916
101061
  }
100917
101062
  const agentBoardMatch = API_AGENT_BOARD_COMMENTS_ROUTE.exec(pathname);
100918
101063
  if (agentBoardMatch) {
100919
- if (req.method !== "POST" || key2 === null || !safeEqual(key2, token)) {
101064
+ if (req.method !== "POST" || !agentOk(req, key2)) {
100920
101065
  send(res, 403, "Forbidden: agent calls need ?key=");
100921
101066
  return;
100922
101067
  }
@@ -100927,7 +101072,7 @@ async function startArtifactsServer(options) {
100927
101072
  }
100928
101073
  const agentCheckMatch = API_AGENT_CHECK_ROUTE.exec(pathname);
100929
101074
  if (agentCheckMatch) {
100930
- if (req.method !== "POST" || key2 === null || !safeEqual(key2, token)) {
101075
+ if (req.method !== "POST" || !agentOk(req, key2)) {
100931
101076
  send(res, 403, "Forbidden: agent calls need ?key=");
100932
101077
  return;
100933
101078
  }
@@ -100955,8 +101100,19 @@ async function startArtifactsServer(options) {
100955
101100
  serveArtifactApi(res, apiMatch[1], apiMatch[2]);
100956
101101
  return;
100957
101102
  }
100958
- if (SHELL_ROUTE.test(pathname) || PREVIEW_ROUTE.test(pathname) || pathname === "/index.html") {
100959
- const requested = artifactKeyOf(
101103
+ const embedMatch = EMBED_ROUTE.exec(pathname);
101104
+ const embed = !!embedMatch;
101105
+ const embedded = embedMatch && embedTarget(embedMatch[1]);
101106
+ if (pathname.startsWith("/embed/") && (!embedded || !options.cloud)) {
101107
+ send(res, 404, "Not found");
101108
+ return;
101109
+ }
101110
+ if (SHELL_ROUTE.test(pathname) || PREVIEW_ROUTE.test(pathname) || embed || pathname === "/index.html") {
101111
+ if (loopback && (pathname === "/" || pathname === "/index.html") && !navigationAllowed(req.headers["sec-fetch-site"])) {
101112
+ send(res, 403, "Forbidden");
101113
+ return;
101114
+ }
101115
+ const requested = embedded || artifactKeyOf(
100960
101116
  pathname.replace(/^\/(?:preview\/)?/, "").replace(/\/$/, ""),
100961
101117
  isArtifactLocator
100962
101118
  );
@@ -100975,9 +101131,12 @@ async function startArtifactsServer(options) {
100975
101131
  const preview = PREVIEW_ROUTE.test(pathname);
100976
101132
  const canonicalPath = ref ? dir ? artifactPath(root, ref.type, ref.id) : `/${ref.type}/${ref.id}` : "/";
100977
101133
  const canonical = `http://${urlHostForHttp(options.urlHost)}:${port}${preview ? "/preview" : ""}${canonicalPath}`;
100978
- const csp = preview ? VIEWER_CSP.replace("frame-ancestors 'none'", "frame-ancestors 'self'") : VIEWER_CSP;
101134
+ const csp = embed ? viewerCsp(boardOrigins()).replace(
101135
+ "frame-ancestors 'none'",
101136
+ `frame-ancestors ${options.cloud.origin}`
101137
+ ) : preview ? viewerCsp(boardOrigins()).replace("frame-ancestors 'none'", "frame-ancestors 'self'") : viewerCsp(boardOrigins());
100979
101138
  const headers = { "Content-Type": "text/html; charset=utf-8" };
100980
- if (key2 !== null)
101139
+ if (key2 !== null && !loopback)
100981
101140
  headers["Set-Cookie"] = `${cookieName}=${token}; HttpOnly; SameSite=Strict; Path=/`;
100982
101141
  const entry = preview && import_node_fs26.default.existsSync(import_node_path23.default.join(viewerDir, "preview.html")) ? "preview.html" : "index.html";
100983
101142
  void import_node_fs26.default.promises.readFile(import_node_path23.default.join(viewerDir, entry), "utf8").then((template) => {
@@ -100987,7 +101146,8 @@ async function startArtifactsServer(options) {
100987
101146
  locale,
100988
101147
  url: canonical,
100989
101148
  icon: ref ? typeFaviconHref(ref.type) : void 0,
100990
- artifactId: resolved?.id
101149
+ artifactId: resolved?.id,
101150
+ embedParent: embed ? options.cloud.origin : void 0
100991
101151
  });
100992
101152
  send(res, 200, html, {
100993
101153
  ...headers,
@@ -101000,7 +101160,10 @@ async function startArtifactsServer(options) {
101000
101160
  }
101001
101161
  const target = resolveInside(viewerDir, pathname.slice(1));
101002
101162
  if (!target) send(res, 404, "Not found");
101003
- else sendFile(res, target, { "Content-Security-Policy": VIEWER_CSP });
101163
+ else
101164
+ sendFile(res, target, {
101165
+ "Content-Security-Policy": viewerCsp(boardOrigins())
101166
+ });
101004
101167
  };
101005
101168
  const server = import_node_http.default.createServer((req, res) => {
101006
101169
  try {
@@ -101010,12 +101173,16 @@ async function startArtifactsServer(options) {
101010
101173
  }
101011
101174
  });
101012
101175
  server.on("upgrade", (req, socket) => {
101176
+ if (!hostAllowed(policy, req.headers.host)) {
101177
+ rejectUpgrade(socket, 403, "Forbidden");
101178
+ return;
101179
+ }
101013
101180
  const url2 = new URL(req.url ?? "/", "http://artifacts.local");
101014
101181
  const clientKey = req.headers["sec-websocket-key"];
101015
101182
  const directMatch = DIRECT_RELAY_ROUTE.exec(url2.pathname);
101016
101183
  if (directMatch && typeof clientKey === "string") {
101017
101184
  const fromCloud = options.cloud !== void 0 && req.headers.origin === options.cloud.origin;
101018
- if (!safeEqual(url2.searchParams.get("key") ?? "", token) || !(fromCloud || sameOrigin(req))) {
101185
+ if (!keyOk(url2.searchParams.get("key")) || !(fromCloud || sameOrigin(req))) {
101019
101186
  rejectUpgrade(socket, 403, "Forbidden");
101020
101187
  return;
101021
101188
  }
@@ -101060,9 +101227,56 @@ async function startArtifactsServer(options) {
101060
101227
  cookieName = `ryugi_artifacts_${port}`;
101061
101228
  import_node_fs26.default.writeFileSync(portFile, `${port}
101062
101229
  `, { mode: 384 });
101230
+ const boardServer = import_node_http.default.createServer((req, res) => {
101231
+ if (!hostAllowed(policy, req.headers.host)) {
101232
+ send(res, 403, "Forbidden host");
101233
+ return;
101234
+ }
101235
+ let pathname;
101236
+ try {
101237
+ pathname = decodeURIComponent(new URL(req.url ?? "/", "http://board.local").pathname);
101238
+ } catch {
101239
+ send(res, 400, "Bad request");
101240
+ return;
101241
+ }
101242
+ try {
101243
+ const route = routeBoardRequest(req, pathname);
101244
+ if (route.kind === "robots") send(res, 200, "User-agent: *\nDisallow: /\n");
101245
+ else if (route.kind === "runtime") serveContent(res, route.rest, req.headers.range, "board");
101246
+ else if (route.kind === "board") {
101247
+ const resolved = resolveArtifactAddress(root, "artboard", route.address);
101248
+ if (!resolved || resolved.id === route.address) send(res, 404, "Not found");
101249
+ else serveContent(res, `artboard/${resolved.id}/${route.rest}`, req.headers.range, "board");
101250
+ } else send(res, 404, "Not found");
101251
+ } catch (err) {
101252
+ if (!res.headersSent) send(res, 500, err.message);
101253
+ else res.destroy();
101254
+ }
101255
+ });
101256
+ if (loopback) {
101257
+ const boardPortFile = import_node_path23.default.join(stateDir, BOARD_PORT_FILE);
101258
+ const previousBoardPort = Number(readPersisted(boardPortFile));
101259
+ try {
101260
+ boardPort = await listen(
101261
+ boardServer,
101262
+ options.host,
101263
+ Number.isInteger(previousBoardPort) && previousBoardPort > 0 && previousBoardPort !== port ? previousBoardPort : 0
101264
+ );
101265
+ } catch {
101266
+ boardPort = await listen(boardServer, options.host, 0);
101267
+ }
101268
+ import_node_fs26.default.writeFileSync(boardPortFile, `${boardPort}
101269
+ `, { mode: 384 });
101270
+ }
101271
+ policy = accessPolicy({
101272
+ host: options.host,
101273
+ urlHost: options.urlHost,
101274
+ ports: boardPort ? [port, boardPort] : [port],
101275
+ cloudOrigin: options.cloud?.origin
101276
+ });
101063
101277
  const origin = `http://${urlHostForHttp(options.urlHost)}:${port}`;
101064
- const url = `${origin}/?key=${token}`;
101065
- const linkFor = (type, id2) => `${origin}${artifactPath(root, type, id2)}?key=${token}`;
101278
+ const url = loopback ? `${origin}/` : `${origin}/?key=${token}`;
101279
+ const linkFor = (type, id2) => `${origin}${artifactPath(root, type, id2)}${loopback ? "" : `?key=${token}`}`;
101066
101280
  const signatures = /* @__PURE__ */ new Map();
101067
101281
  const writeState = (ref, dir) => {
101068
101282
  const payload = readArtifact(dir, ref, runtimeOf(ref, dir));
@@ -101084,8 +101298,20 @@ async function startArtifactsServer(options) {
101084
101298
  initialChanges.push({ ref: entry, payload, files: [] });
101085
101299
  if (entry.type === "document") void documents.open(entry.id);
101086
101300
  }
101087
- writeJsonAtomic(import_node_path23.default.join(stateDir, "server-info"), { type: "server-started", url, port, root });
101301
+ writeJsonAtomic(import_node_path23.default.join(stateDir, "server-info"), {
101302
+ type: "server-started",
101303
+ url,
101304
+ port,
101305
+ boardPort,
101306
+ root
101307
+ });
101088
101308
  const relayViewers = /* @__PURE__ */ new Map();
101309
+ const embedTarget = (id2) => {
101310
+ if (isArtifactLocator(id2) && resolveArtifactAddress(root, "artboard", id2))
101311
+ return { type: "artboard", id: id2 };
101312
+ const served = artifactKeyOf(servedArtifacts().get(id2) ?? "");
101313
+ return served?.type === "artboard" ? served : null;
101314
+ };
101089
101315
  const servedArtifacts = () => {
101090
101316
  const served = /* @__PURE__ */ new Map();
101091
101317
  if (!options.configFile) return served;
@@ -101167,7 +101393,11 @@ async function startArtifactsServer(options) {
101167
101393
  ...options.relay,
101168
101394
  token: () => readCredentials(options.cloud.credentialsFile, options.cloud.origin)?.token ?? null,
101169
101395
  served: servedArtifacts,
101170
- local: () => ({ hostId: hostIdFor(options.cloud.credentialsFile), port, key: token }),
101396
+ local: () => ({
101397
+ hostId: hostIdFor(options.cloud.credentialsFile),
101398
+ port,
101399
+ ...loopback ? { embed: true } : { key: token }
101400
+ }),
101171
101401
  handle: handleRelay,
101172
101402
  onActivity: touch,
101173
101403
  onWatch: (keys2) => {
@@ -101262,6 +101492,7 @@ async function startArtifactsServer(options) {
101262
101492
  );
101263
101493
  return {
101264
101494
  port,
101495
+ boardPort,
101265
101496
  token,
101266
101497
  contentToken,
101267
101498
  url,
@@ -101290,6 +101521,8 @@ async function startArtifactsServer(options) {
101290
101521
  direct.close();
101291
101522
  selections.clearAll();
101292
101523
  for (const socket of clients) socket.destroy();
101524
+ boardServer.close();
101525
+ boardServer.closeAllConnections();
101293
101526
  server.close(() => resolve());
101294
101527
  server.closeAllConnections();
101295
101528
  });