ryugi-artifacts 1.26.1 → 1.28.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 (141) hide show
  1. package/dist/cli.cjs +6 -3
  2. package/dist/server.cjs +63 -25
  3. package/dist/viewer/{CloudDocument-D3S7e7RC.js → CloudDocument-BWuXcyA5.js} +1 -1
  4. package/dist/viewer/{CloudLiveDocument-CRPSKpFi.js → CloudLiveDocument-DY2AK2fW.js} +1 -1
  5. package/dist/viewer/{DocumentLayout-DCqaPuH2.js → DocumentLayout-Byi-FSqu.js} +4 -4
  6. package/dist/viewer/{DocumentPage-U7FIJYbX.js → DocumentPage-OOUWnUbI.js} +1 -1
  7. package/dist/viewer/{abnfDiagram-VCTEODGH-3r_i2uTk.js → abnfDiagram-VCTEODGH-B76YgVSl.js} +1 -1
  8. package/dist/viewer/{ar-SA-G6X2FPQ2-CwNjAezr.js → ar-SA-G6X2FPQ2-DLDk3Fr1.js} +1 -1
  9. package/dist/viewer/{architectureDiagram-5GKGNRK7-By620ee3.js → architectureDiagram-5GKGNRK7-DJ2b0H6u.js} +1 -1
  10. package/dist/viewer/{az-AZ-76LH7QW2-CZFC99eK.js → az-AZ-76LH7QW2-BNE3cqGu.js} +1 -1
  11. package/dist/viewer/{bg-BG-XCXSNQG7-CdHl5mL3.js → bg-BG-XCXSNQG7-Ba6gRSVy.js} +1 -1
  12. package/dist/viewer/{blockDiagram-I7D4REHJ-BBNwPBui.js → blockDiagram-I7D4REHJ-CFQQSd-A.js} +1 -1
  13. package/dist/viewer/{bn-BD-2XOGV67Q-BCcfNU1w.js → bn-BD-2XOGV67Q-ByJdIgWh.js} +1 -1
  14. package/dist/viewer/{c4Diagram-7LVT6UL2-W0oo4SZL.js → c4Diagram-7LVT6UL2-CbJzjhvB.js} +1 -1
  15. package/dist/viewer/{ca-ES-6MX7JW3Y-D1LVE_KZ.js → ca-ES-6MX7JW3Y-Bn0HEIfv.js} +1 -1
  16. package/dist/viewer/{chunk-4HAMMTFA-CkqsGoaq.js → chunk-4HAMMTFA-B9aeqO2F.js} +1 -1
  17. package/dist/viewer/{chunk-EIO257PC-CU7XpdH7.js → chunk-EIO257PC-DPOhWzKh.js} +1 -1
  18. package/dist/viewer/{chunk-GMAD6QVW-BaeLTMI4.js → chunk-GMAD6QVW-BpmihfGs.js} +1 -1
  19. package/dist/viewer/{chunk-GVQU2GXP-BIBhDhue.js → chunk-GVQU2GXP-DF7F0sgS.js} +1 -1
  20. package/dist/viewer/{chunk-IMKFNOWR-CEG0s9FD.js → chunk-IMKFNOWR-C-YO3NQ2.js} +1 -1
  21. package/dist/viewer/{chunk-L3NEJ4N5-Ck17hjBg.js → chunk-L3NEJ4N5-DlmncLgE.js} +1 -1
  22. package/dist/viewer/{chunk-OSK3NFVY-CNSvj6xi.js → chunk-OSK3NFVY-CL7h-mBo.js} +1 -1
  23. package/dist/viewer/{chunk-PWAF6VOD-mVgGIJrT.js → chunk-PWAF6VOD-B8BPkPFW.js} +1 -1
  24. package/dist/viewer/{chunk-SHT3W25Y-C4Y6RPj0.js → chunk-SHT3W25Y-BpyOxjUT.js} +1 -1
  25. package/dist/viewer/{chunk-SVP7TREG-Casm8Nvh.js → chunk-SVP7TREG-Rl8tIF8A.js} +1 -1
  26. package/dist/viewer/{chunk-TICWLB2K-CoU4Z4HC.js → chunk-TICWLB2K-B9QJjkf4.js} +1 -1
  27. package/dist/viewer/{classDiagram-ZZMXUADV-D6UCj2L0.js → classDiagram-ZZMXUADV-DLD_6HAr.js} +1 -1
  28. package/dist/viewer/{classDiagram-v2-VYDZK3BY-D6UCj2L0.js → classDiagram-v2-VYDZK3BY-DLD_6HAr.js} +1 -1
  29. package/dist/viewer/{cs-CZ-2BRQDIVT-5Fad8-92.js → cs-CZ-2BRQDIVT-CP2adRFB.js} +1 -1
  30. package/dist/viewer/{cynefinDiagram-5FMLGOSQ-B2ZRSjmw.js → cynefinDiagram-5FMLGOSQ-D9ppMSAA.js} +1 -1
  31. package/dist/viewer/{da-DK-5WZEPLOC-BFBLv4Uk.js → da-DK-5WZEPLOC-C854LrBe.js} +1 -1
  32. package/dist/viewer/{dagre-GXQ25YYZ-BFgBhyr3.js → dagre-GXQ25YYZ-CwJRgiLt.js} +1 -1
  33. package/dist/viewer/{de-DE-XR44H4JA-qyJtGLTH.js → de-DE-XR44H4JA-DwXVAz5d.js} +1 -1
  34. package/dist/viewer/{diagram-S7CK7UJ4-hmI-Gut0.js → diagram-S7CK7UJ4-BvzLjbsx.js} +1 -1
  35. package/dist/viewer/{diagram-UQ7AKVKN-DPjoAEc4.js → diagram-UQ7AKVKN-DVhbPMxc.js} +1 -1
  36. package/dist/viewer/{diagram-VX7I27RA-GCjWgZ9y.js → diagram-VX7I27RA-CiZPn2lF.js} +1 -1
  37. package/dist/viewer/{diagram-Z3DM3KII-C2M991ko.js → diagram-Z3DM3KII-DXPygDoX.js} +1 -1
  38. package/dist/viewer/{dist-Dwk2pFvp.js → dist-8IahudhA.js} +1 -1
  39. package/dist/viewer/{dist-GN5sxa0R.js → dist-9M_yJcOs.js} +1 -1
  40. package/dist/viewer/{dist-CXDzUM_N.js → dist-B1Ptot19.js} +1 -1
  41. package/dist/viewer/{dist-DI3XZN2p.js → dist-B5lO5wnx.js} +1 -1
  42. package/dist/viewer/{dist-ByR4-IkI.js → dist-BOP0LsZa.js} +1 -1
  43. package/dist/viewer/{dist-CdTPm-OW.js → dist-BPFV7HsR.js} +1 -1
  44. package/dist/viewer/{dist-Yrf-RYLb.js → dist-Be1IcO6Q.js} +1 -1
  45. package/dist/viewer/{dist-B2zokIna.js → dist-BzgaaK2T.js} +1 -1
  46. package/dist/viewer/{dist-DqKbfOWo.js → dist-CFgqvLZ2.js} +1 -1
  47. package/dist/viewer/{dist-C3FADbMn.js → dist-CGrJjp88.js} +4 -4
  48. package/dist/viewer/{dist-Ogq2hBPJ.js → dist-CK0OLGCF.js} +1 -1
  49. package/dist/viewer/{dist-42dQbZqK.js → dist-CY7v7M0d.js} +1 -1
  50. package/dist/viewer/{dist-Bt08qAY3.js → dist-CbUvo-PD.js} +1 -1
  51. package/dist/viewer/{dist-zqqKIyiY.js → dist-ClaGSrjh.js} +1 -1
  52. package/dist/viewer/{dist-C8Q-Pgp3.js → dist-CvwCGpfr.js} +1 -1
  53. package/dist/viewer/{dist-BVz3Wdll.js → dist-DNNj2aMA.js} +1 -1
  54. package/dist/viewer/{dist-DXMGdH-z.js → dist-DP6MYfia.js} +1 -1
  55. package/dist/viewer/{dist-DT7JKS37.js → dist-FgUijJl1.js} +1 -1
  56. package/dist/viewer/{dist-BGIgMJuT.js → dist-QOs0jlFD.js} +1 -1
  57. package/dist/viewer/{dist-BL8ZPE60.js → dist-SiyuNGPI.js} +1 -1
  58. package/dist/viewer/{dist-DywgOf-d.js → dist-k5Bay5go.js} +1 -1
  59. package/dist/viewer/{dist-DB07IXf4.js → dist-qDaS3xgU.js} +1 -1
  60. package/dist/viewer/{dist-BE-ykq1O.js → dist-tNvHCVhP.js} +1 -1
  61. package/dist/viewer/{dist-BMLwzVoq.js → dist-vne2aEcf.js} +1 -1
  62. package/dist/viewer/{ebnfDiagram-PWID7BFC-DL8-fLh7.js → ebnfDiagram-PWID7BFC-8drQoH7p.js} +1 -1
  63. package/dist/viewer/{el-GR-BZB4AONW-D-E4EuSl.js → el-GR-BZB4AONW-BljLqMZ_.js} +1 -1
  64. package/dist/viewer/{en-B4ZKOASM-nyCkEpWd.js → en-B4ZKOASM-BfV31NDk.js} +1 -1
  65. package/dist/viewer/{erDiagram-RLTQ6QDP-BqSCLMWa.js → erDiagram-RLTQ6QDP-0fkPgBMS.js} +1 -1
  66. package/dist/viewer/{es-ES-U4NZUMDT-BWAoORmX.js → es-ES-U4NZUMDT-Da1qIc4a.js} +1 -1
  67. package/dist/viewer/{eu-ES-A7QVB2H4-DtV46eSh.js → eu-ES-A7QVB2H4-CQp4OaxH.js} +1 -1
  68. package/dist/viewer/{fa-IR-HGAKTJCU-BR6zB-uH.js → fa-IR-HGAKTJCU-BvXOUytP.js} +1 -1
  69. package/dist/viewer/{fi-FI-Z5N7JZ37-Bd3JIrkT.js → fi-FI-Z5N7JZ37-Bgx3Gedw.js} +1 -1
  70. package/dist/viewer/flowDiagram-HODETNUW-7aJd59hN.js +1 -0
  71. package/dist/viewer/{fr-FR-RHASNOE6-CppFZqNA.js → fr-FR-RHASNOE6-C-fh7evs.js} +1 -1
  72. package/dist/viewer/{ganttDiagram-EL5Y4UJY-CEu1jOoU.js → ganttDiagram-EL5Y4UJY-BvfQnVc2.js} +1 -1
  73. package/dist/viewer/{gl-ES-HMX3MZ6V-D7Y53A4G.js → gl-ES-HMX3MZ6V-DYeSOfSa.js} +1 -1
  74. package/dist/viewer/{he-IL-6SHJWFNN-CY-wLZAr.js → he-IL-6SHJWFNN-DnGoCpZV.js} +1 -1
  75. package/dist/viewer/{hi-IN-IWLTKZ5I-DVJuRdDe.js → hi-IN-IWLTKZ5I-Bx7eNYDf.js} +1 -1
  76. package/dist/viewer/{hu-HU-A5ZG7DT2-CKLayeMf.js → hu-HU-A5ZG7DT2-DijmTnRH.js} +1 -1
  77. package/dist/viewer/{id-ID-SAP4L64H-CYt7c7f4.js → id-ID-SAP4L64H-DCmr4bop.js} +1 -1
  78. package/dist/viewer/{image-GAAHSSAO-CjEkSOs2.js → image-GAAHSSAO-BHoF2Vsu.js} +1 -1
  79. package/dist/viewer/index.js +7 -7
  80. package/dist/viewer/index2.css +67 -19
  81. package/dist/viewer/{infoDiagram-27XIBGKW-Dpr34g-Z.js → infoDiagram-27XIBGKW-C-j3_tDE.js} +1 -1
  82. package/dist/viewer/{ishikawaDiagram-5VMMS53U-B-hfckVK.js → ishikawaDiagram-5VMMS53U-CrrJKAfN.js} +1 -1
  83. package/dist/viewer/{it-IT-JPQ66NNP-Odx1hSA-.js → it-IT-JPQ66NNP-B_1ONva5.js} +1 -1
  84. package/dist/viewer/{ja-JP-DBVTYXUO-gIE5dmB-.js → ja-JP-DBVTYXUO-COt_mEp7.js} +1 -1
  85. package/dist/viewer/{journeyDiagram-3NMN7TZE-D_FnYj8i.js → journeyDiagram-3NMN7TZE-Bb_vzuuE.js} +1 -1
  86. package/dist/viewer/{kaa-6HZHGXH3-B6ZYHIQ6.js → kaa-6HZHGXH3-CtBWieDY.js} +1 -1
  87. package/dist/viewer/{kab-KAB-ZGHBKWFO-Da2SBW6w.js → kab-KAB-ZGHBKWFO-B1isjGxm.js} +1 -1
  88. package/dist/viewer/{kanban-definition-UXKFOSKX-JBHo4MMu.js → kanban-definition-UXKFOSKX-C8L3qBCD.js} +1 -1
  89. package/dist/viewer/{kk-KZ-P5N5QNE5-BmXrsfBx.js → kk-KZ-P5N5QNE5-6r2ptdHm.js} +1 -1
  90. package/dist/viewer/{km-KH-HSX4SM5Z-B4L5JI34.js → km-KH-HSX4SM5Z-DYRHwFjm.js} +1 -1
  91. package/dist/viewer/{ko-KR-MTYHY66A-MXhfFcg1.js → ko-KR-MTYHY66A-DtXg7Y--.js} +1 -1
  92. package/dist/viewer/{ku-TR-6OUDTVRD-CkgfpJpw.js → ku-TR-6OUDTVRD-6p-SD1d8.js} +1 -1
  93. package/dist/viewer/{lt-LT-XHIRWOB4-DW8fVSzC.js → lt-LT-XHIRWOB4-CJ-U7kN9.js} +1 -1
  94. package/dist/viewer/{lv-LV-5QDEKY6T-DN5qFDVd.js → lv-LV-5QDEKY6T-CGuh47HO.js} +1 -1
  95. package/dist/viewer/{mindmap-definition-YA3MSWOX-BqBzYnHU.js → mindmap-definition-YA3MSWOX-0eisP1RB.js} +1 -1
  96. package/dist/viewer/{mr-IN-CRQNXWMA-BtKz2Eiz.js → mr-IN-CRQNXWMA-C5M5PNpN.js} +1 -1
  97. package/dist/viewer/{my-MM-5M5IBNSE-BE3fojCJ.js → my-MM-5M5IBNSE-DIENd2KG.js} +1 -1
  98. package/dist/viewer/{nb-NO-T6EIAALU-D6TzkiN5.js → nb-NO-T6EIAALU-DXVgc5SE.js} +1 -1
  99. package/dist/viewer/{nl-NL-IS3SIHDZ-CFz9XZrF.js → nl-NL-IS3SIHDZ-8qumey8Z.js} +1 -1
  100. package/dist/viewer/{nn-NO-6E72VCQL-BtqyyXIG.js → nn-NO-6E72VCQL-CDCdtw1B.js} +1 -1
  101. package/dist/viewer/{oc-FR-POXYY2M6-Y5Cl6BCx.js → oc-FR-POXYY2M6-Fc7Bh2Zf.js} +1 -1
  102. package/dist/viewer/{pa-IN-N4M65BXN-CwDhAj5G.js → pa-IN-N4M65BXN-B_4vn2yt.js} +1 -1
  103. package/dist/viewer/{pegDiagram-XKGWAZYB-DWX_F2Dw.js → pegDiagram-XKGWAZYB-CuIetWDp.js} +1 -1
  104. package/dist/viewer/percentages-BXMCSKIN-7tGDPb_F.js +1 -0
  105. package/dist/viewer/{pieDiagram-E7YTZNPT-cO8NWDVq.js → pieDiagram-E7YTZNPT-DJZP8D-Y.js} +1 -1
  106. package/dist/viewer/{pl-PL-T2D74RX3-Ce-3yAtJ.js → pl-PL-T2D74RX3-De3SYqY6.js} +1 -1
  107. package/dist/viewer/{prod-CLgKnmys.js → prod-C348eXRq.js} +8 -8
  108. package/dist/viewer/{pt-BR-5N22H2LF-B9ovUxsk.js → pt-BR-5N22H2LF-7nvQLf7O.js} +1 -1
  109. package/dist/viewer/{pt-PT-UZXXM6DQ-B_ZeBHpV.js → pt-PT-UZXXM6DQ-DtY6VsPE.js} +1 -1
  110. package/dist/viewer/{quadrantDiagram-AXDQQJYC-D_lbVSgg.js → quadrantDiagram-AXDQQJYC-mSYxZRrZ.js} +1 -1
  111. package/dist/viewer/{railroadDiagram-O6MQD6OU-BM1YiPzi.js → railroadDiagram-O6MQD6OU-BB4IbxIB.js} +1 -1
  112. package/dist/viewer/{requirementDiagram-BXWQKSXE-BqqWiApZ.js → requirementDiagram-BXWQKSXE-BsFDYkmh.js} +1 -1
  113. package/dist/viewer/{ro-RO-JPDTUUEW-CWSGs13z.js → ro-RO-JPDTUUEW-C2UUKQUY.js} +1 -1
  114. package/dist/viewer/{ru-RU-B4JR7IUQ-Cyw1cykq.js → ru-RU-B4JR7IUQ-Bl2--IBH.js} +1 -1
  115. package/dist/viewer/{sequenceDiagram-WJ2MYXX4-Cbt6VzGR.js → sequenceDiagram-WJ2MYXX4-BGfuVGG1.js} +1 -1
  116. package/dist/viewer/{si-LK-N5RQ5JYF-kiNYcIfx.js → si-LK-N5RQ5JYF-DPrn5n2l.js} +1 -1
  117. package/dist/viewer/{sk-SK-C5VTKIMK-B7ki64Vo.js → sk-SK-C5VTKIMK-COiEvIHd.js} +1 -1
  118. package/dist/viewer/{sl-SI-NN7IZMDC-Bfw6P3Pg.js → sl-SI-NN7IZMDC-B_lH3TnL.js} +1 -1
  119. package/dist/viewer/{stateDiagram-D77RDMKH-DCZ2vSP1.js → stateDiagram-D77RDMKH-DpCE9DL-.js} +1 -1
  120. package/dist/viewer/{stateDiagram-v2-MP3YSRHH-zcIB9aMp.js → stateDiagram-v2-MP3YSRHH-C0rABr6s.js} +1 -1
  121. package/dist/viewer/subset-shared.chunk-BAO8Kml0.js +1 -0
  122. package/dist/viewer/{subset-worker.chunk-CLv09uw4.js → subset-worker.chunk-B6O2iSJs.js} +1 -1
  123. package/dist/viewer/{sv-SE-XGPEYMSR-Dd33JzgN.js → sv-SE-XGPEYMSR-DVjXhx9f.js} +1 -1
  124. package/dist/viewer/{swimlanes-42K2YHIH-BzMr0L-8.js → swimlanes-42K2YHIH-DUwALMlk.js} +1 -1
  125. package/dist/viewer/{swimlanesDiagram-VR7AAH4N-BrdAbdj0.js → swimlanesDiagram-VR7AAH4N-BdC_UzvH.js} +1 -1
  126. package/dist/viewer/{ta-IN-2NMHFXQM-C3tYlmxb.js → ta-IN-2NMHFXQM-CMaH6ve7.js} +1 -1
  127. package/dist/viewer/{th-TH-HPSO5L25-CMjireIs.js → th-TH-HPSO5L25-VndAJUSw.js} +1 -1
  128. package/dist/viewer/{timeline-definition-24CTP7MA-BJYzYYGo.js → timeline-definition-24CTP7MA-w3XLPWpz.js} +1 -1
  129. package/dist/viewer/{tr-TR-DEFEU3FU-C5O33K6o.js → tr-TR-DEFEU3FU-BBdNf75x.js} +1 -1
  130. package/dist/viewer/{uk-UA-QMV73CPH-m01EdSwq.js → uk-UA-QMV73CPH-BXI-Vp7U.js} +1 -1
  131. package/dist/viewer/{vennDiagram-4TSXK5OY-DK9-uj1H.js → vennDiagram-4TSXK5OY-DctGHju1.js} +1 -1
  132. package/dist/viewer/{vi-VN-M7AON7JQ-Cwye8jKZ.js → vi-VN-M7AON7JQ-bJa-6QK7.js} +1 -1
  133. package/dist/viewer/{wardleyDiagram-VM6X3IG4-BTYwSp7p.js → wardleyDiagram-VM6X3IG4-BQZsrNDk.js} +1 -1
  134. package/dist/viewer/{xychartDiagram-S5SC5T6Z-B8APE590.js → xychartDiagram-S5SC5T6Z-CgaT07RV.js} +1 -1
  135. package/dist/viewer/{zh-CN-LNUGB5OW-aECTzkFT.js → zh-CN-LNUGB5OW-C2xLUp3o.js} +1 -1
  136. package/dist/viewer/{zh-HK-E62DVLB3-49C3nMPL.js → zh-HK-E62DVLB3-C19QGzmQ.js} +1 -1
  137. package/dist/viewer/{zh-TW-RAJ6MFWO-Dbh3W6RH.js → zh-TW-RAJ6MFWO-BgCf3zhS.js} +1 -1
  138. package/package.json +1 -1
  139. package/dist/viewer/flowDiagram-HODETNUW-BRezqzgn.js +0 -1
  140. package/dist/viewer/percentages-BXMCSKIN-B0PKM54b.js +0 -1
  141. package/dist/viewer/subset-shared.chunk-DeW66Lwh.js +0 -1
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.26.1");
931
+ console.log("1.28.0");
929
932
  return 0;
930
933
  }
931
934
  if (command === "--help" || command === "-h") {
package/dist/server.cjs CHANGED
@@ -88684,8 +88684,9 @@ var INSPECTOR_PROPERTIES = [
88684
88684
  "color",
88685
88685
  "box-shadow"
88686
88686
  ];
88687
- var COMMENT_CURSOR_SVG = "<svg xmlns='http://www.w3.org/2000/svg' width='26' height='26' viewBox='0 0 26 26'><path d='M2 24V13a11 11 0 1 1 11 11z' fill='white' stroke='black' stroke-width='1.5' stroke-linejoin='round'/><path d='M13 8.5v9M8.5 13h9' stroke='black' stroke-width='1.8' stroke-linecap='round'/></svg>";
88688
- var COMMENT_CURSOR = `url("data:image/svg+xml,${encodeURIComponent(COMMENT_CURSOR_SVG)}") 2 24, crosshair`;
88687
+ var COMMENT_BUBBLE = "M14.5 3a10.5 10.5 0 1 1-4.2 20.1l-5 1.6c-.9.3-1.7-.5-1.4-1.4l1.6-5A10.5 10.5 0 0 1 14.5 3z";
88688
+ var COMMENT_CURSOR_SVG = `<svg xmlns='http://www.w3.org/2000/svg' width='28' height='28' viewBox='0 0 28 28'><path d='${COMMENT_BUBBLE}' fill='none' stroke='white' stroke-width='4' stroke-linejoin='round'/><path d='${COMMENT_BUBBLE}' fill='#c65d3b'/><path d='M14.5 9.3v8.4M10.3 13.5h8.4' stroke='white' stroke-width='2.4' stroke-linecap='round'/></svg>`;
88689
+ var COMMENT_CURSOR = `url("data:image/svg+xml,${encodeURIComponent(COMMENT_CURSOR_SVG)}") 4 24, crosshair`;
88689
88690
 
88690
88691
  // src/shared/tweaks.ts
88691
88692
  function tweakTools() {
@@ -89911,6 +89912,13 @@ var CloudRefused = class extends Error {
89911
89912
  };
89912
89913
  var CloudCopyGone = class extends Error {
89913
89914
  };
89915
+ var PlanLimited = class extends CloudRefused {
89916
+ constructor(message, upgradeUrl) {
89917
+ super(402, message);
89918
+ this.upgradeUrl = upgradeUrl;
89919
+ }
89920
+ upgradeUrl;
89921
+ };
89914
89922
  var CreateRefused = class extends CloudRefused {
89915
89923
  constructor(detail) {
89916
89924
  super(502, `cloud refused (403): ${detail}`);
@@ -89932,6 +89940,17 @@ async function readJsonBody(req) {
89932
89940
  return null;
89933
89941
  }
89934
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
+ }
89935
89954
  async function errorMessage(res) {
89936
89955
  const text2 = await res.text().catch(() => "");
89937
89956
  try {
@@ -89986,7 +90005,7 @@ function createCloudRoutes(options) {
89986
90005
  return res;
89987
90006
  };
89988
90007
  const expectOk = async (res) => {
89989
- if (!res.ok) throw new CloudRefused(502, `cloud refused (${res.status}): ${await errorMessage(res)}`);
90008
+ if (!res.ok) await refuse(res);
89990
90009
  return res;
89991
90010
  };
89992
90011
  const artifactEntry = (key2) => readConfig(configFile).config.artifacts[key2] ?? {};
@@ -90014,14 +90033,14 @@ function createCloudRoutes(options) {
90014
90033
  const reserve = async (ref) => {
90015
90034
  const key2 = `${ref.type}/${ref.id}`;
90016
90035
  const entry = artifactEntry(key2);
90017
- if (entry.cloud) return entry.cloud.url;
90018
- 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 };
90019
90038
  try {
90020
90039
  await createRecord2(ref, entry.visibility ?? "private");
90021
- } catch {
90022
- return null;
90040
+ } catch (err) {
90041
+ return err instanceof PlanLimited ? { url: null, limit: { message: err.message, upgradeUrl: err.upgradeUrl } } : { url: null };
90023
90042
  }
90024
- return artifactEntry(key2).cloud?.url ?? null;
90043
+ return { url: artifactEntry(key2).cloud?.url ?? null };
90025
90044
  };
90026
90045
  const prepare = async (ref) => {
90027
90046
  const inspected = await options.inspect(ref);
@@ -90082,7 +90101,7 @@ function createCloudRoutes(options) {
90082
90101
  };
90083
90102
  let res = entry.cloud ? await commit(entry.cloud.id, requested) : await commit(await create3(), void 0);
90084
90103
  if (res.status === 404 && entry.cloud) {
90085
- if (!recreate) throw new CloudCopyGone();
90104
+ if (!recreate && entry.cloud.publishedAt) throw new CloudCopyGone();
90086
90105
  res = await commit(await create3(), void 0);
90087
90106
  }
90088
90107
  const published = await (await expectOk(res)).json();
@@ -90137,6 +90156,7 @@ function createCloudRoutes(options) {
90137
90156
  return { kind: "opted-out" };
90138
90157
  }
90139
90158
  if (err instanceof SignedOut) return { kind: "signed-out" };
90159
+ if (err instanceof PlanLimited) return { kind: "cannot-create", message: err.message, upgradeUrl: err.upgradeUrl };
90140
90160
  if (err instanceof CreateRefused) return { kind: "cannot-create", message: err.detail };
90141
90161
  if (err instanceof CloudRefused && err.status === 404) return { kind: "gone" };
90142
90162
  if (err instanceof CloudRefused && err.status === 413) return { kind: "not-ready" };
@@ -90196,7 +90216,7 @@ function createCloudRoutes(options) {
90196
90216
  return;
90197
90217
  }
90198
90218
  if (action === "reserve" && ref && method === "POST") {
90199
- sendJson(res, 200, { url: await serialized(`${ref.type}/${ref.id}`, () => reserve(ref)) });
90219
+ sendJson(res, 200, await serialized(`${ref.type}/${ref.id}`, () => reserve(ref)));
90200
90220
  return;
90201
90221
  }
90202
90222
  if (action === "publish" && ref && method === "DELETE") {
@@ -90273,6 +90293,8 @@ function createCloudRoutes(options) {
90273
90293
  if (res.headersSent) return;
90274
90294
  if (err instanceof SignedOut) {
90275
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 });
90276
90298
  } else if (err instanceof CloudRefused) {
90277
90299
  sendJson(res, err.status, { error: err.message });
90278
90300
  } else {
@@ -90434,10 +90456,11 @@ var import_node_fs20 = __toESM(require("node:fs"), 1);
90434
90456
  var IDLE_MS = 5 * 60 * 1e3;
90435
90457
  var MAX_WAIT_MS = 15 * 60 * 1e3;
90436
90458
  var SIGNED_OUT_MESSAGE = "auto-publish paused: the Ryugi Cloud sign-in expired";
90459
+ var FAILURES_BEFORE_NOTICE = 3;
90437
90460
  function isNotice(value) {
90438
90461
  if (typeof value !== "object" || value === null) return false;
90439
90462
  const { id: id2, kind, message } = value;
90440
- 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";
90441
90464
  }
90442
90465
  function readAutoPublishState(file) {
90443
90466
  let raw = {};
@@ -90460,9 +90483,10 @@ function createAutoPublisher(options) {
90460
90483
  let notice = saved.notice;
90461
90484
  let paused = saved.paused;
90462
90485
  const remarked = /* @__PURE__ */ new Set();
90486
+ const failures = /* @__PURE__ */ new Map();
90463
90487
  const save = () => writeJsonAtomic(options.stateFile, { dirty: [...dirty], notice, paused });
90464
- const raise = (kind, message) => {
90465
- 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 } : {} };
90466
90490
  };
90467
90491
  let idleTimer = null;
90468
90492
  let maxTimer = null;
@@ -90489,6 +90513,15 @@ function createAutoPublisher(options) {
90489
90513
  for (const key2 of [...dirty]) {
90490
90514
  remarked.delete(key2);
90491
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
+ }
90492
90525
  if (outcome.kind === "signed-out") {
90493
90526
  paused = { token };
90494
90527
  raise("signed-out", SIGNED_OUT_MESSAGE);
@@ -90501,7 +90534,7 @@ function createAutoPublisher(options) {
90501
90534
  } else if (outcome.kind === "opted-out" || outcome.kind === "gone") {
90502
90535
  dirty.delete(key2);
90503
90536
  } else if (outcome.kind === "cannot-create") {
90504
- raise("cap", outcome.message);
90537
+ raise("cap", outcome.message, outcome.upgradeUrl);
90505
90538
  } else {
90506
90539
  retry = true;
90507
90540
  }
@@ -90657,6 +90690,7 @@ var CONTENT_CSP = {
90657
90690
  document: "sandbox; default-src 'none'",
90658
90691
  html: "sandbox allow-scripts allow-modals allow-forms allow-popups allow-downloads"
90659
90692
  };
90693
+ var CLOSE_FLUSH_MS = 5e3;
90660
90694
  var DIRECT_RELAY_ROUTE = /^\/relay\/a\/([A-Za-z0-9_-]{1,64})$/;
90661
90695
  var SHELL_ROUTE = new RegExp(`^/(?:(${ARTIFACT_TYPES.join("|")})/([^/]+)/?)?$`);
90662
90696
  var API_ARTIFACT_ROUTE = /^\/api\/artifacts\/([^/]+)\/([^/]+)$/;
@@ -91432,16 +91466,20 @@ async function startArtifactsServer(options) {
91432
91466
  for (const change of initialChanges) listener(change.ref, change.payload, change.files);
91433
91467
  },
91434
91468
  onActivity: (listener) => activityListeners.push(listener),
91435
- close: () => new Promise((resolve) => {
91436
- watcher.close();
91437
- autoPublisher?.close();
91438
- relay?.close();
91439
- direct.close();
91440
- selections.clearAll();
91441
- for (const socket of clients) socket.destroy();
91442
- server.close(() => resolve());
91443
- server.closeAllConnections();
91444
- }).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
+ }
91445
91483
  };
91446
91484
  }
91447
91485
 
@@ -91541,7 +91579,7 @@ function openReady(payload) {
91541
91579
  }
91542
91580
 
91543
91581
  // package.json
91544
- var version = "1.26.1";
91582
+ var version = "1.28.0";
91545
91583
 
91546
91584
  // src/server/main.ts
91547
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-DCqaPuH2.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-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 +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-D3S7e7RC.js";import{DocumentView as o,t as s}from"./DocumentPage-U7FIJYbX.js";var c=e(t(),1),l=`1.26.1`,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-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.28.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};