ryugi-artifacts 1.8.0 → 1.9.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 (150) hide show
  1. package/bin/ryugi-artifacts.cjs +1 -52
  2. package/dist/cli.cjs +594 -0
  3. package/dist/server.cjs +196 -38
  4. package/dist/viewer/{CloudDocument-Ba6KrnqA.js → CloudDocument-Dguokp_6.js} +1 -1
  5. package/dist/viewer/{DocumentEditor-BS16Wb_Z.js → DocumentEditor-rRoUyzj5.js} +81 -81
  6. package/dist/viewer/DocumentPage-C0_SVGNv.js +1 -0
  7. package/dist/viewer/{abnfDiagram-VCTEODGH-DuJfhZTl.js → abnfDiagram-VCTEODGH-Cd62lXYi.js} +1 -1
  8. package/dist/viewer/{ar-SA-G6X2FPQ2-CVlRFGvR.js → ar-SA-G6X2FPQ2-k4wcXC0w.js} +1 -1
  9. package/dist/viewer/{architectureDiagram-5GKGNRK7-Ca-sK1k9.js → architectureDiagram-5GKGNRK7-BqGRfF7K.js} +1 -1
  10. package/dist/viewer/{az-AZ-76LH7QW2-CzO5U4tE.js → az-AZ-76LH7QW2-DjkRWALq.js} +1 -1
  11. package/dist/viewer/{bg-BG-XCXSNQG7-DLheLFGn.js → bg-BG-XCXSNQG7-CUOyMSFg.js} +1 -1
  12. package/dist/viewer/{blockDiagram-I7D4REHJ-CVWXNFVb.js → blockDiagram-I7D4REHJ-DLj9e678.js} +1 -1
  13. package/dist/viewer/{bn-BD-2XOGV67Q-DvnFf2ym.js → bn-BD-2XOGV67Q-CPw_5I7i.js} +1 -1
  14. package/dist/viewer/{c4Diagram-7LVT6UL2-CddHgiim.js → c4Diagram-7LVT6UL2-D9FPioA_.js} +1 -1
  15. package/dist/viewer/{ca-ES-6MX7JW3Y-1SQM_Wxy.js → ca-ES-6MX7JW3Y-Bl_ggxy-.js} +1 -1
  16. package/dist/viewer/{chunk-4HAMMTFA-B7k7y3et.js → chunk-4HAMMTFA-B8CHZ2iu.js} +1 -1
  17. package/dist/viewer/{chunk-75Z2AOVW-Dmt3SQH3.js → chunk-75Z2AOVW-BLvzzoaA.js} +1 -1
  18. package/dist/viewer/{chunk-EIO257PC-CNxgWaGL.js → chunk-EIO257PC-BkhwQy9u.js} +1 -1
  19. package/dist/viewer/{chunk-GMAD6QVW-Do0Tih79.js → chunk-GMAD6QVW-BIxPNzf_.js} +1 -1
  20. package/dist/viewer/{chunk-GVQU2GXP-C9mWLYpa.js → chunk-GVQU2GXP-BcbkZdgL.js} +1 -1
  21. package/dist/viewer/{chunk-IMKFNOWR-BqsuylOZ.js → chunk-IMKFNOWR-BlVm2eW6.js} +1 -1
  22. package/dist/viewer/{chunk-L3NEJ4N5-D_AVAMEp.js → chunk-L3NEJ4N5-DPP-Uqzz.js} +1 -1
  23. package/dist/viewer/{chunk-OSK3NFVY-BKczRUt9.js → chunk-OSK3NFVY-DvWBYW0M.js} +1 -1
  24. package/dist/viewer/{chunk-PWAF6VOD-CcIRMiiP.js → chunk-PWAF6VOD-Df9WdVJL.js} +1 -1
  25. package/dist/viewer/{chunk-SHT3W25Y-D8R29R_u.js → chunk-SHT3W25Y-BSCi7YG7.js} +1 -1
  26. package/dist/viewer/{chunk-SVP7TREG-DvPbOdMe.js → chunk-SVP7TREG-Bxv2fp8X.js} +1 -1
  27. package/dist/viewer/{chunk-TICWLB2K-v1pSr6BB.js → chunk-TICWLB2K-MSpOEdcV.js} +1 -1
  28. package/dist/viewer/classDiagram-ZZMXUADV-YWXPsH1o.js +1 -0
  29. package/dist/viewer/classDiagram-v2-VYDZK3BY-YWXPsH1o.js +1 -0
  30. package/dist/viewer/{cs-CZ-2BRQDIVT-CuIWOyM9.js → cs-CZ-2BRQDIVT-VpdA_B_0.js} +1 -1
  31. package/dist/viewer/{cynefinDiagram-5FMLGOSQ-CarHaJWA.js → cynefinDiagram-5FMLGOSQ-CCIqA18s.js} +1 -1
  32. package/dist/viewer/{da-DK-5WZEPLOC-BNpk9O4Z.js → da-DK-5WZEPLOC-Bikfnz1b.js} +1 -1
  33. package/dist/viewer/{dagre-GXQ25YYZ-jKxlutMc.js → dagre-GXQ25YYZ-DeVnyw6S.js} +1 -1
  34. package/dist/viewer/{de-DE-XR44H4JA-DeRYYEYN.js → de-DE-XR44H4JA-5nJunltn.js} +1 -1
  35. package/dist/viewer/{diagram-S7CK7UJ4-BzGz76pK.js → diagram-S7CK7UJ4-rcnT6Csv.js} +1 -1
  36. package/dist/viewer/{diagram-UQ7AKVKN-DDsoAc73.js → diagram-UQ7AKVKN-D6yGL_te.js} +1 -1
  37. package/dist/viewer/{diagram-VSXAHHWV-HxtxJg2X.js → diagram-VSXAHHWV-C8eVmzD7.js} +1 -1
  38. package/dist/viewer/{diagram-VX7I27RA-BIeolo3r.js → diagram-VX7I27RA-BVBGylbn.js} +1 -1
  39. package/dist/viewer/{diagram-Z3DM3KII-CU7mw2ow.js → diagram-Z3DM3KII-DnsHEfda.js} +1 -1
  40. package/dist/viewer/{dist-DqbHnPRI.js → dist-BGR5ezDy.js} +1 -1
  41. package/dist/viewer/{dist-DC1HltnF.js → dist-BPa5yz1M.js} +1 -1
  42. package/dist/viewer/{dist-BgSBKOA3.js → dist-BSqmGdSf.js} +1 -1
  43. package/dist/viewer/{dist-Bu_voPaa.js → dist-Bn3GpIIQ.js} +1 -1
  44. package/dist/viewer/{dist-BSeJYKLj.js → dist-C2UdEldV.js} +1 -1
  45. package/dist/viewer/{dist-DX3SNcdm.js → dist-C46f_skK.js} +1 -1
  46. package/dist/viewer/{dist-AH0bdIVa.js → dist-CNSswqVs.js} +1 -1
  47. package/dist/viewer/{dist-CgYgXYmt.js → dist-CPg9Exib.js} +1 -1
  48. package/dist/viewer/{dist-CddCPamz.js → dist-CWy1mEqq.js} +1 -1
  49. package/dist/viewer/{dist-CHLFapPp.js → dist-C_2nvGGH.js} +1 -1
  50. package/dist/viewer/{dist-CZsxPTNE.js → dist-CjSSDaiM.js} +1 -1
  51. package/dist/viewer/{dist-C-ieEyE1.js → dist-CyR9uUsj.js} +1 -1
  52. package/dist/viewer/{dist-CvB831yK.js → dist-DOLGlCIF.js} +1 -1
  53. package/dist/viewer/{dist-Cu6PLla0.js → dist-DOpcb4fi.js} +1 -1
  54. package/dist/viewer/{dist-CbHHxvP1.js → dist-DRJfWmsE.js} +1 -1
  55. package/dist/viewer/{dist-BeULvDu_.js → dist-DU3q2qgP.js} +1 -1
  56. package/dist/viewer/{dist-BlXyXxst.js → dist-DeqL7hkG.js} +1 -1
  57. package/dist/viewer/{dist-BppD0RS2.js → dist-DlPVPwB6.js} +1 -1
  58. package/dist/viewer/{dist-BbW5iWCe.js → dist-JNndX187.js} +1 -1
  59. package/dist/viewer/{dist-C21gJBBO.js → dist-bznEISxg.js} +1 -1
  60. package/dist/viewer/{dist-DA8TW41P.js → dist-gtpBaWjz.js} +1 -1
  61. package/dist/viewer/{dist-Cackv1h9.js → dist-oPn-5997.js} +1 -1
  62. package/dist/viewer/{dist-CitzQ6z1.js → dist-rkIdnkmY.js} +4 -4
  63. package/dist/viewer/{dist-D_Vtqh_s.js → dist-s3i70bod.js} +1 -1
  64. package/dist/viewer/{ebnfDiagram-PWID7BFC-BUmzlASS.js → ebnfDiagram-PWID7BFC-c_bXfo9C.js} +1 -1
  65. package/dist/viewer/{el-GR-BZB4AONW-CU9I6jx_.js → el-GR-BZB4AONW-DuM6nGWb.js} +1 -1
  66. package/dist/viewer/{en-B4ZKOASM-DGboqHSv.js → en-B4ZKOASM-Cr7s3JvY.js} +1 -1
  67. package/dist/viewer/{erDiagram-RLTQ6QDP-DRUmIoEG.js → erDiagram-RLTQ6QDP-B-DgtUd4.js} +1 -1
  68. package/dist/viewer/{es-ES-U4NZUMDT-j5HevUjd.js → es-ES-U4NZUMDT-DNvSsfqo.js} +1 -1
  69. package/dist/viewer/{eu-ES-A7QVB2H4-FpISoaoc.js → eu-ES-A7QVB2H4-NECtmtc_.js} +1 -1
  70. package/dist/viewer/{fa-IR-HGAKTJCU-COJsQztN.js → fa-IR-HGAKTJCU-fp_dFFfn.js} +1 -1
  71. package/dist/viewer/{fi-FI-Z5N7JZ37-BNHsLnGq.js → fi-FI-Z5N7JZ37-uZ8T0uZ2.js} +1 -1
  72. package/dist/viewer/flowDiagram-HODETNUW-QbMFIBc7.js +1 -0
  73. package/dist/viewer/{fr-FR-RHASNOE6-CM9a28Dh.js → fr-FR-RHASNOE6-DYF69T_L.js} +1 -1
  74. package/dist/viewer/{ganttDiagram-EL5Y4UJY-BVcwKFHE.js → ganttDiagram-EL5Y4UJY-C7nYK4VV.js} +1 -1
  75. package/dist/viewer/{gitGraphDiagram-WWUBYQGX-CZxp-Wm4.js → gitGraphDiagram-WWUBYQGX-BYs6a9XC.js} +1 -1
  76. package/dist/viewer/{gl-ES-HMX3MZ6V-C5aDlPBE.js → gl-ES-HMX3MZ6V-Cjlf8qDo.js} +1 -1
  77. package/dist/viewer/{he-IL-6SHJWFNN-eFs-GSWn.js → he-IL-6SHJWFNN-B44gxQ_q.js} +1 -1
  78. package/dist/viewer/{hi-IN-IWLTKZ5I-O1MAguUp.js → hi-IN-IWLTKZ5I-DHRyKjrX.js} +1 -1
  79. package/dist/viewer/{hu-HU-A5ZG7DT2-B3meydQb.js → hu-HU-A5ZG7DT2-B0x2fwF-.js} +1 -1
  80. package/dist/viewer/{id-ID-SAP4L64H-PHNH2hzW.js → id-ID-SAP4L64H-Xxsnu-eK.js} +1 -1
  81. package/dist/viewer/{image-GAAHSSAO-BJifdIGE.js → image-GAAHSSAO-DmsBDNOK.js} +1 -1
  82. package/dist/viewer/index.js +2 -2
  83. package/dist/viewer/index2.css +20 -0
  84. package/dist/viewer/{infoDiagram-27XIBGKW-D5Ag03ug.js → infoDiagram-27XIBGKW-OPdlHu-j.js} +1 -1
  85. package/dist/viewer/{ishikawaDiagram-5VMMS53U-B9SCwzFe.js → ishikawaDiagram-5VMMS53U-3fyfjNAh.js} +1 -1
  86. package/dist/viewer/{it-IT-JPQ66NNP-DHOLiY7r.js → it-IT-JPQ66NNP-B0X8yQyS.js} +1 -1
  87. package/dist/viewer/{ja-JP-DBVTYXUO-DTOuZQy0.js → ja-JP-DBVTYXUO-CnhqD0fK.js} +1 -1
  88. package/dist/viewer/{journeyDiagram-3NMN7TZE-CQvvWgCk.js → journeyDiagram-3NMN7TZE-BD_Ll3Bo.js} +1 -1
  89. package/dist/viewer/{kaa-6HZHGXH3-1d0tKthK.js → kaa-6HZHGXH3-BzhTyhLc.js} +1 -1
  90. package/dist/viewer/{kab-KAB-ZGHBKWFO-BaPyqYzR.js → kab-KAB-ZGHBKWFO-DGiUv22x.js} +1 -1
  91. package/dist/viewer/{kanban-definition-UXKFOSKX-Bg-Q4j28.js → kanban-definition-UXKFOSKX-BspaC3q1.js} +1 -1
  92. package/dist/viewer/{kk-KZ-P5N5QNE5-BqF9n_h-.js → kk-KZ-P5N5QNE5-DH8jyrO_.js} +1 -1
  93. package/dist/viewer/{km-KH-HSX4SM5Z-DPTb_KDC.js → km-KH-HSX4SM5Z-CTtH-yq7.js} +1 -1
  94. package/dist/viewer/{ko-KR-MTYHY66A-DxGidADD.js → ko-KR-MTYHY66A-kp3bbs3q.js} +1 -1
  95. package/dist/viewer/{ku-TR-6OUDTVRD-BECmOCof.js → ku-TR-6OUDTVRD-CniHyrQH.js} +1 -1
  96. package/dist/viewer/{lt-LT-XHIRWOB4-DKQm4SS0.js → lt-LT-XHIRWOB4-C5_ErQjQ.js} +1 -1
  97. package/dist/viewer/{lv-LV-5QDEKY6T-C4kUM3XE.js → lv-LV-5QDEKY6T-DH2pmwSL.js} +1 -1
  98. package/dist/viewer/{mindmap-definition-YA3MSWOX-DRQfDlAQ.js → mindmap-definition-YA3MSWOX-gbG6Nf0i.js} +1 -1
  99. package/dist/viewer/{mr-IN-CRQNXWMA-CutHorlk.js → mr-IN-CRQNXWMA-4I7m5ob-.js} +1 -1
  100. package/dist/viewer/{my-MM-5M5IBNSE-BqscH03z.js → my-MM-5M5IBNSE-0nHUTGbL.js} +1 -1
  101. package/dist/viewer/{nb-NO-T6EIAALU-Dqflwtt9.js → nb-NO-T6EIAALU-DfqC7CQ7.js} +1 -1
  102. package/dist/viewer/{nl-NL-IS3SIHDZ-BFq09PQX.js → nl-NL-IS3SIHDZ-Bjzz0r--.js} +1 -1
  103. package/dist/viewer/{nn-NO-6E72VCQL-BNIuUKOs.js → nn-NO-6E72VCQL-m2jjAc9n.js} +1 -1
  104. package/dist/viewer/{oc-FR-POXYY2M6-Bz0jVYcW.js → oc-FR-POXYY2M6-CAVYt9Ft.js} +1 -1
  105. package/dist/viewer/{pa-IN-N4M65BXN-Diu6ZQtk.js → pa-IN-N4M65BXN-CrcUCfFF.js} +1 -1
  106. package/dist/viewer/{pegDiagram-XKGWAZYB-COMSnXOr.js → pegDiagram-XKGWAZYB-MIcAh6C6.js} +1 -1
  107. package/dist/viewer/percentages-BXMCSKIN-I1K7WJgu.js +1 -0
  108. package/dist/viewer/{pieDiagram-E7YTZNPT-gHe-bm7N.js → pieDiagram-E7YTZNPT-mI3-_ikZ.js} +1 -1
  109. package/dist/viewer/{pl-PL-T2D74RX3-CCwgP0Tt.js → pl-PL-T2D74RX3-CGPvBMhq.js} +1 -1
  110. package/dist/viewer/{prod-iZwju1YX.js → prod-DdQVR1xL.js} +8 -8
  111. package/dist/viewer/{pt-BR-5N22H2LF-CNn18ypM.js → pt-BR-5N22H2LF-jUQJyEPF.js} +1 -1
  112. package/dist/viewer/{pt-PT-UZXXM6DQ-BMoRZ8jH.js → pt-PT-UZXXM6DQ-4quEbcoT.js} +1 -1
  113. package/dist/viewer/{quadrantDiagram-AXDQQJYC-YkFWTX48.js → quadrantDiagram-AXDQQJYC-qOr_Ag5n.js} +1 -1
  114. package/dist/viewer/{railroadDiagram-O6MQD6OU-BP58ggYs.js → railroadDiagram-O6MQD6OU-C8uzuX6Z.js} +1 -1
  115. package/dist/viewer/{requirementDiagram-BXWQKSXE-B4RcZ6Uz.js → requirementDiagram-BXWQKSXE-Dz0j-_Ul.js} +1 -1
  116. package/dist/viewer/{ro-RO-JPDTUUEW-SoalcNvO.js → ro-RO-JPDTUUEW-Fux6vqWg.js} +1 -1
  117. package/dist/viewer/{ru-RU-B4JR7IUQ-DkWHaRhg.js → ru-RU-B4JR7IUQ-Dfr69XLN.js} +1 -1
  118. package/dist/viewer/{sequenceDiagram-WJ2MYXX4-C5uL0tpK.js → sequenceDiagram-WJ2MYXX4-DJU5fD19.js} +1 -1
  119. package/dist/viewer/{si-LK-N5RQ5JYF-eD68JhLY.js → si-LK-N5RQ5JYF-Cb-bjtRn.js} +1 -1
  120. package/dist/viewer/{sk-SK-C5VTKIMK-EXqkY3Ta.js → sk-SK-C5VTKIMK-CohdnzY8.js} +1 -1
  121. package/dist/viewer/{sl-SI-NN7IZMDC-D2V_J_sw.js → sl-SI-NN7IZMDC-DHVdRHE2.js} +1 -1
  122. package/dist/viewer/{stateDiagram-D77RDMKH-DkyLdU7q.js → stateDiagram-D77RDMKH-Rooio_TB.js} +1 -1
  123. package/dist/viewer/stateDiagram-v2-MP3YSRHH-DU1T3Lmf.js +1 -0
  124. package/dist/viewer/subset-shared.chunk-CrkhCoQF.js +1 -0
  125. package/dist/viewer/{subset-worker.chunk-B92dIZyQ.js → subset-worker.chunk-Zq5HEGfq.js} +1 -1
  126. package/dist/viewer/{sv-SE-XGPEYMSR-Bzbzaslo.js → sv-SE-XGPEYMSR-BU075tJ9.js} +1 -1
  127. package/dist/viewer/{swimlanes-42K2YHIH-BWEGkPBm.js → swimlanes-42K2YHIH-BBJBvoSV.js} +1 -1
  128. package/dist/viewer/swimlanesDiagram-VR7AAH4N-NfEcSN_S.js +8 -0
  129. package/dist/viewer/{ta-IN-2NMHFXQM-BkRw8Ab-.js → ta-IN-2NMHFXQM-D5U6fuX5.js} +1 -1
  130. package/dist/viewer/{th-TH-HPSO5L25-DpxjfRSg.js → th-TH-HPSO5L25-5svbXPdz.js} +1 -1
  131. package/dist/viewer/{timeline-definition-24CTP7MA-BEYELt88.js → timeline-definition-24CTP7MA-B0TrCHZJ.js} +1 -1
  132. package/dist/viewer/{tr-TR-DEFEU3FU-CDIHZRzE.js → tr-TR-DEFEU3FU-CtJIUVOL.js} +1 -1
  133. package/dist/viewer/{uk-UA-QMV73CPH-BX8bS5mk.js → uk-UA-QMV73CPH-BUwW5t5R.js} +1 -1
  134. package/dist/viewer/{vennDiagram-4TSXK5OY-CWnDIkB0.js → vennDiagram-4TSXK5OY-I1KbtT6m.js} +1 -1
  135. package/dist/viewer/{vi-VN-M7AON7JQ-uPTH0PFh.js → vi-VN-M7AON7JQ-CEi077aa.js} +1 -1
  136. package/dist/viewer/{wardleyDiagram-VM6X3IG4-DazKGA6Y.js → wardleyDiagram-VM6X3IG4-BBsUCECp.js} +1 -1
  137. package/dist/viewer/{xychartDiagram-S5SC5T6Z-sQuCm3yV.js → xychartDiagram-S5SC5T6Z-CVMwOWKp.js} +1 -1
  138. package/dist/viewer/{zh-CN-LNUGB5OW-CSw936pf.js → zh-CN-LNUGB5OW-BSFQBwv1.js} +1 -1
  139. package/dist/viewer/{zh-HK-E62DVLB3-D5pp2ILq.js → zh-HK-E62DVLB3-C_UX1aQ7.js} +1 -1
  140. package/dist/viewer/{zh-TW-RAJ6MFWO-DUVdEREg.js → zh-TW-RAJ6MFWO-BvBIQhnc.js} +1 -1
  141. package/package.json +7 -5
  142. package/dist/start-server.sh +0 -359
  143. package/dist/viewer/DocumentPage-DQmrD0th.js +0 -1
  144. package/dist/viewer/classDiagram-ZZMXUADV-BJqflR68.js +0 -1
  145. package/dist/viewer/classDiagram-v2-VYDZK3BY-BJqflR68.js +0 -1
  146. package/dist/viewer/flowDiagram-HODETNUW-BIce5Xbz.js +0 -1
  147. package/dist/viewer/percentages-BXMCSKIN-C4UC-sd0.js +0 -1
  148. package/dist/viewer/stateDiagram-v2-MP3YSRHH-BMCqlN4T.js +0 -1
  149. package/dist/viewer/subset-shared.chunk-pCVh-jxe.js +0 -1
  150. package/dist/viewer/swimlanesDiagram-VR7AAH4N-a8X5vJTG.js +0 -8
package/dist/server.cjs CHANGED
@@ -1562,13 +1562,13 @@ var require_canvas = __commonJS({
1562
1562
  });
1563
1563
 
1564
1564
  // src/server/main.ts
1565
- var import_node_child_process = require("node:child_process");
1566
- var import_node_fs18 = __toESM(require("node:fs"), 1);
1565
+ var import_node_child_process2 = require("node:child_process");
1566
+ var import_node_fs19 = __toESM(require("node:fs"), 1);
1567
1567
  var import_node_os = __toESM(require("node:os"), 1);
1568
1568
  var import_node_path17 = __toESM(require("node:path"), 1);
1569
1569
 
1570
1570
  // src/server/app.ts
1571
- var import_node_fs16 = __toESM(require("node:fs"), 1);
1571
+ var import_node_fs17 = __toESM(require("node:fs"), 1);
1572
1572
  var import_node_http = __toESM(require("node:http"), 1);
1573
1573
  var import_node_path16 = __toESM(require("node:path"), 1);
1574
1574
 
@@ -1755,6 +1755,16 @@ function parseComments(text2) {
1755
1755
  });
1756
1756
  return raw;
1757
1757
  }
1758
+ var isSavedMessage = (m11) => !!m11.id && (m11.author === "human" || m11.author === "agent") && typeof m11.text === "string" && typeof m11.at === "string";
1759
+ function savedComments(incoming) {
1760
+ const threads = [];
1761
+ for (const t7 of incoming.threads) {
1762
+ if (!t7.id || !t7.anchor?.blockId || !t7.statusAt || t7.status !== "open" && t7.status !== "resolved") continue;
1763
+ const messages = (t7.messages ?? []).filter(isSavedMessage);
1764
+ threads.push({ id: t7.id, anchor: { blockId: t7.anchor.blockId, quote: t7.anchor.quote ?? "" }, status: t7.status, statusAt: t7.statusAt, messages });
1765
+ }
1766
+ return { version: 1, threads };
1767
+ }
1758
1768
  var stampOf = (m11) => m11.editedAt ?? m11.at;
1759
1769
  function mergeMessage(base, incoming, origin, now, warnings) {
1760
1770
  if (base.deleted) return base;
@@ -1770,7 +1780,8 @@ function mergeMessage(base, incoming, origin, now, warnings) {
1770
1780
  if (deleting) return { ...base, text: "", deleted: true, editedAt: now };
1771
1781
  return { ...base, text: incoming.text, editedAt: incomingStamp === stampOf(base) ? now : incomingStamp };
1772
1782
  }
1773
- function mergeThread(base, incoming, origin, now, newId, warnings) {
1783
+ var personOf = (who) => ({ ...who?.name ? { name: who.name } : {}, ...who?.avatar ? { avatar: who.avatar } : {} });
1784
+ function mergeThread(base, incoming, origin, now, newId, warnings, name) {
1774
1785
  const messages = [...base.messages];
1775
1786
  for (const message of incoming.messages ?? []) {
1776
1787
  const index = message.id ? messages.findIndex((m11) => m11.id === message.id) : -1;
@@ -1785,7 +1796,7 @@ function mergeThread(base, incoming, origin, now, newId, warnings) {
1785
1796
  continue;
1786
1797
  }
1787
1798
  if (typeof message.text !== "string" || message.text.length === 0) continue;
1788
- messages.push({ id: message.id ?? newId(), author, text: message.text, at: message.at ?? now });
1799
+ messages.push({ id: message.id ?? newId(), author, ...personOf({ name }), text: message.text, at: message.at ?? now });
1789
1800
  }
1790
1801
  messages.sort((a5, b6) => a5.at < b6.at ? -1 : a5.at > b6.at ? 1 : 0);
1791
1802
  let { status, statusAt } = base;
@@ -1799,13 +1810,13 @@ function mergeThread(base, incoming, origin, now, newId, warnings) {
1799
1810
  return { ...base, status, statusAt, messages };
1800
1811
  }
1801
1812
  var sameUnsavedThread = (existing, incoming) => existing.anchor.blockId === incoming.anchor?.blockId && existing.anchor.quote === (incoming.anchor?.quote ?? "") && existing.messages[0]?.text === incoming.messages?.[0]?.text;
1802
- function mergeComments(base, incoming, origin, now, newId) {
1813
+ function mergeComments(base, incoming, origin, now, newId, name) {
1803
1814
  const warnings = [];
1804
1815
  const threads = [...base.threads];
1805
1816
  for (const thread of incoming.threads) {
1806
1817
  const index = thread.id ? threads.findIndex((t7) => t7.id === thread.id) : threads.findIndex((t7) => sameUnsavedThread(t7, thread));
1807
1818
  if (index >= 0) {
1808
- threads[index] = mergeThread(threads[index], thread, origin, now, newId, warnings);
1819
+ threads[index] = mergeThread(threads[index], thread, origin, now, newId, warnings, name);
1809
1820
  continue;
1810
1821
  }
1811
1822
  if (!thread.anchor?.blockId) {
@@ -1819,7 +1830,7 @@ function mergeComments(base, incoming, origin, now, newId) {
1819
1830
  statusAt: now,
1820
1831
  messages: []
1821
1832
  };
1822
- threads.push(mergeThread(fresh, { ...thread, status: thread.status ?? "open" }, origin, now, newId, warnings));
1833
+ threads.push(mergeThread(fresh, { ...thread, status: thread.status ?? "open" }, origin, now, newId, warnings, name));
1823
1834
  }
1824
1835
  return { file: { version: 1, threads }, warnings };
1825
1836
  }
@@ -1831,7 +1842,7 @@ var updateHumanMessage = (thread, messageId, update2) => ({
1831
1842
  ...thread,
1832
1843
  messages: thread.messages.map((m11) => m11.id === messageId && m11.author === "human" && !m11.deleted ? update2(m11) : m11)
1833
1844
  });
1834
- function applyHumanOp(file, op, now, newId) {
1845
+ function applyHumanOp(file, op, now, newId, who) {
1835
1846
  switch (op.op) {
1836
1847
  case "create":
1837
1848
  return {
@@ -1843,12 +1854,12 @@ function applyHumanOp(file, op, now, newId) {
1843
1854
  anchor: { blockId: op.blockId, quote: op.quote },
1844
1855
  status: "open",
1845
1856
  statusAt: now,
1846
- messages: [{ id: newId(), author: "human", text: op.text, at: now }]
1857
+ messages: [{ id: newId(), author: "human", ...personOf(who), text: op.text, at: now }]
1847
1858
  }
1848
1859
  ]
1849
1860
  };
1850
1861
  case "reply":
1851
- return updateThread(file, op.threadId, (t7) => ({ ...t7, messages: [...t7.messages, { id: newId(), author: "human", text: op.text, at: now }] }));
1862
+ return updateThread(file, op.threadId, (t7) => ({ ...t7, messages: [...t7.messages, { id: newId(), author: "human", ...personOf(who), text: op.text, at: now }] }));
1852
1863
  case "edit":
1853
1864
  return updateThread(file, op.threadId, (t7) => updateHumanMessage(t7, op.messageId, (m11) => ({ ...m11, text: op.text, editedAt: now })));
1854
1865
  case "delete":
@@ -2208,10 +2219,12 @@ function asHumanOp(value) {
2208
2219
  return null;
2209
2220
  }
2210
2221
  }
2211
- function createCommentStore(file, now = () => (/* @__PURE__ */ new Date()).toISOString(), newId = () => nanoid(10)) {
2222
+ var noNames = { human: () => void 0, agent: () => void 0 };
2223
+ function createCommentStore(file, names = noNames, now = () => (/* @__PURE__ */ new Date()).toISOString(), newId = () => nanoid(10)) {
2212
2224
  let current = emptyComments();
2213
2225
  let lastSeen = null;
2214
2226
  let warnings = [];
2227
+ let loaded = false;
2215
2228
  const write = () => {
2216
2229
  writeJsonAtomic(file, current);
2217
2230
  lastSeen = import_node_fs6.default.readFileSync(file, "utf8");
@@ -2226,7 +2239,9 @@ function createCommentStore(file, now = () => (/* @__PURE__ */ new Date()).toISO
2226
2239
  if (text2 === lastSeen) return false;
2227
2240
  lastSeen = text2;
2228
2241
  try {
2229
- const merged = mergeComments(current, parseComments(text2), "agent", now(), newId);
2242
+ const incoming = parseComments(text2);
2243
+ const base = loaded ? current : savedComments(incoming);
2244
+ const merged = mergeComments(base, incoming, "agent", now(), newId, names.agent());
2230
2245
  current = merged.file;
2231
2246
  warnings = merged.warnings;
2232
2247
  if (`${JSON.stringify(current, null, 2)}
@@ -2237,13 +2252,14 @@ function createCommentStore(file, now = () => (/* @__PURE__ */ new Date()).toISO
2237
2252
  return true;
2238
2253
  };
2239
2254
  sync();
2255
+ loaded = true;
2240
2256
  return {
2241
2257
  current: () => current,
2242
2258
  warnings: () => warnings,
2243
2259
  sync,
2244
2260
  apply: (op) => {
2245
2261
  sync();
2246
- current = applyHumanOp(current, op, now(), newId);
2262
+ current = applyHumanOp(current, op, now(), newId, names.human());
2247
2263
  write();
2248
2264
  return current;
2249
2265
  }
@@ -28004,10 +28020,10 @@ function _loadWasmModule(sync, filepath, src, imports2) {
28004
28020
  var buf = null;
28005
28021
  var isNode2 = typeof process !== "undefined" && process.versions != null && process.versions.node != null;
28006
28022
  if (filepath && isNode2) {
28007
- var fs21 = null;
28023
+ var fs22 = null;
28008
28024
  var path18 = null;
28009
28025
  return new Promise((resolve, reject) => {
28010
- fs21.readFile(path18.resolve(__dirname, filepath), (error, buffer) => {
28026
+ fs22.readFile(path18.resolve(__dirname, filepath), (error, buffer) => {
28011
28027
  if (error != null) {
28012
28028
  reject(error);
28013
28029
  } else {
@@ -83875,7 +83891,7 @@ function createDocumentRegistry(options) {
83875
83891
  const commentStore = (id2) => {
83876
83892
  let store = commentStores.get(id2);
83877
83893
  if (!store) {
83878
- store = createCommentStore(import_node_path7.default.join(options.root, "document", id2, "comments.json"));
83894
+ store = createCommentStore(import_node_path7.default.join(options.root, "document", id2, "comments.json"), options.names);
83879
83895
  commentStores.set(id2, store);
83880
83896
  }
83881
83897
  return store;
@@ -84814,8 +84830,49 @@ function updateArtifactConfig(file, key2, patch) {
84814
84830
  return entry;
84815
84831
  }
84816
84832
 
84833
+ // src/server/avatars.ts
84834
+ var import_node_crypto3 = require("node:crypto");
84835
+ var AVATAR_ROUTE = /^\/api\/avatar\/([a-z]+)\/([^/]+)$/;
84836
+ var MAX_BYTES = 512 * 1024;
84837
+ var TIMEOUT_MS = 5e3;
84838
+ var SOURCES = {
84839
+ github: { valid: /^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})$/, url: (id2) => `https://avatars.githubusercontent.com/${id2}?s=64` },
84840
+ gravatar: { valid: /^[0-9a-f]{64}$/, url: (id2) => `https://gravatar.com/avatar/${id2}?s=64&d=404` }
84841
+ };
84842
+ var githubAvatar = (login) => `/api/avatar/github/${login}`;
84843
+ var gravatarAvatar = (email) => `/api/avatar/gravatar/${(0, import_node_crypto3.createHash)("sha256").update(email.trim().toLowerCase()).digest("hex")}`;
84844
+ function createAvatars(fetchImpl = fetch) {
84845
+ const cache = /* @__PURE__ */ new Map();
84846
+ const fetchAvatar = async (url) => {
84847
+ try {
84848
+ const res = await fetchImpl(url, { signal: AbortSignal.timeout(TIMEOUT_MS) });
84849
+ const type = res.headers.get("content-type") ?? "";
84850
+ if (!res.ok || !type.startsWith("image/")) return { status: 404 };
84851
+ const body = Buffer.from(await res.arrayBuffer());
84852
+ return body.length > MAX_BYTES ? { status: 404 } : { status: 200, type, body };
84853
+ } catch {
84854
+ return { status: 502 };
84855
+ }
84856
+ };
84857
+ return {
84858
+ load(source, id2) {
84859
+ const known = SOURCES[source];
84860
+ if (!known || !known.valid.test(id2)) return Promise.resolve({ status: 404 });
84861
+ const key2 = `${source}/${id2}`;
84862
+ const cached = cache.get(key2);
84863
+ if (cached) return cached;
84864
+ const pending = fetchAvatar(known.url(id2)).then((result) => {
84865
+ if (result.status === 502) cache.delete(key2);
84866
+ return result;
84867
+ });
84868
+ cache.set(key2, pending);
84869
+ return pending;
84870
+ }
84871
+ };
84872
+ }
84873
+
84817
84874
  // src/server/cloud.ts
84818
- var import_node_crypto3 = __toESM(require("node:crypto"), 1);
84875
+ var import_node_crypto4 = __toESM(require("node:crypto"), 1);
84819
84876
 
84820
84877
  // src/shared/brand.ts
84821
84878
  var RYUGI_MARK_VIEWBOX = "0 0 512 512";
@@ -85065,7 +85122,7 @@ function createCloudRoutes(options) {
85065
85122
  const state = randomToken();
85066
85123
  const verifier = randomToken();
85067
85124
  pendingStates.set(state, { expires: now + LOGIN_STATE_TTL_MS, verifier });
85068
- const challenge = import_node_crypto3.default.createHash("sha256").update(verifier).digest("base64url");
85125
+ const challenge = import_node_crypto4.default.createHash("sha256").update(verifier).digest("base64url");
85069
85126
  return `${origin}/auth/cli?port=${options.port()}&state=${state}&challenge=${challenge}`;
85070
85127
  };
85071
85128
  const cloudFetch = async (method, path18, body) => {
@@ -85106,7 +85163,7 @@ function createCloudRoutes(options) {
85106
85163
  }
85107
85164
  const key2 = `${ref.type}/${ref.id}`;
85108
85165
  const entry = artifactEntry(key2);
85109
- const hashed = files.map((file) => ({ ...file, hash: import_node_crypto3.default.createHash("sha256").update(file.data).digest("hex") }));
85166
+ const hashed = files.map((file) => ({ ...file, hash: import_node_crypto4.default.createHash("sha256").update(file.data).digest("hex") }));
85110
85167
  const byHash = new Map(hashed.map((file) => [file.hash, file.data]));
85111
85168
  const manifest = hashed.map(({ path: path18, hash }) => ({ path: path18, hash }));
85112
85169
  const version = (visibility) => ({ title: inspected.title, payload: inspected.payload, files: manifest, ...visibility ? { visibility } : {} });
@@ -85285,6 +85342,97 @@ function createCloudRoutes(options) {
85285
85342
  };
85286
85343
  }
85287
85344
 
85345
+ // src/server/comment-names.ts
85346
+ var import_node_child_process = require("node:child_process");
85347
+ var import_node_fs15 = __toESM(require("node:fs"), 1);
85348
+
85349
+ // src/server/agent.ts
85350
+ var NAMES = {
85351
+ claude: "Claude Code",
85352
+ "claude-code": "Claude Code",
85353
+ cowork: "Claude Cowork",
85354
+ codex: "Codex",
85355
+ cursor: "Cursor",
85356
+ "cursor-cli": "Cursor",
85357
+ gemini: "Gemini CLI",
85358
+ "gemini-cli": "Gemini CLI",
85359
+ "github-copilot": "GitHub Copilot",
85360
+ "github-copilot-cli": "GitHub Copilot",
85361
+ kilo: "Kilo Code",
85362
+ opencode: "OpenCode",
85363
+ "qwen-code": "Qwen Code",
85364
+ antigravity: "Antigravity",
85365
+ augment: "Augment",
85366
+ "augment-cli": "Augment",
85367
+ goose: "Goose",
85368
+ amp: "Amp",
85369
+ cline: "Cline",
85370
+ roo: "Roo Code",
85371
+ devin: "Devin",
85372
+ replit: "Replit",
85373
+ v0: "v0"
85374
+ };
85375
+ var AGENT_DISPLAY_NAMES = [...new Set(Object.values(NAMES))];
85376
+ var MARKERS = [
85377
+ ["cowork", (env) => !!env.CLAUDE_CODE_IS_COWORK],
85378
+ ["kilo", (env) => !!env.KILO],
85379
+ ["codex", (env) => !!(env.CODEX_THREAD_ID || env.CODEX_SANDBOX || env.CODEX_CI)],
85380
+ ["cursor", (env) => !!(env.CURSOR_AGENT || env.CURSOR_TRACE_ID)],
85381
+ ["gemini", (env) => !!env.GEMINI_CLI],
85382
+ ["github-copilot", (env) => !!env.COPILOT_CLI],
85383
+ ["opencode", (env) => env.OPENCODE === "1" || !!env.OPENCODE_CLIENT],
85384
+ ["qwen-code", (env) => !!env.QWEN_CODE],
85385
+ ["antigravity", (env) => !!env.ANTIGRAVITY_AGENT],
85386
+ ["augment", (env) => !!env.AUGMENT_AGENT],
85387
+ ["cline", (env) => !!env.CLINE_ACTIVE],
85388
+ ["roo", (env) => !!env.ROO_ACTIVE],
85389
+ ["claude", (env) => !!(env.CLAUDECODE || env.CLAUDE_CODE)]
85390
+ ];
85391
+ var declaredName = (value) => value?.trim().split(/[@_]/)[0]?.toLowerCase() || void 0;
85392
+ function detectAgent(env) {
85393
+ if (env.CLAUDE_CODE_IS_COWORK) return NAMES.cowork;
85394
+ const declared = declaredName(env.AI_AGENT);
85395
+ if (declared) return NAMES[declared] ?? declared;
85396
+ const marked = MARKERS.find(([, test]) => test(env))?.[0];
85397
+ if (marked) return NAMES[marked];
85398
+ const agent = declaredName(env.AGENT);
85399
+ if (agent && !/^(1|true|yes)$/.test(agent)) return NAMES[agent] ?? agent;
85400
+ return void 0;
85401
+ }
85402
+
85403
+ // src/server/comment-names.ts
85404
+ function gitConfig(cwd, key2) {
85405
+ try {
85406
+ return (0, import_node_child_process.execFileSync)("git", ["config", key2], { cwd, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"], timeout: 2e3 }).trim() || void 0;
85407
+ } catch {
85408
+ return void 0;
85409
+ }
85410
+ }
85411
+ function gitPerson(cwd) {
85412
+ const name = gitConfig(cwd, "user.name");
85413
+ if (!name) return void 0;
85414
+ const email = gitConfig(cwd, "user.email");
85415
+ return email ? { name, avatar: gravatarAvatar(email) } : { name };
85416
+ }
85417
+ function commentNames({ agentFile, projectDir, cloud }) {
85418
+ let git;
85419
+ return {
85420
+ human: () => {
85421
+ const login = cloud ? readCredentials(cloud.credentialsFile, cloud.origin)?.login : void 0;
85422
+ if (login) return { name: login, avatar: githubAvatar(login) };
85423
+ git ??= { person: gitPerson(projectDir) };
85424
+ return git.person;
85425
+ },
85426
+ agent: () => {
85427
+ try {
85428
+ return detectAgent(JSON.parse(import_node_fs15.default.readFileSync(agentFile, "utf8")));
85429
+ } catch {
85430
+ return void 0;
85431
+ }
85432
+ }
85433
+ };
85434
+ }
85435
+
85288
85436
  // src/server/viewer-page.ts
85289
85437
  var escapeHtml2 = (value) => value.replace(/[&<>"']/g, (ch) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" })[ch]);
85290
85438
  function viewerPage(template, page) {
@@ -85305,14 +85453,14 @@ function viewerPage(template, page) {
85305
85453
  }
85306
85454
 
85307
85455
  // src/server/watch.ts
85308
- var import_node_fs15 = __toESM(require("node:fs"), 1);
85456
+ var import_node_fs16 = __toESM(require("node:fs"), 1);
85309
85457
  var import_node_path15 = __toESM(require("node:path"), 1);
85310
85458
  var toPosix = (file) => file.split(import_node_path15.default.sep).join("/");
85311
85459
  var ignored = (file) => file === ".state" || file.startsWith(".state/");
85312
85460
  function snapshot(root, dir = root, out = /* @__PURE__ */ new Map()) {
85313
85461
  let entries2;
85314
85462
  try {
85315
- entries2 = import_node_fs15.default.readdirSync(dir, { withFileTypes: true });
85463
+ entries2 = import_node_fs16.default.readdirSync(dir, { withFileTypes: true });
85316
85464
  } catch {
85317
85465
  return out;
85318
85466
  }
@@ -85323,7 +85471,7 @@ function snapshot(root, dir = root, out = /* @__PURE__ */ new Map()) {
85323
85471
  if (entry.isDirectory()) snapshot(root, full, out);
85324
85472
  else {
85325
85473
  try {
85326
- out.set(rel, import_node_fs15.default.statSync(full).mtimeMs);
85474
+ out.set(rel, import_node_fs16.default.statSync(full).mtimeMs);
85327
85475
  } catch {
85328
85476
  }
85329
85477
  }
@@ -85356,7 +85504,7 @@ function watchTree(root, onChange, debounceMs = 120, backupPollMs = 1e3) {
85356
85504
  }, debounceMs);
85357
85505
  };
85358
85506
  try {
85359
- const watcher = import_node_fs15.default.watch(root, { recursive: true }, (_event, filename) => {
85507
+ const watcher = import_node_fs16.default.watch(root, { recursive: true }, (_event, filename) => {
85360
85508
  if (filename) queue([toPosix(filename.toString())]);
85361
85509
  });
85362
85510
  watcher.on("error", () => {
@@ -85381,7 +85529,7 @@ function watchTree(root, onChange, debounceMs = 120, backupPollMs = 1e3) {
85381
85529
  }
85382
85530
 
85383
85531
  // src/server/ws.ts
85384
- var import_node_crypto4 = __toESM(require("node:crypto"), 1);
85532
+ var import_node_crypto5 = __toESM(require("node:crypto"), 1);
85385
85533
  var WS_MAGIC = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
85386
85534
  var OPCODE_TEXT = 1;
85387
85535
  var OPCODE_CLOSE = 8;
@@ -85389,7 +85537,7 @@ var OPCODE_PING = 9;
85389
85537
  var OPCODE_PONG = 10;
85390
85538
  var MAX_CLIENT_FRAME = 8 * 1024 * 1024;
85391
85539
  function acceptKey(clientKey) {
85392
- return import_node_crypto4.default.createHash("sha1").update(clientKey + WS_MAGIC).digest("base64");
85540
+ return import_node_crypto5.default.createHash("sha1").update(clientKey + WS_MAGIC).digest("base64");
85393
85541
  }
85394
85542
  function encodeFrame(opcode, payload) {
85395
85543
  const len = payload.length;
@@ -85511,13 +85659,13 @@ async function startArtifactsServer(options) {
85511
85659
  const viewerDir = import_node_path16.default.resolve(options.viewerDir);
85512
85660
  const runtimeDir = options.runtimeDir ? import_node_path16.default.resolve(options.runtimeDir) : null;
85513
85661
  const stateDir = import_node_path16.default.join(root, ".state");
85514
- import_node_fs16.default.mkdirSync(stateDir, { recursive: true, mode: 448 });
85515
- import_node_fs16.default.writeFileSync(import_node_path16.default.join(stateDir, ".gitignore"), "*\n");
85662
+ import_node_fs17.default.mkdirSync(stateDir, { recursive: true, mode: 448 });
85663
+ import_node_fs17.default.writeFileSync(import_node_path16.default.join(stateDir, ".gitignore"), "*\n");
85516
85664
  if (options.configFile) ensureConfig(options.configFile);
85517
85665
  const portFile = import_node_path16.default.join(stateDir, ".last-port");
85518
85666
  const tokenFile = import_node_path16.default.join(stateDir, ".last-token");
85519
85667
  const token = readPersisted(tokenFile) || randomToken();
85520
- import_node_fs16.default.writeFileSync(tokenFile, `${token}
85668
+ import_node_fs17.default.writeFileSync(tokenFile, `${token}
85521
85669
  `, { mode: 384 });
85522
85670
  const contentToken = randomToken();
85523
85671
  const runtimeWarnings = /* @__PURE__ */ new Map();
@@ -85537,11 +85685,13 @@ async function startArtifactsServer(options) {
85537
85685
  const frame = textFrame(JSON.stringify(message));
85538
85686
  for (const socket of clients) socket.write(frame);
85539
85687
  };
85688
+ const avatars = createAvatars(options.fetch);
85540
85689
  const documents = createDocumentRegistry({
85541
85690
  root,
85542
85691
  stateDir,
85543
85692
  timing: options.documentTiming,
85544
85693
  broadcast,
85694
+ names: commentNames({ agentFile: import_node_path16.default.join(stateDir, "agent"), projectDir: import_node_path16.default.resolve(root, "../.."), cloud: options.cloud }),
85545
85695
  onWarningsChange: (id2) => {
85546
85696
  const dir = resolveArtifactDir(root, "document", id2);
85547
85697
  if (!dir) return;
@@ -85684,7 +85834,7 @@ async function startArtifactsServer(options) {
85684
85834
  sendFile(res, target, headers);
85685
85835
  return;
85686
85836
  }
85687
- import_node_fs16.default.readFile(target, "utf8", (err, source) => {
85837
+ import_node_fs17.default.readFile(target, "utf8", (err, source) => {
85688
85838
  if (err) send(res, 404, "Not found");
85689
85839
  else {
85690
85840
  const uiRuntimeUrl = runtimeDir ? `${contentPrefix}runtime/ryugi-ui.js` : void 0;
@@ -85792,6 +85942,14 @@ async function startArtifactsServer(options) {
85792
85942
  serveList(res);
85793
85943
  return;
85794
85944
  }
85945
+ const avatarMatch = AVATAR_ROUTE.exec(pathname);
85946
+ if (avatarMatch) {
85947
+ void avatars.load(avatarMatch[1], avatarMatch[2]).then(({ status, type, body }) => {
85948
+ if (body && type) send(res, status, body, { "Content-Type": type, "Cache-Control": "private, max-age=86400" });
85949
+ else send(res, status, "No avatar");
85950
+ });
85951
+ return;
85952
+ }
85795
85953
  const previewMatch = API_PREVIEW_ROUTE.exec(pathname);
85796
85954
  if (previewMatch) {
85797
85955
  const [, type = "", id2 = ""] = previewMatch;
@@ -85843,7 +86001,7 @@ async function startArtifactsServer(options) {
85843
86001
  "Content-Security-Policy": PREVIEW_ROUTE.test(pathname) ? VIEWER_CSP.replace("frame-ancestors 'none'", "frame-ancestors 'self'") : VIEWER_CSP
85844
86002
  };
85845
86003
  if (key2 !== null) headers["Set-Cookie"] = `${cookieName}=${token}; HttpOnly; SameSite=Strict; Path=/`;
85846
- void import_node_fs16.default.promises.readFile(import_node_path16.default.join(viewerDir, "index.html"), "utf8").then((template) => send(res, 200, viewerPage(template, { title, description, url: canonical }), headers)).catch((err) => send(res, err.code === "ENOENT" ? 404 : 500, "Viewer unavailable"));
86004
+ void import_node_fs17.default.promises.readFile(import_node_path16.default.join(viewerDir, "index.html"), "utf8").then((template) => send(res, 200, viewerPage(template, { title, description, url: canonical }), headers)).catch((err) => send(res, err.code === "ENOENT" ? 404 : 500, "Viewer unavailable"));
85847
86005
  return;
85848
86006
  }
85849
86007
  const target = resolveInside(viewerDir, pathname.slice(1));
@@ -85890,7 +86048,7 @@ async function startArtifactsServer(options) {
85890
86048
  port = await listen(server, options.host, 0);
85891
86049
  }
85892
86050
  cookieName = `ryugi_artifacts_${port}`;
85893
- import_node_fs16.default.writeFileSync(portFile, `${port}
86051
+ import_node_fs17.default.writeFileSync(portFile, `${port}
85894
86052
  `, { mode: 384 });
85895
86053
  const origin = `http://${urlHostForHttp(options.urlHost)}:${port}`;
85896
86054
  const url = `${origin}/?key=${token}`;
@@ -85974,7 +86132,7 @@ async function startArtifactsServer(options) {
85974
86132
  }
85975
86133
 
85976
86134
  // src/server/lifecycle.ts
85977
- var import_node_fs17 = __toESM(require("node:fs"), 1);
86135
+ var import_node_fs18 = __toESM(require("node:fs"), 1);
85978
86136
  var DEFAULT_IDLE_TIMEOUT_MS = 4 * 60 * 60 * 1e3;
85979
86137
  var DEFAULT_LIFECYCLE_CHECK_MS = 60 * 1e3;
85980
86138
  var SERVER_ID_ARG = "--artifacts-server-id=";
@@ -86006,7 +86164,7 @@ function parseEnv(env, argv = []) {
86006
86164
  function readOwners(file) {
86007
86165
  let text2;
86008
86166
  try {
86009
- text2 = import_node_fs17.default.readFileSync(file, "utf8");
86167
+ text2 = import_node_fs18.default.readFileSync(file, "utf8");
86010
86168
  } catch {
86011
86169
  return [];
86012
86170
  }
@@ -86094,12 +86252,12 @@ async function main() {
86094
86252
  if (server.clientCount() > 0) return;
86095
86253
  const link = server.linkFor(ref.type, ref.id);
86096
86254
  if (config.openCmd) {
86097
- (0, import_node_child_process.exec)(`${config.openCmd} ${JSON.stringify(link)}`, () => {
86255
+ (0, import_node_child_process2.exec)(`${config.openCmd} ${JSON.stringify(link)}`, () => {
86098
86256
  });
86099
86257
  return;
86100
86258
  }
86101
86259
  const launcher = browserLauncher(process.platform, link);
86102
- if (launcher) (0, import_node_child_process.execFile)(launcher.bin, launcher.args, () => {
86260
+ if (launcher) (0, import_node_child_process2.execFile)(launcher.bin, launcher.args, () => {
86103
86261
  });
86104
86262
  });
86105
86263
  let stopping = false;
@@ -86107,7 +86265,7 @@ async function main() {
86107
86265
  if (stopping) return;
86108
86266
  stopping = true;
86109
86267
  console.log(JSON.stringify({ type: "server-stopped", reason }));
86110
- import_node_fs18.default.rmSync(import_node_path17.default.join(stateDir, "server-info"), { force: true });
86268
+ import_node_fs19.default.rmSync(import_node_path17.default.join(stateDir, "server-info"), { force: true });
86111
86269
  writeJsonAtomic(import_node_path17.default.join(stateDir, "server-stopped"), { reason, timestamp: Date.now() });
86112
86270
  await server.close();
86113
86271
  process.exit(0);
@@ -86126,7 +86284,7 @@ async function main() {
86126
86284
  timer.unref();
86127
86285
  process.on("SIGTERM", () => void shutdown("SIGTERM"));
86128
86286
  process.on("SIGINT", () => void shutdown("SIGINT"));
86129
- import_node_fs18.default.rmSync(import_node_path17.default.join(stateDir, "server-stopped"), { force: true });
86287
+ import_node_fs19.default.rmSync(import_node_path17.default.join(stateDir, "server-stopped"), { force: true });
86130
86288
  console.log(JSON.stringify({ type: "server-started", url: server.url, port: server.port, root }));
86131
86289
  }
86132
86290
  main().catch((err) => {
@@ -1 +1 @@
1
- import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{n as t,t as n}from"./jsx-runtime-CldxteV5.js";import{c as r,l as i,n as a,o,r as s,s as c}from"./DocumentEditor-BS16Wb_Z.js";var l=e(t(),1),u=n();function d(){let e=(0,l.useMemo)(()=>window.matchMedia(`(prefers-color-scheme: dark)`),[]),[t,n]=(0,l.useState)(e.matches);return(0,l.useEffect)(()=>{let t=()=>n(e.matches);return e.addEventListener(`change`,t),()=>e.removeEventListener(`change`,t)},[e]),t}function f({id:e,state:t,contentBase:n}){let f=d(),p=(0,l.useMemo)(()=>({artifact:`cloud/${e}`,contentBase:n,channel:c(),send:()=>void 0}),[e,n]);return(0,l.useEffect)(()=>{let e=document.createElement(`base`);return e.href=n,document.head.prepend(e),()=>e.remove()},[n]),(0,u.jsx)(`div`,{className:`x1us19tq x1rozbrz xo2rkog`,className:`ryugi-doc ${{className:`x1us19tq x1rozbrz xo2rkog`}.className??``}`,children:(0,u.jsx)(`article`,{className:`xrgej4m xvueqy4 x1axd487 x4l9tsp`,children:(0,u.jsx)(o.Provider,{value:p,children:(0,u.jsx)(i,{variant:`article`,theme:f?`dark`:`light`,initialValue:t,extraNodes:a,rendererConfig:s,onEditorReady:e=>e?.setEditable(!1),children:(0,u.jsx)(r,{})})})})})}export{f as default};
1
+ import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{n as t,t as n}from"./jsx-runtime-CldxteV5.js";import{c as r,l as i,n as a,o,r as s,s as c}from"./DocumentEditor-rRoUyzj5.js";var l=e(t(),1),u=n();function d(){let e=(0,l.useMemo)(()=>window.matchMedia(`(prefers-color-scheme: dark)`),[]),[t,n]=(0,l.useState)(e.matches);return(0,l.useEffect)(()=>{let t=()=>n(e.matches);return e.addEventListener(`change`,t),()=>e.removeEventListener(`change`,t)},[e]),t}function f({id:e,state:t,contentBase:n}){let f=d(),p=(0,l.useMemo)(()=>({artifact:`cloud/${e}`,contentBase:n,channel:c(),send:()=>void 0}),[e,n]);return(0,l.useEffect)(()=>{let e=document.createElement(`base`);return e.href=n,document.head.prepend(e),()=>e.remove()},[n]),(0,u.jsx)(`div`,{className:`x1us19tq x1rozbrz xo2rkog`,className:`ryugi-doc ${{className:`x1us19tq x1rozbrz xo2rkog`}.className??``}`,children:(0,u.jsx)(`article`,{className:`xrgej4m xvueqy4 x1axd487 x4l9tsp`,children:(0,u.jsx)(o.Provider,{value:p,children:(0,u.jsx)(i,{variant:`article`,theme:f?`dark`:`light`,initialValue:t,extraNodes:a,rendererConfig:s,onEditorReady:e=>e?.setEditable(!1),children:(0,u.jsx)(r,{})})})})})}export{f as default};