ryugi-artifacts 1.27.0 → 1.29.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 (145) hide show
  1. package/dist/cli.cjs +6 -3
  2. package/dist/server.cjs +60 -23
  3. package/dist/viewer/{CloudDocument-BWuXcyA5.js → CloudDocument-DaS9ceOa.js} +1 -1
  4. package/dist/viewer/{CloudLiveDocument-WbsGlhSr.js → CloudLiveDocument-BDga8aEj.js} +1 -1
  5. package/dist/viewer/{DocumentLayout-Byi-FSqu.js → DocumentLayout-DYTnCgfH.js} +139 -139
  6. package/dist/viewer/DocumentPage-BLL9x3pY.js +1 -0
  7. package/dist/viewer/{abnfDiagram-VCTEODGH-B76YgVSl.js → abnfDiagram-VCTEODGH-B4hF9R2U.js} +1 -1
  8. package/dist/viewer/{ar-SA-G6X2FPQ2-DLDk3Fr1.js → ar-SA-G6X2FPQ2-B0MSU5l9.js} +1 -1
  9. package/dist/viewer/{architectureDiagram-5GKGNRK7-DJ2b0H6u.js → architectureDiagram-5GKGNRK7-Cd8Xx-hV.js} +1 -1
  10. package/dist/viewer/{az-AZ-76LH7QW2-BNE3cqGu.js → az-AZ-76LH7QW2-DQpVWUnU.js} +1 -1
  11. package/dist/viewer/{bg-BG-XCXSNQG7-Ba6gRSVy.js → bg-BG-XCXSNQG7-CFWizXaa.js} +1 -1
  12. package/dist/viewer/{blockDiagram-I7D4REHJ-CFQQSd-A.js → blockDiagram-I7D4REHJ-C2yu7mK-.js} +1 -1
  13. package/dist/viewer/{bn-BD-2XOGV67Q-ByJdIgWh.js → bn-BD-2XOGV67Q-DoeoV9n5.js} +1 -1
  14. package/dist/viewer/{c4Diagram-7LVT6UL2-CbJzjhvB.js → c4Diagram-7LVT6UL2-B5orhRgE.js} +1 -1
  15. package/dist/viewer/{ca-ES-6MX7JW3Y-Bn0HEIfv.js → ca-ES-6MX7JW3Y-B6_hkxTX.js} +1 -1
  16. package/dist/viewer/{chunk-4HAMMTFA-B9aeqO2F.js → chunk-4HAMMTFA-BGybz_si.js} +1 -1
  17. package/dist/viewer/{chunk-EIO257PC-DPOhWzKh.js → chunk-EIO257PC-D9F5NHVA.js} +1 -1
  18. package/dist/viewer/{chunk-GMAD6QVW-BpmihfGs.js → chunk-GMAD6QVW-C0XbWNVH.js} +1 -1
  19. package/dist/viewer/{chunk-GVQU2GXP-DF7F0sgS.js → chunk-GVQU2GXP-vRk2m9ao.js} +1 -1
  20. package/dist/viewer/{chunk-IMKFNOWR-C-YO3NQ2.js → chunk-IMKFNOWR-DmpawLXk.js} +1 -1
  21. package/dist/viewer/{chunk-L3NEJ4N5-DlmncLgE.js → chunk-L3NEJ4N5-DUZfiZWj.js} +1 -1
  22. package/dist/viewer/{chunk-OSK3NFVY-CL7h-mBo.js → chunk-OSK3NFVY-BvVtm98g.js} +1 -1
  23. package/dist/viewer/{chunk-PWAF6VOD-B8BPkPFW.js → chunk-PWAF6VOD-BugGgSc5.js} +1 -1
  24. package/dist/viewer/{chunk-SHT3W25Y-BpyOxjUT.js → chunk-SHT3W25Y-BIOqc_9G.js} +1 -1
  25. package/dist/viewer/{chunk-SVP7TREG-Rl8tIF8A.js → chunk-SVP7TREG-CzXvGBkp.js} +1 -1
  26. package/dist/viewer/{chunk-TICWLB2K-B9QJjkf4.js → chunk-TICWLB2K-BGDOLNPy.js} +1 -1
  27. package/dist/viewer/{classDiagram-ZZMXUADV-DLD_6HAr.js → classDiagram-ZZMXUADV-1LD9MdPj.js} +1 -1
  28. package/dist/viewer/{classDiagram-v2-VYDZK3BY-DLD_6HAr.js → classDiagram-v2-VYDZK3BY-1LD9MdPj.js} +1 -1
  29. package/dist/viewer/{cs-CZ-2BRQDIVT-CP2adRFB.js → cs-CZ-2BRQDIVT-DvQX9epx.js} +1 -1
  30. package/dist/viewer/{cynefinDiagram-5FMLGOSQ-D9ppMSAA.js → cynefinDiagram-5FMLGOSQ-Ck6iqdN1.js} +1 -1
  31. package/dist/viewer/{da-DK-5WZEPLOC-C854LrBe.js → da-DK-5WZEPLOC-CIkD-mT-.js} +1 -1
  32. package/dist/viewer/{dagre-GXQ25YYZ-CwJRgiLt.js → dagre-GXQ25YYZ-Bw4MivVe.js} +1 -1
  33. package/dist/viewer/{de-DE-XR44H4JA-DwXVAz5d.js → de-DE-XR44H4JA-CkZg3nnD.js} +1 -1
  34. package/dist/viewer/{diagram-S7CK7UJ4-BvzLjbsx.js → diagram-S7CK7UJ4-DcU-yw6G.js} +1 -1
  35. package/dist/viewer/{diagram-UQ7AKVKN-DVhbPMxc.js → diagram-UQ7AKVKN-DnKTK9PW.js} +1 -1
  36. package/dist/viewer/{diagram-VX7I27RA-CiZPn2lF.js → diagram-VX7I27RA-BBU-ZVb0.js} +1 -1
  37. package/dist/viewer/{diagram-Z3DM3KII-DXPygDoX.js → diagram-Z3DM3KII-CKk14xfI.js} +1 -1
  38. package/dist/viewer/{dist-ClaGSrjh.js → dist-7oXSkB_P.js} +1 -1
  39. package/dist/viewer/{dist-8IahudhA.js → dist-8kfzVrJL.js} +1 -1
  40. package/dist/viewer/{dist-FgUijJl1.js → dist-B0J-I7r2.js} +1 -1
  41. package/dist/viewer/{dist-CK0OLGCF.js → dist-B5g7S3C3.js} +1 -1
  42. package/dist/viewer/{dist-B5lO5wnx.js → dist-B9K9D6SC.js} +1 -1
  43. package/dist/viewer/{dist-BzgaaK2T.js → dist-BKBE5pov.js} +1 -1
  44. package/dist/viewer/{dist-BPFV7HsR.js → dist-BRb242lg.js} +1 -1
  45. package/dist/viewer/{dist-SiyuNGPI.js → dist-BUHcTBPN.js} +1 -1
  46. package/dist/viewer/{dist-qDaS3xgU.js → dist-BhZ13kjD.js} +1 -1
  47. package/dist/viewer/{dist-k5Bay5go.js → dist-BkV7Dy_o.js} +1 -1
  48. package/dist/viewer/{dist-B1Ptot19.js → dist-CCKpuvTI.js} +1 -1
  49. package/dist/viewer/{dist-9M_yJcOs.js → dist-CGL9Y16x.js} +1 -1
  50. package/dist/viewer/{dist-QOs0jlFD.js → dist-CYozWt7T.js} +1 -1
  51. package/dist/viewer/{dist-CvwCGpfr.js → dist-C_kp_dU8.js} +1 -1
  52. package/dist/viewer/{dist-DNNj2aMA.js → dist-CqRkCb8-.js} +1 -1
  53. package/dist/viewer/{dist-vne2aEcf.js → dist-DH-ho6_2.js} +1 -1
  54. package/dist/viewer/{dist-DP6MYfia.js → dist-DImjGUkS.js} +1 -1
  55. package/dist/viewer/{dist-CbUvo-PD.js → dist-DVVjoE8q.js} +1 -1
  56. package/dist/viewer/{dist-CGrJjp88.js → dist-D_WrKoQ5.js} +4 -4
  57. package/dist/viewer/{dist-Be1IcO6Q.js → dist-DcUDFAUF.js} +1 -1
  58. package/dist/viewer/{dist-BOP0LsZa.js → dist-Dj78KV6Q.js} +1 -1
  59. package/dist/viewer/{dist-CFgqvLZ2.js → dist-DmaYQh00.js} +1 -1
  60. package/dist/viewer/{dist-CY7v7M0d.js → dist-DpLi82dR.js} +1 -1
  61. package/dist/viewer/{dist-tNvHCVhP.js → dist-uAqigpP8.js} +1 -1
  62. package/dist/viewer/{ebnfDiagram-PWID7BFC-8drQoH7p.js → ebnfDiagram-PWID7BFC-CUH9C71X.js} +1 -1
  63. package/dist/viewer/{el-GR-BZB4AONW-BljLqMZ_.js → el-GR-BZB4AONW-Cl1kWlzB.js} +1 -1
  64. package/dist/viewer/{en-B4ZKOASM-BfV31NDk.js → en-B4ZKOASM-CT3OzVWV.js} +1 -1
  65. package/dist/viewer/{erDiagram-RLTQ6QDP-0fkPgBMS.js → erDiagram-RLTQ6QDP-BZbuVZrG.js} +1 -1
  66. package/dist/viewer/{es-ES-U4NZUMDT-Da1qIc4a.js → es-ES-U4NZUMDT-BAD-ccHs.js} +1 -1
  67. package/dist/viewer/{eu-ES-A7QVB2H4-CQp4OaxH.js → eu-ES-A7QVB2H4-Cj2NDws-.js} +1 -1
  68. package/dist/viewer/{fa-IR-HGAKTJCU-BvXOUytP.js → fa-IR-HGAKTJCU-C0FVEGIZ.js} +1 -1
  69. package/dist/viewer/{fi-FI-Z5N7JZ37-Bgx3Gedw.js → fi-FI-Z5N7JZ37-D2AdBx48.js} +1 -1
  70. package/dist/viewer/flowDiagram-HODETNUW-CAHqUwH1.js +1 -0
  71. package/dist/viewer/{fr-FR-RHASNOE6-C-fh7evs.js → fr-FR-RHASNOE6-BFreNJCR.js} +1 -1
  72. package/dist/viewer/{ganttDiagram-EL5Y4UJY-BvfQnVc2.js → ganttDiagram-EL5Y4UJY-CF5GNdln.js} +1 -1
  73. package/dist/viewer/{gl-ES-HMX3MZ6V-DYeSOfSa.js → gl-ES-HMX3MZ6V-DkkhEoWc.js} +1 -1
  74. package/dist/viewer/{he-IL-6SHJWFNN-DnGoCpZV.js → he-IL-6SHJWFNN-VvaCcliL.js} +1 -1
  75. package/dist/viewer/{hi-IN-IWLTKZ5I-Bx7eNYDf.js → hi-IN-IWLTKZ5I-DJSuk02I.js} +1 -1
  76. package/dist/viewer/{hu-HU-A5ZG7DT2-DijmTnRH.js → hu-HU-A5ZG7DT2-CNvqWgoH.js} +1 -1
  77. package/dist/viewer/{id-ID-SAP4L64H-DCmr4bop.js → id-ID-SAP4L64H-BdPRkPOp.js} +1 -1
  78. package/dist/viewer/{image-GAAHSSAO-BHoF2Vsu.js → image-GAAHSSAO-C5hSHSJ9.js} +1 -1
  79. package/dist/viewer/index.html +1 -1
  80. package/dist/viewer/index.js +10 -10
  81. package/dist/viewer/index2.css +1 -1
  82. package/dist/viewer/{infoDiagram-27XIBGKW-C-j3_tDE.js → infoDiagram-27XIBGKW-Dz669Ti5.js} +1 -1
  83. package/dist/viewer/{ishikawaDiagram-5VMMS53U-CrrJKAfN.js → ishikawaDiagram-5VMMS53U-BO2EV1vm.js} +1 -1
  84. package/dist/viewer/{it-IT-JPQ66NNP-B_1ONva5.js → it-IT-JPQ66NNP-BAm2zqLD.js} +1 -1
  85. package/dist/viewer/{ja-JP-DBVTYXUO-COt_mEp7.js → ja-JP-DBVTYXUO-Dux__a-p.js} +1 -1
  86. package/dist/viewer/{journeyDiagram-3NMN7TZE-Bb_vzuuE.js → journeyDiagram-3NMN7TZE-B8pnfhpY.js} +1 -1
  87. package/dist/viewer/{kaa-6HZHGXH3-CtBWieDY.js → kaa-6HZHGXH3-5P_fyC_H.js} +1 -1
  88. package/dist/viewer/{kab-KAB-ZGHBKWFO-B1isjGxm.js → kab-KAB-ZGHBKWFO-9hTPNvCU.js} +1 -1
  89. package/dist/viewer/{kanban-definition-UXKFOSKX-C8L3qBCD.js → kanban-definition-UXKFOSKX-B8Pjf3dY.js} +1 -1
  90. package/dist/viewer/{kk-KZ-P5N5QNE5-6r2ptdHm.js → kk-KZ-P5N5QNE5-CGou3WF6.js} +1 -1
  91. package/dist/viewer/{km-KH-HSX4SM5Z-DYRHwFjm.js → km-KH-HSX4SM5Z-DOyT_tEV.js} +1 -1
  92. package/dist/viewer/{ko-KR-MTYHY66A-DtXg7Y--.js → ko-KR-MTYHY66A-DftVvGn6.js} +1 -1
  93. package/dist/viewer/{ku-TR-6OUDTVRD-6p-SD1d8.js → ku-TR-6OUDTVRD-CVdlBZmx.js} +1 -1
  94. package/dist/viewer/{lt-LT-XHIRWOB4-CJ-U7kN9.js → lt-LT-XHIRWOB4-CUlT0RyT.js} +1 -1
  95. package/dist/viewer/{lv-LV-5QDEKY6T-CGuh47HO.js → lv-LV-5QDEKY6T-6wWFJoM0.js} +1 -1
  96. package/dist/viewer/{mindmap-definition-YA3MSWOX-0eisP1RB.js → mindmap-definition-YA3MSWOX-BcDNUqMO.js} +1 -1
  97. package/dist/viewer/{mr-IN-CRQNXWMA-C5M5PNpN.js → mr-IN-CRQNXWMA-DnzpVGTc.js} +1 -1
  98. package/dist/viewer/{my-MM-5M5IBNSE-DIENd2KG.js → my-MM-5M5IBNSE-Cm4pCcPj.js} +1 -1
  99. package/dist/viewer/{nb-NO-T6EIAALU-DXVgc5SE.js → nb-NO-T6EIAALU-BcuxE4U7.js} +1 -1
  100. package/dist/viewer/{nl-NL-IS3SIHDZ-8qumey8Z.js → nl-NL-IS3SIHDZ-CQexxASS.js} +1 -1
  101. package/dist/viewer/{nn-NO-6E72VCQL-CDCdtw1B.js → nn-NO-6E72VCQL-C6pPjApO.js} +1 -1
  102. package/dist/viewer/{oc-FR-POXYY2M6-Fc7Bh2Zf.js → oc-FR-POXYY2M6-CovxAT6s.js} +1 -1
  103. package/dist/viewer/{pa-IN-N4M65BXN-B_4vn2yt.js → pa-IN-N4M65BXN-CM-0Bi_k.js} +1 -1
  104. package/dist/viewer/{pegDiagram-XKGWAZYB-CuIetWDp.js → pegDiagram-XKGWAZYB-DHtXRebi.js} +1 -1
  105. package/dist/viewer/percentages-BXMCSKIN-dSCeY2Vz.js +1 -0
  106. package/dist/viewer/{pieDiagram-E7YTZNPT-DJZP8D-Y.js → pieDiagram-E7YTZNPT-CxPTGmMv.js} +1 -1
  107. package/dist/viewer/{pl-PL-T2D74RX3-De3SYqY6.js → pl-PL-T2D74RX3-Ce8egCLJ.js} +1 -1
  108. package/dist/viewer/{prod-C348eXRq.js → prod-DLkZlcd2.js} +8 -8
  109. package/dist/viewer/{pt-BR-5N22H2LF-7nvQLf7O.js → pt-BR-5N22H2LF-CwjXtf87.js} +1 -1
  110. package/dist/viewer/{pt-PT-UZXXM6DQ-DtY6VsPE.js → pt-PT-UZXXM6DQ-Q9ejxTg5.js} +1 -1
  111. package/dist/viewer/{quadrantDiagram-AXDQQJYC-mSYxZRrZ.js → quadrantDiagram-AXDQQJYC-z7Tz0_0k.js} +1 -1
  112. package/dist/viewer/{railroadDiagram-O6MQD6OU-BB4IbxIB.js → railroadDiagram-O6MQD6OU-DwyNHCPY.js} +1 -1
  113. package/dist/viewer/{requirementDiagram-BXWQKSXE-BsFDYkmh.js → requirementDiagram-BXWQKSXE-BTL35j9A.js} +1 -1
  114. package/dist/viewer/{ro-RO-JPDTUUEW-C2UUKQUY.js → ro-RO-JPDTUUEW-J9XQ6U80.js} +1 -1
  115. package/dist/viewer/{ru-RU-B4JR7IUQ-Bl2--IBH.js → ru-RU-B4JR7IUQ-BBA1AdyW.js} +1 -1
  116. package/dist/viewer/{sequenceDiagram-WJ2MYXX4-BGfuVGG1.js → sequenceDiagram-WJ2MYXX4-DLJNXQ8o.js} +1 -1
  117. package/dist/viewer/{si-LK-N5RQ5JYF-DPrn5n2l.js → si-LK-N5RQ5JYF-U__xLKqD.js} +1 -1
  118. package/dist/viewer/{sk-SK-C5VTKIMK-COiEvIHd.js → sk-SK-C5VTKIMK-DnbPvh29.js} +1 -1
  119. package/dist/viewer/{sl-SI-NN7IZMDC-B_lH3TnL.js → sl-SI-NN7IZMDC-C8Eoz0pl.js} +1 -1
  120. package/dist/viewer/{stateDiagram-D77RDMKH-DpCE9DL-.js → stateDiagram-D77RDMKH-BfdN30HE.js} +1 -1
  121. package/dist/viewer/{stateDiagram-v2-MP3YSRHH-C0rABr6s.js → stateDiagram-v2-MP3YSRHH-CXwzb1Xj.js} +1 -1
  122. package/dist/viewer/subset-shared.chunk-Cd4b8GJL.js +1 -0
  123. package/dist/viewer/{subset-worker.chunk-B6O2iSJs.js → subset-worker.chunk-B0UjzhBX.js} +1 -1
  124. package/dist/viewer/{sv-SE-XGPEYMSR-DVjXhx9f.js → sv-SE-XGPEYMSR-B82M1B45.js} +1 -1
  125. package/dist/viewer/{swimlanes-42K2YHIH-DUwALMlk.js → swimlanes-42K2YHIH-CVnTCkti.js} +1 -1
  126. package/dist/viewer/{swimlanesDiagram-VR7AAH4N-BdC_UzvH.js → swimlanesDiagram-VR7AAH4N-CAsLGxAi.js} +1 -1
  127. package/dist/viewer/{ta-IN-2NMHFXQM-CMaH6ve7.js → ta-IN-2NMHFXQM-CDtoSBaY.js} +1 -1
  128. package/dist/viewer/{th-TH-HPSO5L25-VndAJUSw.js → th-TH-HPSO5L25-CiNISjF4.js} +1 -1
  129. package/dist/viewer/{timeline-definition-24CTP7MA-w3XLPWpz.js → timeline-definition-24CTP7MA-DCb3aOrx.js} +1 -1
  130. package/dist/viewer/{tr-TR-DEFEU3FU-BBdNf75x.js → tr-TR-DEFEU3FU-CJmFpjiQ.js} +1 -1
  131. package/dist/viewer/{uk-UA-QMV73CPH-BXI-Vp7U.js → uk-UA-QMV73CPH-BMLxQJ4h.js} +1 -1
  132. package/dist/viewer/useSandboxFrame-rZO0A3sZ.js +58 -0
  133. package/dist/viewer/{vennDiagram-4TSXK5OY-DctGHju1.js → vennDiagram-4TSXK5OY-CuIg1PcQ.js} +1 -1
  134. package/dist/viewer/{vi-VN-M7AON7JQ-bJa-6QK7.js → vi-VN-M7AON7JQ-BOwqnpoG.js} +1 -1
  135. package/dist/viewer/{wardleyDiagram-VM6X3IG4-BQZsrNDk.js → wardleyDiagram-VM6X3IG4-D7TjtyXK.js} +1 -1
  136. package/dist/viewer/{xychartDiagram-S5SC5T6Z-CgaT07RV.js → xychartDiagram-S5SC5T6Z-D6WkQ4f2.js} +1 -1
  137. package/dist/viewer/{zh-CN-LNUGB5OW-C2xLUp3o.js → zh-CN-LNUGB5OW-BGvgy1n4.js} +1 -1
  138. package/dist/viewer/{zh-HK-E62DVLB3-C19QGzmQ.js → zh-HK-E62DVLB3-D7vhuMPK.js} +1 -1
  139. package/dist/viewer/{zh-TW-RAJ6MFWO-BgCf3zhS.js → zh-TW-RAJ6MFWO-vpZcm2KN.js} +1 -1
  140. package/package.json +1 -1
  141. package/dist/viewer/DocumentPage-OOUWnUbI.js +0 -1
  142. package/dist/viewer/flowDiagram-HODETNUW-7aJd59hN.js +0 -1
  143. package/dist/viewer/percentages-BXMCSKIN-7tGDPb_F.js +0 -1
  144. package/dist/viewer/subset-shared.chunk-BAO8Kml0.js +0 -1
  145. package/dist/viewer/useSandboxFrame-8NPM2cx_.js +0 -58
package/dist/cli.cjs CHANGED
@@ -502,8 +502,10 @@ async function withCloudLink(out, artifact) {
502
502
  method: "POST",
503
503
  signal: AbortSignal.timeout(RESERVE_TIMEOUT_MS)
504
504
  });
505
- const { url } = await res.json();
506
- return typeof url === "string" ? { ...out, cloudLink: url } : out;
505
+ const { url, limit } = await res.json();
506
+ if (typeof url === "string") return { ...out, cloudLink: url };
507
+ if (typeof limit?.upgradeUrl === "string") return { ...out, cloudLimit: { message: limit.message, upgradeUrl: limit.upgradeUrl } };
508
+ return out;
507
509
  } catch {
508
510
  return out;
509
511
  }
@@ -684,6 +686,7 @@ async function publish(options, emit) {
684
686
  const call = async (method, route, body) => {
685
687
  const { status, json } = await server.call(method, route, body);
686
688
  if (status === 401) throw new CliError("", { type: "login-required", url: json.loginUrl, message: "Open url to sign in to the Ryugi cloud, then run the same command again." }, 2);
689
+ if (status === 402 && json.code === "plan_limit") throw new CliError("", { type: "plan-limit", message: json.error, upgradeUrl: json.upgradeUrl }, 2);
687
690
  if (status < 200 || status >= 300) throw new CliError(json.error || `HTTP ${status}`, json.reasons ? { reasons: json.reasons } : {});
688
691
  return json;
689
692
  };
@@ -925,7 +928,7 @@ async function main(argv) {
925
928
  }, emit);
926
929
  }
927
930
  if (command === "--version" || command === "-v") {
928
- console.log("1.27.0");
931
+ console.log("1.29.0");
929
932
  return 0;
930
933
  }
931
934
  if (command === "--help" || command === "-h") {
package/dist/server.cjs CHANGED
@@ -89912,6 +89912,13 @@ var CloudRefused = class extends Error {
89912
89912
  };
89913
89913
  var CloudCopyGone = class extends Error {
89914
89914
  };
89915
+ var PlanLimited = class extends CloudRefused {
89916
+ constructor(message, upgradeUrl) {
89917
+ super(402, message);
89918
+ this.upgradeUrl = upgradeUrl;
89919
+ }
89920
+ upgradeUrl;
89921
+ };
89915
89922
  var CreateRefused = class extends CloudRefused {
89916
89923
  constructor(detail) {
89917
89924
  super(502, `cloud refused (403): ${detail}`);
@@ -89933,6 +89940,17 @@ async function readJsonBody(req) {
89933
89940
  return null;
89934
89941
  }
89935
89942
  }
89943
+ async function refuse(res) {
89944
+ const text2 = await res.text().catch(() => "");
89945
+ let parsed = {};
89946
+ try {
89947
+ parsed = JSON.parse(text2);
89948
+ } catch {
89949
+ }
89950
+ const message = typeof parsed.error === "string" ? parsed.error : text2 || res.statusText;
89951
+ if (res.status === 402 && parsed.code === "plan_limit" && typeof parsed.upgradeUrl === "string") throw new PlanLimited(message, parsed.upgradeUrl);
89952
+ throw new CloudRefused(502, `cloud refused (${res.status}): ${message}`);
89953
+ }
89936
89954
  async function errorMessage(res) {
89937
89955
  const text2 = await res.text().catch(() => "");
89938
89956
  try {
@@ -89987,7 +90005,7 @@ function createCloudRoutes(options) {
89987
90005
  return res;
89988
90006
  };
89989
90007
  const expectOk = async (res) => {
89990
- if (!res.ok) throw new CloudRefused(502, `cloud refused (${res.status}): ${await errorMessage(res)}`);
90008
+ if (!res.ok) await refuse(res);
89991
90009
  return res;
89992
90010
  };
89993
90011
  const artifactEntry = (key2) => readConfig(configFile).config.artifacts[key2] ?? {};
@@ -90015,14 +90033,14 @@ function createCloudRoutes(options) {
90015
90033
  const reserve = async (ref) => {
90016
90034
  const key2 = `${ref.type}/${ref.id}`;
90017
90035
  const entry = artifactEntry(key2);
90018
- if (entry.cloud) return entry.cloud.url;
90019
- if (entry.autoPublish === false || !autoPublishState().enabled) return null;
90036
+ if (entry.cloud) return { url: entry.cloud.url };
90037
+ if (entry.autoPublish === false || !autoPublishState().enabled) return { url: null };
90020
90038
  try {
90021
90039
  await createRecord2(ref, entry.visibility ?? "private");
90022
- } catch {
90023
- return null;
90040
+ } catch (err) {
90041
+ return err instanceof PlanLimited ? { url: null, limit: { message: err.message, upgradeUrl: err.upgradeUrl } } : { url: null };
90024
90042
  }
90025
- return artifactEntry(key2).cloud?.url ?? null;
90043
+ return { url: artifactEntry(key2).cloud?.url ?? null };
90026
90044
  };
90027
90045
  const prepare = async (ref) => {
90028
90046
  const inspected = await options.inspect(ref);
@@ -90083,7 +90101,7 @@ function createCloudRoutes(options) {
90083
90101
  };
90084
90102
  let res = entry.cloud ? await commit(entry.cloud.id, requested) : await commit(await create3(), void 0);
90085
90103
  if (res.status === 404 && entry.cloud) {
90086
- if (!recreate) throw new CloudCopyGone();
90104
+ if (!recreate && entry.cloud.publishedAt) throw new CloudCopyGone();
90087
90105
  res = await commit(await create3(), void 0);
90088
90106
  }
90089
90107
  const published = await (await expectOk(res)).json();
@@ -90138,6 +90156,7 @@ function createCloudRoutes(options) {
90138
90156
  return { kind: "opted-out" };
90139
90157
  }
90140
90158
  if (err instanceof SignedOut) return { kind: "signed-out" };
90159
+ if (err instanceof PlanLimited) return { kind: "cannot-create", message: err.message, upgradeUrl: err.upgradeUrl };
90141
90160
  if (err instanceof CreateRefused) return { kind: "cannot-create", message: err.detail };
90142
90161
  if (err instanceof CloudRefused && err.status === 404) return { kind: "gone" };
90143
90162
  if (err instanceof CloudRefused && err.status === 413) return { kind: "not-ready" };
@@ -90197,7 +90216,7 @@ function createCloudRoutes(options) {
90197
90216
  return;
90198
90217
  }
90199
90218
  if (action === "reserve" && ref && method === "POST") {
90200
- sendJson(res, 200, { url: await serialized(`${ref.type}/${ref.id}`, () => reserve(ref)) });
90219
+ sendJson(res, 200, await serialized(`${ref.type}/${ref.id}`, () => reserve(ref)));
90201
90220
  return;
90202
90221
  }
90203
90222
  if (action === "publish" && ref && method === "DELETE") {
@@ -90274,6 +90293,8 @@ function createCloudRoutes(options) {
90274
90293
  if (res.headersSent) return;
90275
90294
  if (err instanceof SignedOut) {
90276
90295
  sendJson(res, 401, { error: "not signed in to the Ryugi cloud", loginUrl: loginUrl() });
90296
+ } else if (err instanceof PlanLimited) {
90297
+ sendJson(res, 402, { error: err.message, code: "plan_limit", upgradeUrl: err.upgradeUrl });
90277
90298
  } else if (err instanceof CloudRefused) {
90278
90299
  sendJson(res, err.status, { error: err.message });
90279
90300
  } else {
@@ -90435,10 +90456,11 @@ var import_node_fs20 = __toESM(require("node:fs"), 1);
90435
90456
  var IDLE_MS = 5 * 60 * 1e3;
90436
90457
  var MAX_WAIT_MS = 15 * 60 * 1e3;
90437
90458
  var SIGNED_OUT_MESSAGE = "auto-publish paused: the Ryugi Cloud sign-in expired";
90459
+ var FAILURES_BEFORE_NOTICE = 3;
90438
90460
  function isNotice(value) {
90439
90461
  if (typeof value !== "object" || value === null) return false;
90440
90462
  const { id: id2, kind, message } = value;
90441
- return typeof id2 === "string" && (kind === "signed-out" || kind === "cap") && typeof message === "string";
90463
+ return typeof id2 === "string" && (kind === "signed-out" || kind === "cap" || kind === "failing") && typeof message === "string";
90442
90464
  }
90443
90465
  function readAutoPublishState(file) {
90444
90466
  let raw = {};
@@ -90461,9 +90483,10 @@ function createAutoPublisher(options) {
90461
90483
  let notice = saved.notice;
90462
90484
  let paused = saved.paused;
90463
90485
  const remarked = /* @__PURE__ */ new Set();
90486
+ const failures = /* @__PURE__ */ new Map();
90464
90487
  const save = () => writeJsonAtomic(options.stateFile, { dirty: [...dirty], notice, paused });
90465
- const raise = (kind, message) => {
90466
- if (notice?.kind !== kind) notice = { id: import_node_crypto8.default.randomUUID(), kind, message };
90488
+ const raise = (kind, message, upgradeUrl) => {
90489
+ if (notice?.kind !== kind) notice = { id: import_node_crypto8.default.randomUUID(), kind, message, ...upgradeUrl ? { upgradeUrl } : {} };
90467
90490
  };
90468
90491
  let idleTimer = null;
90469
90492
  let maxTimer = null;
@@ -90490,6 +90513,15 @@ function createAutoPublisher(options) {
90490
90513
  for (const key2 of [...dirty]) {
90491
90514
  remarked.delete(key2);
90492
90515
  const outcome = await options.publish(key2);
90516
+ console.error(JSON.stringify({ type: "auto-publish", key: key2, outcome: outcome.kind, ..."message" in outcome ? { message: outcome.message } : {} }));
90517
+ if (outcome.kind === "failed" || outcome.kind === "not-ready") {
90518
+ const count = (failures.get(key2) ?? 0) + 1;
90519
+ failures.set(key2, count);
90520
+ if (count >= FAILURES_BEFORE_NOTICE) raise("failing", `${key2}: ${outcome.kind === "failed" ? outcome.message : "not ready to publish; fix its warnings"}`);
90521
+ } else {
90522
+ failures.delete(key2);
90523
+ if (failures.size === 0 && notice?.kind === "failing") notice = null;
90524
+ }
90493
90525
  if (outcome.kind === "signed-out") {
90494
90526
  paused = { token };
90495
90527
  raise("signed-out", SIGNED_OUT_MESSAGE);
@@ -90502,7 +90534,7 @@ function createAutoPublisher(options) {
90502
90534
  } else if (outcome.kind === "opted-out" || outcome.kind === "gone") {
90503
90535
  dirty.delete(key2);
90504
90536
  } else if (outcome.kind === "cannot-create") {
90505
- raise("cap", outcome.message);
90537
+ raise("cap", outcome.message, outcome.upgradeUrl);
90506
90538
  } else {
90507
90539
  retry = true;
90508
90540
  }
@@ -90658,6 +90690,7 @@ var CONTENT_CSP = {
90658
90690
  document: "sandbox; default-src 'none'",
90659
90691
  html: "sandbox allow-scripts allow-modals allow-forms allow-popups allow-downloads"
90660
90692
  };
90693
+ var CLOSE_FLUSH_MS = 5e3;
90661
90694
  var DIRECT_RELAY_ROUTE = /^\/relay\/a\/([A-Za-z0-9_-]{1,64})$/;
90662
90695
  var SHELL_ROUTE = new RegExp(`^/(?:(${ARTIFACT_TYPES.join("|")})/([^/]+)/?)?$`);
90663
90696
  var API_ARTIFACT_ROUTE = /^\/api\/artifacts\/([^/]+)\/([^/]+)$/;
@@ -91433,16 +91466,20 @@ async function startArtifactsServer(options) {
91433
91466
  for (const change of initialChanges) listener(change.ref, change.payload, change.files);
91434
91467
  },
91435
91468
  onActivity: (listener) => activityListeners.push(listener),
91436
- close: () => new Promise((resolve) => {
91437
- watcher.close();
91438
- autoPublisher?.close();
91439
- relay?.close();
91440
- direct.close();
91441
- selections.clearAll();
91442
- for (const socket of clients) socket.destroy();
91443
- server.close(() => resolve());
91444
- server.closeAllConnections();
91445
- }).then(() => documents.close().catch(() => void 0))
91469
+ close: async () => {
91470
+ await Promise.race([autoPublisher?.flush(), new Promise((resolve) => setTimeout(resolve, CLOSE_FLUSH_MS).unref())]);
91471
+ await new Promise((resolve) => {
91472
+ watcher.close();
91473
+ autoPublisher?.close();
91474
+ relay?.close();
91475
+ direct.close();
91476
+ selections.clearAll();
91477
+ for (const socket of clients) socket.destroy();
91478
+ server.close(() => resolve());
91479
+ server.closeAllConnections();
91480
+ });
91481
+ await documents.close().catch(() => void 0);
91482
+ }
91446
91483
  };
91447
91484
  }
91448
91485
 
@@ -91542,7 +91579,7 @@ function openReady(payload) {
91542
91579
  }
91543
91580
 
91544
91581
  // package.json
91545
- var version = "1.27.0";
91582
+ var version = "1.29.0";
91546
91583
 
91547
91584
  // src/server/main.ts
91548
91585
  async function main() {
@@ -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{a as r,x as i}from"./useSandboxFrame-8NPM2cx_.js";import{_ as a,d as o,f as s,g as c,t as l,v as u,y as d}from"./DocumentLayout-Byi-FSqu.js";var f=e(t(),1),p=n();function m(){let e=(0,f.useMemo)(()=>window.matchMedia(`(prefers-color-scheme: dark)`),[]),[t,n]=(0,f.useState)(e.matches);return(0,f.useEffect)(()=>{let t=()=>n(e.matches);return e.addEventListener(`change`,t),()=>e.removeEventListener(`change`,t)},[e]),t}function h({id:e,state:t,contentBase:n,comments:h=i(),offline:g=!1}){let _=m(),[v,y]=(0,f.useState)(null),b=(0,f.useMemo)(()=>({artifact:`cloud/${e}`,contentBase:n,channel:a(),send:()=>void 0}),[e,n]),x=r(e,{comments:h.threads.filter(e=>e.status===`open`).length,activity:null,retrying:!1,reason:null});return(0,f.useEffect)(()=>{let e=document.createElement(`base`);return e.href=n,document.head.prepend(e),()=>e.remove()},[n]),(0,p.jsxs)(`div`,{className:`x1us19tq x1rozbrz xo2rkog`,className:`ryugi-doc ${{className:`x1us19tq x1rozbrz xo2rkog`}.className??``}`,children:[g?(0,p.jsxs)(`div`,{...{0:{className:`x78zum5 x6s0dn4 x17d4w8g x1vqgdyp x4l9tsp x1bo0w0s xqfszdh xfifm61`},1:{className:`x6s0dn4 x17d4w8g x1vqgdyp x4l9tsp x1bo0w0s xqfszdh xfifm61 x1s85apg x1ux6vrq`}}[!!x|0],children:[(0,p.jsx)(`i`,{className:`xci0xqf x1hagigm x16rqkct xxwmxtg`}),`电脑离线,暂时不能评论`]}):null,(0,p.jsx)(l,{editor:v,threads:h.threads,children:(0,p.jsx)(c.Provider,{value:b,children:(0,p.jsx)(d,{variant:`article`,theme:_?`dark`:`light`,initialValue:t,extraNodes:o,rendererConfig:s,onEditorReady:e=>{e?.setEditable(!1),y(e??null)},children:(0,p.jsx)(u,{})})})})]})}export{h 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{a as r,x as i}from"./useSandboxFrame-rZO0A3sZ.js";import{_ as a,d as o,f as s,g as c,t as l,v as u,y as d}from"./DocumentLayout-DYTnCgfH.js";var f=e(t(),1),p=n();function m(){let e=(0,f.useMemo)(()=>window.matchMedia(`(prefers-color-scheme: dark)`),[]),[t,n]=(0,f.useState)(e.matches);return(0,f.useEffect)(()=>{let t=()=>n(e.matches);return e.addEventListener(`change`,t),()=>e.removeEventListener(`change`,t)},[e]),t}function h({id:e,state:t,contentBase:n,comments:h=i(),offline:g=!1}){let _=m(),[v,y]=(0,f.useState)(null),b=(0,f.useMemo)(()=>({artifact:`cloud/${e}`,contentBase:n,channel:a(),send:()=>void 0}),[e,n]),x=r(e,{comments:h.threads.filter(e=>e.status===`open`).length,activity:null,retrying:!1,reason:null});return(0,f.useEffect)(()=>{let e=document.createElement(`base`);return e.href=n,document.head.prepend(e),()=>e.remove()},[n]),(0,p.jsxs)(`div`,{className:`x1us19tq x1rozbrz xo2rkog`,className:`ryugi-doc ${{className:`x1us19tq x1rozbrz xo2rkog`}.className??``}`,children:[g?(0,p.jsxs)(`div`,{...{0:{className:`x78zum5 x6s0dn4 x17d4w8g x1vqgdyp x4l9tsp x1bo0w0s xqfszdh xfifm61`},1:{className:`x6s0dn4 x17d4w8g x1vqgdyp x4l9tsp x1bo0w0s xqfszdh xfifm61 x1s85apg x1ux6vrq`}}[!!x|0],children:[(0,p.jsx)(`i`,{className:`xci0xqf x1hagigm x16rqkct xxwmxtg`}),`电脑离线,暂时不能评论`]}):null,(0,p.jsx)(l,{editor:v,threads:h.threads,children:(0,p.jsx)(c.Provider,{value:b,children:(0,p.jsx)(d,{variant:`article`,theme:_?`dark`:`light`,initialValue:t,extraNodes:o,rendererConfig:s,onEditorReady:e=>{e?.setEditable(!1),y(e??null)},children:(0,p.jsx)(u,{})})})})]})}export{h as default};
@@ -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{a as r}from"./useSandboxFrame-8NPM2cx_.js";import{t as i}from"./index.js";import a from"./CloudDocument-BWuXcyA5.js";import{DocumentView as o,t as s}from"./DocumentPage-OOUWnUbI.js";var c=e(t(),1),l=`1.27.0`,u=e=>/^(\d+)\.(\d+)\./.exec(e??``)?.slice(1,3).join(`.`)??null;function d(e,t){let n=u(e);return n!==null&&n===u(t)}var f=(e,t)=>`电脑上的 ryugi 是 ${t??`未知版本`},网页是 ${e},版本对上之前只能评论`,p=n();function m({id:e,state:t,contentBase:n,liveContentBase:u,comments:m}){let{transport:h,presence:g}=s(e,u??n??``),_=g?.online??!1;r(e,{online:g?.online??null});let[v,y]=(0,c.useState)(!1);if((0,c.useEffect)(()=>{_&&y(!0)},[_]),!h||!(v||_))return!t||!n?(0,p.jsx)(i,{children:g===null?`正在连接…`:`还没发布。电脑在线时,这里会实时显示。`}):(0,p.jsx)(a,{id:e,state:t,contentBase:n,comments:m,offline:g!==null&&!_});let b=_&&d(l,g?.version??null),x=_&&!b?f(l,g?.version??null):null;return(0,p.jsx)(o,{id:e,transport:h,live:_,cloud:{online:_,canEdit:b,reason:x}})}export{m 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{a as r}from"./useSandboxFrame-rZO0A3sZ.js";import{t as i}from"./index.js";import a from"./CloudDocument-DaS9ceOa.js";import{DocumentView as o,t as s}from"./DocumentPage-BLL9x3pY.js";var c=e(t(),1),l=`1.29.0`,u=e=>/^(\d+)\.(\d+)\./.exec(e??``)?.slice(1,3).join(`.`)??null;function d(e,t){let n=u(e);return n!==null&&n===u(t)}var f=(e,t)=>`电脑上的 ryugi 是 ${t??`未知版本`},网页是 ${e},版本对上之前只能评论`,p=n();function m({id:e,state:t,contentBase:n,liveContentBase:u,comments:m}){let{transport:h,presence:g}=s(e,u??n??``),_=g?.online??!1;r(e,{online:g?.online??null});let[v,y]=(0,c.useState)(!1);if((0,c.useEffect)(()=>{_&&y(!0)},[_]),!h||!(v||_))return!t||!n?(0,p.jsx)(i,{children:g===null?`正在连接…`:`还没发布。电脑在线时,这里会实时显示。`}):(0,p.jsx)(a,{id:e,state:t,contentBase:n,comments:m,offline:g!==null&&!_});let b=_&&d(l,g?.version??null),x=_&&!b?f(l,g?.version??null):null;return(0,p.jsx)(o,{id:e,transport:h,live:_,cloud:{online:_,canEdit:b,reason:x}})}export{m as default};