ryugi-artifacts 1.31.7 → 1.33.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 (147) hide show
  1. package/dist/cli.cjs +496 -82
  2. package/dist/server.cjs +241 -53
  3. package/dist/viewer/CloudDocument-DBhwAPZX.js +1 -0
  4. package/dist/viewer/CloudLiveDocument-ceRinz2F.js +1 -0
  5. package/dist/viewer/{DocumentLayout-CbIehGxV.js → DocumentLayout-DUPesXt0.js} +141 -141
  6. package/dist/viewer/DocumentPage-p78IN0UO.js +1 -0
  7. package/dist/viewer/RailSwitch-B8Aht-FG.js +64 -0
  8. package/dist/viewer/{abnfDiagram-VCTEODGH-BwImveX1.js → abnfDiagram-VCTEODGH-Dz0T5wEI.js} +1 -1
  9. package/dist/viewer/{ar-SA-G6X2FPQ2-RpzZk-vo.js → ar-SA-G6X2FPQ2-Bytlrg0S.js} +1 -1
  10. package/dist/viewer/{architectureDiagram-5GKGNRK7-BhX61Vlu.js → architectureDiagram-5GKGNRK7-OYoo3ME7.js} +1 -1
  11. package/dist/viewer/{az-AZ-76LH7QW2-BVSWK8b7.js → az-AZ-76LH7QW2-w9f06xDk.js} +1 -1
  12. package/dist/viewer/{bg-BG-XCXSNQG7-Bpt9s0jR.js → bg-BG-XCXSNQG7-CEWDLlq7.js} +1 -1
  13. package/dist/viewer/{blockDiagram-I7D4REHJ-CljkTIL7.js → blockDiagram-I7D4REHJ-CAowR37U.js} +1 -1
  14. package/dist/viewer/{bn-BD-2XOGV67Q-BdFSuTbl.js → bn-BD-2XOGV67Q-DBNpDzHO.js} +1 -1
  15. package/dist/viewer/{c4Diagram-7LVT6UL2-D0iRCL-u.js → c4Diagram-7LVT6UL2-Dzzhg0Hl.js} +1 -1
  16. package/dist/viewer/{ca-ES-6MX7JW3Y-ClAdQpRf.js → ca-ES-6MX7JW3Y-Det2dq0q.js} +1 -1
  17. package/dist/viewer/{chunk-4HAMMTFA-Bp0_MHBC.js → chunk-4HAMMTFA-DZl9uS5D.js} +1 -1
  18. package/dist/viewer/{chunk-EIO257PC-C-qOSRvN.js → chunk-EIO257PC-CjCjUdBc.js} +1 -1
  19. package/dist/viewer/{chunk-GMAD6QVW-BFJ7kK_w.js → chunk-GMAD6QVW-CDRo04Dc.js} +1 -1
  20. package/dist/viewer/{chunk-GVQU2GXP-UaddXAPq.js → chunk-GVQU2GXP-BhrYhgpE.js} +1 -1
  21. package/dist/viewer/{chunk-IMKFNOWR-BSXuSZSV.js → chunk-IMKFNOWR-BfAgQjlN.js} +1 -1
  22. package/dist/viewer/{chunk-L3NEJ4N5-CCNBKnXZ.js → chunk-L3NEJ4N5-D-FTstxq.js} +1 -1
  23. package/dist/viewer/{chunk-OSK3NFVY-C6IbO0Jr.js → chunk-OSK3NFVY-CJgUgQQ4.js} +1 -1
  24. package/dist/viewer/{chunk-PWAF6VOD-kCQKhtQ5.js → chunk-PWAF6VOD-DWHqbvtp.js} +1 -1
  25. package/dist/viewer/{chunk-SHT3W25Y-CjszVd1a.js → chunk-SHT3W25Y-CBzt56Er.js} +1 -1
  26. package/dist/viewer/{chunk-SVP7TREG-BQ5ECbFL.js → chunk-SVP7TREG-b6pmQaqb.js} +1 -1
  27. package/dist/viewer/{chunk-TICWLB2K-CM3SXgeB.js → chunk-TICWLB2K-DIPK-gAO.js} +1 -1
  28. package/dist/viewer/{classDiagram-ZZMXUADV-CklLnwGV.js → classDiagram-ZZMXUADV-DgM9EY-7.js} +1 -1
  29. package/dist/viewer/{classDiagram-v2-VYDZK3BY-CklLnwGV.js → classDiagram-v2-VYDZK3BY-DgM9EY-7.js} +1 -1
  30. package/dist/viewer/{cs-CZ-2BRQDIVT-C9yZWjpH.js → cs-CZ-2BRQDIVT-CXEgS6Pi.js} +1 -1
  31. package/dist/viewer/{cynefinDiagram-5FMLGOSQ-pHGN68P6.js → cynefinDiagram-5FMLGOSQ-BQkxO3xf.js} +1 -1
  32. package/dist/viewer/{da-DK-5WZEPLOC-DNfdbnAi.js → da-DK-5WZEPLOC-D2twM2eB.js} +1 -1
  33. package/dist/viewer/{dagre-GXQ25YYZ-Cu5hDNcZ.js → dagre-GXQ25YYZ-DD_-ARQM.js} +1 -1
  34. package/dist/viewer/{de-DE-XR44H4JA-Dtf5rElI.js → de-DE-XR44H4JA-QQ3wzCUN.js} +1 -1
  35. package/dist/viewer/{diagram-S7CK7UJ4-BKmGJRFo.js → diagram-S7CK7UJ4-C6UhooWh.js} +1 -1
  36. package/dist/viewer/{diagram-UQ7AKVKN-CiImTxYb.js → diagram-UQ7AKVKN-CmOvdTfi.js} +1 -1
  37. package/dist/viewer/{diagram-VX7I27RA-KDRajhma.js → diagram-VX7I27RA-BQrnggcb.js} +1 -1
  38. package/dist/viewer/{diagram-Z3DM3KII-BaftiW-B.js → diagram-Z3DM3KII-eqq_bLYp.js} +1 -1
  39. package/dist/viewer/{dist-DnVCAc8Q.js → dist-A6XqCKp3.js} +1 -1
  40. package/dist/viewer/{dist-DH1y51Ji.js → dist-BHQRLarc.js} +1 -1
  41. package/dist/viewer/{dist-PRMB1ALz.js → dist-BVD4SXRG.js} +1 -1
  42. package/dist/viewer/{dist-BvAcUpu2.js → dist-C2_czco-.js} +1 -1
  43. package/dist/viewer/{dist-DZY6VV6F.js → dist-CBPL9nOI.js} +1 -1
  44. package/dist/viewer/{dist-vSbmlgLw.js → dist-CBa9iIgE.js} +1 -1
  45. package/dist/viewer/{dist-BIwkt9qv.js → dist-COWTq4PW.js} +1 -1
  46. package/dist/viewer/{dist-Dr0sIPMq.js → dist-CRFROhiU.js} +1 -1
  47. package/dist/viewer/{dist-CGMkgipD.js → dist-Cm3PtUTh.js} +1 -1
  48. package/dist/viewer/{dist-BwXQ338V.js → dist-CmuZXMYX.js} +1 -1
  49. package/dist/viewer/{dist-CmvbQIrE.js → dist-CvMMV1bh.js} +1 -1
  50. package/dist/viewer/{dist-hmKSLQSf.js → dist-D6ZK8Xjb.js} +1 -1
  51. package/dist/viewer/{dist-KWTwuZjj.js → dist-D9ubIHs9.js} +1 -1
  52. package/dist/viewer/{dist-BPjjkXfR.js → dist-DlqN5LCW.js} +1 -1
  53. package/dist/viewer/{dist-CJ7SqDZz.js → dist-Dvmx2QWc.js} +1 -1
  54. package/dist/viewer/{dist-Bf8Gpkfz.js → dist-DwneAiRo.js} +4 -4
  55. package/dist/viewer/{dist-y8ORXHnh.js → dist-IvjL_4Fz.js} +1 -1
  56. package/dist/viewer/{dist-Dzz8z2UZ.js → dist-MgwwM__x.js} +1 -1
  57. package/dist/viewer/{dist-BZ58JpdA.js → dist-QND2Lmk5.js} +1 -1
  58. package/dist/viewer/{dist-C4SdA9EW.js → dist-YskcL8-n.js} +1 -1
  59. package/dist/viewer/{dist-B15eZXtk.js → dist-lBA58Q6O.js} +1 -1
  60. package/dist/viewer/{dist-C12tszp1.js → dist-lONhpLQT.js} +1 -1
  61. package/dist/viewer/{dist-u48wpMGh.js → dist-v3HQ_tBw.js} +1 -1
  62. package/dist/viewer/{dist-DycRP_OX.js → dist-vk9ofs_t.js} +1 -1
  63. package/dist/viewer/{ebnfDiagram-PWID7BFC-BrG8iNXQ.js → ebnfDiagram-PWID7BFC-0s9Mm78H.js} +1 -1
  64. package/dist/viewer/{el-GR-BZB4AONW-DqICvPRG.js → el-GR-BZB4AONW-DFIcTo3i.js} +1 -1
  65. package/dist/viewer/{en-B4ZKOASM-dczwLo2Q.js → en-B4ZKOASM-BEswEOpC.js} +1 -1
  66. package/dist/viewer/{erDiagram-RLTQ6QDP-1lXVLQAr.js → erDiagram-RLTQ6QDP-A9ucHzt3.js} +1 -1
  67. package/dist/viewer/{es-ES-U4NZUMDT-B5LCvezC.js → es-ES-U4NZUMDT-Dsyjlq5a.js} +1 -1
  68. package/dist/viewer/{eu-ES-A7QVB2H4-AxW11Jr4.js → eu-ES-A7QVB2H4-BAIIFqxX.js} +1 -1
  69. package/dist/viewer/{fa-IR-HGAKTJCU-CrextBTW.js → fa-IR-HGAKTJCU-C3OpuRE4.js} +1 -1
  70. package/dist/viewer/{fi-FI-Z5N7JZ37-DW0oU7X0.js → fi-FI-Z5N7JZ37-CGZNrctb.js} +1 -1
  71. package/dist/viewer/flowDiagram-HODETNUW-D_xWrdzr.js +1 -0
  72. package/dist/viewer/{fr-FR-RHASNOE6-D1WTztbV.js → fr-FR-RHASNOE6-DABvCzvT.js} +1 -1
  73. package/dist/viewer/{ganttDiagram-EL5Y4UJY-OHjITozZ.js → ganttDiagram-EL5Y4UJY-DqLWQJWV.js} +1 -1
  74. package/dist/viewer/{gl-ES-HMX3MZ6V-Bz6k3trL.js → gl-ES-HMX3MZ6V-D-FsubUP.js} +1 -1
  75. package/dist/viewer/{he-IL-6SHJWFNN-BB9LB2-0.js → he-IL-6SHJWFNN-DKZYdZfW.js} +1 -1
  76. package/dist/viewer/{hi-IN-IWLTKZ5I-Dz-hDa8B.js → hi-IN-IWLTKZ5I-Dg6zlEAV.js} +1 -1
  77. package/dist/viewer/{hu-HU-A5ZG7DT2-Bty6njMB.js → hu-HU-A5ZG7DT2-N2pu49mS.js} +1 -1
  78. package/dist/viewer/{id-ID-SAP4L64H-C4usOGls.js → id-ID-SAP4L64H-L0ROzOqC.js} +1 -1
  79. package/dist/viewer/{image-GAAHSSAO-vAX85uOY.js → image-GAAHSSAO-CPsuFbpQ.js} +1 -1
  80. package/dist/viewer/index.html +6 -6
  81. package/dist/viewer/index.js +10 -10
  82. package/dist/viewer/index2.css +1 -1
  83. package/dist/viewer/{infoDiagram-27XIBGKW-BqzIrdk1.js → infoDiagram-27XIBGKW-DpFxmo2_.js} +1 -1
  84. package/dist/viewer/{ishikawaDiagram-5VMMS53U-Di-DEKXa.js → ishikawaDiagram-5VMMS53U-8EYGUU-2.js} +1 -1
  85. package/dist/viewer/{it-IT-JPQ66NNP-mzQckg9k.js → it-IT-JPQ66NNP-BV10T_YH.js} +1 -1
  86. package/dist/viewer/{ja-JP-DBVTYXUO-C7-H-cmZ.js → ja-JP-DBVTYXUO-BCaJwh3E.js} +1 -1
  87. package/dist/viewer/{journeyDiagram-3NMN7TZE-I0j1KMEL.js → journeyDiagram-3NMN7TZE-DaFiGmqB.js} +1 -1
  88. package/dist/viewer/{kaa-6HZHGXH3-CmNCMCJy.js → kaa-6HZHGXH3-B1skt76W.js} +1 -1
  89. package/dist/viewer/{kab-KAB-ZGHBKWFO-ItB_9BGI.js → kab-KAB-ZGHBKWFO-Cw1z7bNO.js} +1 -1
  90. package/dist/viewer/{kanban-definition-UXKFOSKX-DTBDnl3B.js → kanban-definition-UXKFOSKX-XFPAw_KL.js} +1 -1
  91. package/dist/viewer/{kk-KZ-P5N5QNE5-DFvprYF4.js → kk-KZ-P5N5QNE5-BPyIEorg.js} +1 -1
  92. package/dist/viewer/{km-KH-HSX4SM5Z-CYlJRLqM.js → km-KH-HSX4SM5Z-DuqV3Xms.js} +1 -1
  93. package/dist/viewer/{ko-KR-MTYHY66A-DdWMyWM6.js → ko-KR-MTYHY66A-C40qKz7C.js} +1 -1
  94. package/dist/viewer/{ku-TR-6OUDTVRD-BzvpGeMQ.js → ku-TR-6OUDTVRD-Bbrtxcjm.js} +1 -1
  95. package/dist/viewer/{lt-LT-XHIRWOB4-BYo85Qu7.js → lt-LT-XHIRWOB4-B_qXWIwM.js} +1 -1
  96. package/dist/viewer/{lv-LV-5QDEKY6T-CosJufMV.js → lv-LV-5QDEKY6T-8_k-NVNn.js} +1 -1
  97. package/dist/viewer/{mindmap-definition-YA3MSWOX-D8dIeGOr.js → mindmap-definition-YA3MSWOX-CJw_BzHI.js} +1 -1
  98. package/dist/viewer/{mr-IN-CRQNXWMA-DZw4xisJ.js → mr-IN-CRQNXWMA-Cr6mk0h0.js} +1 -1
  99. package/dist/viewer/{my-MM-5M5IBNSE-CJaPw4-2.js → my-MM-5M5IBNSE-zfvalQ4P.js} +1 -1
  100. package/dist/viewer/{nb-NO-T6EIAALU-7G70nMbl.js → nb-NO-T6EIAALU-B0R5LoPU.js} +1 -1
  101. package/dist/viewer/{nl-NL-IS3SIHDZ-C2N5LLwv.js → nl-NL-IS3SIHDZ-DByEOQ_2.js} +1 -1
  102. package/dist/viewer/{nn-NO-6E72VCQL-hN3Y-orF.js → nn-NO-6E72VCQL-DUupf9du.js} +1 -1
  103. package/dist/viewer/{oc-FR-POXYY2M6-C6zKnltp.js → oc-FR-POXYY2M6-C4GiSVlQ.js} +1 -1
  104. package/dist/viewer/{pa-IN-N4M65BXN-D9LFkWXb.js → pa-IN-N4M65BXN-BmpOpAle.js} +1 -1
  105. package/dist/viewer/{pegDiagram-XKGWAZYB-B0RvoMQk.js → pegDiagram-XKGWAZYB-DAjil8NL.js} +1 -1
  106. package/dist/viewer/percentages-BXMCSKIN-B-KINBvQ.js +1 -0
  107. package/dist/viewer/{pieDiagram-E7YTZNPT-ewOACQMR.js → pieDiagram-E7YTZNPT-CaXmRdry.js} +1 -1
  108. package/dist/viewer/{pl-PL-T2D74RX3-B7Srn8r-.js → pl-PL-T2D74RX3-DuE4eY9G.js} +1 -1
  109. package/dist/viewer/{prod-BrYSC5BZ.js → prod-CJIb7nxS.js} +8 -8
  110. package/dist/viewer/{pt-BR-5N22H2LF-DYyT3f2b.js → pt-BR-5N22H2LF-KH_3-_Pi.js} +1 -1
  111. package/dist/viewer/{pt-PT-UZXXM6DQ-rOtMHOEe.js → pt-PT-UZXXM6DQ-BF4pZvjU.js} +1 -1
  112. package/dist/viewer/{quadrantDiagram-AXDQQJYC-7uBvJywd.js → quadrantDiagram-AXDQQJYC-CttUyhBS.js} +1 -1
  113. package/dist/viewer/{railroadDiagram-O6MQD6OU-CjrkD1Sv.js → railroadDiagram-O6MQD6OU-CbnAU0MT.js} +1 -1
  114. package/dist/viewer/{requirementDiagram-BXWQKSXE-CtK-_ZfU.js → requirementDiagram-BXWQKSXE-DvKdUhZQ.js} +1 -1
  115. package/dist/viewer/{ro-RO-JPDTUUEW-DlX5UQ5g.js → ro-RO-JPDTUUEW-Brpa20Xr.js} +1 -1
  116. package/dist/viewer/{ru-RU-B4JR7IUQ-DMkmBI_w.js → ru-RU-B4JR7IUQ-PktJmPKO.js} +1 -1
  117. package/dist/viewer/{sequenceDiagram-WJ2MYXX4-FH_hVozp.js → sequenceDiagram-WJ2MYXX4-CJoSlXfo.js} +1 -1
  118. package/dist/viewer/{si-LK-N5RQ5JYF-syGIcUZu.js → si-LK-N5RQ5JYF-ChiCBRoh.js} +1 -1
  119. package/dist/viewer/{sk-SK-C5VTKIMK-DNPJXh_n.js → sk-SK-C5VTKIMK-CqJFB_HV.js} +1 -1
  120. package/dist/viewer/{sl-SI-NN7IZMDC-DRPcTij4.js → sl-SI-NN7IZMDC-DVLqmOJ1.js} +1 -1
  121. package/dist/viewer/{stateDiagram-D77RDMKH-l7B99Ka0.js → stateDiagram-D77RDMKH-DMn_ZLVi.js} +1 -1
  122. package/dist/viewer/{stateDiagram-v2-MP3YSRHH-C0UvR7x5.js → stateDiagram-v2-MP3YSRHH-CEKv_pDb.js} +1 -1
  123. package/dist/viewer/subset-shared.chunk-P48EEdkR.js +1 -0
  124. package/dist/viewer/{subset-worker.chunk-DlQBa_39.js → subset-worker.chunk-D7vPNmxj.js} +1 -1
  125. package/dist/viewer/{sv-SE-XGPEYMSR-S3tp2Wzl.js → sv-SE-XGPEYMSR-BE0Rox_P.js} +1 -1
  126. package/dist/viewer/{swimlanes-42K2YHIH-B13WRxod.js → swimlanes-42K2YHIH-Z13RXAJ2.js} +1 -1
  127. package/dist/viewer/{swimlanesDiagram-VR7AAH4N-D1UZKMPA.js → swimlanesDiagram-VR7AAH4N-2F-sMn5C.js} +1 -1
  128. package/dist/viewer/{ta-IN-2NMHFXQM-DZwig901.js → ta-IN-2NMHFXQM-BytzkZT9.js} +1 -1
  129. package/dist/viewer/{th-TH-HPSO5L25-C4AAMO23.js → th-TH-HPSO5L25-8djIgrrS.js} +1 -1
  130. package/dist/viewer/{timeline-definition-24CTP7MA-DIMtwmk3.js → timeline-definition-24CTP7MA-BBemmJjg.js} +1 -1
  131. package/dist/viewer/{tr-TR-DEFEU3FU-qZqNQn0v.js → tr-TR-DEFEU3FU-s5K56Q5P.js} +1 -1
  132. package/dist/viewer/{uk-UA-QMV73CPH-DCpn5eCj.js → uk-UA-QMV73CPH-BR4VH6DS.js} +1 -1
  133. package/dist/viewer/{vennDiagram-4TSXK5OY-Cm6chrYK.js → vennDiagram-4TSXK5OY-BF17eruu.js} +1 -1
  134. package/dist/viewer/{vi-VN-M7AON7JQ-Mx8GQ3WP.js → vi-VN-M7AON7JQ-B0ic3hAd.js} +1 -1
  135. package/dist/viewer/{wardleyDiagram-VM6X3IG4-BJBCh83b.js → wardleyDiagram-VM6X3IG4-D-8trXu4.js} +1 -1
  136. package/dist/viewer/{xychartDiagram-S5SC5T6Z-Dwt5Yi9Q.js → xychartDiagram-S5SC5T6Z-B596erre.js} +1 -1
  137. package/dist/viewer/{zh-CN-LNUGB5OW-uVvmbpx_.js → zh-CN-LNUGB5OW-CYANBkOM.js} +1 -1
  138. package/dist/viewer/{zh-HK-E62DVLB3-B10Y5kIG.js → zh-HK-E62DVLB3-BWpz93gC.js} +1 -1
  139. package/dist/viewer/{zh-TW-RAJ6MFWO-siER1xfy.js → zh-TW-RAJ6MFWO-CACFXFA3.js} +1 -1
  140. package/package.json +3 -1
  141. package/dist/viewer/CloudDocument-qU9Y5IS3.js +0 -1
  142. package/dist/viewer/CloudLiveDocument-BjQZue8V.js +0 -1
  143. package/dist/viewer/DocumentPage-BYXyKDdx.js +0 -1
  144. package/dist/viewer/RailSwitch-Dz65rESU.js +0 -58
  145. package/dist/viewer/flowDiagram-HODETNUW-BaTzUU_D.js +0 -1
  146. package/dist/viewer/percentages-BXMCSKIN-B8SN6v6b.js +0 -1
  147. package/dist/viewer/subset-shared.chunk-8gQsHXf4.js +0 -1
package/dist/server.cjs CHANGED
@@ -5171,9 +5171,9 @@ var require_websocket_server = __commonJS({
5171
5171
 
5172
5172
  // src/server/main.ts
5173
5173
  var import_node_child_process2 = require("node:child_process");
5174
- var import_node_fs26 = __toESM(require("node:fs"), 1);
5175
- var import_node_os = __toESM(require("node:os"), 1);
5176
- var import_node_path22 = __toESM(require("node:path"), 1);
5174
+ var import_node_fs27 = __toESM(require("node:fs"), 1);
5175
+ var import_node_os2 = __toESM(require("node:os"), 1);
5176
+ var import_node_path23 = __toESM(require("node:path"), 1);
5177
5177
 
5178
5178
  // src/server/app.ts
5179
5179
  var import_node_fs24 = __toESM(require("node:fs"), 1);
@@ -19688,19 +19688,19 @@ var ElementDOMSlot = class _ElementDOMSlot extends DOMSlot {
19688
19688
  }
19689
19689
  };
19690
19690
  function indexPath(root, child) {
19691
- const path23 = [];
19691
+ const path24 = [];
19692
19692
  let node = child;
19693
19693
  for (; node !== root && node !== null; node = node.parentNode) {
19694
19694
  let i6 = 0;
19695
19695
  for (let sibling = node.previousSibling; sibling !== null; sibling = sibling.previousSibling) {
19696
19696
  i6++;
19697
19697
  }
19698
- path23.push(i6);
19698
+ path24.push(i6);
19699
19699
  }
19700
19700
  if (!(node === root)) {
19701
19701
  formatDevErrorMessage(`indexPath: root is not a parent of child`);
19702
19702
  }
19703
- return path23.reverse();
19703
+ return path24.reverse();
19704
19704
  }
19705
19705
  // @__NO_SIDE_EFFECTS__
19706
19706
  function readLexicalVersion() {
@@ -34480,9 +34480,9 @@ function getActiveElementDeep(root) {
34480
34480
  function getComposedEventTarget(event) {
34481
34481
  const target = event.target;
34482
34482
  if (target !== null && isHTMLElement(target) && target.shadowRoot !== null && typeof event.composedPath === "function") {
34483
- const path23 = event.composedPath();
34484
- if (path23.length > 0) {
34485
- return path23[0];
34483
+ const path24 = event.composedPath();
34484
+ if (path24.length > 0) {
34485
+ return path24[0];
34486
34486
  }
34487
34487
  }
34488
34488
  return target;
@@ -44578,10 +44578,10 @@ function _loadWasmModule(sync, filepath, src, imports2) {
44578
44578
  var buf = null;
44579
44579
  var isNode2 = typeof process !== "undefined" && process.versions != null && process.versions.node != null;
44580
44580
  if (filepath && isNode2) {
44581
- var fs29 = null;
44582
- var path23 = null;
44581
+ var fs30 = null;
44582
+ var path24 = null;
44583
44583
  return new Promise((resolve, reject) => {
44584
- fs29.readFile(path23.resolve(__dirname, filepath), (error, buffer) => {
44584
+ fs30.readFile(path24.resolve(__dirname, filepath), (error, buffer) => {
44585
44585
  if (error != null) {
44586
44586
  reject(error);
44587
44587
  } else {
@@ -45884,10 +45884,10 @@ var LoroDoc = class _LoroDoc {
45884
45884
  * @param {string} path
45885
45885
  * @returns {Value | Container | undefined}
45886
45886
  */
45887
- getByPath(path23) {
45887
+ getByPath(path24) {
45888
45888
  try {
45889
45889
  const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
45890
- const ptr0 = passStringToWasm0(path23, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
45890
+ const ptr0 = passStringToWasm0(path24, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
45891
45891
  const len0 = WASM_VECTOR_LEN;
45892
45892
  wasm.lorodoc_getByPath(retptr, this.__wbg_ptr, ptr0, len0);
45893
45893
  var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
@@ -84900,10 +84900,10 @@ var CHAT_BLOCK_TRANSFORMER = {
84900
84900
  export: (node) => {
84901
84901
  if (node.getType() !== "chat") return null;
84902
84902
  const j4 = node.exportJSON();
84903
- const lookup = new Map(j4.participants.map((p7) => [p7.id, p7]));
84903
+ const lookup2 = new Map(j4.participants.map((p7) => [p7.id, p7]));
84904
84904
  const lines = [];
84905
84905
  j4.messages.forEach((m11, idx) => {
84906
- const p7 = lookup.get(m11.participantId) ?? UNKNOWN_CHAT_PARTICIPANT;
84906
+ const p7 = lookup2.get(m11.participantId) ?? UNKNOWN_CHAT_PARTICIPANT;
84907
84907
  const name = chatParticipantName(p7);
84908
84908
  const block = j4.variant === "user-user" || j4.variant === "user-agent" && p7.kind === "user" ? m11.content.split("\n").map((line, i6) => i6 === 0 ? `> **${name}:** ${line}` : `> ${line}`).join("\n") : m11.content;
84909
84909
  if (idx > 0) lines.push("");
@@ -89731,6 +89731,112 @@ var import_node_crypto8 = __toESM(require("node:crypto"), 1);
89731
89731
  var RYUGI_MARK_VIEWBOX = "0 0 512 512";
89732
89732
  var RYUGI_MARK_BODY = '<g transform="translate(82 136.317460) scale(0.613756614)"><g transform="translate(0.000000,390.000000) scale(0.100000,-0.100000)" stroke="none"><path d="M4945 3889 c-339 -44 -682 -239 -905 -517 -139 -172 -232 -355 -365 -717 -136 -368 -285 -735 -360 -890 -219 -449 -524 -768 -849 -887 -121 -44 -215 -60 -356 -60 -162 0 -244 18 -450 97 -291 111 -420 144 -650 166 -257 24 -637 -19 -772 -87 -148 -75 -249 -247 -235 -399 19 -197 186 -344 392 -346 40 -1 127 11 205 27 115 23 160 28 300 28 242 1 372 -29 671 -155 226 -95 467 -149 662 -149 252 0 548 74 789 197 394 201 708 521 988 1008 83 144 271 529 405 830 220 493 300 632 436 759 121 112 226 162 424 201 44 9 108 29 143 45 165 77 274 285 244 467 -31 188 -168 334 -354 378 -70 16 -249 18 -363 4z M765 3139 c-202 -11 -415 -48 -497 -86 -91 -44 -151 -101 -193 -186 -123 -248 31 -525 307 -554 38 -4 99 3 204 23 137 27 167 29 384 29 205 0 249 -3 347 -23 225 -45 387 -106 658 -247 182 -94 308 -144 463 -182 138 -35 350 -39 447 -9 174 53 275 152 305 299 26 130 -40 267 -158 323 -52 25 -72 28 -227 35 -248 11 -328 37 -576 187 -232 140 -384 213 -585 281 -283 95 -541 127 -879 110z M620 2104 c-273 -32 -384 -65 -471 -143 -235 -208 -136 -589 172 -660 68 -16 129 -13 272 14 400 73 702 31 1167 -163 239 -99 350 -125 535 -125 193 0 338 51 448 157 117 113 139 261 56 375 -50 69 -99 85 -294 92 -245 10 -332 35 -563 163 -224 123 -456 211 -693 262 -111 23 -149 26 -359 29 -129 2 -251 1 -270 -1z"/></g></g>';
89733
89733
 
89734
+ // src/shared/locale.ts
89735
+ var HTML_LANG = { en: "en", zh: "zh-CN" };
89736
+ function resolveLocale(preferences) {
89737
+ for (const preference of preferences) {
89738
+ const primary = preference.split("-")[0]?.trim().toLowerCase();
89739
+ if (primary === "zh") return "zh";
89740
+ if (primary === "en") return "en";
89741
+ }
89742
+ return "en";
89743
+ }
89744
+ function parseAcceptLanguage(header) {
89745
+ if (!header) return [];
89746
+ return header.split(",").map((part, index) => {
89747
+ const [tag = "", ...params] = part.trim().split(";");
89748
+ const q3 = params.map((param) => param.trim()).find((param) => param.startsWith("q="));
89749
+ return { tag: tag.trim(), q: q3 ? Number(q3.slice(2)) : 1, index };
89750
+ }).filter((entry) => entry.tag && !Number.isNaN(entry.q) && entry.q > 0).sort((a5, b6) => b6.q - a5.q || a5.index - b6.index).map((entry) => entry.tag);
89751
+ }
89752
+
89753
+ // src/shared/messages.ts
89754
+ function lookup(dictionary, key2) {
89755
+ let node = dictionary;
89756
+ for (const part of key2.split(".")) node = typeof node === "object" ? node[part] : void 0;
89757
+ return typeof node === "string" ? node : void 0;
89758
+ }
89759
+ function find3(dictionary, key2, locale, count) {
89760
+ if (typeof count === "number") {
89761
+ const form = lookup(dictionary, `${key2}_${new Intl.PluralRules(locale).select(count)}`) ?? lookup(dictionary, `${key2}_other`);
89762
+ if (form !== void 0) return form;
89763
+ }
89764
+ return lookup(dictionary, key2);
89765
+ }
89766
+ function translator(dictionaries, locale) {
89767
+ return (key2, values = {}) => {
89768
+ const message = find3(dictionaries[locale], key2, locale, values.count) ?? find3(dictionaries.en, key2, "en", values.count) ?? key2;
89769
+ return message.replace(/\{\{(\w+)\}\}/g, (match, name) => name in values ? String(values[name]) : match);
89770
+ };
89771
+ }
89772
+
89773
+ // src/server/locales/en.json
89774
+ var en_default = {
89775
+ callback: {
89776
+ titleOk: "Signed in to Ryugi Cloud",
89777
+ titleFailed: "Sign-in didn't finish",
89778
+ connected: "Connected to Ryugi Cloud",
89779
+ signedIn: "Signed in as",
89780
+ lead: "Ryugi on this computer can publish artifacts now.",
89781
+ fromPage: "Published from a Ryugi page?",
89782
+ fromPageDetail: "Go back to Ryugi; the share panel refreshes on its own.",
89783
+ fromAgent: "Asked the agent to publish?",
89784
+ fromAgentDetail: "Have it run the publish command again.",
89785
+ autoPublish: "Auto-publish is on",
89786
+ autoPublishDetail: "After each agent turn, changed artifacts sync privately to Ryugi Cloud. To turn it off, run <code>ryugi-artifacts config --auto-publish off</code>.",
89787
+ notConnected: "Not connected",
89788
+ retry: "Sign in again",
89789
+ retryDetail: "Go back to Ryugi and click Sign in in the share panel again.",
89790
+ description: "Result of signing in to Ryugi Cloud on this computer. Once connected, go back to Ryugi to publish and share artifacts.",
89791
+ closeOk: "You can close this page",
89792
+ closeFailed: "You can close this page and try again"
89793
+ },
89794
+ login: {
89795
+ expired: "This sign-in link has expired or was already used. Go back to Ryugi and sign in again.",
89796
+ unreachable: "Couldn't reach {{origin}} ({{message}}). Check your network, then go back to Ryugi and sign in again.",
89797
+ refused: "Ryugi Cloud didn't accept this sign-in ({{reason}}). Go back to Ryugi and sign in again."
89798
+ },
89799
+ meta: {
89800
+ artifact: "View {{title}} in the {{project}} project. This is a {{type}} artifact.",
89801
+ library: "Browse every artboard, document and HTML artifact in the {{project}} project, preview their content, and find them by type, name or update time."
89802
+ }
89803
+ };
89804
+
89805
+ // src/server/locales/zh.json
89806
+ var zh_default = {
89807
+ callback: {
89808
+ titleOk: "\u5DF2\u767B\u5F55 Ryugi Cloud",
89809
+ titleFailed: "\u767B\u5F55\u6CA1\u6709\u5B8C\u6210",
89810
+ connected: "\u5DF2\u8FDE\u63A5 Ryugi Cloud",
89811
+ signedIn: "\u5DF2\u767B\u5F55",
89812
+ lead: "\u8FD9\u53F0\u7535\u8111\u4E0A\u7684 Ryugi \u73B0\u5728\u53EF\u4EE5\u53D1\u5E03 artifact \u4E86\u3002",
89813
+ fromPage: "\u5728 Ryugi \u9875\u9762\u91CC\u53D1\u5E03\u7684\uFF1F",
89814
+ fromPageDetail: "\u56DE\u5230 Ryugi\uFF0C\u5206\u4EAB\u9762\u677F\u4F1A\u81EA\u52A8\u5237\u65B0\u3002",
89815
+ fromAgent: "\u8BA9 agent \u53D1\u5E03\u7684\uFF1F",
89816
+ fromAgentDetail: "\u8BA9\u5B83\u518D\u8FD0\u884C\u4E00\u6B21\u53D1\u5E03\u547D\u4EE4\u3002",
89817
+ autoPublish: "\u81EA\u52A8\u53D1\u5E03\u5DF2\u6253\u5F00",
89818
+ autoPublishDetail: "agent \u6BCF\u8F6E\u7ED3\u675F\u540E\uFF0C\u6539\u8FC7\u7684 artifact \u4F1A\u4EE5\u79C1\u5BC6\u65B9\u5F0F\u540C\u6B65\u5230 Ryugi Cloud\u3002\u5173\u95ED\uFF1A\u8FD0\u884C <code>ryugi-artifacts config --auto-publish off</code>\u3002",
89819
+ notConnected: "\u672A\u8FDE\u63A5",
89820
+ retry: "\u91CD\u65B0\u767B\u5F55",
89821
+ retryDetail: "\u56DE\u5230 Ryugi\uFF0C\u5728\u5206\u4EAB\u9762\u677F\u91CC\u518D\u70B9\u4E00\u6B21\u300C\u767B\u5F55\u300D\u3002",
89822
+ description: "Ryugi Cloud \u672C\u5730\u767B\u5F55\u7ED3\u679C\u3002\u5B8C\u6210\u8FDE\u63A5\u540E\uFF0C\u8FD4\u56DE Ryugi \u7EE7\u7EED\u53D1\u5E03\u548C\u5206\u4EAB Artifact\u3002",
89823
+ closeOk: "\u53EF\u4EE5\u5173\u95ED\u8FD9\u4E2A\u9875\u9762",
89824
+ closeFailed: "\u53EF\u4EE5\u5173\u95ED\u8FD9\u4E2A\u9875\u9762\u540E\u91CD\u8BD5"
89825
+ },
89826
+ login: {
89827
+ expired: "\u8FD9\u4E2A\u767B\u5F55\u94FE\u63A5\u5DF2\u8FC7\u671F\u6216\u5DF2\u7ECF\u7528\u8FC7\u3002\u56DE\u5230 Ryugi \u91CD\u65B0\u53D1\u8D77\u4E00\u6B21\u767B\u5F55\u3002",
89828
+ unreachable: "\u8FDE\u4E0D\u4E0A {{origin}}\uFF08{{message}}\uFF09\u3002\u68C0\u67E5\u7F51\u7EDC\u540E\u56DE\u5230 Ryugi \u91CD\u65B0\u53D1\u8D77\u767B\u5F55\u3002",
89829
+ refused: "Ryugi Cloud \u6CA1\u6709\u63A5\u53D7\u8FD9\u6B21\u767B\u5F55\uFF08{{reason}}\uFF09\u3002\u56DE\u5230 Ryugi \u91CD\u65B0\u53D1\u8D77\u767B\u5F55\u3002"
89830
+ },
89831
+ meta: {
89832
+ artifact: "\u5728 {{project}} \u9879\u76EE\u4E2D\u67E5\u770B {{title}}\uFF0C\u8FD9\u662F\u4E00\u4E2A {{type}} Artifact\u3002",
89833
+ library: "\u6D4F\u89C8 {{project}} \u9879\u76EE\u7684\u5168\u90E8 Artboard\u3001Document \u548C HTML Artifact\uFF0C\u9884\u89C8\u771F\u5B9E\u5185\u5BB9\uFF0C\u6309\u7C7B\u578B\u3001\u540D\u79F0\u548C\u66F4\u65B0\u65F6\u95F4\u67E5\u627E\u4F5C\u54C1\u3002"
89834
+ }
89835
+ };
89836
+
89837
+ // src/server/locales/index.ts
89838
+ var serverText = (locale) => translator({ en: en_default, zh: zh_default }, locale);
89839
+
89734
89840
  // src/server/callback-page.ts
89735
89841
  var CALLBACK_PAGE_CSP = "default-src 'none'; style-src 'unsafe-inline'; img-src data:; script-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'";
89736
89842
  var escapeHtml = (value) => value.replace(/[&<>"']/g, (ch) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" })[ch]);
@@ -89802,24 +89908,25 @@ footer { display: flex; justify-content: space-between; gap: 16px; margin-top: 2
89802
89908
  footer code { font: 12px var(--mono); }
89803
89909
  `;
89804
89910
  var row = (title, detail) => `<li><b>${title}</b><span>${detail}</span></li>`;
89805
- function callbackPage(result) {
89911
+ function callbackPage(result, locale = "en") {
89912
+ const t7 = serverText(locale);
89806
89913
  const host = escapeHtml(new URL(result.origin).host);
89807
- const title = result.ok ? "\u5DF2\u767B\u5F55 Ryugi Cloud" : "\u767B\u5F55\u6CA1\u6709\u5B8C\u6210";
89808
- const body = result.ok ? `<p class="status">${CIRCLE_CHECK}\u5DF2\u8FDE\u63A5 Ryugi Cloud</p>
89809
- <h1>\u5DF2\u767B\u5F55<em>${escapeHtml(result.login)}</em></h1>
89810
- <p class="lead">\u8FD9\u53F0\u7535\u8111\u4E0A\u7684 Ryugi \u73B0\u5728\u53EF\u4EE5\u53D1\u5E03 artifact \u4E86\u3002</p>
89811
- <ul class="rows">${row("\u5728 Ryugi \u9875\u9762\u91CC\u53D1\u5E03\u7684\uFF1F", "\u56DE\u5230 Ryugi\uFF0C\u5206\u4EAB\u9762\u677F\u4F1A\u81EA\u52A8\u5237\u65B0\u3002")}${row("\u8BA9 agent \u53D1\u5E03\u7684\uFF1F", "\u8BA9\u5B83\u518D\u8FD0\u884C\u4E00\u6B21\u53D1\u5E03\u547D\u4EE4\u3002")}${result.autoPublish ? row("\u81EA\u52A8\u53D1\u5E03\u5DF2\u6253\u5F00", "agent \u6BCF\u8F6E\u7ED3\u675F\u540E\uFF0C\u6539\u8FC7\u7684 artifact \u4F1A\u4EE5\u79C1\u5BC6\u65B9\u5F0F\u540C\u6B65\u5230 Ryugi Cloud\u3002\u5173\u95ED\uFF1A\u8FD0\u884C <code>ryugi-artifacts config --auto-publish off</code>\u3002") : ""}</ul>` : `<p class="status">${CIRCLE_ALERT}\u672A\u8FDE\u63A5</p>
89812
- <h1>\u767B\u5F55\u6CA1\u6709\u5B8C\u6210</h1>
89914
+ const title = result.ok ? t7("callback.titleOk") : t7("callback.titleFailed");
89915
+ const body = result.ok ? `<p class="status">${CIRCLE_CHECK}${t7("callback.connected")}</p>
89916
+ <h1>${t7("callback.signedIn")}<em>${escapeHtml(result.login)}</em></h1>
89917
+ <p class="lead">${t7("callback.lead")}</p>
89918
+ <ul class="rows">${row(t7("callback.fromPage"), t7("callback.fromPageDetail"))}${row(t7("callback.fromAgent"), t7("callback.fromAgentDetail"))}${result.autoPublish ? row(t7("callback.autoPublish"), t7("callback.autoPublishDetail")) : ""}</ul>` : `<p class="status">${CIRCLE_ALERT}${t7("callback.notConnected")}</p>
89919
+ <h1>${t7("callback.titleFailed")}</h1>
89813
89920
  <p class="lead">${escapeHtml(result.detail)}</p>
89814
- <ul class="rows">${row("\u91CD\u65B0\u767B\u5F55", "\u56DE\u5230 Ryugi\uFF0C\u5728\u5206\u4EAB\u9762\u677F\u91CC\u518D\u70B9\u4E00\u6B21\u300C\u767B\u5F55\u300D\u3002")}</ul>`;
89921
+ <ul class="rows">${row(t7("callback.retry"), t7("callback.retryDetail"))}</ul>`;
89815
89922
  return `<!doctype html>
89816
- <html lang="zh-CN">
89923
+ <html lang="${HTML_LANG[locale]}">
89817
89924
  <head>
89818
89925
  <meta charset="utf-8">
89819
89926
  <meta name="viewport" content="width=device-width, initial-scale=1">
89820
89927
  <meta name="referrer" content="no-referrer">
89821
89928
  <meta name="robots" content="noindex, nofollow">
89822
- <meta name="description" content="Ryugi Cloud \u672C\u5730\u767B\u5F55\u7ED3\u679C\u3002\u5B8C\u6210\u8FDE\u63A5\u540E\uFF0C\u8FD4\u56DE Ryugi \u7EE7\u7EED\u53D1\u5E03\u548C\u5206\u4EAB Artifact\u3002">
89929
+ <meta name="description" content="${t7("callback.description")}">
89823
89930
  <title>${title}</title>
89824
89931
  <style>${STYLE2}</style>
89825
89932
  </head>
@@ -89827,7 +89934,7 @@ function callbackPage(result) {
89827
89934
  <div class="mark">${MARK}ryugi</div>
89828
89935
  <main class="${result.ok ? "signed-in" : "failed"}">
89829
89936
  ${body}
89830
- <footer><span>${result.ok ? "\u53EF\u4EE5\u5173\u95ED\u8FD9\u4E2A\u9875\u9762" : "\u53EF\u4EE5\u5173\u95ED\u8FD9\u4E2A\u9875\u9762\u540E\u91CD\u8BD5"}</span><code>${host}</code></footer>
89937
+ <footer><span>${result.ok ? t7("callback.closeOk") : t7("callback.closeFailed")}</span><code>${host}</code></footer>
89831
89938
  </main>
89832
89939
  </body>
89833
89940
  </html>
@@ -90043,7 +90150,7 @@ function createCloudRoutes(options) {
90043
90150
  const challenge = import_node_crypto8.default.createHash("sha256").update(verifier).digest("base64url");
90044
90151
  return `${origin}/auth/cli?port=${options.port()}&state=${state}&challenge=${challenge}`;
90045
90152
  };
90046
- const cloudFetch = async (method, path23, body) => {
90153
+ const cloudFetch = async (method, path24, body) => {
90047
90154
  const credentials = readCredentials(credentialsFile2, origin);
90048
90155
  if (!credentials) throw new SignedOut();
90049
90156
  const headers = { Authorization: `Bearer ${credentials.token}` };
@@ -90057,7 +90164,7 @@ function createCloudRoutes(options) {
90057
90164
  }
90058
90165
  let res;
90059
90166
  try {
90060
- res = await fetch(`${origin}${path23}`, { method, headers, body: payload });
90167
+ res = await fetch(`${origin}${path24}`, { method, headers, body: payload });
90061
90168
  } catch (err) {
90062
90169
  throw new CloudRefused(502, `could not reach ${origin}: ${err.message}`);
90063
90170
  }
@@ -90114,7 +90221,7 @@ function createCloudRoutes(options) {
90114
90221
  }
90115
90222
  const sha = (data) => import_node_crypto8.default.createHash("sha256").update(data).digest("hex");
90116
90223
  const hashed = withCloudRuntime(ref.type, packed).map((file) => ({ ...file, hash: sha(file.data) }));
90117
- const content = { title: inspected.title, payload: inspected.payload, files: hashed.map(({ path: path23, hash }) => ({ path: path23, hash })) };
90224
+ const content = { title: inspected.title, payload: inspected.payload, files: hashed.map(({ path: path24, hash }) => ({ path: path24, hash })) };
90118
90225
  const fingerprint = sha(JSON.stringify({ title: inspected.title, payload: fingerprintPayload(inspected.payload), files: packed.map((file) => ({ path: file.path, hash: sha(file.data) })) }));
90119
90226
  return { ready: true, hashed, content, fingerprint };
90120
90227
  };
@@ -90129,7 +90236,7 @@ function createCloudRoutes(options) {
90129
90236
  };
90130
90237
  const publish = async (ref, requested, { recreate = true, skipUnchanged = false } = {}) => {
90131
90238
  const prepared = await prepare(ref);
90132
- if (!prepared.ready) return { status: 409, body: { error: "fix these before publishing", reasons: prepared.reasons } };
90239
+ if (!prepared.ready) return { status: 409, body: { error: "fix these before publishing", code: "publish_not_ready", reasons: prepared.reasons } };
90133
90240
  const { hashed, content, fingerprint } = prepared;
90134
90241
  const key2 = `${ref.type}/${ref.id}`;
90135
90242
  const entry = artifactEntry(key2);
@@ -90308,8 +90415,9 @@ function createCloudRoutes(options) {
90308
90415
  send(res, 404, "Not found");
90309
90416
  };
90310
90417
  return {
90311
- async handleCallback(url, res) {
90312
- const page = (status, result) => send(res, status, callbackPage({ ...result, origin }), {
90418
+ async handleCallback(url, res, locale = "en") {
90419
+ const t7 = serverText(locale);
90420
+ const page = (status, result) => send(res, status, callbackPage({ ...result, origin }, locale), {
90313
90421
  "Content-Type": "text/html; charset=utf-8",
90314
90422
  "Content-Security-Policy": CALLBACK_PAGE_CSP
90315
90423
  });
@@ -90318,7 +90426,7 @@ function createCloudRoutes(options) {
90318
90426
  pendingStates.delete(state);
90319
90427
  const code = url.searchParams.get("code");
90320
90428
  if (!pending || pending.expires < Date.now() || !code) {
90321
- page(400, { ok: false, detail: "\u8FD9\u4E2A\u767B\u5F55\u94FE\u63A5\u5DF2\u8FC7\u671F\u6216\u5DF2\u7ECF\u7528\u8FC7\u3002\u56DE\u5230 Ryugi \u91CD\u65B0\u53D1\u8D77\u4E00\u6B21\u767B\u5F55\u3002" });
90429
+ page(400, { ok: false, detail: t7("login.expired") });
90322
90430
  return;
90323
90431
  }
90324
90432
  let swap;
@@ -90329,13 +90437,13 @@ function createCloudRoutes(options) {
90329
90437
  body: JSON.stringify({ code, verifier: pending.verifier })
90330
90438
  });
90331
90439
  } catch (err) {
90332
- page(502, { ok: false, detail: `\u8FDE\u4E0D\u4E0A ${origin}\uFF08${err.message}\uFF09\u3002\u68C0\u67E5\u7F51\u7EDC\u540E\u56DE\u5230 Ryugi \u91CD\u65B0\u53D1\u8D77\u767B\u5F55\u3002` });
90440
+ page(502, { ok: false, detail: t7("login.unreachable", { origin, message: err.message }) });
90333
90441
  return;
90334
90442
  }
90335
90443
  const issued = await swap.json().catch(() => ({}));
90336
90444
  if (!swap.ok || typeof issued.token !== "string" || typeof issued.login !== "string") {
90337
90445
  const reason = typeof issued.error === "string" ? issued.error : `HTTP ${swap.status}`;
90338
- page(400, { ok: false, detail: `Ryugi Cloud \u6CA1\u6709\u63A5\u53D7\u8FD9\u6B21\u767B\u5F55\uFF08${reason}\uFF09\u3002\u56DE\u5230 Ryugi \u91CD\u65B0\u53D1\u8D77\u767B\u5F55\u3002` });
90446
+ page(400, { ok: false, detail: t7("login.refused", { reason }) });
90339
90447
  return;
90340
90448
  }
90341
90449
  writeCredentials(credentialsFile2, { origin, token: issued.token, login: issued.login });
@@ -90495,15 +90603,17 @@ function commentNames({ agentFile, projectDir, cloud }) {
90495
90603
  var import_node_crypto9 = require("node:crypto");
90496
90604
  var escapeHtml2 = (value) => value.replace(/[&<>"']/g, (ch) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" })[ch]);
90497
90605
  function viewerPage(template, page) {
90606
+ const locale = page.locale ?? "en";
90498
90607
  const values = {
90499
90608
  robots: "noindex, nofollow",
90609
+ "og:locale": locale === "zh" ? "zh_CN" : "en_US",
90500
90610
  description: page.description,
90501
90611
  "og:title": page.title,
90502
90612
  "og:description": page.description,
90503
90613
  "twitter:title": page.title,
90504
90614
  "twitter:description": page.description
90505
90615
  };
90506
- return template.replace(/<html\b/i, (tag) => page.artifactId ? `${tag} data-ryugi-artifact-id="${escapeHtml2(page.artifactId)}"` : tag).replace(/<title\b[^>]*>[\s\S]*?<\/title>/i, () => `<title>${escapeHtml2(page.title)}</title>`).replace(/(<link\b[^>]*\brel="icon"[^>]*\bhref=")[^"]*(")/i, (tag, prefix, suffix) => page.icon ? `${prefix}${escapeHtml2(page.icon)}${suffix}` : tag).replace(/(<meta\b[^>]*\b(?:name|property)="([^"]+)"[^>]*\bcontent=")([^"]*)("[^>]*>)/gi, (tag, prefix, name, value, suffix) => {
90616
+ return template.replace(/<html\b([^>]*)>/i, (_tag, attributes) => `<html${attributes.replace(/\slang="[^"]*"/i, "")} lang="${HTML_LANG[locale]}"${page.artifactId ? ` data-ryugi-artifact-id="${escapeHtml2(page.artifactId)}"` : ""}>`).replace(/<title\b[^>]*>[\s\S]*?<\/title>/i, () => `<title>${escapeHtml2(page.title)}</title>`).replace(/(<link\b[^>]*\brel="icon"[^>]*\bhref=")[^"]*(")/i, (tag, prefix, suffix) => page.icon ? `${prefix}${escapeHtml2(page.icon)}${suffix}` : tag).replace(/(<meta\b[^>]*\b(?:name|property)="([^"]+)"[^>]*\bcontent=")([^"]*)("[^>]*>)/gi, (tag, prefix, name, value, suffix) => {
90507
90617
  const content = values[name] ?? (name === "og:image" || name === "twitter:image" ? new URL(value, page.url).href : void 0);
90508
90618
  return content === void 0 ? tag : `${prefix}${escapeHtml2(content)}${suffix}`;
90509
90619
  }).replace(/<\/head>/i, () => `<link rel="canonical" href="${escapeHtml2(page.url)}">
@@ -90811,7 +90921,12 @@ async function startArtifactsServer(options) {
90811
90921
  selections.clearAll();
90812
90922
  const changeListeners = [];
90813
90923
  const activityListeners = [];
90814
- const touch = () => activityListeners.forEach((listener) => listener());
90924
+ const startedAt = Date.now();
90925
+ let lastActivity = startedAt;
90926
+ const touch = () => {
90927
+ lastActivity = Date.now();
90928
+ activityListeners.forEach((listener) => listener());
90929
+ };
90815
90930
  let port = 0;
90816
90931
  let cookieName = "";
90817
90932
  let relay = null;
@@ -91179,9 +91294,14 @@ async function startArtifactsServer(options) {
91179
91294
  for (const socket of clients) socket.write(frame);
91180
91295
  }
91181
91296
  const handleRequest = (req, res) => {
91182
- touch();
91183
91297
  res.setHeader("X-Robots-Tag", "noindex, nofollow");
91184
91298
  const url2 = new URL(req.url ?? "/", "http://artifacts.local");
91299
+ if (url2.pathname === "/api/status") {
91300
+ if (!isAuthorized(req, url2.searchParams.get("key"))) send(res, 403, "Forbidden: agent calls need ?key=");
91301
+ else sendJson(res, 200, { pid: process.pid, startedAt, lastActivity, clients: clients.size });
91302
+ return;
91303
+ }
91304
+ touch();
91185
91305
  let pathname;
91186
91306
  try {
91187
91307
  pathname = decodeURIComponent(url2.pathname);
@@ -91199,7 +91319,7 @@ async function startArtifactsServer(options) {
91199
91319
  return;
91200
91320
  }
91201
91321
  if (cloud && pathname === "/api/cloud/callback") {
91202
- void cloud.handleCallback(url2, res).catch((err) => {
91322
+ void cloud.handleCallback(url2, res, resolveLocale(parseAcceptLanguage(req.headers["accept-language"]))).catch((err) => {
91203
91323
  if (!res.headersSent) send(res, 500, `Artifacts error: ${err.message}`);
91204
91324
  });
91205
91325
  return;
@@ -91320,7 +91440,9 @@ async function startArtifactsServer(options) {
91320
91440
  const dir = resolved?.dir;
91321
91441
  const project = import_node_path21.default.basename(import_node_path21.default.dirname(import_node_path21.default.dirname(root)));
91322
91442
  const title = ref ? dir ? titleOf(readArtifact(dir, ref), ref) : ref.id : `${project} \xB7 Artifacts`;
91323
- const description = ref ? `\u5728 ${project} \u9879\u76EE\u4E2D\u67E5\u770B ${title}\uFF0C\u8FD9\u662F\u4E00\u4E2A ${ref.type === "artboard" ? "Artboard" : ref.type === "document" ? "Document" : "HTML"} Artifact\u3002` : `\u6D4F\u89C8 ${project} \u9879\u76EE\u7684\u5168\u90E8 Artboard\u3001Document \u548C HTML Artifact\uFF0C\u9884\u89C8\u771F\u5B9E\u5185\u5BB9\uFF0C\u6309\u7C7B\u578B\u3001\u540D\u79F0\u548C\u66F4\u65B0\u65F6\u95F4\u67E5\u627E\u4F5C\u54C1\u3002`;
91443
+ const locale = resolveLocale(parseAcceptLanguage(req.headers["accept-language"]));
91444
+ const t7 = serverText(locale);
91445
+ const description = ref ? t7("meta.artifact", { project, title, type: ref.type === "artboard" ? "Artboard" : ref.type === "document" ? "Document" : "HTML" }) : t7("meta.library", { project });
91324
91446
  const preview = PREVIEW_ROUTE.test(pathname);
91325
91447
  const canonicalPath = ref ? dir ? artifactPath(root, ref.type, ref.id) : `/${ref.type}/${ref.id}` : "/";
91326
91448
  const canonical = `http://${urlHostForHttp(options.urlHost)}:${port}${preview ? "/preview" : ""}${canonicalPath}`;
@@ -91328,7 +91450,7 @@ async function startArtifactsServer(options) {
91328
91450
  const headers = { "Content-Type": "text/html; charset=utf-8" };
91329
91451
  if (key2 !== null) headers["Set-Cookie"] = `${cookieName}=${token}; HttpOnly; SameSite=Strict; Path=/`;
91330
91452
  void import_node_fs24.default.promises.readFile(import_node_path21.default.join(viewerDir, "index.html"), "utf8").then((template) => {
91331
- const html = viewerPage(template, { title, description, url: canonical, icon: ref ? typeFaviconHref(ref.type) : void 0, artifactId: resolved?.id });
91453
+ const html = viewerPage(template, { title, description, locale, url: canonical, icon: ref ? typeFaviconHref(ref.type) : void 0, artifactId: resolved?.id });
91332
91454
  send(res, 200, html, { ...headers, "Content-Security-Policy": allowInlineScripts(csp, html) });
91333
91455
  }).catch((err) => send(res, err.code === "ENOENT" ? 404 : 500, "Viewer unavailable"));
91334
91456
  return;
@@ -91688,22 +91810,76 @@ function openReady(payload) {
91688
91810
  return pageBoards.filter(([id2]) => ready(id2)).length >= 2;
91689
91811
  }
91690
91812
 
91813
+ // src/server/registry.ts
91814
+ var import_node_crypto11 = __toESM(require("node:crypto"), 1);
91815
+ var import_node_fs26 = __toESM(require("node:fs"), 1);
91816
+ var import_node_os = __toESM(require("node:os"), 1);
91817
+ var import_node_path22 = __toESM(require("node:path"), 1);
91818
+ function registryDir(env = process.env, platform = process.platform, uid = process.getuid?.() ?? -1, tmpdir = import_node_os.default.tmpdir()) {
91819
+ if (env.RYUGI_RUNTIME_DIR) return import_node_path22.default.join(env.RYUGI_RUNTIME_DIR, "servers");
91820
+ if (platform === "win32") return import_node_path22.default.join(tmpdir, "ryugi", "servers");
91821
+ return `/tmp/ryugi-${uid}/servers`;
91822
+ }
91823
+ var fileFor = (dir, project) => import_node_path22.default.join(dir, `${import_node_crypto11.default.createHash("sha256").update(project).digest("hex").slice(0, 16)}.json`);
91824
+ function verifyDir(dir) {
91825
+ if (process.platform === "win32") return;
91826
+ for (const target of [import_node_path22.default.dirname(dir), dir]) {
91827
+ const stat = import_node_fs26.default.lstatSync(target);
91828
+ if (!stat.isDirectory() || stat.uid !== process.getuid() || stat.mode & 18) throw new Error(`Unsafe registry directory: ${target}`);
91829
+ }
91830
+ }
91831
+ function ensureDir(dir) {
91832
+ import_node_fs26.default.mkdirSync(dir, { recursive: true, mode: 448 });
91833
+ verifyDir(dir);
91834
+ }
91835
+ function writeEntry(dir, entry) {
91836
+ ensureDir(dir);
91837
+ const file = fileFor(dir, entry.project);
91838
+ const tmp = `${file}.${process.pid}.tmp`;
91839
+ import_node_fs26.default.writeFileSync(tmp, `${JSON.stringify(entry)}
91840
+ `, { mode: 384 });
91841
+ import_node_fs26.default.renameSync(tmp, file);
91842
+ }
91843
+ function readEntry(file) {
91844
+ try {
91845
+ const value = JSON.parse(import_node_fs26.default.readFileSync(file, "utf8"));
91846
+ if (typeof value.project !== "string" || typeof value.root !== "string" || typeof value.serverId !== "string") return null;
91847
+ if (!Number.isInteger(value.pid) || !Number.isFinite(value.startedAt)) return null;
91848
+ if (value.root !== import_node_path22.default.join(value.project, ".ryugi", "artifacts")) return null;
91849
+ return value;
91850
+ } catch {
91851
+ return null;
91852
+ }
91853
+ }
91854
+ function removeEntry(dir, entry) {
91855
+ const file = fileFor(dir, entry.project);
91856
+ if (readEntry(file)?.serverId === entry.serverId) import_node_fs26.default.rmSync(file, { force: true });
91857
+ }
91858
+ function touchEntry(dir, entry) {
91859
+ const file = fileFor(dir, entry.project);
91860
+ const current = readEntry(file);
91861
+ if (!current) return writeEntry(dir, entry);
91862
+ if (current.serverId !== entry.serverId) return;
91863
+ const now = /* @__PURE__ */ new Date();
91864
+ import_node_fs26.default.utimesSync(file, now, now);
91865
+ }
91866
+
91691
91867
  // package.json
91692
- var version = "1.31.7";
91868
+ var version = "1.33.0";
91693
91869
 
91694
91870
  // src/server/main.ts
91695
91871
  async function main() {
91696
91872
  const config = parseEnv(process.env, process.argv.slice(2));
91697
- const root = import_node_path22.default.resolve(config.root);
91698
- const stateDir = import_node_path22.default.join(root, ".state");
91873
+ const root = import_node_path23.default.resolve(config.root);
91874
+ const stateDir = import_node_path23.default.join(root, ".state");
91699
91875
  const server = await startArtifactsServer({
91700
91876
  root,
91701
- viewerDir: import_node_path22.default.join(__dirname, "viewer"),
91702
- runtimeDir: import_node_path22.default.join(__dirname, "runtime"),
91877
+ viewerDir: import_node_path23.default.join(__dirname, "viewer"),
91878
+ runtimeDir: import_node_path23.default.join(__dirname, "runtime"),
91703
91879
  host: config.host,
91704
91880
  urlHost: config.urlHost,
91705
- configFile: import_node_path22.default.join(import_node_path22.default.dirname(root), "config.json"),
91706
- cloud: { origin: config.cloudOrigin, credentialsFile: credentialsFile(process.env, process.platform, import_node_os.default.homedir()) },
91881
+ configFile: import_node_path23.default.join(import_node_path23.default.dirname(root), "config.json"),
91882
+ cloud: { origin: config.cloudOrigin, credentialsFile: credentialsFile(process.env, process.platform, import_node_os2.default.homedir()) },
91707
91883
  relay: { url: `${config.cloudOrigin.replace(/^http/, "ws")}/api/relay/host`, version }
91708
91884
  });
91709
91885
  let lastActivity = Date.now();
@@ -91727,17 +91903,26 @@ async function main() {
91727
91903
  if (launcher) (0, import_node_child_process2.execFile)(launcher.bin, launcher.args, () => {
91728
91904
  });
91729
91905
  });
91906
+ const registry2 = registryDir();
91907
+ const entry = config.serverId ? { project: import_node_path23.default.dirname(import_node_path23.default.dirname(root)), root, pid: process.pid, serverId: config.serverId, startedAt: Date.now() } : null;
91908
+ const quietly = (fn5) => {
91909
+ try {
91910
+ fn5();
91911
+ } catch {
91912
+ }
91913
+ };
91730
91914
  let stopping = false;
91731
91915
  const shutdown = async (reason) => {
91732
91916
  if (stopping) return;
91733
91917
  stopping = true;
91734
91918
  console.log(JSON.stringify({ type: "server-stopped", reason }));
91735
- import_node_fs26.default.rmSync(import_node_path22.default.join(stateDir, "server-info"), { force: true });
91736
- writeJsonAtomic(import_node_path22.default.join(stateDir, "server-stopped"), { reason, timestamp: Date.now() });
91919
+ import_node_fs27.default.rmSync(import_node_path23.default.join(stateDir, "server-info"), { force: true });
91920
+ writeJsonAtomic(import_node_path23.default.join(stateDir, "server-stopped"), { reason, timestamp: Date.now() });
91921
+ if (entry) quietly(() => removeEntry(registry2, entry));
91737
91922
  await server.close();
91738
91923
  process.exit(0);
91739
91924
  };
91740
- const ownersFile = import_node_path22.default.join(stateDir, "owners");
91925
+ const ownersFile = import_node_path23.default.join(stateDir, "owners");
91741
91926
  const timer = setInterval(() => {
91742
91927
  const owners = readOwners(ownersFile);
91743
91928
  const reason = shutdownReason({
@@ -91747,11 +91932,14 @@ async function main() {
91747
91932
  ownersAlive: owners.length === 0 || liveOwners(owners, processAlive).length > 0
91748
91933
  });
91749
91934
  if (reason) void shutdown(reason);
91935
+ else if (entry) quietly(() => touchEntry(registry2, entry));
91750
91936
  }, config.lifecycleCheckMs);
91751
91937
  timer.unref();
91752
91938
  process.on("SIGTERM", () => void shutdown("SIGTERM"));
91753
91939
  process.on("SIGINT", () => void shutdown("SIGINT"));
91754
- import_node_fs26.default.rmSync(import_node_path22.default.join(stateDir, "server-stopped"), { force: true });
91940
+ process.on("SIGHUP", () => void shutdown("SIGHUP"));
91941
+ import_node_fs27.default.rmSync(import_node_path23.default.join(stateDir, "server-stopped"), { force: true });
91942
+ if (entry) quietly(() => writeEntry(registry2, entry));
91755
91943
  console.log(JSON.stringify({ type: "server-started", url: server.url, port: server.port, root }));
91756
91944
  }
91757
91945
  main().catch((err) => {
@@ -0,0 +1 @@
1
+ import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{n as t,t as n}from"./jsx-runtime-CldxteV5.js";import{S as r,T as i,o as a,t as o}from"./RailSwitch-B8Aht-FG.js";import{E as s,T as c,d as l,f as u,k as d,t as f,y as p}from"./DocumentLayout-DUPesXt0.js";var m=e(t(),1),h=n();function g(){let e=(0,m.useMemo)(()=>window.matchMedia(`(prefers-color-scheme: dark)`),[]),[t,n]=(0,m.useState)(e.matches);return(0,m.useEffect)(()=>{let t=()=>n(e.matches);return e.addEventListener(`change`,t),()=>e.removeEventListener(`change`,t)},[e]),t}function _({id:e,state:t,contentBase:n,comments:_=r(),offline:v=!1}){let y=g(),[b,x]=(0,m.useState)(null),S=(0,m.useMemo)(()=>({artifact:`cloud/${e}`,contentBase:n,channel:c(),send:()=>void 0}),[e,n]),C=_.threads.filter(e=>e.status===`open`).length,w=a(e,{comments:C,activity:null,retrying:!1,reason:null,history:!1,historyOpen:!1});return(0,m.useEffect)(()=>{let e=document.createElement(`base`);return e.href=n,document.head.prepend(e),()=>e.remove()},[n]),(0,h.jsxs)(`div`,{className:`x1us19tq x1rozbrz xo2rkog`,className:`ryugi-doc ${{className:`x1us19tq x1rozbrz xo2rkog`}.className??``}`,children:[w?null:(0,h.jsxs)(`div`,{className:`x78zum5 x6s0dn4 x17d4w8g x1vqgdyp x4l9tsp x1bo0w0s xqfszdh xfifm61`,children:[(0,h.jsx)(o,{comments:C,open:!1,available:!1,onComments:()=>{},onHistory:()=>{}}),(0,h.jsx)(`span`,{children:i(`document.historyOffline`)})]}),v?(0,h.jsxs)(`div`,{...{0:{className:`x78zum5 x6s0dn4 x17d4w8g x1vqgdyp x4l9tsp x1bo0w0s xqfszdh xfifm61`},1:{className:`x6s0dn4 x17d4w8g x1vqgdyp x4l9tsp x1bo0w0s xqfszdh xfifm61 x1s85apg x1ux6vrq`}}[!!w|0],children:[(0,h.jsx)(`i`,{className:`xci0xqf x1hagigm x16rqkct xxwmxtg`}),i(`document.offlineNoComments`)]}):null,(0,h.jsx)(f,{editor:b,threads:_.threads,children:(0,h.jsx)(p.Provider,{value:S,children:(0,h.jsx)(d,{variant:`article`,theme:y?`dark`:`light`,initialValue:t,extraNodes:l,rendererConfig:u,onEditorReady:e=>{e?.setEditable(!1),x(e??null)},children:(0,h.jsx)(s,{})})})})]})}export{_ as default};
@@ -0,0 +1 @@
1
+ import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{n as t,t as n}from"./jsx-runtime-CldxteV5.js";import{T as r,o as i,w as a}from"./RailSwitch-B8Aht-FG.js";import{t as o}from"./index.js";import s from"./CloudDocument-DBhwAPZX.js";import{DocumentView as c,t as l}from"./DocumentPage-p78IN0UO.js";var u=e(t(),1),d=`1.33.0`,f=e=>/^(\d+)\.(\d+)\./.exec(e??``)?.slice(1,3).join(`.`)??null;function p(e,t){let n=f(e);return n!==null&&n===f(t)}var m=(e,t)=>a.t(`document.versionReason`,{host:t??a.t(`document.unknownVersion`),viewer:e}),h=n();function g({id:e,state:t,contentBase:n,liveContentBase:a,comments:f}){let{transport:g,presence:_}=l(e,a??n??``),v=_?.online??!1;i(e,{online:_?.online??null});let[y,b]=(0,u.useState)(!1);(0,u.useEffect)(()=>{v&&b(!0)},[v]);let x=t&&n?(0,h.jsx)(s,{id:e,state:t,contentBase:n,comments:f,offline:_!==null&&!v}):null;if(!g||!(y||v))return x??(0,h.jsx)(o,{children:r(_===null?`common.connecting`:`document.notPublished`)});let S=v&&p(d,_?.version??null),C=v&&!S?m(d,_?.version??null):null;return(0,h.jsx)(c,{id:e,transport:g,live:v,cloud:{online:v,canEdit:S,reason:C},fallback:x})}export{g as default};