ryugi-artifacts 1.60.0 → 1.61.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 (396) hide show
  1. package/README.md +8 -0
  2. package/dist/cli.cjs +262 -101
  3. package/dist/output-bootstrap.cjs +25 -8
  4. package/dist/server.cjs +522 -283
  5. package/dist/viewer/AgentStatusPill-Bg3-TfB6.js +1 -0
  6. package/dist/viewer/ArtboardLayout-fEYVfxn4.js +12 -0
  7. package/dist/viewer/ArtifactList-DuzFhHUE.js +2 -0
  8. package/dist/viewer/{AutoPublishPrompt-4NnJXZog.js → AutoPublishPrompt-B8EornjB.js} +1 -1
  9. package/dist/viewer/{Avatar-dNoe5E1c.js → Avatar-BFlGnh3K.js} +1 -1
  10. package/dist/viewer/Avatar-DoJIbVRH.js +1 -0
  11. package/dist/viewer/{Canvas-CNOyUMJm.js → Canvas-BNBbDEQk.js} +1 -1
  12. package/dist/viewer/DocumentLayout-Dg-bV04g.js +2 -0
  13. package/dist/viewer/DocumentPage-CzDGbW7J.js +4 -0
  14. package/dist/viewer/{HtmlLayout-BntwoI3r.js → HtmlLayout-CHC8Wgst.js} +1 -1
  15. package/dist/viewer/PhoneSheet-COiqG2Qf.js +1 -0
  16. package/dist/viewer/{Popover-B_CXVR49.js → Popover-APpFVB9l.js} +1 -1
  17. package/dist/viewer/PreviewLayout-C6AN655_.js +2 -0
  18. package/dist/viewer/{RailSwitch-Du0xlqfo.js → RailSwitch-CltBH8g4.js} +1 -1
  19. package/dist/viewer/{Select-Bt3TgRTH.js → Select-Cq0vY0fU.js} +1 -1
  20. package/dist/viewer/{SelectScrollUpArrow-Bxle5Ik3.js → SelectScrollUpArrow-VBobuSoz.js} +1 -1
  21. package/dist/viewer/SettingsDialog-DJVNG5Xg.js +1 -0
  22. package/dist/viewer/SnapshotDocument-BezdwGQl.js +1 -0
  23. package/dist/viewer/SplitShell-Sl7upggj.js +1 -0
  24. package/dist/viewer/TooltipPopup-D_x17pfc.js +1 -0
  25. package/dist/viewer/VirtualizedEditor-D9Ivycdp-BvVanAks.js +1 -0
  26. package/dist/viewer/{VirtualizedRenderer-C_d95FXi-DlsMCHOp.js → VirtualizedRenderer-C_d95FXi-BfRP_clr.js} +1 -1
  27. package/dist/viewer/{WarningsBadge-Cm_tPZxD.js → WarningsBadge-BmZsGppu.js} +1 -1
  28. package/dist/viewer/{abnfDiagram-VCTEODGH-V02w9mmq.js → abnfDiagram-VCTEODGH-Dy-Yd9GT.js} +1 -1
  29. package/dist/viewer/agentLook-CgpljoOL.js +1 -0
  30. package/dist/viewer/anchor-C31CS18T.js +1 -0
  31. package/dist/viewer/{ar-SA-G6X2FPQ2-Ch7uC6Uu.js → ar-SA-G6X2FPQ2-DQEgddf_.js} +1 -1
  32. package/dist/viewer/{architecture-7GRP2DOG-g5b4QnNK.js → architecture-7GRP2DOG-BRqKI1uU.js} +1 -1
  33. package/dist/viewer/{architectureDiagram-5GKGNRK7-D5qmUNao.js → architectureDiagram-5GKGNRK7-DYnNQ5GA.js} +1 -1
  34. package/dist/viewer/arrow-up-BjP7sXQi.js +1 -0
  35. package/dist/viewer/{az-AZ-76LH7QW2-D_1HMIy0.js → az-AZ-76LH7QW2-BqSwQDgU.js} +1 -1
  36. package/dist/viewer/{bg-BG-XCXSNQG7-BR4xAQwM.js → bg-BG-XCXSNQG7-D3qaiKCR.js} +1 -1
  37. package/dist/viewer/{blockDiagram-I7D4REHJ-mLe3Gd_Z.js → blockDiagram-I7D4REHJ-gfOqOqK8.js} +1 -1
  38. package/dist/viewer/{bn-BD-2XOGV67Q-DuZJy6yQ.js → bn-BD-2XOGV67Q-uueVjSG0.js} +1 -1
  39. package/dist/viewer/{c4Diagram-7LVT6UL2-CsrmBJ7r.js → c4Diagram-7LVT6UL2-CspixSih.js} +1 -1
  40. package/dist/viewer/{ca-ES-6MX7JW3Y-0aC8YzCV.js → ca-ES-6MX7JW3Y-BPVc8zQY.js} +1 -1
  41. package/dist/viewer/channel-BcP7xsGP.js +1 -0
  42. package/dist/viewer/{channel-BUqsTLoJ.js → channel-CKa-n8no.js} +161 -161
  43. package/dist/viewer/{chunk-4HAMMTFA-CsS8ySls.js → chunk-4HAMMTFA-OwEqPYqg.js} +1 -1
  44. package/dist/viewer/{chunk-75Z2AOVW-BA5zQjlf.js → chunk-75Z2AOVW-DEvYTf43.js} +1 -1
  45. package/dist/viewer/{chunk-DU6HZSFF-CtKmoJBe.js → chunk-DU6HZSFF-Bo8LAnUG.js} +1 -1
  46. package/dist/viewer/{chunk-EIO257PC-CP9-NY-y.js → chunk-EIO257PC-DOWICayv.js} +1 -1
  47. package/dist/viewer/{chunk-F27PBJKO-BrzOEdmQ.js → chunk-F27PBJKO-FPprQQwQ.js} +1 -1
  48. package/dist/viewer/{chunk-GMAD6QVW-BEIQMvPy.js → chunk-GMAD6QVW-CcuMOYFd.js} +1 -1
  49. package/dist/viewer/{chunk-GVQU2GXP-CHgL6ykK.js → chunk-GVQU2GXP-CwyhLOSe.js} +1 -1
  50. package/dist/viewer/{chunk-IMKFNOWR-CuVAUnsT.js → chunk-IMKFNOWR-BRcARyIO.js} +1 -1
  51. package/dist/viewer/{chunk-L3NEJ4N5-rUjkjDEt.js → chunk-L3NEJ4N5-DIvNBSBN.js} +1 -1
  52. package/dist/viewer/{chunk-OSK3NFVY-AZgoDDlE.js → chunk-OSK3NFVY-DlZAl57I.js} +1 -1
  53. package/dist/viewer/{chunk-P2QGCYS3-CnqNqmnt.js → chunk-P2QGCYS3-BJ6X1Qvu.js} +1 -1
  54. package/dist/viewer/{chunk-POPQ4Y6H-C0VQEl8T.js → chunk-POPQ4Y6H-7iiU0DyD.js} +1 -1
  55. package/dist/viewer/{chunk-PWAF6VOD-N9Uz0jx9.js → chunk-PWAF6VOD-ClGno4La.js} +1 -1
  56. package/dist/viewer/{chunk-SHT3W25Y-DWL13XB_.js → chunk-SHT3W25Y-BlaWEaK4.js} +1 -1
  57. package/dist/viewer/{chunk-SVP7TREG-Dq7RxyUW.js → chunk-SVP7TREG-Cba4SxZ5.js} +1 -1
  58. package/dist/viewer/{chunk-TICWLB2K-6rFQNnYe.js → chunk-TICWLB2K-CZ2y5jMV.js} +1 -1
  59. package/dist/viewer/classDiagram-ZZMXUADV-Dp5LBWBk.js +1 -0
  60. package/dist/viewer/classDiagram-v2-VYDZK3BY-Dp5LBWBk.js +1 -0
  61. package/dist/viewer/{common-mldU7ZsL.js → common-DhR3pjFS.js} +1 -1
  62. package/dist/viewer/{cs-CZ-2BRQDIVT-i3Iu_puT.js → cs-CZ-2BRQDIVT-a-4qjDc0.js} +1 -1
  63. package/dist/viewer/{cynefin-OW5HDTMX-bIA2GPJu.js → cynefin-OW5HDTMX-Cjf0AYaV.js} +1 -1
  64. package/dist/viewer/{cynefinDiagram-5FMLGOSQ-1QdiomNx.js → cynefinDiagram-5FMLGOSQ-Dw7ZdM6T.js} +1 -1
  65. package/dist/viewer/{da-DK-5WZEPLOC-CgMT5eDO.js → da-DK-5WZEPLOC-DDN5tVhI.js} +1 -1
  66. package/dist/viewer/{dagre-GXQ25YYZ-C_p1-ufY.js → dagre-GXQ25YYZ-Bp7T7Kmd.js} +1 -1
  67. package/dist/viewer/{de-DE-XR44H4JA-5M86Gk25.js → de-DE-XR44H4JA-BytQ_CrN.js} +1 -1
  68. package/dist/viewer/{diagram-S7CK7UJ4-DDzzCIFb.js → diagram-S7CK7UJ4-Dt9i0DU1.js} +1 -1
  69. package/dist/viewer/{diagram-UQ7AKVKN-DGuPmlxZ.js → diagram-UQ7AKVKN-DSZe0CPN.js} +1 -1
  70. package/dist/viewer/{diagram-VSXAHHWV-50AodQys.js → diagram-VSXAHHWV-DgFFVfm2.js} +1 -1
  71. package/dist/viewer/{diagram-VX7I27RA-D98k-lV5.js → diagram-VX7I27RA-Dd2UGWn8.js} +1 -1
  72. package/dist/viewer/{diagram-Z3DM3KII-DycFDlf3.js → diagram-Z3DM3KII-BPm8itCz.js} +1 -1
  73. package/dist/viewer/{dist-DX6_l1cB.js → dist-B20NF_1w.js} +1 -1
  74. package/dist/viewer/{dist-DbM09a29.js → dist-BIXBs5yY.js} +1 -1
  75. package/dist/viewer/{dist-CdYNWuaW.js → dist-BZQgm0fP.js} +1 -1
  76. package/dist/viewer/{dist-B4JXI4Si.js → dist-BrgjU6Kj.js} +1 -1
  77. package/dist/viewer/{dist-D1CJjkJn.js → dist-C6NM4gya.js} +1 -1
  78. package/dist/viewer/{dist-DDeuapns.js → dist-CAH5wbEo.js} +1 -1
  79. package/dist/viewer/{dist-DdMCA4Py.js → dist-CCnpKWIt.js} +2 -2
  80. package/dist/viewer/{dist-CzE4uHhP.js → dist-CJD5icp7.js} +1 -1
  81. package/dist/viewer/{dist-BDBeTEDr.js → dist-CPZZxnbc.js} +1 -1
  82. package/dist/viewer/{dist-zuDkqQsP.js → dist-CkbIgyIQ.js} +1 -1
  83. package/dist/viewer/{dist-DcF5S87J.js → dist-Cv4vuf_b.js} +1 -1
  84. package/dist/viewer/{dist-BnOZSaxP.js → dist-D2KAT3mC.js} +1 -1
  85. package/dist/viewer/{dist-BLKN3RJ1.js → dist-DRC0i5gA.js} +2 -2
  86. package/dist/viewer/{dist-C6m7_IIO.js → dist-DYBFczu0.js} +1 -1
  87. package/dist/viewer/{dist-DBnftyF_.js → dist-DnGkIFUM.js} +4 -4
  88. package/dist/viewer/{dist-D1YenQjZ.js → dist-G9zZ1RBJ.js} +1 -1
  89. package/dist/viewer/dist-J-Ry-abR.js +6 -0
  90. package/dist/viewer/{dist-aNCGpCGL.js → dist-JHcrIXSF.js} +1 -1
  91. package/dist/viewer/{dist-3toIv9ax.js → dist-Q_Zx--RV.js} +1 -1
  92. package/dist/viewer/dist-V-zHhIcO.js +1 -0
  93. package/dist/viewer/{dist-DrE8ciLv.js → dist-XvS6ci1T.js} +2 -2
  94. package/dist/viewer/dist-a_UUJo8x.js +23 -0
  95. package/dist/viewer/{dist-CfW4_4LE.js → dist-ePb257VQ.js} +1 -1
  96. package/dist/viewer/{dist-CCzd1zK0.js → dist-nTTZk2bO.js} +1 -1
  97. package/dist/viewer/{ebnfDiagram-PWID7BFC-CORvb246.js → ebnfDiagram-PWID7BFC-BMoELXgl.js} +1 -1
  98. package/dist/viewer/{el-GR-BZB4AONW-Bc1slvxt.js → el-GR-BZB4AONW-zsoj3bty.js} +1 -1
  99. package/dist/viewer/{en-B4ZKOASM-C1vlYjE_.js → en-B4ZKOASM-umHmROdK.js} +1 -1
  100. package/dist/viewer/{erDiagram-RLTQ6QDP-BXDWJpPA.js → erDiagram-RLTQ6QDP-DKLZGQuZ.js} +1 -1
  101. package/dist/viewer/{es-ES-U4NZUMDT-rZ0sZd3p.js → es-ES-U4NZUMDT-BKvciIF7.js} +1 -1
  102. package/dist/viewer/{eu-ES-A7QVB2H4-PI8QTaiF.js → eu-ES-A7QVB2H4-CIEtyFuU.js} +1 -1
  103. package/dist/viewer/{eventmodeling-NTZA5JFV-Cb9m-K7H.js → eventmodeling-NTZA5JFV-DoF-cBhC.js} +1 -1
  104. package/dist/viewer/{fa-IR-HGAKTJCU-DAwzrpHi.js → fa-IR-HGAKTJCU-0s9_ZrQD.js} +1 -1
  105. package/dist/viewer/{fi-FI-Z5N7JZ37-BByaX7nJ.js → fi-FI-Z5N7JZ37-DNx5O4ny.js} +1 -1
  106. package/dist/viewer/flowDiagram-HODETNUW-CAdqr-O0.js +1 -0
  107. package/dist/viewer/{fr-FR-RHASNOE6-Klk1fzkX.js → fr-FR-RHASNOE6-R14jaePu.js} +1 -1
  108. package/dist/viewer/ganttDiagram-EL5Y4UJY-BEtMB3Re.js +292 -0
  109. package/dist/viewer/{gitGraph-4MIJSDKK-isoaKk1X.js → gitGraph-4MIJSDKK-CAknE3UE.js} +1 -1
  110. package/dist/viewer/{gitGraphDiagram-WWUBYQGX-yWlETb3x.js → gitGraphDiagram-WWUBYQGX-DaF_3psO.js} +1 -1
  111. package/dist/viewer/{gl-ES-HMX3MZ6V-BJKYEt17.js → gl-ES-HMX3MZ6V-LKgNlnss.js} +1 -1
  112. package/dist/viewer/{he-IL-6SHJWFNN-kBf37qYy.js → he-IL-6SHJWFNN-BrIuZ8Py.js} +1 -1
  113. package/dist/viewer/{hi-IN-IWLTKZ5I-CfLTCUTm.js → hi-IN-IWLTKZ5I-CUraB0TV.js} +1 -1
  114. package/dist/viewer/{hu-HU-A5ZG7DT2-CYYFX46C.js → hu-HU-A5ZG7DT2-DnrESyoD.js} +1 -1
  115. package/dist/viewer/{id-ID-SAP4L64H-Dvx8IBbU.js → id-ID-SAP4L64H-SUjMkUnN.js} +1 -1
  116. package/dist/viewer/{image-GAAHSSAO-BRSljglW.js → image-GAAHSSAO-eZswirxU.js} +1 -1
  117. package/dist/viewer/{imperative-Bl76r1j2.js → imperative-_YhkNLK4.js} +1 -1
  118. package/dist/viewer/index.html +5 -5
  119. package/dist/viewer/index.js +2 -2
  120. package/dist/viewer/index3.css +40 -4
  121. package/dist/viewer/{info-A6RAGUB7-CCW6I4Wy.js → info-A6RAGUB7-Bsmv3OKw.js} +1 -1
  122. package/dist/viewer/{infoDiagram-27XIBGKW-DewuEFv-.js → infoDiagram-27XIBGKW-3GhkTSpF.js} +1 -1
  123. package/dist/viewer/{isElementDisabled-DZok2iqw.js → isElementDisabled-BwUscK-1.js} +1 -1
  124. package/dist/viewer/{ishikawaDiagram-5VMMS53U-BDDRi495.js → ishikawaDiagram-5VMMS53U-CjPzGmEw.js} +1 -1
  125. package/dist/viewer/{it-IT-JPQ66NNP-BFWWFlnb.js → it-IT-JPQ66NNP-CVlssRrp.js} +1 -1
  126. package/dist/viewer/{ja-JP-DBVTYXUO-bpQtg8fw.js → ja-JP-DBVTYXUO-Hp2I9Iyx.js} +1 -1
  127. package/dist/viewer/{journeyDiagram-3NMN7TZE-BbJ1eZNu.js → journeyDiagram-3NMN7TZE-DhyEZ2I3.js} +1 -1
  128. package/dist/viewer/{kaa-6HZHGXH3-K5oenSag.js → kaa-6HZHGXH3-7aWlc8ys.js} +1 -1
  129. package/dist/viewer/{kab-KAB-ZGHBKWFO-DkUxVyw_.js → kab-KAB-ZGHBKWFO-Co-ehoZu.js} +1 -1
  130. package/dist/viewer/{kanban-definition-UXKFOSKX-B3qZ6Rkk.js → kanban-definition-UXKFOSKX-Dtoq54ES.js} +1 -1
  131. package/dist/viewer/{kk-KZ-P5N5QNE5-BUjA95mK.js → kk-KZ-P5N5QNE5-DWQlG67D.js} +1 -1
  132. package/dist/viewer/{km-KH-HSX4SM5Z-D4uRbo6A.js → km-KH-HSX4SM5Z-JtHzzhkf.js} +1 -1
  133. package/dist/viewer/{ko-KR-MTYHY66A-bLvg0vo1.js → ko-KR-MTYHY66A-SVXw6RP-.js} +1 -1
  134. package/dist/viewer/{ku-TR-6OUDTVRD-Btg6Cs-I.js → ku-TR-6OUDTVRD-BCl0E9O4.js} +1 -1
  135. package/dist/viewer/local-split-host-DNVZJL-p.js +1 -0
  136. package/dist/viewer/{lt-LT-XHIRWOB4-BXtyilKc.js → lt-LT-XHIRWOB4-BM6oy7Qh.js} +1 -1
  137. package/dist/viewer/{lv-LV-5QDEKY6T-trXznvJJ.js → lv-LV-5QDEKY6T-Dno1GFUx.js} +1 -1
  138. package/dist/viewer/{mermaid-parser.core-CHSpk_HG.js → mermaid-parser.core-CHryh7q2.js} +3 -3
  139. package/dist/viewer/messages-ByFQUibx.js +1 -0
  140. package/dist/viewer/{mindmap-definition-YA3MSWOX-CWPQuuGG.js → mindmap-definition-YA3MSWOX-DcZP0645.js} +1 -1
  141. package/dist/viewer/{mr-IN-CRQNXWMA-CM5QTzuk.js → mr-IN-CRQNXWMA-CRIolDpf.js} +1 -1
  142. package/dist/viewer/{my-MM-5M5IBNSE-DUgiCj6u.js → my-MM-5M5IBNSE-MwaIgMgQ.js} +1 -1
  143. package/dist/viewer/{nb-NO-T6EIAALU-D8rCk2qi.js → nb-NO-T6EIAALU-C6XQwPOX.js} +1 -1
  144. package/dist/viewer/{nl-NL-IS3SIHDZ-DSR4OK7l.js → nl-NL-IS3SIHDZ-CxSbCT2i.js} +1 -1
  145. package/dist/viewer/{nn-NO-6E72VCQL-1Hi7xlf5.js → nn-NO-6E72VCQL-CbP2Axky.js} +1 -1
  146. package/dist/viewer/{oc-FR-POXYY2M6-T-3jTSUi.js → oc-FR-POXYY2M6-Dn7n39jS.js} +1 -1
  147. package/dist/viewer/{pa-IN-N4M65BXN-xpefY7_A.js → pa-IN-N4M65BXN-DQo8oQqA.js} +1 -1
  148. package/dist/viewer/{packet-AYTQ26CC-BcLryIwT.js → packet-AYTQ26CC-dnn_KeS8.js} +1 -1
  149. package/dist/viewer/{pegDiagram-XKGWAZYB-28MmCQx6.js → pegDiagram-XKGWAZYB-2AcyHVIQ.js} +1 -1
  150. package/dist/viewer/percentages-BXMCSKIN-Ny0Q3EEx.js +1 -0
  151. package/dist/viewer/{pie-WAS4IAKB-DkoovnS2.js → pie-WAS4IAKB-C-V2of2Z.js} +1 -1
  152. package/dist/viewer/{pieDiagram-E7YTZNPT-D9tSKQkI.js → pieDiagram-E7YTZNPT-CNl1kvr4.js} +1 -1
  153. package/dist/viewer/{pl-PL-T2D74RX3-DGg_KuwH.js → pl-PL-T2D74RX3-CHBV_JI8.js} +1 -1
  154. package/dist/viewer/preview.html +4 -4
  155. package/dist/viewer/preview.js +1 -1
  156. package/dist/viewer/{prod-x5m4nnk2.js → prod-GiVGCxPb.js} +9 -9
  157. package/dist/viewer/{pt-BR-5N22H2LF-Ccab0mQU.js → pt-BR-5N22H2LF-DxJcRGlD.js} +1 -1
  158. package/dist/viewer/{pt-PT-UZXXM6DQ-CIMND8O_.js → pt-PT-UZXXM6DQ-U93mdWBO.js} +1 -1
  159. package/dist/viewer/{quadrantDiagram-AXDQQJYC-D8YUh_rr.js → quadrantDiagram-AXDQQJYC-C2yQqGcH.js} +1 -1
  160. package/dist/viewer/{radar-RG4KPBEZ-maaMLwMS.js → radar-RG4KPBEZ-DEQbufWQ.js} +1 -1
  161. package/dist/viewer/{railroad-74A4TZTK-BiB5uT6j.js → railroad-74A4TZTK-nycieANE.js} +1 -1
  162. package/dist/viewer/{railroad-abnf-HS5TGJTU-CilEsgfI.js → railroad-abnf-HS5TGJTU-Q7AD2CxO.js} +1 -1
  163. package/dist/viewer/{railroad-ebnf-LZEXJU2U-CX5aEvR0.js → railroad-ebnf-LZEXJU2U-BvOZBzTF.js} +1 -1
  164. package/dist/viewer/{railroad-peg-WCYAUIDC-BxZrwOzZ.js → railroad-peg-WCYAUIDC-CgyxJCgO.js} +1 -1
  165. package/dist/viewer/{railroadDiagram-O6MQD6OU-C8BzjLMd.js → railroadDiagram-O6MQD6OU-CPqAQg4Z.js} +1 -1
  166. package/dist/viewer/{requirementDiagram-BXWQKSXE-CFUVLnqw.js → requirementDiagram-BXWQKSXE-xC_LnSVv.js} +1 -1
  167. package/dist/viewer/{ro-RO-JPDTUUEW-BS1TF72D.js → ro-RO-JPDTUUEW-mIaEDa0N.js} +1 -1
  168. package/dist/viewer/{route-C680gVZl.js → route-DYaSOkyn.js} +2 -2
  169. package/dist/viewer/{ru-RU-B4JR7IUQ-CHMlU7kb.js → ru-RU-B4JR7IUQ-Bz3n1Nvv.js} +1 -1
  170. package/dist/viewer/{sankeyDiagram-P5KCCOFB-Ctqqk5CX.js → sankeyDiagram-P5KCCOFB-CY0RPWoA.js} +1 -1
  171. package/dist/viewer/{selection-HixnnPur.js → selection-kJ3dxSuU.js} +1 -1
  172. package/dist/viewer/{sequenceDiagram-WJ2MYXX4-BMF7Yr8w.js → sequenceDiagram-WJ2MYXX4-B-pDfaOI.js} +1 -1
  173. package/dist/viewer/{settings-dialog-DCHQA2FU.js → settings-dialog-DJBifcsk.js} +1 -1
  174. package/dist/viewer/{si-LK-N5RQ5JYF-04M_PbX7.js → si-LK-N5RQ5JYF-DK9qNgFK.js} +1 -1
  175. package/dist/viewer/{sk-SK-C5VTKIMK-npVDEClq.js → sk-SK-C5VTKIMK-Dava3Enb.js} +1 -1
  176. package/dist/viewer/{sl-SI-NN7IZMDC-eO4SV9v3.js → sl-SI-NN7IZMDC-DHYFwE-d.js} +1 -1
  177. package/dist/viewer/{split-url-EcmwFhkE.js → split-url-dnlNU15s.js} +1 -1
  178. package/dist/viewer/{stateDiagram-D77RDMKH-BfYCodpx.js → stateDiagram-D77RDMKH-Z94YnGDy.js} +1 -1
  179. package/dist/viewer/stateDiagram-v2-MP3YSRHH-CrVY5liO.js +1 -0
  180. package/dist/viewer/subset-shared.chunk-DieSBWOG.js +1 -0
  181. package/dist/viewer/{subset-worker.chunk-bPvG0d57.js → subset-worker.chunk-B8bh964c.js} +1 -1
  182. package/dist/viewer/{sv-SE-XGPEYMSR-bqQ8_wr-.js → sv-SE-XGPEYMSR-CvDLBZBa.js} +1 -1
  183. package/dist/viewer/{swimlanes-42K2YHIH-dgR9qJGL.js → swimlanes-42K2YHIH-C0TefFPR.js} +1 -1
  184. package/dist/viewer/swimlanesDiagram-VR7AAH4N-UXgVsias.js +8 -0
  185. package/dist/viewer/{ta-IN-2NMHFXQM-B-FnwnkD.js → ta-IN-2NMHFXQM-DDYntxFl.js} +1 -1
  186. package/dist/viewer/{th-TH-HPSO5L25-PdKsfBFn.js → th-TH-HPSO5L25-ZxMqu6gC.js} +1 -1
  187. package/dist/viewer/{timeline-definition-24CTP7MA-BMCYoChw.js → timeline-definition-24CTP7MA-BKjZneFP.js} +1 -1
  188. package/dist/viewer/{tr-TR-DEFEU3FU-B4qIeS8D.js → tr-TR-DEFEU3FU-B2pq5a2N.js} +1 -1
  189. package/dist/viewer/{treeView-Q6P3EWNA-BY1SPiGu.js → treeView-Q6P3EWNA-CzRKPU-u.js} +1 -1
  190. package/dist/viewer/{treemap-WGGIJYW6-C0VMGONw.js → treemap-WGGIJYW6-CJ9mgExM.js} +1 -1
  191. package/dist/viewer/{uk-UA-QMV73CPH-D7drZA64.js → uk-UA-QMV73CPH-DliJo-Ys.js} +1 -1
  192. package/dist/viewer/useArtifactFeed-BwcxmGxv.js +1 -0
  193. package/dist/viewer/useCloudStatus-BGo294ml.js +1 -0
  194. package/dist/viewer/useMedia-D8CjE-j8.js +1 -0
  195. package/dist/viewer/{useOpenInteractionType-DXxloYK-.js → useOpenInteractionType-CKJQyk9S.js} +1 -1
  196. package/dist/viewer/{useTranslation-Pzj8jSZg.js → useTranslation-t8jNxSf7.js} +1 -1
  197. package/dist/viewer/useTypeFavicon-DdgEBY2z.js +1 -0
  198. package/dist/viewer/{vennDiagram-4TSXK5OY-BZvfzbkk.js → vennDiagram-4TSXK5OY-DFKX_VPB.js} +1 -1
  199. package/dist/viewer/verdicts-DTCoDGyi.js +1 -0
  200. package/dist/viewer/{vi-VN-M7AON7JQ-C4JGfMaF.js → vi-VN-M7AON7JQ-B4ooV6-0.js} +1 -1
  201. package/dist/viewer/{view-CEDIINbK.js → view-DAv-p29M.js} +1 -1
  202. package/dist/viewer/{viewport-CFJHn_Y6-EKV3XlAA.js → viewport-CFJHn_Y6-7cOMixnT.js} +1 -1
  203. package/dist/viewer/{wardley-WFR3VGLG-DpyQ2UuG.js → wardley-WFR3VGLG-DUTPfGqO.js} +1 -1
  204. package/dist/viewer/{wardleyDiagram-VM6X3IG4-BQ6o0RYp.js → wardleyDiagram-VM6X3IG4-D-YIXTi3.js} +1 -1
  205. package/dist/viewer/{xychartDiagram-S5SC5T6Z-C7Zmu8u-.js → xychartDiagram-S5SC5T6Z-CrfV8Z2r.js} +2 -2
  206. package/dist/viewer/{zh-CN-LNUGB5OW-HH9iFktL.js → zh-CN-LNUGB5OW-DV5Sf1hZ.js} +1 -1
  207. package/dist/viewer/{zh-HK-E62DVLB3-CQs9vPCC.js → zh-HK-E62DVLB3-DqdoMgey.js} +1 -1
  208. package/dist/viewer/{zh-TW-RAJ6MFWO-BrJH7r4M.js → zh-TW-RAJ6MFWO-Bp2Aj3WE.js} +1 -1
  209. package/dist/viewer-lib/{BottomSheet-CmQ-mlg3.js → BottomSheet-6PyEWu_I.js} +2 -2
  210. package/dist/viewer-lib/{Canvas-zsUI5R_r.js → Canvas-CLHk5G2x.js} +142 -115
  211. package/dist/viewer-lib/{PreviewView-sdm-qrv7.js → PreviewView-Cwd9OwHs.js} +2 -2
  212. package/dist/viewer-lib/{SnapshotDocument-BRrf3bYP.js → SnapshotDocument-LOn7Pshr.js} +35 -35
  213. package/dist/viewer-lib/{VirtualizedEditor-D9Ivycdp-CKmY-oBS.js → VirtualizedEditor-D9Ivycdp-BM9t5-Th.js} +2 -2
  214. package/dist/viewer-lib/{VirtualizedRenderer-C_d95FXi-CRCHpfEc.js → VirtualizedRenderer-C_d95FXi-CB_Lm4Tu.js} +3 -3
  215. package/dist/viewer-lib/{WarningsBadge-CP8suzTb.js → WarningsBadge-DNC7NkUF.js} +1 -1
  216. package/dist/viewer-lib/{abnfDiagram-VCTEODGH-BcqIWXiN.js → abnfDiagram-VCTEODGH-CaS0VFx0.js} +2 -2
  217. package/dist/viewer-lib/{agentLook-JAlLJ_KQ.js → agentLook-BSHloVwx.js} +1 -1
  218. package/dist/viewer-lib/{ar-SA-G6X2FPQ2-C9GRL_5j.js → ar-SA-G6X2FPQ2-QikTuJ6H.js} +1 -1
  219. package/dist/viewer-lib/{architectureDiagram-5GKGNRK7-CdWD82aP.js → architectureDiagram-5GKGNRK7-FUNSgbrA.js} +3 -3
  220. package/dist/viewer-lib/{az-AZ-76LH7QW2-Bzvwk86v.js → az-AZ-76LH7QW2-kkLTB1rg.js} +1 -1
  221. package/dist/viewer-lib/{bg-BG-XCXSNQG7-BnpAqy1u.js → bg-BG-XCXSNQG7-Bg9mtvaJ.js} +1 -1
  222. package/dist/viewer-lib/{blockDiagram-I7D4REHJ-b3mcK6pX.js → blockDiagram-I7D4REHJ-D57ACiLL.js} +5 -5
  223. package/dist/viewer-lib/{bn-BD-2XOGV67Q-D_2DZRzE.js → bn-BD-2XOGV67Q-XBc68o9d.js} +1 -1
  224. package/dist/viewer-lib/{c4Diagram-7LVT6UL2-IPVOeGBM.js → c4Diagram-7LVT6UL2-BWFr8EY8.js} +3 -3
  225. package/dist/viewer-lib/{ca-ES-6MX7JW3Y-B9pr5fXX.js → ca-ES-6MX7JW3Y-boToPDu2.js} +1 -1
  226. package/dist/viewer-lib/{chunk-4HAMMTFA-DRZlxcJK.js → chunk-4HAMMTFA-CkKDgg0R.js} +2 -2
  227. package/dist/viewer-lib/{chunk-EIO257PC-Csle0Z6K.js → chunk-EIO257PC-BhJQeVEB.js} +1 -1
  228. package/dist/viewer-lib/{chunk-GMAD6QVW-Dv9-FWAD.js → chunk-GMAD6QVW-CuiBT4rF.js} +1 -1
  229. package/dist/viewer-lib/{chunk-GVQU2GXP-BgYFpEUK.js → chunk-GVQU2GXP-PiMT9J_e.js} +1 -1
  230. package/dist/viewer-lib/{chunk-IMKFNOWR-CeHdonLi.js → chunk-IMKFNOWR-BsU2ugOL.js} +1 -1
  231. package/dist/viewer-lib/{chunk-L3NEJ4N5-DZiUeBIT.js → chunk-L3NEJ4N5-bhJ_l0rD.js} +3 -3
  232. package/dist/viewer-lib/{chunk-OSK3NFVY-CPK5Cy4R.js → chunk-OSK3NFVY-SejOGw3K.js} +4 -4
  233. package/dist/viewer-lib/{chunk-PWAF6VOD-DHxPdi5T.js → chunk-PWAF6VOD-DW3aSujp.js} +1 -1
  234. package/dist/viewer-lib/{chunk-SHT3W25Y-LOvf3hk7.js → chunk-SHT3W25Y-DrnhXJn1.js} +2 -2
  235. package/dist/viewer-lib/{chunk-SVP7TREG-DCUAISUY.js → chunk-SVP7TREG-DxtGuYE_.js} +1 -1
  236. package/dist/viewer-lib/{chunk-TICWLB2K-ByMAX8gU.js → chunk-TICWLB2K-PwAERtPL.js} +1 -1
  237. package/dist/viewer-lib/{classDiagram-ZZMXUADV-CTNifYSG.js → classDiagram-ZZMXUADV-BjcIz4KM.js} +8 -8
  238. package/dist/viewer-lib/{classDiagram-v2-VYDZK3BY-DPrdiRUa.js → classDiagram-v2-VYDZK3BY-D8Skaixn.js} +8 -8
  239. package/dist/viewer-lib/core.js +3 -3
  240. package/dist/viewer-lib/{cs-CZ-2BRQDIVT-BTChkIYu.js → cs-CZ-2BRQDIVT-ClM_vRAm.js} +1 -1
  241. package/dist/viewer-lib/{cynefinDiagram-5FMLGOSQ-CJqj0WaL.js → cynefinDiagram-5FMLGOSQ-BlUjtF3U.js} +1 -1
  242. package/dist/viewer-lib/{da-DK-5WZEPLOC-t_4lopIQ.js → da-DK-5WZEPLOC-DJwAGxDn.js} +1 -1
  243. package/dist/viewer-lib/{dagre-GXQ25YYZ-C-Tlx0XY.js → dagre-GXQ25YYZ-BTEYeKQY.js} +7 -7
  244. package/dist/viewer-lib/{de-DE-XR44H4JA-1muDYa7q.js → de-DE-XR44H4JA-B_VfQ-2v.js} +1 -1
  245. package/dist/viewer-lib/{diagram-S7CK7UJ4-Dvu3Flg-.js → diagram-S7CK7UJ4-Bq6cvpPE.js} +2 -2
  246. package/dist/viewer-lib/{diagram-UQ7AKVKN-DKdXjDs2.js → diagram-UQ7AKVKN-BFpYj8D9.js} +1 -1
  247. package/dist/viewer-lib/{diagram-VX7I27RA-C1a4YeFj.js → diagram-VX7I27RA-CZJIvtMv.js} +2 -2
  248. package/dist/viewer-lib/{diagram-Z3DM3KII-BkXxEH5E.js → diagram-Z3DM3KII-B009LTl6.js} +1 -1
  249. package/dist/viewer-lib/{dist-BUboBstj.js → dist-0BbZqtqQ.js} +3 -3
  250. package/dist/viewer-lib/{dist-B1PqUp83.js → dist-BOEUR9tt.js} +2 -2
  251. package/dist/viewer-lib/{dist-D-7VBnnE.js → dist-BSHzBH45.js} +4 -4
  252. package/dist/viewer-lib/{dist-Ddn-ZW9x.js → dist-B_jrXFz4.js} +2 -2
  253. package/dist/viewer-lib/{dist-DbanN8W9.js → dist-BdZLaZs9.js} +3 -3
  254. package/dist/viewer-lib/{dist-UXF2UOX-.js → dist-BlUF4IaO.js} +2 -2
  255. package/dist/viewer-lib/{dist-sH8SwUeH.js → dist-C7cs1DYp.js} +3 -3
  256. package/dist/viewer-lib/{dist-DTu9gvb9.js → dist-CA9eEwxZ.js} +3 -3
  257. package/dist/viewer-lib/{dist-BTOt7KE6.js → dist-CKtcXXnp.js} +2 -2
  258. package/dist/viewer-lib/{dist-CKT6VPOt.js → dist-CMb9V6AI.js} +2 -2
  259. package/dist/viewer-lib/{dist-Dd94-nUb.js → dist-CgeC5vzP.js} +3 -3
  260. package/dist/viewer-lib/{dist-CW4BqRiO.js → dist-CwkLFmtg.js} +1 -1
  261. package/dist/viewer-lib/{dist-brZt020-.js → dist-D4ihNzpJ.js} +3 -3
  262. package/dist/viewer-lib/{dist-Ck2QIOBP.js → dist-DOnavGjd.js} +3 -3
  263. package/dist/viewer-lib/{dist-T_M2R-mU.js → dist-DaLGOpZ0.js} +2 -2
  264. package/dist/viewer-lib/{dist-DshrM5NU.js → dist-Df2ZzhMm.js} +3 -3
  265. package/dist/viewer-lib/{dist-B6UGwggQ.js → dist-DsQWJDDp.js} +4 -4
  266. package/dist/viewer-lib/{dist-BIlVb4s5.js → dist-Dw8vWuOF.js} +2 -2
  267. package/dist/viewer-lib/{dist-4d_5T54o.js → dist-DyNR_ARp.js} +1 -1
  268. package/dist/viewer-lib/{dist-DcaboDn3.js → dist-PIGTNSZn.js} +3 -3
  269. package/dist/viewer-lib/{dist-Cjimm-Jl.js → dist-XlhrQdHn.js} +2 -2
  270. package/dist/viewer-lib/{dist-D16sPdym.js → dist-brqPUpgR.js} +3 -3
  271. package/dist/viewer-lib/{dist-C2MyLee5.js → dist-kxkFqjxk.js} +43 -43
  272. package/dist/viewer-lib/{dist-DZUqL8d-.js → dist-y61uVn7g.js} +4 -4
  273. package/dist/viewer-lib/document.js +41 -22
  274. package/dist/viewer-lib/{ebnfDiagram-PWID7BFC-Cm7Ab-sV.js → ebnfDiagram-PWID7BFC-s9Ka95mL.js} +2 -2
  275. package/dist/viewer-lib/{el-GR-BZB4AONW-CE4Sdzuz.js → el-GR-BZB4AONW-BksF2U0i.js} +1 -1
  276. package/dist/viewer-lib/{en-B4ZKOASM-ByJIU_CM.js → en-B4ZKOASM-BHdkkDnU.js} +1 -1
  277. package/dist/viewer-lib/{erDiagram-RLTQ6QDP-Dw2k-b8X.js → erDiagram-RLTQ6QDP-DLEkCbHx.js} +7 -7
  278. package/dist/viewer-lib/{es-ES-U4NZUMDT-CdVsjw7_.js → es-ES-U4NZUMDT-D7frP5H5.js} +1 -1
  279. package/dist/viewer-lib/{eu-ES-A7QVB2H4-C_mFymvA.js → eu-ES-A7QVB2H4-CIitEizR.js} +1 -1
  280. package/dist/viewer-lib/{fa-IR-HGAKTJCU-ByRuU7uQ.js → fa-IR-HGAKTJCU-DG4i9E4t.js} +1 -1
  281. package/dist/viewer-lib/{fi-FI-Z5N7JZ37-DCy5msMW.js → fi-FI-Z5N7JZ37-B0A8Sbor.js} +1 -1
  282. package/dist/viewer-lib/flowDiagram-HODETNUW-CFQD1uO6.js +15 -0
  283. package/dist/viewer-lib/{fr-FR-RHASNOE6-Js8LEXaG.js → fr-FR-RHASNOE6-Cigp9xJY.js} +1 -1
  284. package/dist/viewer-lib/{ganttDiagram-EL5Y4UJY-ojCIdqy5.js → ganttDiagram-EL5Y4UJY-BzcHHdr3.js} +1 -1
  285. package/dist/viewer-lib/{gl-ES-HMX3MZ6V-DXYxWA9n.js → gl-ES-HMX3MZ6V-De1l8aoj.js} +1 -1
  286. package/dist/viewer-lib/{he-IL-6SHJWFNN-DXkUBR8K.js → he-IL-6SHJWFNN-DfaMFN91.js} +1 -1
  287. package/dist/viewer-lib/{hi-IN-IWLTKZ5I-D5U6H5z-.js → hi-IN-IWLTKZ5I-CHP3sOje.js} +1 -1
  288. package/dist/viewer-lib/{hu-HU-A5ZG7DT2-DDa7gVCP.js → hu-HU-A5ZG7DT2-B-Wtga39.js} +1 -1
  289. package/dist/viewer-lib/{i18n-BPoZ83u5.js → i18n-DgnmyJzy.js} +20 -0
  290. package/dist/viewer-lib/{id-ID-SAP4L64H-BIQxeAER.js → id-ID-SAP4L64H-BYVUO2Uk.js} +1 -1
  291. package/dist/viewer-lib/{image-GAAHSSAO-Bi64DG9r.js → image-GAAHSSAO-p6UjpkEQ.js} +1 -1
  292. package/dist/viewer-lib/index.js +605 -600
  293. package/dist/viewer-lib/{infoDiagram-27XIBGKW-BUp2-126.js → infoDiagram-27XIBGKW-Dg3R-2jC.js} +1 -1
  294. package/dist/viewer-lib/{ishikawaDiagram-5VMMS53U-BCijsdRK.js → ishikawaDiagram-5VMMS53U-o8M0zr6b.js} +1 -1
  295. package/dist/viewer-lib/{it-IT-JPQ66NNP-B8zwF05Q.js → it-IT-JPQ66NNP-D_HLXpbm.js} +1 -1
  296. package/dist/viewer-lib/{ja-JP-DBVTYXUO-D8svaAtt.js → ja-JP-DBVTYXUO-CEo26FZs.js} +1 -1
  297. package/dist/viewer-lib/{journeyDiagram-3NMN7TZE-GC8hOs3H.js → journeyDiagram-3NMN7TZE-IKKA2odG.js} +1 -1
  298. package/dist/viewer-lib/{kaa-6HZHGXH3-CUkX7Esz.js → kaa-6HZHGXH3-Clv2CAEn.js} +1 -1
  299. package/dist/viewer-lib/{kab-KAB-ZGHBKWFO-B3wNptDE.js → kab-KAB-ZGHBKWFO-Bm8q76_P.js} +1 -1
  300. package/dist/viewer-lib/{kanban-definition-UXKFOSKX-DgTcKCkc.js → kanban-definition-UXKFOSKX-j_ouX3pt.js} +6 -6
  301. package/dist/viewer-lib/{kk-KZ-P5N5QNE5-BCCrWYvW.js → kk-KZ-P5N5QNE5-BdPH7ns0.js} +1 -1
  302. package/dist/viewer-lib/{km-KH-HSX4SM5Z-BtxxgcVG.js → km-KH-HSX4SM5Z-CYzSP_Wz.js} +1 -1
  303. package/dist/viewer-lib/{ko-KR-MTYHY66A-DWQyZku6.js → ko-KR-MTYHY66A-BvjphoRF.js} +1 -1
  304. package/dist/viewer-lib/{ku-TR-6OUDTVRD-Bvz63KqZ.js → ku-TR-6OUDTVRD-B9bT8-oY.js} +1 -1
  305. package/dist/viewer-lib/{lt-LT-XHIRWOB4-C9hKOOFk.js → lt-LT-XHIRWOB4-n8ThfFZX.js} +1 -1
  306. package/dist/viewer-lib/{lv-LV-5QDEKY6T-CcSv3YIv.js → lv-LV-5QDEKY6T-Dc7Ovfir.js} +1 -1
  307. package/dist/viewer-lib/{mindmap-definition-YA3MSWOX-DkYON3LI.js → mindmap-definition-YA3MSWOX-DRQKmldL.js} +7 -7
  308. package/dist/viewer-lib/{mr-IN-CRQNXWMA-B7Fkafce.js → mr-IN-CRQNXWMA-Xot9_Rfp.js} +1 -1
  309. package/dist/viewer-lib/{my-MM-5M5IBNSE-3sFKtmpR.js → my-MM-5M5IBNSE-DndQX8Jm.js} +1 -1
  310. package/dist/viewer-lib/{nb-NO-T6EIAALU-CBIrmzXA.js → nb-NO-T6EIAALU-C3-O3O3q.js} +1 -1
  311. package/dist/viewer-lib/{nl-NL-IS3SIHDZ-D-7E7BWK.js → nl-NL-IS3SIHDZ-BzlZ2P0b.js} +1 -1
  312. package/dist/viewer-lib/{nn-NO-6E72VCQL-BE0N1SpI.js → nn-NO-6E72VCQL-kYugECen.js} +1 -1
  313. package/dist/viewer-lib/{oc-FR-POXYY2M6-CZdzcnlV.js → oc-FR-POXYY2M6-sDMgcduE.js} +1 -1
  314. package/dist/viewer-lib/{pa-IN-N4M65BXN-Cy5dIrii.js → pa-IN-N4M65BXN-B565I1l2.js} +1 -1
  315. package/dist/viewer-lib/{pegDiagram-XKGWAZYB-_z_9ahsa.js → pegDiagram-XKGWAZYB-D_yqrOMS.js} +2 -2
  316. package/dist/viewer-lib/percentages-BXMCSKIN-BL1yYGJJ.js +1 -0
  317. package/dist/viewer-lib/{pieDiagram-E7YTZNPT-ozmxheeh.js → pieDiagram-E7YTZNPT-BZxECmkG.js} +2 -2
  318. package/dist/viewer-lib/{pl-PL-T2D74RX3-45L7cZ3M.js → pl-PL-T2D74RX3-CbdkYzou.js} +1 -1
  319. package/dist/viewer-lib/{plugin-_bGVeqI0-BSPgvD7m.js → plugin-_bGVeqI0-DA4IV5I1.js} +1 -1
  320. package/dist/viewer-lib/{prod-gq5WhEDa.js → prod-llK5wpAC.js} +61 -61
  321. package/dist/viewer-lib/{pt-BR-5N22H2LF-BLmx2uhv.js → pt-BR-5N22H2LF-DQv1ybQ8.js} +1 -1
  322. package/dist/viewer-lib/{pt-PT-UZXXM6DQ-lyzgNGbx.js → pt-PT-UZXXM6DQ-CP3V_8X2.js} +1 -1
  323. package/dist/viewer-lib/{quadrantDiagram-AXDQQJYC-O5HVk-fl.js → quadrantDiagram-AXDQQJYC-BfzBhDDA.js} +1 -1
  324. package/dist/viewer-lib/{railroadDiagram-O6MQD6OU-CrCFPBb1.js → railroadDiagram-O6MQD6OU-DUEpFqjB.js} +2 -2
  325. package/dist/viewer-lib/{requirementDiagram-BXWQKSXE-itQjHrCZ.js → requirementDiagram-BXWQKSXE-Drgz4NCl.js} +7 -7
  326. package/dist/viewer-lib/{ro-RO-JPDTUUEW-CAG1RMKi.js → ro-RO-JPDTUUEW-C4vtGNDF.js} +1 -1
  327. package/dist/viewer-lib/{ru-RU-B4JR7IUQ-DcRA0eFi.js → ru-RU-B4JR7IUQ-DB_JA5cm.js} +1 -1
  328. package/dist/viewer-lib/{sequenceDiagram-WJ2MYXX4-DlkJYYc-.js → sequenceDiagram-WJ2MYXX4-BKsJiG6S.js} +1 -1
  329. package/dist/viewer-lib/{si-LK-N5RQ5JYF-CvTHO8RZ.js → si-LK-N5RQ5JYF-BCKr33di.js} +1 -1
  330. package/dist/viewer-lib/{sk-SK-C5VTKIMK-DYe4CrYi.js → sk-SK-C5VTKIMK-Dfag8d_3.js} +1 -1
  331. package/dist/viewer-lib/{sl-SI-NN7IZMDC-ChXQR2a1.js → sl-SI-NN7IZMDC-VbBSUOUJ.js} +1 -1
  332. package/dist/viewer-lib/{stateDiagram-D77RDMKH-DOyMGBzi.js → stateDiagram-D77RDMKH-Dtdw1Ipn.js} +9 -9
  333. package/dist/viewer-lib/{stateDiagram-v2-MP3YSRHH-Evkc2VhV.js → stateDiagram-v2-MP3YSRHH-B1wQoHXi.js} +8 -8
  334. package/dist/viewer-lib/{stylex-ADNt4DYX.css → stylex-CibYRSc3.css} +4 -4
  335. package/dist/viewer-lib/subset-shared.chunk-BmoZNBrB.js +2 -0
  336. package/dist/viewer-lib/{subset-worker.chunk-CqRZNp0D.js → subset-worker.chunk-BaG_gcml.js} +2 -2
  337. package/dist/viewer-lib/{sv-SE-XGPEYMSR-Cqpzdflw.js → sv-SE-XGPEYMSR-uGek8WLx.js} +1 -1
  338. package/dist/viewer-lib/{swimlanes-42K2YHIH-Clk2tUDm.js → swimlanes-42K2YHIH-CJp4Ujis.js} +7 -7
  339. package/dist/viewer-lib/{swimlanesDiagram-VR7AAH4N-E--6xQOc.js → swimlanesDiagram-VR7AAH4N-B8nsdv6K.js} +8 -8
  340. package/dist/viewer-lib/{ta-IN-2NMHFXQM-BdkwgU_E.js → ta-IN-2NMHFXQM-CD89DKSY.js} +1 -1
  341. package/dist/viewer-lib/{th-TH-HPSO5L25-8E8IRdKX.js → th-TH-HPSO5L25-B8ajl7oq.js} +1 -1
  342. package/dist/viewer-lib/{timeline-definition-24CTP7MA-oJk6CQ62.js → timeline-definition-24CTP7MA-r6rQsm5j.js} +2 -2
  343. package/dist/viewer-lib/{tr-TR-DEFEU3FU-CwVRRypN.js → tr-TR-DEFEU3FU-B1uetpiQ.js} +1 -1
  344. package/dist/viewer-lib/types/src/shared/agent-status.d.ts +20 -0
  345. package/dist/viewer-lib/types/src/shared/types.d.ts +4 -0
  346. package/dist/viewer-lib/types/src/viewer/components/Canvas.d.ts +4 -1
  347. package/dist/viewer-lib/types/src/viewer/document/useCloudRefBoard.d.ts +1 -0
  348. package/dist/viewer-lib/types/src/viewer/hooks/useCanvasData.d.ts +2 -1
  349. package/dist/viewer-lib/types/src/viewer/hooks/useCursorParked.d.ts +1 -0
  350. package/dist/viewer-lib/types/src/viewer/layouts/ArtboardView.d.ts +3 -1
  351. package/dist/viewer-lib/types/src/viewer/layouts/PhoneArtboard.d.ts +3 -1
  352. package/dist/viewer-lib/types/src/viewer/lib/cursorPark.d.ts +13 -0
  353. package/dist/viewer-lib/types/src/viewer/lib/feed.d.ts +2 -0
  354. package/dist/viewer-lib/{uk-UA-QMV73CPH-k8lrIltz.js → uk-UA-QMV73CPH-B7A02qBP.js} +1 -1
  355. package/dist/viewer-lib/{vennDiagram-4TSXK5OY-B831nqfc.js → vennDiagram-4TSXK5OY-h8monHL9.js} +1 -1
  356. package/dist/viewer-lib/{vi-VN-M7AON7JQ-BOSWpRVj.js → vi-VN-M7AON7JQ-DS76pp2k.js} +1 -1
  357. package/dist/viewer-lib/{viewport-CFJHn_Y6-LaFiTbTr.js → viewport-CFJHn_Y6-Bxae2L9X.js} +1 -1
  358. package/dist/viewer-lib/{wardleyDiagram-VM6X3IG4-D8hama2v.js → wardleyDiagram-VM6X3IG4-BRtvuiN8.js} +1 -1
  359. package/dist/viewer-lib/{xychartDiagram-S5SC5T6Z-BgF6DuGP.js → xychartDiagram-S5SC5T6Z-CpFKUIWd.js} +4 -4
  360. package/dist/viewer-lib/{zh-CN-LNUGB5OW-DC5QUJ1S.js → zh-CN-LNUGB5OW-C-xg90Aa.js} +1 -1
  361. package/dist/viewer-lib/{zh-HK-E62DVLB3-DpCawjf0.js → zh-HK-E62DVLB3-BJmaecPz.js} +1 -1
  362. package/dist/viewer-lib/{zh-TW-RAJ6MFWO-DtYt9wQa.js → zh-TW-RAJ6MFWO-C0oCsL-1.js} +1 -1
  363. package/package.json +1 -1
  364. package/dist/viewer/ArtboardLayout-Bn13zoQ0.js +0 -12
  365. package/dist/viewer/ArtifactList-xPH03ekM.js +0 -2
  366. package/dist/viewer/DocumentLayout-BTPD7t8z.js +0 -2
  367. package/dist/viewer/DocumentPage-AxyoH_UG.js +0 -4
  368. package/dist/viewer/PreviewLayout-BYHbU8pA.js +0 -2
  369. package/dist/viewer/SettingsDialog-DuGcfRD6.js +0 -1
  370. package/dist/viewer/SnapshotDocument-BdixBnqr.js +0 -1
  371. package/dist/viewer/SplitShell-DbDyQWmx.js +0 -1
  372. package/dist/viewer/TooltipPopup-BkLxWk5U.js +0 -1
  373. package/dist/viewer/VirtualizedEditor-D9Ivycdp-D_m5rZu5.js +0 -1
  374. package/dist/viewer/agentLook-XVxxsZ0G.js +0 -1
  375. package/dist/viewer/channel-CU8wzXfN.js +0 -1
  376. package/dist/viewer/classDiagram-ZZMXUADV-Bjg3chE2.js +0 -1
  377. package/dist/viewer/classDiagram-v2-VYDZK3BY-Bjg3chE2.js +0 -1
  378. package/dist/viewer/dist-BVso9ZnX.js +0 -23
  379. package/dist/viewer/dist-C40aE18e.js +0 -6
  380. package/dist/viewer/dist-CRGDTKo5.js +0 -1
  381. package/dist/viewer/flowDiagram-HODETNUW-yoSwUZRV.js +0 -1
  382. package/dist/viewer/ganttDiagram-EL5Y4UJY-CXpcZBGV.js +0 -292
  383. package/dist/viewer/local-split-host-81-CNYzg.js +0 -1
  384. package/dist/viewer/motion-DuWNLoOD.js +0 -1
  385. package/dist/viewer/percentages-BXMCSKIN-CVjj6sZf.js +0 -1
  386. package/dist/viewer/stateDiagram-v2-MP3YSRHH-fUvYDEUV.js +0 -1
  387. package/dist/viewer/subset-shared.chunk-DhgHzOaH.js +0 -1
  388. package/dist/viewer/swimlanesDiagram-VR7AAH4N-DO1nuuiZ.js +0 -8
  389. package/dist/viewer/useArtifactFeed-xA-zirbh.js +0 -1
  390. package/dist/viewer/useArtifactSocket-OyJ8LQZj.js +0 -1
  391. package/dist/viewer/useCloudStatus-BmjNxiD8.js +0 -1
  392. package/dist/viewer/useTypeFavicon-CdSjEdzV.js +0 -1
  393. package/dist/viewer/verdicts-BWM_HBw0.js +0 -1
  394. package/dist/viewer-lib/flowDiagram-HODETNUW-CBIDl6cb.js +0 -15
  395. package/dist/viewer-lib/percentages-BXMCSKIN-BuYxllSX.js +0 -1
  396. package/dist/viewer-lib/subset-shared.chunk-Dr3q7Pia.js +0 -2
package/dist/server.cjs CHANGED
@@ -8794,12 +8794,12 @@ var require_websocket_server = __commonJS({
8794
8794
  // src/server/main.ts
8795
8795
  var import_node_child_process5 = require("node:child_process");
8796
8796
  var import_node_crypto13 = __toESM(require("node:crypto"), 1);
8797
- var import_node_fs41 = __toESM(require("node:fs"), 1);
8797
+ var import_node_fs42 = __toESM(require("node:fs"), 1);
8798
8798
  var import_node_os2 = __toESM(require("node:os"), 1);
8799
- var import_node_path36 = __toESM(require("node:path"), 1);
8799
+ var import_node_path37 = __toESM(require("node:path"), 1);
8800
8800
 
8801
8801
  // package.json
8802
- var version = "1.60.0";
8802
+ var version = "1.61.0";
8803
8803
 
8804
8804
  // src/server/browser-focus.ts
8805
8805
  var import_node_child_process = require("node:child_process");
@@ -9491,9 +9491,9 @@ function clearCredentials(file) {
9491
9491
  }
9492
9492
 
9493
9493
  // src/server/hub.ts
9494
- var import_node_fs38 = __toESM(require("node:fs"), 1);
9494
+ var import_node_fs39 = __toESM(require("node:fs"), 1);
9495
9495
  var import_node_http2 = __toESM(require("node:http"), 1);
9496
- var import_node_path34 = __toESM(require("node:path"), 1);
9496
+ var import_node_path35 = __toESM(require("node:path"), 1);
9497
9497
 
9498
9498
  // src/server/access.ts
9499
9499
  var LOOPBACK = /* @__PURE__ */ new Set(["localhost", "::1", "[::1]"]);
@@ -9520,9 +9520,9 @@ var originAllowed = (policy, origin, { cloud = false } = {}) => origin === void
9520
9520
  var navigationAllowed = (secFetchSite) => secFetchSite === void 0 || secFetchSite === "none" || secFetchSite === "same-origin";
9521
9521
 
9522
9522
  // src/server/app.ts
9523
- var import_node_fs35 = __toESM(require("node:fs"), 1);
9523
+ var import_node_fs36 = __toESM(require("node:fs"), 1);
9524
9524
  var import_node_http = __toESM(require("node:http"), 1);
9525
- var import_node_path31 = __toESM(require("node:path"), 1);
9525
+ var import_node_path32 = __toESM(require("node:path"), 1);
9526
9526
 
9527
9527
  // src/shared/cloud.ts
9528
9528
  var MAX_ARTIFACT_BYTES = 20 * 1024 * 1024;
@@ -9868,6 +9868,8 @@ function watchArtifacts(ctx) {
9868
9868
  }
9869
9869
  for (const [key2, { ref, files: changed }] of byArtifact) {
9870
9870
  const dir = resolveArtifactDir(root, ref.type, ref.id);
9871
+ if (ref.type === "artboard" && (changed.some((file) => file !== "comments.json") || changed.length === 0))
9872
+ documents.artboardChanged(ref.id);
9871
9873
  if (!dir) {
9872
9874
  signatures.delete(key2);
9873
9875
  ctx.autoPublisher?.removed(key2);
@@ -9912,9 +9914,9 @@ function watchArtifacts(ctx) {
9912
9914
  var PAGE_CSP = "sandbox allow-scripts allow-modals allow-forms allow-popups allow-downloads";
9913
9915
  var DOCUMENT_ASSET_CSP = "sandbox; default-src 'none'";
9914
9916
  var ISOLATED_BOARD_CSP = "worker-src 'none'";
9915
- function contentCsp(type, path37, ownOrigin) {
9917
+ function contentCsp(type, path38, ownOrigin) {
9916
9918
  if (type === "html") return PAGE_CSP;
9917
- if (type === "document") return path37.endsWith(".html") ? PAGE_CSP : DOCUMENT_ASSET_CSP;
9919
+ if (type === "document") return path38.endsWith(".html") ? PAGE_CSP : DOCUMENT_ASSET_CSP;
9918
9920
  return ownOrigin ? ISOLATED_BOARD_CSP : "sandbox allow-scripts";
9919
9921
  }
9920
9922
 
@@ -9942,8 +9944,8 @@ function routeBoardRequest(req, pathname) {
9942
9944
  }
9943
9945
 
9944
9946
  // src/server/context.ts
9945
- var import_node_fs31 = __toESM(require("node:fs"), 1);
9946
- var import_node_path27 = __toESM(require("node:path"), 1);
9947
+ var import_node_fs32 = __toESM(require("node:fs"), 1);
9948
+ var import_node_path28 = __toESM(require("node:path"), 1);
9947
9949
 
9948
9950
  // src/server/agent-review.ts
9949
9951
  var import_node_crypto5 = __toESM(require("node:crypto"), 1);
@@ -10477,6 +10479,15 @@ var requiredReviewFields = {
10477
10479
  groups: ["id", "kind", "verdict", "choice"],
10478
10480
  rounds: ["id", "state"]
10479
10481
  };
10482
+ var reviewSectionsFor = (artifact) => artifact.startsWith("document/") ? ["threads", "asks"] : ["threads", "groups", "rounds"];
10483
+ function validateReviewBundle(input, artifact) {
10484
+ if (input.section) return "Choose section or sections, not both.";
10485
+ if (!input.sections.length || new Set(input.sections).size !== input.sections.length || input.sections.some((section) => !reviewSectionsFor(artifact).includes(section)))
10486
+ return "Choose distinct review sections supported by this artifact.";
10487
+ if (input.fields || input.cursor || input.snapshot || input.thread || input.filters && Object.values(input.filters).some((value) => value !== void 0))
10488
+ return "Fields, filters, thread, cursor and snapshot require a single --section. Follow each collection continuation separately.";
10489
+ return null;
10490
+ }
10480
10491
  function validateReviewQuery(input) {
10481
10492
  const { section, filters: filters2 } = input;
10482
10493
  if (!section && (input.detail || input.cursor || input.fields || filters2 && Object.values(filters2).some(Boolean)))
@@ -10805,9 +10816,133 @@ function createAgentReview(stateDir, options2 = {}) {
10805
10816
  };
10806
10817
  }
10807
10818
 
10819
+ // src/server/agent-status.ts
10820
+ var import_node_fs9 = __toESM(require("node:fs"), 1);
10821
+ var import_node_path8 = __toESM(require("node:path"), 1);
10822
+
10823
+ // src/shared/agent-status.ts
10824
+ var AGENT_HOST_NAMES = {
10825
+ claude: "Claude Code",
10826
+ codex: "Codex"
10827
+ };
10828
+
10829
+ // src/server/agent-status.ts
10830
+ var ACTIVE_TTL_MS = 30 * 6e4;
10831
+ var IDLE_TTL_MS = 8 * 60 * 6e4;
10832
+ var ARTIFACT_TYPES2 = /* @__PURE__ */ new Set(["artboard", "document", "html"]);
10833
+ var ARTIFACT_ID = /^[a-z0-9][a-z0-9-]*$/;
10834
+ var USER_WAIT_TOOLS = /* @__PURE__ */ new Set(["AskUserQuestion", "ExitPlanMode"]);
10835
+ var TRANSITIONS = {
10836
+ UserPromptSubmit: { state: "thinking", clearArtifacts: true, endTurn: true },
10837
+ PreToolUse: { state: "running" },
10838
+ PostToolUse: { state: "thinking", clearArtifacts: true },
10839
+ PostToolUseFailure: { state: "thinking", clearArtifacts: true },
10840
+ PermissionRequest: { state: "needs-approval" },
10841
+ PermissionDenied: { state: "thinking", clearArtifacts: true },
10842
+ Stop: { state: "your-turn", clearArtifacts: true, endTurn: true },
10843
+ Interrupt: { state: "your-turn", clearArtifacts: true, endTurn: true },
10844
+ SessionEnd: "end"
10845
+ };
10846
+ var HUB_TEMP_FILE = /\.\d+\.tmp$/;
10847
+ var HUB_WRITTEN = /* @__PURE__ */ new Set(["doc.xml", "comments.json"]);
10848
+ var agentWrittenFiles = (files) => files.filter((file) => !HUB_WRITTEN.has(file.replace(HUB_TEMP_FILE, "")));
10849
+ function realpathOr(dir) {
10850
+ try {
10851
+ return import_node_fs9.default.realpathSync(dir);
10852
+ } catch {
10853
+ return import_node_path8.default.resolve(dir);
10854
+ }
10855
+ }
10856
+ function realpathOfNew(file) {
10857
+ let dir = import_node_path8.default.resolve(file);
10858
+ const rest = [];
10859
+ while (dir !== import_node_path8.default.dirname(dir)) {
10860
+ try {
10861
+ return import_node_path8.default.join(import_node_fs9.default.realpathSync(dir), ...rest);
10862
+ } catch {
10863
+ rest.unshift(import_node_path8.default.basename(dir));
10864
+ dir = import_node_path8.default.dirname(dir);
10865
+ }
10866
+ }
10867
+ return import_node_path8.default.resolve(file);
10868
+ }
10869
+ function createAgentStatus(root) {
10870
+ const bases = [.../* @__PURE__ */ new Set([import_node_path8.default.resolve(root), realpathOr(root)])];
10871
+ const entries2 = /* @__PURE__ */ new Map();
10872
+ const keyOf = (file) => {
10873
+ if (!import_node_path8.default.isAbsolute(file)) return null;
10874
+ const candidates = [.../* @__PURE__ */ new Set([import_node_path8.default.resolve(file), realpathOfNew(file)])];
10875
+ for (const base of bases)
10876
+ for (const candidate of candidates) {
10877
+ const parts = import_node_path8.default.relative(base, candidate).split(import_node_path8.default.sep);
10878
+ if (parts.length < 3 || parts[0] === "..") continue;
10879
+ const [type, id2] = parts;
10880
+ if (ARTIFACT_TYPES2.has(type) && ARTIFACT_ID.test(id2)) return `${type}/${id2}`;
10881
+ }
10882
+ return null;
10883
+ };
10884
+ const add2 = (list2, keys2) => [.../* @__PURE__ */ new Set([...list2, ...keys2])];
10885
+ return {
10886
+ apply(event) {
10887
+ const transition = TRANSITIONS[event.event];
10888
+ if (!transition) return false;
10889
+ const id2 = `${event.host}:${event.session}`;
10890
+ const entry = entries2.get(id2);
10891
+ if (entry && event.at < entry.lastAt) return false;
10892
+ if (transition === "end") return entries2.delete(id2);
10893
+ if (event.event === "PreToolUse" && entry?.session.state === "needs-approval") {
10894
+ entry.lastAt = event.at;
10895
+ return false;
10896
+ }
10897
+ const keys2 = (event.paths ?? []).flatMap((file) => keyOf(file) ?? []);
10898
+ const previous = entry?.session;
10899
+ const turnArtifacts = transition.endTurn ? [] : previous?.turnArtifacts ?? [];
10900
+ const artifacts = transition.clearArtifacts ? [] : previous?.artifacts ?? [];
10901
+ const waitsOnUser = event.event === "PreToolUse" && USER_WAIT_TOOLS.has(event.tool ?? "");
10902
+ const session = {
10903
+ id: event.session,
10904
+ host: event.host,
10905
+ agent: AGENT_HOST_NAMES[event.host],
10906
+ state: waitsOnUser ? "needs-approval" : transition.state,
10907
+ since: previous?.state === transition.state && !waitsOnUser ? previous.since : event.at,
10908
+ artifacts: add2(artifacts, keys2),
10909
+ turnArtifacts: add2(turnArtifacts, keys2)
10910
+ };
10911
+ entries2.set(id2, { session, lastAt: event.at });
10912
+ return true;
10913
+ },
10914
+ touched(key2) {
10915
+ let changed = false;
10916
+ for (const entry of entries2.values()) {
10917
+ const { session } = entry;
10918
+ if (session.state !== "running" || session.artifacts.includes(key2)) continue;
10919
+ entry.session = {
10920
+ ...session,
10921
+ artifacts: add2(session.artifacts, [key2]),
10922
+ turnArtifacts: add2(session.turnArtifacts, [key2])
10923
+ };
10924
+ changed = true;
10925
+ }
10926
+ return changed;
10927
+ },
10928
+ expire(now) {
10929
+ let changed = false;
10930
+ for (const [id2, entry] of entries2) {
10931
+ const waiting = entry.session.state === "your-turn" || entry.session.state === "needs-approval";
10932
+ const ttl = waiting ? IDLE_TTL_MS : ACTIVE_TTL_MS;
10933
+ if (now - entry.lastAt >= ttl) changed = entries2.delete(id2) || changed;
10934
+ }
10935
+ return changed;
10936
+ },
10937
+ sessions() {
10938
+ return [...entries2.values()].map((entry) => entry.session);
10939
+ }
10940
+ };
10941
+ }
10942
+
10808
10943
  // src/server/auto-publish.ts
10809
10944
  var import_node_crypto6 = __toESM(require("node:crypto"), 1);
10810
- var import_node_fs9 = __toESM(require("node:fs"), 1);
10945
+ var import_node_fs10 = __toESM(require("node:fs"), 1);
10811
10946
  var IDLE_MS = 5 * 60 * 1e3;
10812
10947
  var MAX_WAIT_MS = 15 * 60 * 1e3;
10813
10948
  var SIGNED_OUT_MESSAGE = "auto-publish paused: the Ryugi Cloud sign-in expired";
@@ -10820,7 +10955,7 @@ function isNotice(value) {
10820
10955
  function readAutoPublishState(file) {
10821
10956
  let raw = {};
10822
10957
  try {
10823
- const parsed = JSON.parse(import_node_fs9.default.readFileSync(file, "utf8"));
10958
+ const parsed = JSON.parse(import_node_fs10.default.readFileSync(file, "utf8"));
10824
10959
  if (typeof parsed === "object" && parsed !== null) raw = parsed;
10825
10960
  } catch {
10826
10961
  }
@@ -11025,8 +11160,8 @@ function unreferencedChoiceWarnings(slug, backlinks, canvas, hasDocuments) {
11025
11160
 
11026
11161
  // src/server/board-comments.ts
11027
11162
  var import_node_crypto9 = __toESM(require("node:crypto"), 1);
11028
- var import_node_fs14 = __toESM(require("node:fs"), 1);
11029
- var import_node_path11 = __toESM(require("node:path"), 1);
11163
+ var import_node_fs15 = __toESM(require("node:fs"), 1);
11164
+ var import_node_path12 = __toESM(require("node:path"), 1);
11030
11165
 
11031
11166
  // src/shared/board-comments.ts
11032
11167
  var isChoiceRecord = (thread) => thread.anchor.choice !== void 0 || thread.anchor.submit !== void 0;
@@ -11209,8 +11344,8 @@ function groupVerdict(threads2, group, stale) {
11209
11344
  }
11210
11345
 
11211
11346
  // src/server/board-choices.ts
11212
- var import_node_fs10 = __toESM(require("node:fs"), 1);
11213
- var import_node_path8 = __toESM(require("node:path"), 1);
11347
+ var import_node_fs11 = __toESM(require("node:fs"), 1);
11348
+ var import_node_path9 = __toESM(require("node:path"), 1);
11214
11349
 
11215
11350
  // src/shared/rounds.ts
11216
11351
  function pageTitles(canvas, layout, page) {
@@ -11257,7 +11392,7 @@ var roundOfGroup = (rounds, group) => rounds.find((round) => round.groups.includ
11257
11392
  // src/server/board-choices.ts
11258
11393
  function choiceContext(dir) {
11259
11394
  try {
11260
- const canvas = JSON.parse(import_node_fs10.default.readFileSync(import_node_path8.default.join(dir, "canvas.json"), "utf8"));
11395
+ const canvas = JSON.parse(import_node_fs11.default.readFileSync(import_node_path9.default.join(dir, "canvas.json"), "utf8"));
11261
11396
  if (!Array.isArray(canvas.pages) || typeof canvas.boards !== "object" || !canvas.boards)
11262
11397
  return { canvas: null, rounds: [] };
11263
11398
  return { canvas, rounds: choiceRounds(canvas, computeLayout(canvas)) };
@@ -11355,12 +11490,12 @@ function agentSubmitAnchor(context2, id2, submit) {
11355
11490
  }
11356
11491
 
11357
11492
  // src/server/comment-cursors.ts
11358
- var import_node_fs11 = __toESM(require("node:fs"), 1);
11359
- var import_node_path9 = __toESM(require("node:path"), 1);
11360
- var cursorsFile = (stateDir, id2, type = "document") => import_node_path9.default.join(stateDir, type, id2, "comment-cursors.json");
11493
+ var import_node_fs12 = __toESM(require("node:fs"), 1);
11494
+ var import_node_path10 = __toESM(require("node:path"), 1);
11495
+ var cursorsFile = (stateDir, id2, type = "document") => import_node_path10.default.join(stateDir, type, id2, "comment-cursors.json");
11361
11496
  function read(file) {
11362
11497
  try {
11363
- const value = JSON.parse(import_node_fs11.default.readFileSync(file, "utf8"));
11498
+ const value = JSON.parse(import_node_fs12.default.readFileSync(file, "utf8"));
11364
11499
  if (typeof value !== "object" || value === null || Array.isArray(value)) return {};
11365
11500
  return Object.fromEntries(
11366
11501
  Object.entries(value).filter(
@@ -11384,7 +11519,7 @@ function createCommentCursors(stateDir, type = "document") {
11384
11519
  }
11385
11520
 
11386
11521
  // src/server/document-comments.ts
11387
- var import_node_fs12 = __toESM(require("node:fs"), 1);
11522
+ var import_node_fs13 = __toESM(require("node:fs"), 1);
11388
11523
 
11389
11524
  // ../../node_modules/.pnpm/nanoid@5.1.16/node_modules/nanoid/index.js
11390
11525
  var import_node_crypto8 = require("node:crypto");
@@ -11493,12 +11628,12 @@ function createStore(file, rules, names = noNames, now = () => (/* @__PURE__ */
11493
11628
  let loaded = false;
11494
11629
  const write = () => {
11495
11630
  writeJsonAtomic(file, current);
11496
- lastSeen = import_node_fs12.default.readFileSync(file, "utf8");
11631
+ lastSeen = import_node_fs13.default.readFileSync(file, "utf8");
11497
11632
  };
11498
11633
  const sync = () => {
11499
11634
  let text4;
11500
11635
  try {
11501
- text4 = import_node_fs12.default.readFileSync(file, "utf8");
11636
+ text4 = import_node_fs13.default.readFileSync(file, "utf8");
11502
11637
  } catch {
11503
11638
  return false;
11504
11639
  }
@@ -11542,13 +11677,13 @@ function createStore(file, rules, names = noNames, now = () => (/* @__PURE__ */
11542
11677
  }
11543
11678
 
11544
11679
  // src/server/listening.ts
11545
- var import_node_fs13 = __toESM(require("node:fs"), 1);
11546
- var import_node_path10 = __toESM(require("node:path"), 1);
11680
+ var import_node_fs14 = __toESM(require("node:fs"), 1);
11681
+ var import_node_path11 = __toESM(require("node:path"), 1);
11547
11682
  var HOSTS = ["claude", "codex"];
11548
11683
  var FRESH_MS = 1e4;
11549
11684
  function readSubscription(file) {
11550
11685
  try {
11551
- const value = JSON.parse(import_node_fs13.default.readFileSync(file, "utf8"));
11686
+ const value = JSON.parse(import_node_fs14.default.readFileSync(file, "utf8"));
11552
11687
  return Array.isArray(value.artifacts) ? value.artifacts.filter((a5) => typeof a5 === "string") : [];
11553
11688
  } catch {
11554
11689
  return [];
@@ -11556,7 +11691,7 @@ function readSubscription(file) {
11556
11691
  }
11557
11692
  function beatAt(file) {
11558
11693
  try {
11559
- const stamp3 = Number(import_node_fs13.default.readFileSync(file, "utf8"));
11694
+ const stamp3 = Number(import_node_fs14.default.readFileSync(file, "utf8"));
11560
11695
  return Number.isFinite(stamp3) ? stamp3 : null;
11561
11696
  } catch {
11562
11697
  return null;
@@ -11564,18 +11699,18 @@ function beatAt(file) {
11564
11699
  }
11565
11700
  function listeningOn(stateDir, artifact, now = Date.now()) {
11566
11701
  for (const host of HOSTS) {
11567
- const dir = import_node_path10.default.join(stateDir, `${host}-comment-watch`);
11702
+ const dir = import_node_path11.default.join(stateDir, `${host}-comment-watch`);
11568
11703
  let names;
11569
11704
  try {
11570
- names = import_node_fs13.default.readdirSync(dir);
11705
+ names = import_node_fs14.default.readdirSync(dir);
11571
11706
  } catch {
11572
11707
  continue;
11573
11708
  }
11574
11709
  for (const name of names) {
11575
11710
  if (!name.endsWith(".json")) continue;
11576
- const artifacts = readSubscription(import_node_path10.default.join(dir, name));
11711
+ const artifacts = readSubscription(import_node_path11.default.join(dir, name));
11577
11712
  if (!artifacts.includes("*") && !artifacts.includes(artifact)) continue;
11578
- const beat = beatAt(import_node_path10.default.join(dir, name.replace(/\.json$/, ".alive")));
11713
+ const beat = beatAt(import_node_path11.default.join(dir, name.replace(/\.json$/, ".alive")));
11579
11714
  if (beat !== null && now - beat < FRESH_MS) return true;
11580
11715
  }
11581
11716
  }
@@ -11624,7 +11759,7 @@ function asBoardAgentOp(value) {
11624
11759
  }
11625
11760
  function readCanvasJson(dir) {
11626
11761
  try {
11627
- return JSON.parse(import_node_fs14.default.readFileSync(import_node_path11.default.join(dir, "canvas.json"), "utf8"));
11762
+ return JSON.parse(import_node_fs15.default.readFileSync(import_node_path12.default.join(dir, "canvas.json"), "utf8"));
11628
11763
  } catch {
11629
11764
  return {};
11630
11765
  }
@@ -11683,11 +11818,11 @@ function fileHash(dir, relative) {
11683
11818
  const file = resolveBoardFile(dir, relative);
11684
11819
  if (!file) return null;
11685
11820
  try {
11686
- const stat = import_node_fs14.default.statSync(file);
11821
+ const stat = import_node_fs15.default.statSync(file);
11687
11822
  const stamp3 = `${stat.size}:${stat.mtimeMs}`;
11688
11823
  const cached = hashCache.get(file);
11689
11824
  if (cached?.stamp === stamp3) return cached.hash;
11690
- const hash2 = import_node_crypto9.default.createHash("sha1").update(import_node_fs14.default.readFileSync(file)).digest("hex").slice(0, 12);
11825
+ const hash2 = import_node_crypto9.default.createHash("sha1").update(import_node_fs15.default.readFileSync(file)).digest("hex").slice(0, 12);
11691
11826
  hashCache.set(file, { stamp: stamp3, hash: hash2 });
11692
11827
  return hash2;
11693
11828
  } catch {
@@ -11730,11 +11865,11 @@ function createBoardCommentRegistry(options2) {
11730
11865
  const lastListening = /* @__PURE__ */ new Map();
11731
11866
  const listening = (id2) => listeningOn(options2.stateDir, `artboard/${id2}`);
11732
11867
  const cursors = createCommentCursors(options2.stateDir, "artboard");
11733
- const dirOf = (id2) => import_node_path11.default.join(options2.root, "artboard", id2);
11868
+ const dirOf = (id2) => import_node_path12.default.join(options2.root, "artboard", id2);
11734
11869
  const store = (id2) => {
11735
11870
  let found = stores.get(id2);
11736
11871
  if (!found) {
11737
- found = createStore(import_node_path11.default.join(dirOf(id2), "comments.json"), boardRules, options2.names);
11872
+ found = createStore(import_node_path12.default.join(dirOf(id2), "comments.json"), boardRules, options2.names);
11738
11873
  stores.set(id2, found);
11739
11874
  }
11740
11875
  return found;
@@ -11777,12 +11912,12 @@ function createBoardCommentRegistry(options2) {
11777
11912
  hashes.delete(id2);
11778
11913
  return currentHashes(id2);
11779
11914
  };
11780
- const roundsFile = (id2) => import_node_path11.default.join(options2.stateDir, "artboard", id2, "rounds.json");
11915
+ const roundsFile = (id2) => import_node_path12.default.join(options2.stateDir, "artboard", id2, "rounds.json");
11781
11916
  const writeRounds = (id2) => {
11782
11917
  const context2 = choiceContext(dirOf(id2));
11783
11918
  if (!context2.canvas) return;
11784
11919
  const rounds = roundViews(context2, store(id2).current().threads);
11785
- if (rounds.length === 0 && !import_node_fs14.default.existsSync(roundsFile(id2))) return;
11920
+ if (rounds.length === 0 && !import_node_fs15.default.existsSync(roundsFile(id2))) return;
11786
11921
  writeJsonAtomic(roundsFile(id2), { rounds });
11787
11922
  };
11788
11923
  const forAgent2 = (id2, staleIds) => {
@@ -11920,7 +12055,7 @@ function createBoardCommentRegistry(options2) {
11920
12055
  boardsChanged: (id2) => {
11921
12056
  fresh(id2);
11922
12057
  writeRounds(id2);
11923
- if (!stores.has(id2) && !import_node_fs14.default.existsSync(import_node_path11.default.join(dirOf(id2), "comments.json"))) return;
12058
+ if (!stores.has(id2) && !import_node_fs15.default.existsSync(import_node_path12.default.join(dirOf(id2), "comments.json"))) return;
11924
12059
  if (JSON.stringify(stale(id2)) !== (lastStale.get(id2) ?? "[]")) push2(id2);
11925
12060
  }
11926
12061
  };
@@ -12256,8 +12391,8 @@ function callbackPage(result, locale = "en") {
12256
12391
  }
12257
12392
 
12258
12393
  // src/server/config.ts
12259
- var import_node_fs15 = __toESM(require("node:fs"), 1);
12260
- var import_node_path12 = __toESM(require("node:path"), 1);
12394
+ var import_node_fs16 = __toESM(require("node:fs"), 1);
12395
+ var import_node_path13 = __toESM(require("node:path"), 1);
12261
12396
  var defaults = () => ({ version: 1, artifacts: {} });
12262
12397
  function isCloudRecord(value) {
12263
12398
  if (typeof value !== "object" || value === null) return false;
@@ -12298,7 +12433,7 @@ function normalize(raw) {
12298
12433
  function readConfig(file) {
12299
12434
  let text4;
12300
12435
  try {
12301
- text4 = import_node_fs15.default.readFileSync(file, "utf8");
12436
+ text4 = import_node_fs16.default.readFileSync(file, "utf8");
12302
12437
  } catch {
12303
12438
  return { config: defaults() };
12304
12439
  }
@@ -12313,22 +12448,22 @@ function readConfig(file) {
12313
12448
  }
12314
12449
  var IGNORED = ["config.json", "artifacts/*", "!artifacts/document/", "artifacts/document/*/.artifact-id"];
12315
12450
  function ensureGitignore(dir) {
12316
- const file = import_node_path12.default.join(dir, ".gitignore");
12451
+ const file = import_node_path13.default.join(dir, ".gitignore");
12317
12452
  let current = "";
12318
12453
  try {
12319
- current = import_node_fs15.default.readFileSync(file, "utf8");
12454
+ current = import_node_fs16.default.readFileSync(file, "utf8");
12320
12455
  } catch {
12321
12456
  }
12322
12457
  const present = new Set(current.split(/\r?\n/).map((line) => line.trim()));
12323
12458
  const missing = IGNORED.filter((line) => !present.has(line));
12324
12459
  if (missing.length === 0) return;
12325
- import_node_fs15.default.writeFileSync(file, `${current}${current === "" || current.endsWith("\n") ? "" : "\n"}${missing.join("\n")}
12460
+ import_node_fs16.default.writeFileSync(file, `${current}${current === "" || current.endsWith("\n") ? "" : "\n"}${missing.join("\n")}
12326
12461
  `);
12327
12462
  }
12328
12463
  function ensureConfig(file) {
12329
- import_node_fs15.default.mkdirSync(import_node_path12.default.dirname(file), { recursive: true });
12330
- ensureGitignore(import_node_path12.default.dirname(file));
12331
- if (!import_node_fs15.default.existsSync(file)) writeJsonAtomic(file, defaults());
12464
+ import_node_fs16.default.mkdirSync(import_node_path13.default.dirname(file), { recursive: true });
12465
+ ensureGitignore(import_node_path13.default.dirname(file));
12466
+ if (!import_node_fs16.default.existsSync(file)) writeJsonAtomic(file, defaults());
12332
12467
  }
12333
12468
  function updateArtifactConfig(file, key2, patch) {
12334
12469
  const { config, warning } = readConfig(file);
@@ -12348,27 +12483,27 @@ function setProjectAutoPublish(file, value) {
12348
12483
  if (warning) throw new Error(warning);
12349
12484
  if (value === null) delete config.autoPublish;
12350
12485
  else config.autoPublish = value;
12351
- import_node_fs15.default.mkdirSync(import_node_path12.default.dirname(file), { recursive: true });
12486
+ import_node_fs16.default.mkdirSync(import_node_path13.default.dirname(file), { recursive: true });
12352
12487
  writeJsonAtomic(file, config);
12353
12488
  }
12354
12489
 
12355
12490
  // src/server/host-id.ts
12356
- var import_node_fs16 = __toESM(require("node:fs"), 1);
12357
- var import_node_path13 = __toESM(require("node:path"), 1);
12491
+ var import_node_fs17 = __toESM(require("node:fs"), 1);
12492
+ var import_node_path14 = __toESM(require("node:path"), 1);
12358
12493
  function hostIdFor(credentialsFile2) {
12359
- const file = import_node_path13.default.join(import_node_path13.default.dirname(credentialsFile2), "host-id");
12494
+ const file = import_node_path14.default.join(import_node_path14.default.dirname(credentialsFile2), "host-id");
12360
12495
  const saved = readPersisted(file);
12361
12496
  if (/^[\w-]{16,64}$/.test(saved)) return saved;
12362
12497
  const id2 = randomToken();
12363
- import_node_fs16.default.mkdirSync(import_node_path13.default.dirname(file), { recursive: true, mode: 448 });
12364
- import_node_fs16.default.writeFileSync(file, `${id2}
12498
+ import_node_fs17.default.mkdirSync(import_node_path14.default.dirname(file), { recursive: true, mode: 448 });
12499
+ import_node_fs17.default.writeFileSync(file, `${id2}
12365
12500
  `, { mode: 384 });
12366
12501
  return id2;
12367
12502
  }
12368
12503
 
12369
12504
  // src/server/pack.ts
12370
- var import_node_fs17 = __toESM(require("node:fs"), 1);
12371
- var import_node_path14 = __toESM(require("node:path"), 1);
12505
+ var import_node_fs18 = __toESM(require("node:fs"), 1);
12506
+ var import_node_path15 = __toESM(require("node:path"), 1);
12372
12507
  var ArtifactTooLarge = class extends Error {
12373
12508
  };
12374
12509
  var excluded = (type, relative) => (type === "document" || type === "artboard") && relative === "comments.json";
@@ -12376,22 +12511,22 @@ function packArtifact(dir, type, {
12376
12511
  maxBytes = MAX_ARTIFACT_BYTES,
12377
12512
  overrides
12378
12513
  } = {}) {
12379
- const rootReal = import_node_fs17.default.realpathSync(dir);
12514
+ const rootReal = import_node_fs18.default.realpathSync(dir);
12380
12515
  const found = [];
12381
12516
  const visited = /* @__PURE__ */ new Set([rootReal]);
12382
12517
  let total = 0;
12383
12518
  const walk = (current) => {
12384
- for (const entry of import_node_fs17.default.readdirSync(current, { withFileTypes: true })) {
12519
+ for (const entry of import_node_fs18.default.readdirSync(current, { withFileTypes: true })) {
12385
12520
  if (entry.name.startsWith(".")) continue;
12386
- const full = import_node_path14.default.join(current, entry.name);
12521
+ const full = import_node_path15.default.join(current, entry.name);
12387
12522
  let real;
12388
12523
  try {
12389
- real = import_node_fs17.default.realpathSync(full);
12524
+ real = import_node_fs18.default.realpathSync(full);
12390
12525
  } catch {
12391
12526
  continue;
12392
12527
  }
12393
- if (!real.startsWith(rootReal + import_node_path14.default.sep)) continue;
12394
- const stat = import_node_fs17.default.statSync(real);
12528
+ if (!real.startsWith(rootReal + import_node_path15.default.sep)) continue;
12529
+ const stat = import_node_fs18.default.statSync(real);
12395
12530
  if (stat.isDirectory()) {
12396
12531
  if (visited.has(real)) continue;
12397
12532
  visited.add(real);
@@ -12399,7 +12534,7 @@ function packArtifact(dir, type, {
12399
12534
  continue;
12400
12535
  }
12401
12536
  if (!stat.isFile()) continue;
12402
- const relative = import_node_path14.default.relative(dir, full).split(import_node_path14.default.sep).join("/");
12537
+ const relative = import_node_path15.default.relative(dir, full).split(import_node_path15.default.sep).join("/");
12403
12538
  if (excluded(type, relative)) continue;
12404
12539
  if (!overrides?.has(relative)) total += stat.size;
12405
12540
  found.push({ path: relative, real });
@@ -12413,14 +12548,14 @@ function packArtifact(dir, type, {
12413
12548
  );
12414
12549
  }
12415
12550
  return [
12416
- ...found.filter((file) => !overrides?.has(file.path)).map((file) => ({ path: file.path, data: import_node_fs17.default.readFileSync(file.real) })),
12551
+ ...found.filter((file) => !overrides?.has(file.path)).map((file) => ({ path: file.path, data: import_node_fs18.default.readFileSync(file.real) })),
12417
12552
  ...[...overrides ?? []].flatMap(([file, data]) => data ? [{ path: file, data }] : [])
12418
12553
  ];
12419
12554
  }
12420
12555
 
12421
12556
  // src/server/publish-payload.ts
12422
- var import_node_fs18 = __toESM(require("node:fs"), 1);
12423
- var import_node_path15 = __toESM(require("node:path"), 1);
12557
+ var import_node_fs19 = __toESM(require("node:fs"), 1);
12558
+ var import_node_path16 = __toESM(require("node:path"), 1);
12424
12559
 
12425
12560
  // ../../node_modules/.pnpm/nanoid@6.0.2/node_modules/nanoid/url-alphabet/index.js
12426
12561
  var urlAlphabet2 = "57X6y3wQZNzYjJB2L_10pxbackgroundhimselfUTF-8DEMOGRAPHICSVqvt4KW9";
@@ -26238,7 +26373,7 @@ function publishPayload(ref, dir, title, payload, comments = emptyComments()) {
26238
26373
  if (ref.type === "document")
26239
26374
  return {
26240
26375
  title,
26241
- state: parseDocument2(import_node_fs18.default.readFileSync(import_node_path15.default.join(dir, "doc.xml"), "utf8")),
26376
+ state: parseDocument2(import_node_fs19.default.readFileSync(import_node_path16.default.join(dir, "doc.xml"), "utf8")),
26242
26377
  comments: sharedComments(comments)
26243
26378
  };
26244
26379
  return { title };
@@ -26260,12 +26395,12 @@ function withCloudRuntime(type, files) {
26260
26395
  }
26261
26396
 
26262
26397
  // src/server/settings.ts
26263
- var import_node_fs19 = __toESM(require("node:fs"), 1);
26264
- var import_node_path16 = __toESM(require("node:path"), 1);
26265
- var settingsFileFor = (credentialsFile2) => import_node_path16.default.join(import_node_path16.default.dirname(credentialsFile2), "config.json");
26398
+ var import_node_fs20 = __toESM(require("node:fs"), 1);
26399
+ var import_node_path17 = __toESM(require("node:path"), 1);
26400
+ var settingsFileFor = (credentialsFile2) => import_node_path17.default.join(import_node_path17.default.dirname(credentialsFile2), "config.json");
26266
26401
  function readSettings(file) {
26267
26402
  try {
26268
- const raw = JSON.parse(import_node_fs19.default.readFileSync(file, "utf8"));
26403
+ const raw = JSON.parse(import_node_fs20.default.readFileSync(file, "utf8"));
26269
26404
  return typeof raw === "object" && raw !== null && !Array.isArray(raw) ? raw : {};
26270
26405
  } catch {
26271
26406
  return {};
@@ -26276,7 +26411,7 @@ function readGlobalAutoPublish(file) {
26276
26411
  return typeof value === "boolean" ? value : void 0;
26277
26412
  }
26278
26413
  function writeGlobalAutoPublish(file, value) {
26279
- import_node_fs19.default.mkdirSync(import_node_path16.default.dirname(file), { recursive: true, mode: 448 });
26414
+ import_node_fs20.default.mkdirSync(import_node_path17.default.dirname(file), { recursive: true, mode: 448 });
26280
26415
  writeJsonAtomic(file, { ...readSettings(file), autoPublish: value });
26281
26416
  }
26282
26417
  function postponeGlobalAutoPublish(file) {
@@ -26285,7 +26420,7 @@ function postponeGlobalAutoPublish(file) {
26285
26420
  writeGlobalAutoPublish(file, false);
26286
26421
  return "off";
26287
26422
  }
26288
- import_node_fs19.default.mkdirSync(import_node_path16.default.dirname(file), { recursive: true, mode: 448 });
26423
+ import_node_fs20.default.mkdirSync(import_node_path17.default.dirname(file), { recursive: true, mode: 448 });
26289
26424
  writeJsonAtomic(file, { ...settings, autoPublishPostponed: true });
26290
26425
  return "postponed";
26291
26426
  }
@@ -26422,7 +26557,7 @@ function createCloudRoutes(options2) {
26422
26557
  const challenge = import_node_crypto10.default.createHash("sha256").update(verifier).digest("base64url");
26423
26558
  return `${origin}/auth/cli?port=${options2.port()}&state=${state2}&challenge=${challenge}`;
26424
26559
  };
26425
- const cloudFetch = async (method, path37, body) => {
26560
+ const cloudFetch = async (method, path38, body) => {
26426
26561
  const credentials = readCredentials(credentialsFile2, origin);
26427
26562
  if (!credentials) throw new SignedOut();
26428
26563
  const headers = { Authorization: `Bearer ${credentials.token}` };
@@ -26436,7 +26571,7 @@ function createCloudRoutes(options2) {
26436
26571
  }
26437
26572
  let res;
26438
26573
  try {
26439
- res = await fetch(`${origin}${path37}`, { method, headers, body: payload });
26574
+ res = await fetch(`${origin}${path38}`, { method, headers, body: payload });
26440
26575
  } catch (err) {
26441
26576
  throw new CloudRefused(502, `could not reach ${origin}: ${err.message}`);
26442
26577
  }
@@ -26572,7 +26707,7 @@ function createCloudRoutes(options2) {
26572
26707
  const content = {
26573
26708
  title: inspected.title,
26574
26709
  payload: inspected.payload,
26575
- files: hashed.map(({ path: path37, hash: hash2 }) => ({ path: path37, hash: hash2 }))
26710
+ files: hashed.map(({ path: path38, hash: hash2 }) => ({ path: path38, hash: hash2 }))
26576
26711
  };
26577
26712
  const fingerprint = sha(
26578
26713
  JSON.stringify({
@@ -27006,7 +27141,7 @@ function createCloudRoutes(options2) {
27006
27141
 
27007
27142
  // src/server/comment-names.ts
27008
27143
  var import_node_child_process2 = require("node:child_process");
27009
- var import_node_fs20 = __toESM(require("node:fs"), 1);
27144
+ var import_node_fs21 = __toESM(require("node:fs"), 1);
27010
27145
 
27011
27146
  // src/server/agent.ts
27012
27147
  var NAMES = {
@@ -27099,7 +27234,7 @@ function commentNames({ agentFile, projectDir, cloud }) {
27099
27234
  agent: () => {
27100
27235
  try {
27101
27236
  return detectAgent(
27102
- JSON.parse(import_node_fs20.default.readFileSync(agentFile, "utf8"))
27237
+ JSON.parse(import_node_fs21.default.readFileSync(agentFile, "utf8"))
27103
27238
  );
27104
27239
  } catch {
27105
27240
  return void 0;
@@ -27179,28 +27314,28 @@ function createDirectRelay(options2) {
27179
27314
  }
27180
27315
 
27181
27316
  // src/server/document.ts
27182
- var import_node_fs22 = __toESM(require("node:fs"), 1);
27183
- var import_node_path18 = __toESM(require("node:path"), 1);
27317
+ var import_node_fs23 = __toESM(require("node:fs"), 1);
27318
+ var import_node_path19 = __toESM(require("node:path"), 1);
27184
27319
 
27185
27320
  // src/server/html.ts
27186
- var import_node_fs21 = __toESM(require("node:fs"), 1);
27187
- var import_node_path17 = __toESM(require("node:path"), 1);
27321
+ var import_node_fs22 = __toESM(require("node:fs"), 1);
27322
+ var import_node_path18 = __toESM(require("node:path"), 1);
27188
27323
  var TITLE = /<title[^>]*>([\s\S]*?)<\/title>/i;
27189
27324
  function latestMtime(dir) {
27190
27325
  let latest2 = 0;
27191
27326
  let entries2;
27192
27327
  try {
27193
- entries2 = import_node_fs21.default.readdirSync(dir, { withFileTypes: true });
27328
+ entries2 = import_node_fs22.default.readdirSync(dir, { withFileTypes: true });
27194
27329
  } catch {
27195
27330
  return latest2;
27196
27331
  }
27197
27332
  for (const entry of entries2) {
27198
27333
  if (entry.name.startsWith(".")) continue;
27199
- const full = import_node_path17.default.join(dir, entry.name);
27334
+ const full = import_node_path18.default.join(dir, entry.name);
27200
27335
  try {
27201
27336
  latest2 = Math.max(
27202
27337
  latest2,
27203
- entry.isDirectory() ? latestMtime(full) : import_node_fs21.default.statSync(full).mtimeMs
27338
+ entry.isDirectory() ? latestMtime(full) : import_node_fs22.default.statSync(full).mtimeMs
27204
27339
  );
27205
27340
  } catch {
27206
27341
  continue;
@@ -27211,7 +27346,7 @@ function latestMtime(dir) {
27211
27346
  function readHtml(dir, id2) {
27212
27347
  let source;
27213
27348
  try {
27214
- source = import_node_fs21.default.readFileSync(import_node_path17.default.join(dir, ENTRY_FILE.html), "utf8");
27349
+ source = import_node_fs22.default.readFileSync(import_node_path18.default.join(dir, ENTRY_FILE.html), "utf8");
27215
27350
  } catch {
27216
27351
  return { title: id2, warnings: ["index.html not found"], version: latestMtime(dir) };
27217
27352
  }
@@ -27224,7 +27359,7 @@ var FIRST_HEADING = /<h[1-6]\b[^>]*>([\s\S]*?)<\/h[1-6]>/i;
27224
27359
  function readDocument(dir, id2) {
27225
27360
  let source;
27226
27361
  try {
27227
- source = import_node_fs22.default.readFileSync(import_node_path18.default.join(dir, ENTRY_FILE.document), "utf8");
27362
+ source = import_node_fs23.default.readFileSync(import_node_path19.default.join(dir, ENTRY_FILE.document), "utf8");
27228
27363
  } catch {
27229
27364
  return { title: id2, warnings: ["doc.xml not found"], version: latestMtime(dir) };
27230
27365
  }
@@ -27233,17 +27368,17 @@ function readDocument(dir, id2) {
27233
27368
  }
27234
27369
 
27235
27370
  // src/server/documents.ts
27236
- var import_node_fs25 = __toESM(require("node:fs"), 1);
27237
- var import_node_path22 = __toESM(require("node:path"), 1);
27371
+ var import_node_fs26 = __toESM(require("node:fs"), 1);
27372
+ var import_node_path23 = __toESM(require("node:path"), 1);
27238
27373
 
27239
27374
  // src/server/change-cursors.ts
27240
- var import_node_fs23 = __toESM(require("node:fs"), 1);
27241
- var import_node_path19 = __toESM(require("node:path"), 1);
27242
- var cursorsFile2 = (stateDir, id2) => import_node_path19.default.join(stateDir, "document", id2, "change-cursors.json");
27375
+ var import_node_fs24 = __toESM(require("node:fs"), 1);
27376
+ var import_node_path20 = __toESM(require("node:path"), 1);
27377
+ var cursorsFile2 = (stateDir, id2) => import_node_path20.default.join(stateDir, "document", id2, "change-cursors.json");
27243
27378
  var isOpId = (value) => typeof value === "object" && value !== null && typeof value.peer === "string" && Number.isInteger(value.counter);
27244
27379
  function read2(file) {
27245
27380
  try {
27246
- const value = JSON.parse(import_node_fs23.default.readFileSync(file, "utf8"));
27381
+ const value = JSON.parse(import_node_fs24.default.readFileSync(file, "utf8"));
27247
27382
  if (typeof value !== "object" || value === null || Array.isArray(value)) return {};
27248
27383
  return Object.fromEntries(
27249
27384
  Object.entries(value).filter(
@@ -27265,8 +27400,8 @@ function createChangeCursors(stateDir) {
27265
27400
  }
27266
27401
 
27267
27402
  // src/server/document-asks.ts
27268
- var import_node_fs24 = __toESM(require("node:fs"), 1);
27269
- var import_node_path20 = __toESM(require("node:path"), 1);
27403
+ var import_node_fs25 = __toESM(require("node:fs"), 1);
27404
+ var import_node_path21 = __toESM(require("node:path"), 1);
27270
27405
  var blockOf = (asks, ask) => asks.find((a5) => a5.id === ask)?.blockId ?? "*";
27271
27406
  function humanAskOp(asks, threads2, op) {
27272
27407
  if (op.op !== "create") {
@@ -27311,8 +27446,8 @@ function askListing(asks, threads2) {
27311
27446
  };
27312
27447
  }
27313
27448
  function writeAsksFile(stateDir, id2, asks, threads2) {
27314
- const file = import_node_path20.default.join(stateDir, "document", id2, "asks.json");
27315
- if (!asks.length && !import_node_fs24.default.existsSync(file)) return;
27449
+ const file = import_node_path21.default.join(stateDir, "document", id2, "asks.json");
27450
+ if (!asks.length && !import_node_fs25.default.existsSync(file)) return;
27316
27451
  const latest2 = latestSubmission(threads2);
27317
27452
  writeJsonAtomic(file, {
27318
27453
  latest: latest2 ? { id: latest2.id, at: latest2.at, withdrawn: latest2.withdrawn } : null
@@ -27321,7 +27456,7 @@ function writeAsksFile(stateDir, id2, asks, threads2) {
27321
27456
 
27322
27457
  // src/server/document-session.ts
27323
27458
  var import_promises = __toESM(require("node:fs/promises"), 1);
27324
- var import_node_path21 = __toESM(require("node:path"), 1);
27459
+ var import_node_path22 = __toESM(require("node:path"), 1);
27325
27460
 
27326
27461
  // ../../node_modules/.pnpm/lexical@0.53.0_typescript@6.0.3/node_modules/lexical/dist/Lexical.dev.js
27327
27462
  var Lexical_dev_exports = {};
@@ -28677,19 +28812,19 @@ var ElementDOMSlot = class _ElementDOMSlot extends DOMSlot {
28677
28812
  }
28678
28813
  };
28679
28814
  function indexPath(root, child) {
28680
- const path37 = [];
28815
+ const path38 = [];
28681
28816
  let node = child;
28682
28817
  for (; node !== root && node !== null; node = node.parentNode) {
28683
28818
  let i6 = 0;
28684
28819
  for (let sibling = node.previousSibling; sibling !== null; sibling = sibling.previousSibling) {
28685
28820
  i6++;
28686
28821
  }
28687
- path37.push(i6);
28822
+ path38.push(i6);
28688
28823
  }
28689
28824
  if (!(node === root)) {
28690
28825
  formatDevErrorMessage(`indexPath: root is not a parent of child`);
28691
28826
  }
28692
- return path37.reverse();
28827
+ return path38.reverse();
28693
28828
  }
28694
28829
  var TEXT_MUTATION_VARIANCE = 100;
28695
28830
  var isProcessingMutations = false;
@@ -38049,9 +38184,9 @@ function getActiveElementDeep(root) {
38049
38184
  function getComposedEventTarget(event) {
38050
38185
  const target = event.target;
38051
38186
  if (target !== null && isHTMLElement(target) && target.shadowRoot !== null && typeof event.composedPath === "function") {
38052
- const path37 = event.composedPath();
38053
- if (path37.length > 0) {
38054
- return path37[0];
38187
+ const path38 = event.composedPath();
38188
+ if (path38.length > 0) {
38189
+ return path38[0];
38055
38190
  }
38056
38191
  }
38057
38192
  return target;
@@ -50345,7 +50480,7 @@ var as = null;
50345
50480
  function us(t7) {
50346
50481
  as = t7;
50347
50482
  }
50348
- var fs25 = /* @__PURE__ */ Symbol("INTERNAL_SKIP_AFTER_CLONE_FROM");
50483
+ var fs26 = /* @__PURE__ */ Symbol("INTERNAL_SKIP_AFTER_CLONE_FROM");
50349
50484
  var ds = 1;
50350
50485
  function hs() {
50351
50486
  ds = 1;
@@ -50817,7 +50952,7 @@ function Il(t7) {
50817
50952
  return ci(t7) || Fl(t7);
50818
50953
  }
50819
50954
  function Ll(t7, e5 = false) {
50820
- const n8 = t7.constructor.clone(t7, fs25);
50955
+ const n8 = t7.constructor.clone(t7, fs26);
50821
50956
  return Ds(n8, null), n8.afterCloneFrom(t7), e5 || n8.resetOnCopyNodeFrom(t7), n8;
50822
50957
  }
50823
50958
  function Kl(t7) {
@@ -51062,7 +51197,7 @@ function wc(t7) {
51062
51197
  })(t7), Tc.set(t7, n8)), n8;
51063
51198
  }
51064
51199
  function Ec(t7) {
51065
- const e5 = t7.constructor.clone(t7, fs25);
51200
+ const e5 = t7.constructor.clone(t7, fs26);
51066
51201
  return e5.afterCloneFrom(t7), e5;
51067
51202
  }
51068
51203
  function Ac(t7) {
@@ -51209,7 +51344,7 @@ function Bc(t7) {
51209
51344
  if (Kc(t9, "clone") || (t9.clone = (e7, n12) => {
51210
51345
  us(e7);
51211
51346
  const o10 = new t9();
51212
- return n12 !== fs25 && o10.afterCloneFrom(e7), o10;
51347
+ return n12 !== fs26 && o10.afterCloneFrom(e7), o10;
51213
51348
  }), Kc(t9, "importJSON") || (t9.importJSON = o9 && o9.$importJSON || /* @__PURE__ */ (function(t10) {
51214
51349
  return (e7) => {
51215
51350
  const n12 = ga(t10);
@@ -55059,10 +55194,10 @@ function _loadWasmModule(sync, filepath, src, imports2) {
55059
55194
  var buf = null;
55060
55195
  var isNode2 = typeof process !== "undefined" && process.versions != null && process.versions.node != null;
55061
55196
  if (filepath && isNode2) {
55062
- var fs44 = null;
55063
- var path37 = null;
55197
+ var fs45 = null;
55198
+ var path38 = null;
55064
55199
  return new Promise((resolve, reject) => {
55065
- fs44.readFile(path37.resolve(__dirname, filepath), (error, buffer) => {
55200
+ fs45.readFile(path38.resolve(__dirname, filepath), (error, buffer) => {
55066
55201
  if (error != null) {
55067
55202
  reject(error);
55068
55203
  } else {
@@ -56365,10 +56500,10 @@ var LoroDoc = class _LoroDoc {
56365
56500
  * @param {string} path
56366
56501
  * @returns {Value | Container | undefined}
56367
56502
  */
56368
- getByPath(path37) {
56503
+ getByPath(path38) {
56369
56504
  try {
56370
56505
  const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
56371
- const ptr0 = passStringToWasm0(path37, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
56506
+ const ptr0 = passStringToWasm0(path38, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
56372
56507
  const len0 = WASM_VECTOR_LEN;
56373
56508
  wasm.lorodoc_getByPath(retptr, this.__wbg_ptr, ptr0, len0);
56374
56509
  var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
@@ -63989,16 +64124,16 @@ var Diff = class {
63989
64124
  }
63990
64125
  }
63991
64126
  }
63992
- addToPath(path37, added, removed, oldPosInc, options2) {
63993
- const last = path37.lastComponent;
64127
+ addToPath(path38, added, removed, oldPosInc, options2) {
64128
+ const last = path38.lastComponent;
63994
64129
  if (last && !options2.oneChangePerToken && last.added === added && last.removed === removed) {
63995
64130
  return {
63996
- oldPos: path37.oldPos + oldPosInc,
64131
+ oldPos: path38.oldPos + oldPosInc,
63997
64132
  lastComponent: { count: last.count + 1, added, removed, previousComponent: last.previousComponent }
63998
64133
  };
63999
64134
  } else {
64000
64135
  return {
64001
- oldPos: path37.oldPos + oldPosInc,
64136
+ oldPos: path38.oldPos + oldPosInc,
64002
64137
  lastComponent: { count: 1, added, removed, previousComponent: last }
64003
64138
  };
64004
64139
  }
@@ -96642,10 +96777,10 @@ function $placeBlocks(runtime, $isTarget) {
96642
96777
  }
96643
96778
  const documentKey = $documentKey();
96644
96779
  for (const [key2, frame] of targets) {
96645
- const path37 = placeOf(frame);
96646
- let id2 = derivePositionalId(documentKey, path37);
96780
+ const path38 = placeOf(frame);
96781
+ let id2 = derivePositionalId(documentKey, path38);
96647
96782
  for (let attempt = 1; taken.has(id2); attempt++) {
96648
- id2 = derivePositionalId(documentKey, `${path37}#${attempt}`);
96783
+ id2 = derivePositionalId(documentKey, `${path38}#${attempt}`);
96649
96784
  }
96650
96785
  taken.add(id2);
96651
96786
  placed.set(key2, id2);
@@ -100955,7 +101090,7 @@ async function readText(file) {
100955
101090
  }
100956
101091
  }
100957
101092
  async function writeAtomic(file, data) {
100958
- await import_promises.default.mkdir(import_node_path21.default.dirname(file), { recursive: true });
101093
+ await import_promises.default.mkdir(import_node_path22.default.dirname(file), { recursive: true });
100959
101094
  const tmp = `${file}.${process.pid}.tmp`;
100960
101095
  await import_promises.default.writeFile(tmp, data);
100961
101096
  await import_promises.default.rename(tmp, file);
@@ -100989,7 +101124,7 @@ async function createDocumentSession(options2) {
100989
101124
  let lastGoodText = null;
100990
101125
  let lastAgentText = null;
100991
101126
  let lastFileText = await readText(file) ?? "";
100992
- const activityFile = import_node_path21.default.join(import_node_path21.default.dirname(snapshotFile), "agent-active");
101127
+ const activityFile = import_node_path22.default.join(import_node_path22.default.dirname(snapshotFile), "agent-active");
100993
101128
  let agentActiveAt = await lastAgentWrite(activityFile, file);
100994
101129
  let activitySaved = Promise.resolve();
100995
101130
  const emitStatus = () => emit({ type: "status", outcome, streaming: streaming > 0, agentActiveAt });
@@ -101059,6 +101194,14 @@ async function createDocumentSession(options2) {
101059
101194
  }
101060
101195
  });
101061
101196
  };
101197
+ const refreshRefs = () => {
101198
+ if (!options2.fillRefs || outcome.kind === "rejected" || streaming > 0) return;
101199
+ const current = editor.getEditorState().toJSON();
101200
+ const filled = options2.fillRefs(current);
101201
+ if (JSON.stringify(filled) === JSON.stringify(current)) return;
101202
+ reconcileWithIds(editor, filled, () => loro.setNextCommitMessage("refs"));
101203
+ scheduleWrite();
101204
+ };
101062
101205
  const saveSnapshot = async () => {
101063
101206
  if (!snapshotDirty) return;
101064
101207
  snapshotDirty = false;
@@ -101152,6 +101295,7 @@ async function createDocumentSession(options2) {
101152
101295
  scheduleWrite();
101153
101296
  },
101154
101297
  onFileText,
101298
+ refreshRefs,
101155
101299
  subscribe: (listener) => {
101156
101300
  listeners.add(listener);
101157
101301
  return () => listeners.delete(listener);
@@ -101260,7 +101404,8 @@ function createDocumentRegistry(options2) {
101260
101404
  return session && !session.streaming() ? refWarnings(refsIn(session.state()), refLookup) : [];
101261
101405
  };
101262
101406
  const warnings = /* @__PURE__ */ new Map();
101263
- const docFile = (id2) => import_node_path22.default.join(options2.root, "document", id2, "doc.xml");
101407
+ const rechecks = /* @__PURE__ */ new Map();
101408
+ const docFile = (id2) => import_node_path23.default.join(options2.root, "document", id2, "doc.xml");
101264
101409
  const commentStores = /* @__PURE__ */ new Map();
101265
101410
  const cursors = createCommentCursors(options2.stateDir);
101266
101411
  const changeCursors = createChangeCursors(options2.stateDir);
@@ -101268,7 +101413,7 @@ function createDocumentRegistry(options2) {
101268
101413
  let store = commentStores.get(id2);
101269
101414
  if (!store) {
101270
101415
  store = createCommentStore(
101271
- import_node_path22.default.join(options2.root, "document", id2, "comments.json"),
101416
+ import_node_path23.default.join(options2.root, "document", id2, "comments.json"),
101272
101417
  options2.names
101273
101418
  );
101274
101419
  commentStores.set(id2, store);
@@ -101301,10 +101446,10 @@ function createDocumentRegistry(options2) {
101301
101446
  if (JSON.stringify(store.warnings()) !== before2) options2.onWarningsChange(id2);
101302
101447
  };
101303
101448
  const create3 = async (id2) => {
101304
- if (!import_node_fs25.default.existsSync(docFile(id2))) return null;
101449
+ if (!import_node_fs26.default.existsSync(docFile(id2))) return null;
101305
101450
  const session = await createDocumentSession({
101306
101451
  file: docFile(id2),
101307
- snapshotFile: import_node_path22.default.join(options2.stateDir, "document", id2, "doc.loro"),
101452
+ snapshotFile: import_node_path23.default.join(options2.stateDir, "document", id2, "doc.loro"),
101308
101453
  fillRefs: (state2) => fillRefIds(state2, refLookup),
101309
101454
  ...options2.timing,
101310
101455
  log: options2.log
@@ -101323,6 +101468,7 @@ function createDocumentRegistry(options2) {
101323
101468
  return outcome.kind === "rejected" ? outcomeWarnings(outcome) : [...outcomeWarnings(outcome), ...diagramWarnings(session), ...liveRefWarnings(id2)];
101324
101469
  };
101325
101470
  setWarnings(currentWarnings());
101471
+ rechecks.set(id2, () => setWarnings(currentWarnings()));
101326
101472
  session.subscribe((event) => {
101327
101473
  if (event.type === "update") {
101328
101474
  options2.broadcast({
@@ -101346,6 +101492,7 @@ function createDocumentRegistry(options2) {
101346
101492
  if (!event.streaming) refsChanged(id2, session);
101347
101493
  }
101348
101494
  });
101495
+ session.refreshRefs();
101349
101496
  return session;
101350
101497
  };
101351
101498
  const open = (id2) => {
@@ -101364,11 +101511,18 @@ function createDocumentRegistry(options2) {
101364
101511
  };
101365
101512
  return {
101366
101513
  open,
101514
+ artboardChanged: (slug) => {
101515
+ for (const [id2, session] of ready) {
101516
+ if (!refsIn(session.state()).some((ref) => ref.artboard === slug)) continue;
101517
+ session.refreshRefs();
101518
+ rechecks.get(id2)?.();
101519
+ }
101520
+ },
101367
101521
  fileChanged: (id2) => {
101368
101522
  const known = sessions.has(id2);
101369
101523
  void open(id2).then((session) => {
101370
101524
  if (!session || !known) return;
101371
- import_node_fs25.default.readFile(docFile(id2), "utf8", (err, text4) => {
101525
+ import_node_fs26.default.readFile(docFile(id2), "utf8", (err, text4) => {
101372
101526
  if (!err) session.onFileText(text4);
101373
101527
  });
101374
101528
  });
@@ -101443,13 +101597,14 @@ function createDocumentRegistry(options2) {
101443
101597
  await Promise.all(all.map((session) => session?.close()));
101444
101598
  sessions.clear();
101445
101599
  ready.clear();
101600
+ rechecks.clear();
101446
101601
  }
101447
101602
  };
101448
101603
  }
101449
101604
 
101450
101605
  // src/server/dynamic-blocks.ts
101451
- var import_node_fs26 = __toESM(require("node:fs"), 1);
101452
- var import_node_path23 = __toESM(require("node:path"), 1);
101606
+ var import_node_fs27 = __toESM(require("node:fs"), 1);
101607
+ var import_node_path24 = __toESM(require("node:path"), 1);
101453
101608
  function dynamicUrls(xml) {
101454
101609
  const urls = /* @__PURE__ */ new Set();
101455
101610
  for (const match of stripOpaque(xml).matchAll(TAG)) {
@@ -101462,7 +101617,7 @@ function dynamicUrls(xml) {
101462
101617
  }
101463
101618
  var mtimeOf = (file) => {
101464
101619
  try {
101465
- return import_node_fs26.default.statSync(file).mtimeMs;
101620
+ return import_node_fs27.default.statSync(file).mtimeMs;
101466
101621
  } catch {
101467
101622
  return -1;
101468
101623
  }
@@ -101479,7 +101634,7 @@ function createDynamicBlocks(limits) {
101479
101634
  };
101480
101635
  const entry = (id2, dir, file) => {
101481
101636
  const map = files(id2);
101482
- const mtime = mtimeOf(import_node_path23.default.join(dir, file));
101637
+ const mtime = mtimeOf(import_node_path24.default.join(dir, file));
101483
101638
  let state2 = map.get(file);
101484
101639
  if (!state2 || state2.mtime !== mtime) {
101485
101640
  state2 = { mtime, errors: [], ran: false };
@@ -101504,19 +101659,19 @@ function createDynamicBlocks(limits) {
101504
101659
  state(id2, dir) {
101505
101660
  let xml;
101506
101661
  try {
101507
- xml = import_node_fs26.default.readFileSync(import_node_path23.default.join(dir, "doc.xml"), "utf8");
101662
+ xml = import_node_fs27.default.readFileSync(import_node_path24.default.join(dir, "doc.xml"), "utf8");
101508
101663
  } catch {
101509
101664
  return { warnings: [], dynamic: {} };
101510
101665
  }
101511
101666
  const urls = dynamicUrls(xml);
101512
101667
  const map = files(id2);
101513
101668
  for (const [file, state2] of map) {
101514
- if (!urls.includes(file) || state2.mtime !== mtimeOf(import_node_path23.default.join(dir, file))) map.delete(file);
101669
+ if (!urls.includes(file) || state2.mtime !== mtimeOf(import_node_path24.default.join(dir, file))) map.delete(file);
101515
101670
  }
101516
101671
  const warnings = [];
101517
101672
  const dynamic = {};
101518
101673
  for (const url of urls) {
101519
- if (!import_node_fs26.default.existsSync(import_node_path23.default.join(dir, url))) warnings.push(`${url} not found`);
101674
+ if (!import_node_fs27.default.existsSync(import_node_path24.default.join(dir, url))) warnings.push(`${url} not found`);
101520
101675
  const state2 = map.get(url);
101521
101676
  for (const error of state2?.errors ?? []) warnings.push(`runtime: ${url}: ${error}`);
101522
101677
  dynamic[url] = { ran: state2?.ran ?? false };
@@ -101532,7 +101687,7 @@ var MAX_COMMENT_OP = 64 * 1024;
101532
101687
  var MAX_DOCUMENT_UPDATE = 8 * 1024 * 1024;
101533
101688
 
101534
101689
  // src/server/artifact-file.ts
101535
- var import_node_fs27 = __toESM(require("node:fs"), 1);
101690
+ var import_node_fs28 = __toESM(require("node:fs"), 1);
101536
101691
  var RESOLVE = {
101537
101692
  artboard: resolveBoardFile,
101538
101693
  document: resolveDocumentAsset,
@@ -101545,8 +101700,8 @@ function readArtifactFile(dir, type, relative, uiRuntimeUrl, maxBytes = Infinity
101545
101700
  if (!target) return null;
101546
101701
  let data;
101547
101702
  try {
101548
- if (import_node_fs27.default.statSync(target).size > maxBytes) throw new RangeError("too large");
101549
- data = import_node_fs27.default.readFileSync(target);
101703
+ if (import_node_fs28.default.statSync(target).size > maxBytes) throw new RangeError("too large");
101704
+ data = import_node_fs28.default.readFileSync(target);
101550
101705
  } catch (err) {
101551
101706
  if (err instanceof RangeError) throw err;
101552
101707
  return null;
@@ -101696,8 +101851,8 @@ async function handleRelay(ctx, key2, body, conn, contentOrigin = "") {
101696
101851
  }
101697
101852
 
101698
101853
  // src/server/selection.ts
101699
- var import_node_fs28 = __toESM(require("node:fs"), 1);
101700
- var import_node_path24 = __toESM(require("node:path"), 1);
101854
+ var import_node_fs29 = __toESM(require("node:fs"), 1);
101855
+ var import_node_path25 = __toESM(require("node:path"), 1);
101701
101856
 
101702
101857
  // src/shared/selection.ts
101703
101858
  var SELECTION_FULL_NODES = 20;
@@ -101812,7 +101967,7 @@ function readAnySelection(value) {
101812
101967
  function createSelectionStore(stateDir, exists) {
101813
101968
  const tabs = /* @__PURE__ */ new Map();
101814
101969
  let clock = 0;
101815
- const fileOf2 = (kind, id2) => import_node_path24.default.join(stateDir, kind, id2, "selection.json");
101970
+ const fileOf2 = (kind, id2) => import_node_path25.default.join(stateDir, kind, id2, "selection.json");
101816
101971
  const write = (kind, id2) => {
101817
101972
  let winner;
101818
101973
  for (const tab of tabs.values()) {
@@ -101820,7 +101975,7 @@ function createSelectionStore(stateDir, exists) {
101820
101975
  if (!winner || tab.humanAt > winner.humanAt || tab.humanAt === winner.humanAt && tab.seenAt > winner.seenAt)
101821
101976
  winner = tab;
101822
101977
  }
101823
- if (!winner?.state) import_node_fs28.default.rmSync(fileOf2(kind, id2), { force: true });
101978
+ if (!winner?.state) import_node_fs29.default.rmSync(fileOf2(kind, id2), { force: true });
101824
101979
  else
101825
101980
  writeJsonAtomic(fileOf2(kind, id2), {
101826
101981
  artifact: `${kind}/${id2}`,
@@ -101862,11 +102017,11 @@ function createSelectionStore(stateDir, exists) {
101862
102017
  for (const kind of ["artboard", "document"]) {
101863
102018
  let ids;
101864
102019
  try {
101865
- ids = import_node_fs28.default.readdirSync(import_node_path24.default.join(stateDir, kind));
102020
+ ids = import_node_fs29.default.readdirSync(import_node_path25.default.join(stateDir, kind));
101866
102021
  } catch {
101867
102022
  continue;
101868
102023
  }
101869
- for (const id2 of ids) import_node_fs28.default.rmSync(fileOf2(kind, id2), { force: true });
102024
+ for (const id2 of ids) import_node_fs29.default.rmSync(fileOf2(kind, id2), { force: true });
101870
102025
  }
101871
102026
  }
101872
102027
  };
@@ -101874,13 +102029,13 @@ function createSelectionStore(stateDir, exists) {
101874
102029
 
101875
102030
  // src/server/verify-recordings.ts
101876
102031
  var import_node_crypto11 = __toESM(require("node:crypto"), 1);
101877
- var import_node_fs30 = __toESM(require("node:fs"), 1);
101878
- var import_node_path26 = __toESM(require("node:path"), 1);
102032
+ var import_node_fs31 = __toESM(require("node:fs"), 1);
102033
+ var import_node_path27 = __toESM(require("node:path"), 1);
101879
102034
 
101880
102035
  // src/server/recording-trim.ts
101881
102036
  var import_node_child_process3 = require("node:child_process");
101882
- var import_node_fs29 = __toESM(require("node:fs"), 1);
101883
- var import_node_path25 = __toESM(require("node:path"), 1);
102037
+ var import_node_fs30 = __toESM(require("node:fs"), 1);
102038
+ var import_node_path26 = __toESM(require("node:path"), 1);
101884
102039
  function run2(command, args, signal3) {
101885
102040
  return new Promise((resolve, reject) => {
101886
102041
  (0, import_node_child_process3.execFile)(
@@ -101900,7 +102055,7 @@ function run2(command, args, signal3) {
101900
102055
  });
101901
102056
  }
101902
102057
  async function trimRecording(input, output, signal3) {
101903
- if (input === output || import_node_fs29.default.existsSync(output))
102058
+ if (input === output || import_node_fs30.default.existsSync(output))
101904
102059
  throw new Error("Choose a new output path; existing files are never overwritten.");
101905
102060
  const probe = JSON.parse(
101906
102061
  (await run2(
@@ -101972,9 +102127,9 @@ async function trimRecording(input, output, signal3) {
101972
102127
  if (start > 0 || end < duration) status = "trimmed";
101973
102128
  }
101974
102129
  if (status === "trimmed") {
101975
- const temporary = import_node_fs29.default.mkdtempSync(import_node_path25.default.join(import_node_path25.default.dirname(output), ".trim-"));
102130
+ const temporary = import_node_fs30.default.mkdtempSync(import_node_path26.default.join(import_node_path26.default.dirname(output), ".trim-"));
101976
102131
  try {
101977
- const encoded = import_node_path25.default.join(temporary, "clip.mp4");
102132
+ const encoded = import_node_path26.default.join(temporary, "clip.mp4");
101978
102133
  await run2(
101979
102134
  "ffmpeg",
101980
102135
  [
@@ -102010,9 +102165,9 @@ async function trimRecording(input, output, signal3) {
102010
102165
  ],
102011
102166
  signal3
102012
102167
  );
102013
- import_node_fs29.default.linkSync(encoded, output);
102168
+ import_node_fs30.default.linkSync(encoded, output);
102014
102169
  } finally {
102015
- import_node_fs29.default.rmSync(temporary, { recursive: true, force: true });
102170
+ import_node_fs30.default.rmSync(temporary, { recursive: true, force: true });
102016
102171
  }
102017
102172
  }
102018
102173
  return { duration, start, end, removed: duration - (end - start), status };
@@ -102023,7 +102178,7 @@ var POLICY = "idle-ends-v2";
102023
102178
  var STABLE_MS = 750;
102024
102179
  var digest2 = (data) => import_node_crypto11.default.createHash("sha256").update(data).digest("hex");
102025
102180
  var stamp2 = (file) => {
102026
- const stat = import_node_fs30.default.statSync(file);
102181
+ const stat = import_node_fs31.default.statSync(file);
102027
102182
  return `${stat.dev}:${stat.ino}:${stat.size}:${stat.mtimeMs}:${stat.ctimeMs}`;
102028
102183
  };
102029
102184
  function createVerifyRecordings(options2) {
@@ -102037,7 +102192,7 @@ function createVerifyRecordings(options2) {
102037
102192
  const notify = (job) => {
102038
102193
  if (current(job)) options2.onChange(job.artifact);
102039
102194
  };
102040
- const cacheDir = import_node_path26.default.join(options2.stateDir, "recordings");
102195
+ const cacheDir = import_node_path27.default.join(options2.stateDir, "recordings");
102041
102196
  async function process2(job) {
102042
102197
  let temporary;
102043
102198
  try {
@@ -102046,7 +102201,7 @@ function createVerifyRecordings(options2) {
102046
102201
  options2.onChange(job.artifact);
102047
102202
  return;
102048
102203
  }
102049
- const bytes = await import_node_fs30.default.promises.readFile(job.file);
102204
+ const bytes = await import_node_fs31.default.promises.readFile(job.file);
102050
102205
  if (!current(job)) return;
102051
102206
  if (stamp2(job.file) !== job.stamp) {
102052
102207
  jobs.delete(job.key);
@@ -102054,22 +102209,22 @@ function createVerifyRecordings(options2) {
102054
102209
  return;
102055
102210
  }
102056
102211
  const key2 = digest2(`${POLICY}:${digest2(bytes)}`);
102057
- const dir = import_node_path26.default.join(cacheDir, key2);
102058
- const output = import_node_path26.default.join(dir, "clip.mp4");
102059
- const metadata = import_node_path26.default.join(dir, "result.json");
102212
+ const dir = import_node_path27.default.join(cacheDir, key2);
102213
+ const output = import_node_path27.default.join(dir, "clip.mp4");
102214
+ const metadata = import_node_path27.default.join(dir, "result.json");
102060
102215
  let cached;
102061
102216
  try {
102062
- const saved = JSON.parse(import_node_fs30.default.readFileSync(metadata, "utf8"));
102063
- if (saved.result.status !== "trimmed" || import_node_fs30.default.existsSync(output) && saved.hash === digest2(import_node_fs30.default.readFileSync(output)))
102217
+ const saved = JSON.parse(import_node_fs31.default.readFileSync(metadata, "utf8"));
102218
+ if (saved.result.status !== "trimmed" || import_node_fs31.default.existsSync(output) && saved.hash === digest2(import_node_fs31.default.readFileSync(output)))
102064
102219
  cached = saved;
102065
102220
  } catch {
102066
102221
  }
102067
102222
  if (!cached) {
102068
- import_node_fs30.default.mkdirSync(cacheDir, { recursive: true });
102069
- temporary = import_node_fs30.default.mkdtempSync(import_node_path26.default.join(cacheDir, ".prepare-"));
102070
- const input = import_node_path26.default.join(temporary, "capture");
102071
- const prepared = import_node_path26.default.join(temporary, "clip.mp4");
102072
- import_node_fs30.default.writeFileSync(input, bytes);
102223
+ import_node_fs31.default.mkdirSync(cacheDir, { recursive: true });
102224
+ temporary = import_node_fs31.default.mkdtempSync(import_node_path27.default.join(cacheDir, ".prepare-"));
102225
+ const input = import_node_path27.default.join(temporary, "capture");
102226
+ const prepared = import_node_path27.default.join(temporary, "clip.mp4");
102227
+ import_node_fs31.default.writeFileSync(input, bytes);
102073
102228
  const result = await (options2.prepare ?? trimRecording)(
102074
102229
  input,
102075
102230
  prepared,
@@ -102081,9 +102236,9 @@ function createVerifyRecordings(options2) {
102081
102236
  options2.onChange(job.artifact);
102082
102237
  return;
102083
102238
  }
102084
- import_node_fs30.default.mkdirSync(dir, { recursive: true });
102085
- const hash2 = result.status === "trimmed" ? digest2(import_node_fs30.default.readFileSync(prepared)) : void 0;
102086
- if (result.status === "trimmed") import_node_fs30.default.copyFileSync(prepared, output);
102239
+ import_node_fs31.default.mkdirSync(dir, { recursive: true });
102240
+ const hash2 = result.status === "trimmed" ? digest2(import_node_fs31.default.readFileSync(prepared)) : void 0;
102241
+ if (result.status === "trimmed") import_node_fs31.default.copyFileSync(prepared, output);
102087
102242
  cached = { result, ...hash2 ? { hash: hash2 } : {} };
102088
102243
  writeJsonAtomic(metadata, cached);
102089
102244
  }
@@ -102116,7 +102271,7 @@ function createVerifyRecordings(options2) {
102116
102271
  };
102117
102272
  notify(job);
102118
102273
  } finally {
102119
- if (temporary) import_node_fs30.default.rmSync(temporary, { recursive: true, force: true });
102274
+ if (temporary) import_node_fs31.default.rmSync(temporary, { recursive: true, force: true });
102120
102275
  }
102121
102276
  }
102122
102277
  function pump() {
@@ -102182,7 +102337,7 @@ function createVerifyRecordings(options2) {
102182
102337
  if (job.state.status === "processing") pending.add(boardId);
102183
102338
  if (job.virtual && job.output) {
102184
102339
  canvas.boards[boardId] = { ...board, file: job.virtual, src: job.virtual };
102185
- versions[job.virtual] = import_node_fs30.default.statSync(job.output).mtimeMs;
102340
+ versions[job.virtual] = import_node_fs31.default.statSync(job.output).mtimeMs;
102186
102341
  }
102187
102342
  }
102188
102343
  for (const job of jobs.values()) if (job.artifact === id2 && !active.has(job.key)) stop(job);
@@ -102211,7 +102366,7 @@ function createVerifyRecordings(options2) {
102211
102366
  continue;
102212
102367
  const original = job.key.slice(id2.length + 1);
102213
102368
  if (!referenced.has(original)) overrides.set(original, null);
102214
- overrides.set(job.virtual, import_node_fs30.default.readFileSync(job.output));
102369
+ overrides.set(job.virtual, import_node_fs31.default.readFileSync(job.output));
102215
102370
  }
102216
102371
  if (overrides.size) overrides.set("canvas.json", Buffer.from(JSON.stringify(payload.canvas)));
102217
102372
  return overrides;
@@ -102251,18 +102406,18 @@ function titleOf(payload) {
102251
102406
  return "Untitled artifact";
102252
102407
  }
102253
102408
  function createServerContext(options2) {
102254
- const root = import_node_path27.default.resolve(options2.root);
102255
- const viewerDir = import_node_path27.default.resolve(options2.viewerDir);
102256
- const runtimeDir = options2.runtimeDir ? import_node_path27.default.resolve(options2.runtimeDir) : null;
102257
- const stateDir = import_node_path27.default.join(root, ".state");
102258
- import_node_fs31.default.mkdirSync(stateDir, { recursive: true, mode: 448 });
102259
- import_node_fs31.default.writeFileSync(import_node_path27.default.join(stateDir, ".gitignore"), "*\n");
102409
+ const root = import_node_path28.default.resolve(options2.root);
102410
+ const viewerDir = import_node_path28.default.resolve(options2.viewerDir);
102411
+ const runtimeDir = options2.runtimeDir ? import_node_path28.default.resolve(options2.runtimeDir) : null;
102412
+ const stateDir = import_node_path28.default.join(root, ".state");
102413
+ import_node_fs32.default.mkdirSync(stateDir, { recursive: true, mode: 448 });
102414
+ import_node_fs32.default.writeFileSync(import_node_path28.default.join(stateDir, ".gitignore"), "*\n");
102260
102415
  if (options2.configFile) ensureConfig(options2.configFile);
102261
- const portFile = import_node_path27.default.join(stateDir, ".last-port");
102262
- const tokenFile = import_node_path27.default.join(stateDir, ".last-token");
102416
+ const portFile = import_node_path28.default.join(stateDir, ".last-port");
102417
+ const tokenFile = import_node_path28.default.join(stateDir, ".last-token");
102263
102418
  const mount = options2.mount;
102264
102419
  const token = mount?.token ?? (readPersisted(tokenFile) || randomToken());
102265
- if (!mount) import_node_fs31.default.writeFileSync(tokenFile, `${token}
102420
+ if (!mount) import_node_fs32.default.writeFileSync(tokenFile, `${token}
102266
102421
  `, { mode: 384 });
102267
102422
  const contentToken = randomToken();
102268
102423
  const loopback = isLoopbackHost(options2.host);
@@ -102296,6 +102451,22 @@ function createServerContext(options2) {
102296
102451
  );
102297
102452
  selections.clearAll();
102298
102453
  const changeListeners = [];
102454
+ const agentStatus = createAgentStatus(root);
102455
+ const agentStatusFrame = () => textFrame(
102456
+ JSON.stringify({
102457
+ type: "agent-status",
102458
+ artifact: "*",
102459
+ sessions: agentStatus.sessions()
102460
+ })
102461
+ );
102462
+ const publishAgentStatus = () => {
102463
+ const frame = agentStatusFrame();
102464
+ for (const socket of clients) socket.write(frame);
102465
+ };
102466
+ changeListeners.push((ref, _payload, files) => {
102467
+ if (agentWrittenFiles(files).length > 0 && agentStatus.touched(`${ref.type}/${ref.id}`))
102468
+ publishAgentStatus();
102469
+ });
102299
102470
  const activityListeners = [];
102300
102471
  const startedAt = Date.now();
102301
102472
  const touch = () => {
@@ -102318,8 +102489,8 @@ function createServerContext(options2) {
102318
102489
  };
102319
102490
  const avatars = createAvatars(options2.fetch);
102320
102491
  const names = commentNames({
102321
- agentFile: import_node_path27.default.join(stateDir, "agent"),
102322
- projectDir: import_node_path27.default.resolve(root, "../.."),
102492
+ agentFile: import_node_path28.default.join(stateDir, "agent"),
102493
+ projectDir: import_node_path28.default.resolve(root, "../.."),
102323
102494
  cloud: options2.cloud
102324
102495
  });
102325
102496
  const recordings = createVerifyRecordings({
@@ -102373,6 +102544,7 @@ function createServerContext(options2) {
102373
102544
  const listeningTimer = setInterval(() => {
102374
102545
  boardComments.refreshListening();
102375
102546
  documents.refreshListening();
102547
+ if (agentStatus.expire(Date.now())) publishAgentStatus();
102376
102548
  }, 3e3);
102377
102549
  listeningTimer.unref();
102378
102550
  const inspect = async (ref) => {
@@ -102414,13 +102586,13 @@ function createServerContext(options2) {
102414
102586
  const cloud = options2.cloud && options2.configFile ? createCloudRoutes({
102415
102587
  ...options2.cloud,
102416
102588
  configFile: options2.configFile,
102417
- project: import_node_path27.default.basename(import_node_path27.default.resolve(root, "../..")),
102589
+ project: import_node_path28.default.basename(import_node_path28.default.resolve(root, "../..")),
102418
102590
  address: (ref) => artifactPath(root, ref.type, ref.id).split("/").pop(),
102419
102591
  references: (ref) => {
102420
102592
  if (ref.type !== "document") return [];
102421
102593
  const dir = resolveArtifactDir(root, "document", ref.id);
102422
- const file = dir ? import_node_path27.default.join(dir, "doc.xml") : null;
102423
- const xml = file && import_node_fs31.default.existsSync(file) ? import_node_fs31.default.readFileSync(file, "utf8") : "";
102594
+ const file = dir ? import_node_path28.default.join(dir, "doc.xml") : null;
102595
+ const xml = file && import_node_fs32.default.existsSync(file) ? import_node_fs32.default.readFileSync(file, "utf8") : "";
102424
102596
  return [...xml.matchAll(REF_ARTBOARD)].map((match) => match[1]).filter((slug) => resolveArtifactDir(root, "artboard", slug) !== null);
102425
102597
  },
102426
102598
  port: () => ctx.port,
@@ -102430,7 +102602,7 @@ function createServerContext(options2) {
102430
102602
  }
102431
102603
  }) : null;
102432
102604
  const autoPublisher = cloud ? createAutoPublisher({
102433
- stateFile: import_node_path27.default.join(stateDir, "auto-publish.json"),
102605
+ stateFile: import_node_path28.default.join(stateDir, "auto-publish.json"),
102434
102606
  enabled: cloud.autoPublishEnabled,
102435
102607
  token: cloud.token,
102436
102608
  publish: async (key2) => {
@@ -102492,7 +102664,7 @@ function createServerContext(options2) {
102492
102664
  );
102493
102665
  if (ref.type === "artboard")
102494
102666
  writeJsonAtomic(
102495
- import_node_path27.default.join(stateDir, "artboard", ref.id, "backlinks.json"),
102667
+ import_node_path28.default.join(stateDir, "artboard", ref.id, "backlinks.json"),
102496
102668
  backlinksOf(ref.id)
102497
102669
  );
102498
102670
  } catch (err) {
@@ -102558,6 +102730,9 @@ function createServerContext(options2) {
102558
102730
  clients,
102559
102731
  selections,
102560
102732
  changeListeners,
102733
+ agentStatus,
102734
+ agentStatusFrame,
102735
+ publishAgentStatus,
102561
102736
  activityListeners,
102562
102737
  relayListeners,
102563
102738
  direct,
@@ -102582,7 +102757,7 @@ function createServerContext(options2) {
102582
102757
  };
102583
102758
  return ctx;
102584
102759
  }
102585
- var projectName = (ctx) => import_node_path27.default.basename(import_node_path27.default.dirname(import_node_path27.default.dirname(ctx.root)));
102760
+ var projectName = (ctx) => import_node_path28.default.basename(import_node_path28.default.dirname(import_node_path28.default.dirname(ctx.root)));
102586
102761
 
102587
102762
  // ../../node_modules/.pnpm/ws@8.18.3/node_modules/ws/wrapper.mjs
102588
102763
  var import_stream = __toESM(require_stream(), 1);
@@ -102730,8 +102905,8 @@ function createRelayClient(options2) {
102730
102905
  }
102731
102906
 
102732
102907
  // src/server/routes/content.ts
102733
- var import_node_fs32 = __toESM(require("node:fs"), 1);
102734
- var import_node_path28 = __toESM(require("node:path"), 1);
102908
+ var import_node_fs33 = __toESM(require("node:fs"), 1);
102909
+ var import_node_path29 = __toESM(require("node:path"), 1);
102735
102910
  function serveContent(ctx, res, rest, range, mode = "main") {
102736
102911
  const { root, runtimeDir, recordings, options: options2 } = ctx;
102737
102912
  if (rest.startsWith("runtime/")) {
@@ -102782,7 +102957,7 @@ function serveContent(ctx, res, rest, range, mode = "main") {
102782
102957
  sendFile(res, target, headers, range);
102783
102958
  return;
102784
102959
  }
102785
- import_node_fs32.default.readFile(target, "utf8", (err, source) => {
102960
+ import_node_fs33.default.readFile(target, "utf8", (err, source) => {
102786
102961
  if (err) send(res, 404, "Not found");
102787
102962
  else {
102788
102963
  const uiRuntimeUrl = runtimeDir ? `${mode === "board" ? "/c/" : ctx.contentPrefix}runtime/ryugi-ui.js` : void 0;
@@ -102818,7 +102993,7 @@ var robotsRoute = {
102818
102993
  path: "/robots.txt",
102819
102994
  auth: "public",
102820
102995
  handle: (_req, res, ctx) => {
102821
- sendFile(res, import_node_path28.default.join(ctx.viewerDir, "robots.txt"));
102996
+ sendFile(res, import_node_path29.default.join(ctx.viewerDir, "robots.txt"));
102822
102997
  }
102823
102998
  };
102824
102999
  var contentRoute = {
@@ -102865,8 +103040,8 @@ var createBoardRequestHandler = (ctx) => (req, res) => {
102865
103040
  };
102866
103041
 
102867
103042
  // src/server/routes/agent.ts
102868
- var import_node_fs33 = __toESM(require("node:fs"), 1);
102869
- var import_node_path29 = __toESM(require("node:path"), 1);
103043
+ var import_node_fs34 = __toESM(require("node:fs"), 1);
103044
+ var import_node_path30 = __toESM(require("node:path"), 1);
102870
103045
 
102871
103046
  // src/server/routes/comments.ts
102872
103047
  var API_BOARD_COMMENTS_ROUTE = /^\/api\/artboard\/([^/]+)\/comments$/;
@@ -102921,7 +103096,7 @@ var CHECK_MERGE_WAIT_MS = 6e4;
102921
103096
  var agentName = (fields) => typeof fields.agent === "string" && fields.agent.length > 0 && fields.agent.length <= 100 ? fields.agent : void 0;
102922
103097
  var blockIdsOf = async (ctx, id2, dir) => {
102923
103098
  await (await ctx.documents.open(id2))?.flush();
102924
- const state2 = parseDocument2(import_node_fs33.default.readFileSync(import_node_path29.default.join(dir, "doc.xml"), "utf8"));
103099
+ const state2 = parseDocument2(import_node_fs34.default.readFileSync(import_node_path30.default.join(dir, "doc.xml"), "utf8"));
102925
103100
  return new Set(
102926
103101
  state2.root.children.flatMap(
102927
103102
  (block) => block.$?.blockId ? [block.$.blockId] : []
@@ -103003,8 +103178,10 @@ function agentAskRequest(fields) {
103003
103178
  }
103004
103179
  function agentVerdictOf(fields) {
103005
103180
  const verdict = fields.verdict;
103006
- if (verdict !== "pass" && verdict !== "reject") throw new Error('verdict needs {verdict: "pass" | "reject"}');
103007
- if (fields.all !== true && !isId(fields.group)) throw new Error("verdict needs {group} or {all: true}");
103181
+ if (verdict !== "pass" && verdict !== "reject")
103182
+ throw new Error('verdict needs {verdict: "pass" | "reject"}');
103183
+ if (fields.all !== true && !isId(fields.group))
103184
+ throw new Error("verdict needs {group} or {all: true}");
103008
103185
  const text4 = typeof fields.text === "string" ? fields.text.trim() : "";
103009
103186
  if (verdict === "reject" && !text4) throw new Error("a reject needs a reason: pass {text}");
103010
103187
  return {
@@ -103096,7 +103273,7 @@ async function serveAgentCheck(res, ctx, type, id2) {
103096
103273
  let merging = false;
103097
103274
  if (ref.type === "document") {
103098
103275
  const session = await documents.open(ref.id);
103099
- const text4 = await import_node_fs33.default.promises.readFile(import_node_path29.default.join(dir, "doc.xml"), "utf8").catch(() => null);
103276
+ const text4 = await import_node_fs34.default.promises.readFile(import_node_path30.default.join(dir, "doc.xml"), "utf8").catch(() => null);
103100
103277
  if (session && text4 !== null) {
103101
103278
  session.onFileText(text4);
103102
103279
  const timeout = new Promise(
@@ -103106,14 +103283,20 @@ async function serveAgentCheck(res, ctx, type, id2) {
103106
103283
  }
103107
103284
  }
103108
103285
  const payload = ctx.writeState(ref, dir);
103109
- const state2 = JSON.parse(await import_node_fs33.default.promises.readFile(import_node_path29.default.join(stateDir, ref.type, ref.id, "warnings.json"), "utf8"));
103286
+ const state2 = JSON.parse(
103287
+ await import_node_fs34.default.promises.readFile(import_node_path30.default.join(stateDir, ref.type, ref.id, "warnings.json"), "utf8")
103288
+ );
103110
103289
  const dynamic = Object.values(state2.dynamic ?? {});
103111
103290
  const required = ref.type === "html" || dynamic.length > 0 || ref.type === "artboard" && "canvas" in payload && Object.values(payload.canvas?.boards ?? {}).some((board) => !isMediaBoard(board));
103112
103291
  const observed = ref.type === "html" ? state2.ran : dynamic.length ? dynamic.every((block) => block.ran === true) : required ? void 0 : true;
103113
103292
  sendJson(res, 200, {
103114
103293
  ...state2,
103115
103294
  ...merging ? { merging: true } : {},
103116
- evidence: { required, observed, fresh: !merging && signatures.get(key2) === artifactSignature(dir, ref.type) }
103295
+ evidence: {
103296
+ required,
103297
+ observed,
103298
+ fresh: !merging && signatures.get(key2) === artifactSignature(dir, ref.type)
103299
+ }
103117
103300
  });
103118
103301
  }
103119
103302
  async function serveAgentChanges(req, res, ctx, id2) {
@@ -103123,7 +103306,11 @@ async function serveAgentChanges(req, res, ctx, id2) {
103123
103306
  }
103124
103307
  const body = await readCommentBody(req);
103125
103308
  const fields = typeof body === "object" && body !== null ? body : {};
103126
- const changes = await ctx.documents.changes(id2, agentName(fields) ?? "Agent", fields.all === true);
103309
+ const changes = await ctx.documents.changes(
103310
+ id2,
103311
+ agentName(fields) ?? "Agent",
103312
+ fields.all === true
103313
+ );
103127
103314
  if (!changes) {
103128
103315
  sendJson(res, 404, { error: `document/${id2} not found` });
103129
103316
  return;
@@ -103154,6 +103341,28 @@ var agentCheckRoute = {
103154
103341
  auth: "agent",
103155
103342
  handle: (_req, res, ctx, { match }) => serveAgentCheck(res, ctx, match[1], match[2])
103156
103343
  };
103344
+ var isAgentEvent = (value) => {
103345
+ if (typeof value !== "object" || value === null) return false;
103346
+ const event = value;
103347
+ const text4 = (field, max) => typeof field === "string" && field.length > 0 && field.length <= max;
103348
+ return (event.host === "claude" || event.host === "codex") && text4(event.session, 200) && text4(event.event, 64) && typeof event.at === "number" && Number.isFinite(event.at) && (event.tool === void 0 || text4(event.tool, 64)) && (event.paths === void 0 || Array.isArray(event.paths) && event.paths.length <= 64 && event.paths.every((file) => text4(file, 4096)));
103349
+ };
103350
+ var agentEventRoute = {
103351
+ path: "/api/agent/event",
103352
+ methods: ["POST"],
103353
+ auth: "agent",
103354
+ handle: async (req, res, ctx) => {
103355
+ const body = await readCommentBody(req);
103356
+ if (!isAgentEvent(body)) {
103357
+ sendJson(res, 400, {
103358
+ error: "not an agent event: need host, session, event, at and optional paths"
103359
+ });
103360
+ return;
103361
+ }
103362
+ if (ctx.agentStatus.apply(body)) ctx.publishAgentStatus();
103363
+ send(res, 204, "");
103364
+ }
103365
+ };
103157
103366
 
103158
103367
  // src/server/routes/agent-review.ts
103159
103368
  var schema = "ryugi.review/v1";
@@ -103178,7 +103387,9 @@ function options(body, artifact) {
103178
103387
  }
103179
103388
  async function threads(ctx, type, id2, input) {
103180
103389
  if (type === "document") {
103181
- const views2 = new Map(ctx.documents.listComments(id2, input.agent, true).map((thread) => [thread.id, thread]));
103390
+ const views2 = new Map(
103391
+ ctx.documents.listComments(id2, input.agent, true).map((thread) => [thread.id, thread])
103392
+ );
103182
103393
  const file2 = ctx.documents.comments(id2);
103183
103394
  return ctx.agentReview.threads({
103184
103395
  ...input,
@@ -103189,7 +103400,9 @@ async function threads(ctx, type, id2, input) {
103189
103400
  }))
103190
103401
  });
103191
103402
  }
103192
- const views = new Map(ctx.boardComments.list(id2, input.agent, true).map((thread) => [thread.id, thread]));
103403
+ const views = new Map(
103404
+ ctx.boardComments.list(id2, input.agent, true).map((thread) => [thread.id, thread])
103405
+ );
103193
103406
  const file = ctx.boardComments.comments(id2);
103194
103407
  return ctx.agentReview.threads({
103195
103408
  ...input,
@@ -103202,7 +103415,8 @@ async function threads(ctx, type, id2, input) {
103202
103415
  }
103203
103416
  async function state(ctx, type, id2, input, section) {
103204
103417
  let items = [];
103205
- if (section === "asks" && type === "document") items = (await ctx.documents.asks(id2)).asks.map((ask) => ({ ...ask }));
103418
+ if (section === "asks" && type === "document")
103419
+ items = (await ctx.documents.asks(id2)).asks.map((ask) => ({ ...ask }));
103206
103420
  else if (section === "groups" && type === "artboard")
103207
103421
  items = ctx.boardComments.groups(id2).map((group) => ({ ...group }));
103208
103422
  else if (section === "rounds" && type === "artboard")
@@ -103238,9 +103452,13 @@ async function serve(req, res, ctx, type, id2, operation) {
103238
103452
  return;
103239
103453
  }
103240
103454
  if (operation === "changes") {
103241
- if (type !== "document") throw new ReviewError("E_ARGUMENT_INVALID", "Changes apply to documents only.");
103455
+ if (type !== "document")
103456
+ throw new ReviewError("E_ARGUMENT_INVALID", "Changes apply to documents only.");
103242
103457
  if (input.detail && (input.limit !== void 0 || input.cursor || input.fields))
103243
- throw new ReviewError("E_ARGUMENT_INVALID", "A complete diff cannot use pagination or fields.");
103458
+ throw new ReviewError(
103459
+ "E_ARGUMENT_INVALID",
103460
+ "A complete diff cannot use pagination or fields."
103461
+ );
103244
103462
  const session = await ctx.documents.open(id2);
103245
103463
  if (!session) throw new ReviewError("E_ARTIFACT_NOT_FOUND", "Document not found.", 404);
103246
103464
  const value = await ctx.agentReview.changes({
@@ -103253,7 +103471,26 @@ async function serve(req, res, ctx, type, id2, operation) {
103253
103471
  const section = body.op === "read" ? "threads" : text2(body.section);
103254
103472
  if (body.op !== "list" && body.op !== "read")
103255
103473
  throw new ReviewError("E_ARGUMENT_INVALID", "Expected list, read or ack.");
103256
- if (body.op === "read" && !input.thread) throw new ReviewError("E_ARGUMENT_INVALID", "A thread ID is required.");
103474
+ if (body.op === "read" && !input.thread)
103475
+ throw new ReviewError("E_ARGUMENT_INVALID", "A thread ID is required.");
103476
+ if (body.sections !== void 0) {
103477
+ if (body.op !== "list" || !Array.isArray(body.sections) || !body.sections.every((item2) => typeof item2 === "string"))
103478
+ throw new ReviewError(
103479
+ "E_ARGUMENT_INVALID",
103480
+ "sections requires a list of collection names and op=list."
103481
+ );
103482
+ const error = validateReviewBundle(
103483
+ { ...input, section, sections: body.sections },
103484
+ input.artifact
103485
+ );
103486
+ if (error) throw new ReviewError("E_ARGUMENT_INVALID", error);
103487
+ const sections = {};
103488
+ for (const name of body.sections) {
103489
+ sections[name] = name === "threads" ? await threads(ctx, type, id2, input) : await state(ctx, type, id2, input, name);
103490
+ }
103491
+ sendJson(res, 200, { schema, artifact: input.artifact, sections });
103492
+ return;
103493
+ }
103257
103494
  validateSection(input, section);
103258
103495
  if (section === "threads")
103259
103496
  sendJson(res, 200, {
@@ -103787,6 +104024,7 @@ var clientSocketRoute = {
103787
104024
  handle: (_req, socket, ctx, { clientKey }) => {
103788
104025
  completeHandshake(socket, clientKey);
103789
104026
  ctx.clients.add(socket);
104027
+ socket.write(ctx.agentStatusFrame());
103790
104028
  handleClientFrames(socket, (text4) => onClientText(ctx, socket, text4));
103791
104029
  const forget = () => {
103792
104030
  ctx.clients.delete(socket);
@@ -103803,8 +104041,8 @@ var clientSocketRoute = {
103803
104041
  };
103804
104042
 
103805
104043
  // src/server/routes/viewer.ts
103806
- var import_node_fs34 = __toESM(require("node:fs"), 1);
103807
- var import_node_path30 = __toESM(require("node:path"), 1);
104044
+ var import_node_fs35 = __toESM(require("node:fs"), 1);
104045
+ var import_node_path31 = __toESM(require("node:path"), 1);
103808
104046
 
103809
104047
  // src/shared/type-icons.ts
103810
104048
  var TYPE_GLYPHS = {
@@ -103924,8 +104162,8 @@ function serveShell(req, res, ctx, { pathname, key: key2 }, embedded) {
103924
104162
  if (ref) headers["Referrer-Policy"] = "same-origin";
103925
104163
  if (key2 !== null && !loopback)
103926
104164
  headers["Set-Cookie"] = `${ctx.cookieName}=${ctx.token}; HttpOnly; SameSite=Strict; Path=/`;
103927
- const entry = preview2 && import_node_fs34.default.existsSync(import_node_path30.default.join(viewerDir, "preview.html")) ? "preview.html" : "index.html";
103928
- void import_node_fs34.default.promises.readFile(import_node_path30.default.join(viewerDir, entry), "utf8").then((template) => {
104165
+ const entry = preview2 && import_node_fs35.default.existsSync(import_node_path31.default.join(viewerDir, "preview.html")) ? "preview.html" : "index.html";
104166
+ void import_node_fs35.default.promises.readFile(import_node_path31.default.join(viewerDir, entry), "utf8").then((template) => {
103929
104167
  const html = viewerPage(template, {
103930
104168
  title,
103931
104169
  description,
@@ -103994,6 +104232,7 @@ var HTTP_ROUTES = [
103994
104232
  agentChangesRoute,
103995
104233
  agentBoardCommentsRoute,
103996
104234
  agentCheckRoute,
104235
+ agentEventRoute,
103997
104236
  boardCommentsRoute,
103998
104237
  documentStateRoute,
103999
104238
  documentWriteRoute,
@@ -104141,7 +104380,7 @@ async function startArtifactsServer(options2) {
104141
104380
  } catch {
104142
104381
  ctx.port = await listen(server, options2.host, 0);
104143
104382
  }
104144
- import_node_fs35.default.writeFileSync(ctx.portFile, `${ctx.port}
104383
+ import_node_fs36.default.writeFileSync(ctx.portFile, `${ctx.port}
104145
104384
  `, { mode: 384 });
104146
104385
  }
104147
104386
  const port = ctx.port;
@@ -104150,7 +104389,7 @@ async function startArtifactsServer(options2) {
104150
104389
  const boardServer = import_node_http.default.createServer(handleBoardRequest);
104151
104390
  if (mount) ctx.boardPort = mount.boardPort;
104152
104391
  else if (loopback) {
104153
- const boardPortFile = import_node_path31.default.join(stateDir, BOARD_PORT_FILE);
104392
+ const boardPortFile = import_node_path32.default.join(stateDir, BOARD_PORT_FILE);
104154
104393
  const previousBoardPort = Number(readPersisted(boardPortFile));
104155
104394
  try {
104156
104395
  ctx.boardPort = await listen(
@@ -104161,7 +104400,7 @@ async function startArtifactsServer(options2) {
104161
104400
  } catch {
104162
104401
  ctx.boardPort = await listen(boardServer, options2.host, 0);
104163
104402
  }
104164
- import_node_fs35.default.writeFileSync(boardPortFile, `${ctx.boardPort}
104403
+ import_node_fs36.default.writeFileSync(boardPortFile, `${ctx.boardPort}
104165
104404
  `, { mode: 384 });
104166
104405
  }
104167
104406
  const boardPort = ctx.boardPort;
@@ -104180,7 +104419,7 @@ async function startArtifactsServer(options2) {
104180
104419
  initialChanges.push({ ref: entry, payload, files: [] });
104181
104420
  if (entry.type === "document") void ctx.documents.open(entry.id);
104182
104421
  }
104183
- writeJsonAtomic(import_node_path31.default.join(stateDir, "server-info"), {
104422
+ writeJsonAtomic(import_node_path32.default.join(stateDir, "server-info"), {
104184
104423
  type: "server-started",
104185
104424
  url,
104186
104425
  port,
@@ -104263,66 +104502,66 @@ async function startArtifactsServer(options2) {
104263
104502
  server.closeAllConnections();
104264
104503
  });
104265
104504
  await ctx.documents.close().catch(() => void 0);
104266
- if (mount) import_node_fs35.default.rmSync(import_node_path31.default.join(stateDir, "server-info"), { force: true });
104505
+ if (mount) import_node_fs36.default.rmSync(import_node_path32.default.join(stateDir, "server-info"), { force: true });
104267
104506
  }
104268
104507
  };
104269
104508
  }
104270
104509
  var mountArtifactsProject = (options2) => startArtifactsServer(options2);
104271
104510
 
104272
104511
  // src/server/artifact-index.ts
104273
- var import_node_fs37 = __toESM(require("node:fs"), 1);
104274
- var import_node_path33 = __toESM(require("node:path"), 1);
104512
+ var import_node_fs38 = __toESM(require("node:fs"), 1);
104513
+ var import_node_path34 = __toESM(require("node:path"), 1);
104275
104514
 
104276
104515
  // src/server/machine.ts
104277
- var import_node_fs36 = __toESM(require("node:fs"), 1);
104516
+ var import_node_fs37 = __toESM(require("node:fs"), 1);
104278
104517
  var import_node_os = __toESM(require("node:os"), 1);
104279
- var import_node_path32 = __toESM(require("node:path"), 1);
104518
+ var import_node_path33 = __toESM(require("node:path"), 1);
104280
104519
  var DORMANT_AFTER_MS = 7 * 24 * 60 * 60 * 1e3;
104281
104520
  function machinePaths(env = process.env, homedir = import_node_os.default.homedir()) {
104282
- const home = env.RYUGI_SERVER_HOME || import_node_path32.default.join(homedir, ".ryugi", "server");
104521
+ const home = env.RYUGI_SERVER_HOME || import_node_path33.default.join(homedir, ".ryugi", "server");
104283
104522
  return {
104284
104523
  home,
104285
- pid: import_node_path32.default.join(home, "server.pid"),
104286
- serverId: import_node_path32.default.join(home, "server-instance-id"),
104287
- info: import_node_path32.default.join(home, "server-info"),
104288
- log: import_node_path32.default.join(home, "server.log"),
104289
- version: import_node_path32.default.join(home, "server-version"),
104290
- lock: import_node_path32.default.join(home, "start.lock"),
104291
- key: import_node_path32.default.join(home, "key"),
104292
- projects: import_node_path32.default.join(home, "projects.json"),
104293
- settings: import_node_path32.default.join(home, "settings.json"),
104294
- stopped: import_node_path32.default.join(home, "server-stopped")
104524
+ pid: import_node_path33.default.join(home, "server.pid"),
104525
+ serverId: import_node_path33.default.join(home, "server-instance-id"),
104526
+ info: import_node_path33.default.join(home, "server-info"),
104527
+ log: import_node_path33.default.join(home, "server.log"),
104528
+ version: import_node_path33.default.join(home, "server-version"),
104529
+ lock: import_node_path33.default.join(home, "start.lock"),
104530
+ key: import_node_path33.default.join(home, "key"),
104531
+ projects: import_node_path33.default.join(home, "projects.json"),
104532
+ settings: import_node_path33.default.join(home, "settings.json"),
104533
+ stopped: import_node_path33.default.join(home, "server-stopped")
104295
104534
  };
104296
104535
  }
104297
104536
  function ensureHome(home) {
104298
- import_node_fs36.default.mkdirSync(home, { recursive: true, mode: 448 });
104299
- import_node_fs36.default.chmodSync(home, 448);
104537
+ import_node_fs37.default.mkdirSync(home, { recursive: true, mode: 448 });
104538
+ import_node_fs37.default.chmodSync(home, 448);
104300
104539
  }
104301
104540
  var realDir = (dir) => {
104302
104541
  try {
104303
- return import_node_fs36.default.realpathSync(import_node_path32.default.resolve(dir));
104542
+ return import_node_fs37.default.realpathSync(import_node_path33.default.resolve(dir));
104304
104543
  } catch {
104305
- return import_node_path32.default.resolve(dir);
104544
+ return import_node_path33.default.resolve(dir);
104306
104545
  }
104307
104546
  };
104308
104547
  var validEntry = (value) => {
104309
104548
  const entry = value;
104310
- return !!entry && typeof entry.dir === "string" && import_node_path32.default.isAbsolute(entry.dir) && Number.isFinite(entry.registeredAt) && Number.isFinite(entry.lastUsedAt);
104549
+ return !!entry && typeof entry.dir === "string" && import_node_path33.default.isAbsolute(entry.dir) && Number.isFinite(entry.registeredAt) && Number.isFinite(entry.lastUsedAt);
104311
104550
  };
104312
104551
  function readProjects(file) {
104313
104552
  try {
104314
- const value = JSON.parse(import_node_fs36.default.readFileSync(file, "utf8"));
104553
+ const value = JSON.parse(import_node_fs37.default.readFileSync(file, "utf8"));
104315
104554
  return Array.isArray(value.projects) ? value.projects.filter(validEntry) : [];
104316
104555
  } catch {
104317
104556
  return [];
104318
104557
  }
104319
104558
  }
104320
104559
  function writeProjects(file, projects) {
104321
- ensureHome(import_node_path32.default.dirname(file));
104560
+ ensureHome(import_node_path33.default.dirname(file));
104322
104561
  const tmp = `${file}.${process.pid}.tmp`;
104323
- import_node_fs36.default.writeFileSync(tmp, `${JSON.stringify({ projects }, null, 2)}
104562
+ import_node_fs37.default.writeFileSync(tmp, `${JSON.stringify({ projects }, null, 2)}
104324
104563
  `, { mode: 384 });
104325
- import_node_fs36.default.renameSync(tmp, file);
104564
+ import_node_fs37.default.renameSync(tmp, file);
104326
104565
  }
104327
104566
  function registerProject(file, projectDir, now = Date.now()) {
104328
104567
  const dir = realDir(projectDir);
@@ -104339,10 +104578,10 @@ function removeProject(file, projectDir) {
104339
104578
  const kept = projects.filter((entry) => entry.dir !== dir);
104340
104579
  if (kept.length !== projects.length) writeProjects(file, kept);
104341
104580
  }
104342
- var artifactsRootOf = (projectDir) => import_node_path32.default.join(projectDir, ".ryugi", "artifacts");
104581
+ var artifactsRootOf = (projectDir) => import_node_path33.default.join(projectDir, ".ryugi", "artifacts");
104343
104582
  function pruneProjects(file) {
104344
104583
  const projects = readProjects(file);
104345
- const kept = projects.filter((entry) => import_node_fs36.default.existsSync(artifactsRootOf(entry.dir)));
104584
+ const kept = projects.filter((entry) => import_node_fs37.default.existsSync(artifactsRootOf(entry.dir)));
104346
104585
  if (kept.length !== projects.length) writeProjects(file, kept);
104347
104586
  return kept;
104348
104587
  }
@@ -104351,7 +104590,7 @@ var isDormant = (entry, now = Date.now()) => now - entry.lastUsedAt > DORMANT_AF
104351
104590
  // src/server/artifact-index.ts
104352
104591
  var readAddress = (dir) => {
104353
104592
  try {
104354
- const value = import_node_fs37.default.readFileSync(import_node_path33.default.join(dir, ".artifact-id"), "utf8").trim();
104593
+ const value = import_node_fs38.default.readFileSync(import_node_path34.default.join(dir, ".artifact-id"), "utf8").trim();
104355
104594
  return isArtifactAddress(value) ? value : null;
104356
104595
  } catch {
104357
104596
  return null;
@@ -104359,7 +104598,7 @@ var readAddress = (dir) => {
104359
104598
  };
104360
104599
  var mtimeOf2 = (dir) => {
104361
104600
  try {
104362
- return import_node_fs37.default.statSync(dir).mtimeMs;
104601
+ return import_node_fs38.default.statSync(dir).mtimeMs;
104363
104602
  } catch {
104364
104603
  return 0;
104365
104604
  }
@@ -104458,7 +104697,7 @@ var ARTIFACT_KEY = /^(?:artboard|document|html)\/[a-z0-9][a-z0-9-]*$/;
104458
104697
  var SEP = "\n";
104459
104698
  var realDir2 = (dir) => {
104460
104699
  try {
104461
- return import_node_fs38.default.realpathSync(import_node_path34.default.resolve(dir));
104700
+ return import_node_fs39.default.realpathSync(import_node_path35.default.resolve(dir));
104462
104701
  } catch {
104463
104702
  return null;
104464
104703
  }
@@ -104516,7 +104755,7 @@ async function startHub(options2) {
104516
104755
  runtimeDir: options2.runtimeDir,
104517
104756
  host: options2.host,
104518
104757
  urlHost: options2.urlHost,
104519
- configFile: import_node_path34.default.join(project, ".ryugi", "config.json"),
104758
+ configFile: import_node_path35.default.join(project, ".ryugi", "config.json"),
104520
104759
  cloud: options2.cloud,
104521
104760
  fetch: options2.fetch,
104522
104761
  debounceMs: options2.debounceMs,
@@ -104531,7 +104770,7 @@ async function startHub(options2) {
104531
104770
  }
104532
104771
  return pending;
104533
104772
  };
104534
- const configFileOf = (project) => import_node_path34.default.join(project, ".ryugi", "config.json");
104773
+ const configFileOf = (project) => import_node_path35.default.join(project, ".ryugi", "config.json");
104535
104774
  const servedBy = (project) => {
104536
104775
  const mounted = ready.get(project);
104537
104776
  if (mounted) return mounted.served();
@@ -104578,10 +104817,10 @@ async function startHub(options2) {
104578
104817
  }) : null;
104579
104818
  const origin = `http://${urlHostForHttp(options2.urlHost)}:${port}`;
104580
104819
  const url = loopback ? `${origin}/` : `${origin}/?key=${options2.token}`;
104581
- const infoFileOf = (project) => import_node_path34.default.join(artifactsRootOf(project), ".state", "server-info");
104820
+ const infoFileOf = (project) => import_node_path35.default.join(artifactsRootOf(project), ".state", "server-info");
104582
104821
  const writeCompatInfo = (project) => {
104583
104822
  try {
104584
- import_node_fs38.default.mkdirSync(import_node_path34.default.dirname(infoFileOf(project)), { recursive: true, mode: 448 });
104823
+ import_node_fs39.default.mkdirSync(import_node_path35.default.dirname(infoFileOf(project)), { recursive: true, mode: 448 });
104585
104824
  writeJsonAtomic(infoFileOf(project), {
104586
104825
  type: "server-started",
104587
104826
  url,
@@ -104600,7 +104839,7 @@ async function startHub(options2) {
104600
104839
  counts.set(entry.project, (counts.get(entry.project) ?? 0) + 1);
104601
104840
  return ordered2().map((entry) => ({
104602
104841
  dir: entry.dir,
104603
- name: import_node_path34.default.basename(entry.dir),
104842
+ name: import_node_path35.default.basename(entry.dir),
104604
104843
  lastUsedAt: entry.lastUsedAt,
104605
104844
  dormant: isDormant(entry),
104606
104845
  artifacts: counts.get(entry.dir) ?? 0
@@ -104613,7 +104852,7 @@ async function startHub(options2) {
104613
104852
  const root = artifactsRootOf(entry.dir);
104614
104853
  const listed = listArtifacts(root);
104615
104854
  for (const warning of listed.warnings)
104616
- warnings.push(`${import_node_path34.default.basename(entry.dir)}: ${warning}`);
104855
+ warnings.push(`${import_node_path35.default.basename(entry.dir)}: ${warning}`);
104617
104856
  for (const artifact of listed.artifacts) {
104618
104857
  try {
104619
104858
  artifacts.push({
@@ -104664,7 +104903,7 @@ async function startHub(options2) {
104664
104903
  };
104665
104904
  const publishedIn = (project, cloudId) => {
104666
104905
  try {
104667
- const { artifacts } = readConfig(import_node_path34.default.join(project, ".ryugi", "config.json")).config;
104906
+ const { artifacts } = readConfig(import_node_path35.default.join(project, ".ryugi", "config.json")).config;
104668
104907
  return Object.values(artifacts).some((entry) => entry.cloud?.id === cloudId);
104669
104908
  } catch {
104670
104909
  return false;
@@ -104727,7 +104966,7 @@ async function startHub(options2) {
104727
104966
  const register = async (dir, open) => {
104728
104967
  const real = realDir2(dir);
104729
104968
  if (!real) throw new Error(`Project directory not found: ${dir}`);
104730
- import_node_fs38.default.mkdirSync(artifactsRootOf(real), { recursive: true });
104969
+ import_node_fs39.default.mkdirSync(artifactsRootOf(real), { recursive: true });
104731
104970
  const entry = registerProject(projectsFile, real);
104732
104971
  index.rescan();
104733
104972
  writeCompatInfo(real);
@@ -104737,10 +104976,10 @@ async function startHub(options2) {
104737
104976
  return entry;
104738
104977
  };
104739
104978
  const remove2 = async (dir) => {
104740
- const real = realDir2(dir) ?? import_node_path34.default.resolve(dir);
104979
+ const real = realDir2(dir) ?? import_node_path35.default.resolve(dir);
104741
104980
  removeProject(projectsFile, real);
104742
104981
  index.rescan();
104743
- import_node_fs38.default.rmSync(infoFileOf(real), { force: true });
104982
+ import_node_fs39.default.rmSync(infoFileOf(real), { force: true });
104744
104983
  const pending = mounts.get(real);
104745
104984
  mounts.delete(real);
104746
104985
  ready.delete(real);
@@ -104748,17 +104987,17 @@ async function startHub(options2) {
104748
104987
  };
104749
104988
  const logTail = (project) => {
104750
104989
  try {
104751
- const fd2 = import_node_fs38.default.openSync(options2.paths.log, "r");
104990
+ const fd2 = import_node_fs39.default.openSync(options2.paths.log, "r");
104752
104991
  try {
104753
- const size = import_node_fs38.default.fstatSync(fd2).size;
104992
+ const size = import_node_fs39.default.fstatSync(fd2).size;
104754
104993
  const length = Math.min(size, LOG_TAIL_BYTES);
104755
104994
  const buffer = Buffer.alloc(length);
104756
- import_node_fs38.default.readSync(fd2, buffer, 0, length, size - length);
104995
+ import_node_fs39.default.readSync(fd2, buffer, 0, length, size - length);
104757
104996
  const lines = buffer.toString("utf8").split("\n").filter(Boolean);
104758
104997
  if (length < size) lines.shift();
104759
104998
  return lines.filter((line) => !project || line.includes(project)).slice(-LOG_TAIL_LINES);
104760
104999
  } finally {
104761
- import_node_fs38.default.closeSync(fd2);
105000
+ import_node_fs39.default.closeSync(fd2);
104762
105001
  }
104763
105002
  } catch {
104764
105003
  return [];
@@ -104895,7 +105134,7 @@ async function startHub(options2) {
104895
105134
  mounts.clear();
104896
105135
  ready.clear();
104897
105136
  await Promise.all(all.map(async (pending) => (await pending.catch(() => null))?.close()));
104898
- for (const entry of ordered2()) import_node_fs38.default.rmSync(infoFileOf(entry.dir), { force: true });
105137
+ for (const entry of ordered2()) import_node_fs39.default.rmSync(infoFileOf(entry.dir), { force: true });
104899
105138
  for (const server of [front, board]) server.closeAllConnections();
104900
105139
  await Promise.all(stopped);
104901
105140
  }
@@ -104904,8 +105143,8 @@ async function startHub(options2) {
104904
105143
 
104905
105144
  // src/server/relaunch.ts
104906
105145
  var import_node_child_process4 = require("node:child_process");
104907
- var import_node_fs39 = __toESM(require("node:fs"), 1);
104908
- var import_node_path35 = __toESM(require("node:path"), 1);
105146
+ var import_node_fs40 = __toESM(require("node:fs"), 1);
105147
+ var import_node_path36 = __toESM(require("node:path"), 1);
104909
105148
  var LAUNCHER_COMMAND = /^node "(.+)"$/;
104910
105149
  var WAIT_THEN_RUN = `
104911
105150
  const [pid, file, ...args] = process.argv.slice(1);
@@ -104919,20 +105158,20 @@ tick();
104919
105158
  function relaunchCommand(env, serverDir) {
104920
105159
  const launcher = LAUNCHER_COMMAND.exec(env.RYUGI_ARTIFACTS_LAUNCHER ?? "")?.[1];
104921
105160
  if (launcher) return [process.execPath, launcher];
104922
- const cli = import_node_path35.default.join(serverDir, "cli.cjs");
104923
- return import_node_fs39.default.existsSync(cli) ? [process.execPath, cli] : null;
105161
+ const cli = import_node_path36.default.join(serverDir, "cli.cjs");
105162
+ return import_node_fs40.default.existsSync(cli) ? [process.execPath, cli] : null;
104924
105163
  }
104925
105164
  function pinLauncherRelease(env, homedir, version2, now = Date.now()) {
104926
- const releases = import_node_path35.default.join(
104927
- env.XDG_CACHE_HOME || import_node_path35.default.join(homedir, ".cache"),
105165
+ const releases = import_node_path36.default.join(
105166
+ env.XDG_CACHE_HOME || import_node_path36.default.join(homedir, ".cache"),
104928
105167
  "ryugi",
104929
105168
  "artifacts"
104930
105169
  );
104931
- import_node_fs39.default.mkdirSync(releases, { recursive: true });
104932
- const file = import_node_path35.default.join(releases, "latest.json");
105170
+ import_node_fs40.default.mkdirSync(releases, { recursive: true });
105171
+ const file = import_node_path36.default.join(releases, "latest.json");
104933
105172
  const tmp = `${file}.${process.pid}`;
104934
- import_node_fs39.default.writeFileSync(tmp, JSON.stringify({ version: version2, checkedAt: now }));
104935
- import_node_fs39.default.renameSync(tmp, file);
105173
+ import_node_fs40.default.writeFileSync(tmp, JSON.stringify({ version: version2, checkedAt: now }));
105174
+ import_node_fs40.default.renameSync(tmp, file);
104936
105175
  }
104937
105176
  function spawnAfterExit(pid, argv, env = process.env) {
104938
105177
  const [file, ...args] = argv;
@@ -104946,7 +105185,7 @@ function spawnAfterExit(pid, argv, env = process.env) {
104946
105185
  }
104947
105186
 
104948
105187
  // src/server/update-check.ts
104949
- var import_node_fs40 = __toESM(require("node:fs"), 1);
105188
+ var import_node_fs41 = __toESM(require("node:fs"), 1);
104950
105189
  var REGISTRY_URL = "https://registry.npmjs.org/ryugi-artifacts/latest";
104951
105190
  var DAY_MS = 24 * 60 * 60 * 1e3;
104952
105191
  var TIMEOUT_MS2 = 5e3;
@@ -104961,7 +105200,7 @@ function newerVersion(candidate, current) {
104961
105200
  }
104962
105201
  function readCache(file) {
104963
105202
  try {
104964
- const value = JSON.parse(import_node_fs40.default.readFileSync(file, "utf8"));
105203
+ const value = JSON.parse(import_node_fs41.default.readFileSync(file, "utf8"));
104965
105204
  return typeof value.version === "string" && Number.isFinite(value.checkedAt) ? value : null;
104966
105205
  } catch {
104967
105206
  return null;
@@ -104985,7 +105224,7 @@ function createUpdateCheck(options2) {
104985
105224
  const { version: version2 } = await res.json();
104986
105225
  if (typeof version2 !== "string") return;
104987
105226
  cached = { version: version2, checkedAt: now() };
104988
- import_node_fs40.default.writeFileSync(options2.cacheFile, `${JSON.stringify(cached)}
105227
+ import_node_fs41.default.writeFileSync(options2.cacheFile, `${JSON.stringify(cached)}
104989
105228
  `, { mode: 384 });
104990
105229
  } catch {
104991
105230
  }
@@ -104997,12 +105236,12 @@ function createUpdateCheck(options2) {
104997
105236
  var UPDATE_POLL_MS = 60 * 60 * 1e3;
104998
105237
  function machineKey(file) {
104999
105238
  try {
105000
- const key3 = import_node_fs41.default.readFileSync(file, "utf8").trim();
105239
+ const key3 = import_node_fs42.default.readFileSync(file, "utf8").trim();
105001
105240
  if (/^[a-f0-9]{48}$/.test(key3)) return key3;
105002
105241
  } catch {
105003
105242
  }
105004
105243
  const key2 = import_node_crypto13.default.randomBytes(24).toString("hex");
105005
- import_node_fs41.default.writeFileSync(file, `${key2}
105244
+ import_node_fs42.default.writeFileSync(file, `${key2}
105006
105245
  `, { mode: 384 });
105007
105246
  return key2;
105008
105247
  }
@@ -105011,14 +105250,14 @@ async function main() {
105011
105250
  const paths = machinePaths();
105012
105251
  ensureHome(paths.home);
105013
105252
  const updates = createUpdateCheck({
105014
- cacheFile: import_node_path36.default.join(paths.home, "latest.json"),
105253
+ cacheFile: import_node_path37.default.join(paths.home, "latest.json"),
105015
105254
  current: version
105016
105255
  });
105017
105256
  const hub = await startHub({
105018
105257
  host: config.host,
105019
105258
  urlHost: config.urlHost,
105020
- viewerDir: import_node_path36.default.join(__dirname, "viewer"),
105021
- runtimeDir: import_node_path36.default.join(__dirname, "runtime"),
105259
+ viewerDir: import_node_path37.default.join(__dirname, "viewer"),
105260
+ runtimeDir: import_node_path37.default.join(__dirname, "runtime"),
105022
105261
  ports: config.ports,
105023
105262
  boardPorts: config.boardPorts,
105024
105263
  paths,
@@ -105055,14 +105294,14 @@ async function main() {
105055
105294
  if (stopping) return;
105056
105295
  stopping = true;
105057
105296
  console.info(JSON.stringify({ type: "server-stopped", reason, at: (/* @__PURE__ */ new Date()).toISOString() }));
105058
- import_node_fs41.default.rmSync(paths.info, { force: true });
105297
+ import_node_fs42.default.rmSync(paths.info, { force: true });
105059
105298
  if (intended) writeJsonAtomic(paths.stopped, { reason, timestamp: Date.now() });
105060
105299
  await hub.close();
105061
105300
  process.exit(0);
105062
105301
  }
105063
105302
  function readRunningVersion() {
105064
105303
  try {
105065
- return import_node_fs41.default.readFileSync(paths.version, "utf8").trim() || version;
105304
+ return import_node_fs42.default.readFileSync(paths.version, "utf8").trim() || version;
105066
105305
  } catch {
105067
105306
  return version;
105068
105307
  }
@@ -105105,7 +105344,7 @@ async function main() {
105105
105344
  process.on("SIGTERM", () => void shutdown("SIGTERM"));
105106
105345
  process.on("SIGINT", () => void shutdown("SIGINT"));
105107
105346
  process.on("SIGHUP", () => void shutdown("SIGHUP"));
105108
- import_node_fs41.default.rmSync(paths.stopped, { force: true });
105347
+ import_node_fs42.default.rmSync(paths.stopped, { force: true });
105109
105348
  const started = {
105110
105349
  type: "server-started",
105111
105350
  url: hub.url,