ryugi-artifacts 1.7.4 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/bin/ryugi-artifacts.cjs +1 -52
  2. package/dist/cli.cjs +594 -0
  3. package/dist/server.cjs +862 -548
  4. package/dist/viewer/{CloudDocument-Ba6KrnqA.js → CloudDocument-Dguokp_6.js} +1 -1
  5. package/dist/viewer/{DocumentEditor-BS16Wb_Z.js → DocumentEditor-rRoUyzj5.js} +81 -81
  6. package/dist/viewer/DocumentPage-C0_SVGNv.js +1 -0
  7. package/dist/viewer/{abnfDiagram-VCTEODGH-DuJfhZTl.js → abnfDiagram-VCTEODGH-Cd62lXYi.js} +1 -1
  8. package/dist/viewer/{ar-SA-G6X2FPQ2-CVlRFGvR.js → ar-SA-G6X2FPQ2-k4wcXC0w.js} +1 -1
  9. package/dist/viewer/{architectureDiagram-5GKGNRK7-Ca-sK1k9.js → architectureDiagram-5GKGNRK7-BqGRfF7K.js} +1 -1
  10. package/dist/viewer/{az-AZ-76LH7QW2-CzO5U4tE.js → az-AZ-76LH7QW2-DjkRWALq.js} +1 -1
  11. package/dist/viewer/{bg-BG-XCXSNQG7-DLheLFGn.js → bg-BG-XCXSNQG7-CUOyMSFg.js} +1 -1
  12. package/dist/viewer/{blockDiagram-I7D4REHJ-CVWXNFVb.js → blockDiagram-I7D4REHJ-DLj9e678.js} +1 -1
  13. package/dist/viewer/{bn-BD-2XOGV67Q-DvnFf2ym.js → bn-BD-2XOGV67Q-CPw_5I7i.js} +1 -1
  14. package/dist/viewer/{c4Diagram-7LVT6UL2-CddHgiim.js → c4Diagram-7LVT6UL2-D9FPioA_.js} +1 -1
  15. package/dist/viewer/{ca-ES-6MX7JW3Y-1SQM_Wxy.js → ca-ES-6MX7JW3Y-Bl_ggxy-.js} +1 -1
  16. package/dist/viewer/{chunk-4HAMMTFA-B7k7y3et.js → chunk-4HAMMTFA-B8CHZ2iu.js} +1 -1
  17. package/dist/viewer/{chunk-75Z2AOVW-Dmt3SQH3.js → chunk-75Z2AOVW-BLvzzoaA.js} +1 -1
  18. package/dist/viewer/{chunk-EIO257PC-CNxgWaGL.js → chunk-EIO257PC-BkhwQy9u.js} +1 -1
  19. package/dist/viewer/{chunk-GMAD6QVW-Do0Tih79.js → chunk-GMAD6QVW-BIxPNzf_.js} +1 -1
  20. package/dist/viewer/{chunk-GVQU2GXP-C9mWLYpa.js → chunk-GVQU2GXP-BcbkZdgL.js} +1 -1
  21. package/dist/viewer/{chunk-IMKFNOWR-BqsuylOZ.js → chunk-IMKFNOWR-BlVm2eW6.js} +1 -1
  22. package/dist/viewer/{chunk-L3NEJ4N5-D_AVAMEp.js → chunk-L3NEJ4N5-DPP-Uqzz.js} +1 -1
  23. package/dist/viewer/{chunk-OSK3NFVY-BKczRUt9.js → chunk-OSK3NFVY-DvWBYW0M.js} +1 -1
  24. package/dist/viewer/{chunk-PWAF6VOD-CcIRMiiP.js → chunk-PWAF6VOD-Df9WdVJL.js} +1 -1
  25. package/dist/viewer/{chunk-SHT3W25Y-D8R29R_u.js → chunk-SHT3W25Y-BSCi7YG7.js} +1 -1
  26. package/dist/viewer/{chunk-SVP7TREG-DvPbOdMe.js → chunk-SVP7TREG-Bxv2fp8X.js} +1 -1
  27. package/dist/viewer/{chunk-TICWLB2K-v1pSr6BB.js → chunk-TICWLB2K-MSpOEdcV.js} +1 -1
  28. package/dist/viewer/classDiagram-ZZMXUADV-YWXPsH1o.js +1 -0
  29. package/dist/viewer/classDiagram-v2-VYDZK3BY-YWXPsH1o.js +1 -0
  30. package/dist/viewer/{cs-CZ-2BRQDIVT-CuIWOyM9.js → cs-CZ-2BRQDIVT-VpdA_B_0.js} +1 -1
  31. package/dist/viewer/{cynefinDiagram-5FMLGOSQ-CarHaJWA.js → cynefinDiagram-5FMLGOSQ-CCIqA18s.js} +1 -1
  32. package/dist/viewer/{da-DK-5WZEPLOC-BNpk9O4Z.js → da-DK-5WZEPLOC-Bikfnz1b.js} +1 -1
  33. package/dist/viewer/{dagre-GXQ25YYZ-jKxlutMc.js → dagre-GXQ25YYZ-DeVnyw6S.js} +1 -1
  34. package/dist/viewer/{de-DE-XR44H4JA-DeRYYEYN.js → de-DE-XR44H4JA-5nJunltn.js} +1 -1
  35. package/dist/viewer/{diagram-S7CK7UJ4-BzGz76pK.js → diagram-S7CK7UJ4-rcnT6Csv.js} +1 -1
  36. package/dist/viewer/{diagram-UQ7AKVKN-DDsoAc73.js → diagram-UQ7AKVKN-D6yGL_te.js} +1 -1
  37. package/dist/viewer/{diagram-VSXAHHWV-HxtxJg2X.js → diagram-VSXAHHWV-C8eVmzD7.js} +1 -1
  38. package/dist/viewer/{diagram-VX7I27RA-BIeolo3r.js → diagram-VX7I27RA-BVBGylbn.js} +1 -1
  39. package/dist/viewer/{diagram-Z3DM3KII-CU7mw2ow.js → diagram-Z3DM3KII-DnsHEfda.js} +1 -1
  40. package/dist/viewer/{dist-DqbHnPRI.js → dist-BGR5ezDy.js} +1 -1
  41. package/dist/viewer/{dist-DC1HltnF.js → dist-BPa5yz1M.js} +1 -1
  42. package/dist/viewer/{dist-BgSBKOA3.js → dist-BSqmGdSf.js} +1 -1
  43. package/dist/viewer/{dist-Bu_voPaa.js → dist-Bn3GpIIQ.js} +1 -1
  44. package/dist/viewer/{dist-BSeJYKLj.js → dist-C2UdEldV.js} +1 -1
  45. package/dist/viewer/{dist-DX3SNcdm.js → dist-C46f_skK.js} +1 -1
  46. package/dist/viewer/{dist-AH0bdIVa.js → dist-CNSswqVs.js} +1 -1
  47. package/dist/viewer/{dist-CgYgXYmt.js → dist-CPg9Exib.js} +1 -1
  48. package/dist/viewer/{dist-CddCPamz.js → dist-CWy1mEqq.js} +1 -1
  49. package/dist/viewer/{dist-CHLFapPp.js → dist-C_2nvGGH.js} +1 -1
  50. package/dist/viewer/{dist-CZsxPTNE.js → dist-CjSSDaiM.js} +1 -1
  51. package/dist/viewer/{dist-C-ieEyE1.js → dist-CyR9uUsj.js} +1 -1
  52. package/dist/viewer/{dist-CvB831yK.js → dist-DOLGlCIF.js} +1 -1
  53. package/dist/viewer/{dist-Cu6PLla0.js → dist-DOpcb4fi.js} +1 -1
  54. package/dist/viewer/{dist-CbHHxvP1.js → dist-DRJfWmsE.js} +1 -1
  55. package/dist/viewer/{dist-BeULvDu_.js → dist-DU3q2qgP.js} +1 -1
  56. package/dist/viewer/{dist-BlXyXxst.js → dist-DeqL7hkG.js} +1 -1
  57. package/dist/viewer/{dist-BppD0RS2.js → dist-DlPVPwB6.js} +1 -1
  58. package/dist/viewer/{dist-BbW5iWCe.js → dist-JNndX187.js} +1 -1
  59. package/dist/viewer/{dist-C21gJBBO.js → dist-bznEISxg.js} +1 -1
  60. package/dist/viewer/{dist-DA8TW41P.js → dist-gtpBaWjz.js} +1 -1
  61. package/dist/viewer/{dist-Cackv1h9.js → dist-oPn-5997.js} +1 -1
  62. package/dist/viewer/{dist-CitzQ6z1.js → dist-rkIdnkmY.js} +4 -4
  63. package/dist/viewer/{dist-D_Vtqh_s.js → dist-s3i70bod.js} +1 -1
  64. package/dist/viewer/{ebnfDiagram-PWID7BFC-BUmzlASS.js → ebnfDiagram-PWID7BFC-c_bXfo9C.js} +1 -1
  65. package/dist/viewer/{el-GR-BZB4AONW-CU9I6jx_.js → el-GR-BZB4AONW-DuM6nGWb.js} +1 -1
  66. package/dist/viewer/{en-B4ZKOASM-DGboqHSv.js → en-B4ZKOASM-Cr7s3JvY.js} +1 -1
  67. package/dist/viewer/{erDiagram-RLTQ6QDP-DRUmIoEG.js → erDiagram-RLTQ6QDP-B-DgtUd4.js} +1 -1
  68. package/dist/viewer/{es-ES-U4NZUMDT-j5HevUjd.js → es-ES-U4NZUMDT-DNvSsfqo.js} +1 -1
  69. package/dist/viewer/{eu-ES-A7QVB2H4-FpISoaoc.js → eu-ES-A7QVB2H4-NECtmtc_.js} +1 -1
  70. package/dist/viewer/{fa-IR-HGAKTJCU-COJsQztN.js → fa-IR-HGAKTJCU-fp_dFFfn.js} +1 -1
  71. package/dist/viewer/{fi-FI-Z5N7JZ37-BNHsLnGq.js → fi-FI-Z5N7JZ37-uZ8T0uZ2.js} +1 -1
  72. package/dist/viewer/flowDiagram-HODETNUW-QbMFIBc7.js +1 -0
  73. package/dist/viewer/{fr-FR-RHASNOE6-CM9a28Dh.js → fr-FR-RHASNOE6-DYF69T_L.js} +1 -1
  74. package/dist/viewer/{ganttDiagram-EL5Y4UJY-BVcwKFHE.js → ganttDiagram-EL5Y4UJY-C7nYK4VV.js} +1 -1
  75. package/dist/viewer/{gitGraphDiagram-WWUBYQGX-CZxp-Wm4.js → gitGraphDiagram-WWUBYQGX-BYs6a9XC.js} +1 -1
  76. package/dist/viewer/{gl-ES-HMX3MZ6V-C5aDlPBE.js → gl-ES-HMX3MZ6V-Cjlf8qDo.js} +1 -1
  77. package/dist/viewer/{he-IL-6SHJWFNN-eFs-GSWn.js → he-IL-6SHJWFNN-B44gxQ_q.js} +1 -1
  78. package/dist/viewer/{hi-IN-IWLTKZ5I-O1MAguUp.js → hi-IN-IWLTKZ5I-DHRyKjrX.js} +1 -1
  79. package/dist/viewer/{hu-HU-A5ZG7DT2-B3meydQb.js → hu-HU-A5ZG7DT2-B0x2fwF-.js} +1 -1
  80. package/dist/viewer/{id-ID-SAP4L64H-PHNH2hzW.js → id-ID-SAP4L64H-Xxsnu-eK.js} +1 -1
  81. package/dist/viewer/{image-GAAHSSAO-BJifdIGE.js → image-GAAHSSAO-DmsBDNOK.js} +1 -1
  82. package/dist/viewer/index.js +3 -3
  83. package/dist/viewer/index2.css +21 -1
  84. package/dist/viewer/{infoDiagram-27XIBGKW-D5Ag03ug.js → infoDiagram-27XIBGKW-OPdlHu-j.js} +1 -1
  85. package/dist/viewer/{ishikawaDiagram-5VMMS53U-B9SCwzFe.js → ishikawaDiagram-5VMMS53U-3fyfjNAh.js} +1 -1
  86. package/dist/viewer/{it-IT-JPQ66NNP-DHOLiY7r.js → it-IT-JPQ66NNP-B0X8yQyS.js} +1 -1
  87. package/dist/viewer/{ja-JP-DBVTYXUO-DTOuZQy0.js → ja-JP-DBVTYXUO-CnhqD0fK.js} +1 -1
  88. package/dist/viewer/{journeyDiagram-3NMN7TZE-CQvvWgCk.js → journeyDiagram-3NMN7TZE-BD_Ll3Bo.js} +1 -1
  89. package/dist/viewer/{kaa-6HZHGXH3-1d0tKthK.js → kaa-6HZHGXH3-BzhTyhLc.js} +1 -1
  90. package/dist/viewer/{kab-KAB-ZGHBKWFO-BaPyqYzR.js → kab-KAB-ZGHBKWFO-DGiUv22x.js} +1 -1
  91. package/dist/viewer/{kanban-definition-UXKFOSKX-Bg-Q4j28.js → kanban-definition-UXKFOSKX-BspaC3q1.js} +1 -1
  92. package/dist/viewer/{kk-KZ-P5N5QNE5-BqF9n_h-.js → kk-KZ-P5N5QNE5-DH8jyrO_.js} +1 -1
  93. package/dist/viewer/{km-KH-HSX4SM5Z-DPTb_KDC.js → km-KH-HSX4SM5Z-CTtH-yq7.js} +1 -1
  94. package/dist/viewer/{ko-KR-MTYHY66A-DxGidADD.js → ko-KR-MTYHY66A-kp3bbs3q.js} +1 -1
  95. package/dist/viewer/{ku-TR-6OUDTVRD-BECmOCof.js → ku-TR-6OUDTVRD-CniHyrQH.js} +1 -1
  96. package/dist/viewer/{lt-LT-XHIRWOB4-DKQm4SS0.js → lt-LT-XHIRWOB4-C5_ErQjQ.js} +1 -1
  97. package/dist/viewer/{lv-LV-5QDEKY6T-C4kUM3XE.js → lv-LV-5QDEKY6T-DH2pmwSL.js} +1 -1
  98. package/dist/viewer/{mindmap-definition-YA3MSWOX-DRQfDlAQ.js → mindmap-definition-YA3MSWOX-gbG6Nf0i.js} +1 -1
  99. package/dist/viewer/{mr-IN-CRQNXWMA-CutHorlk.js → mr-IN-CRQNXWMA-4I7m5ob-.js} +1 -1
  100. package/dist/viewer/{my-MM-5M5IBNSE-BqscH03z.js → my-MM-5M5IBNSE-0nHUTGbL.js} +1 -1
  101. package/dist/viewer/{nb-NO-T6EIAALU-Dqflwtt9.js → nb-NO-T6EIAALU-DfqC7CQ7.js} +1 -1
  102. package/dist/viewer/{nl-NL-IS3SIHDZ-BFq09PQX.js → nl-NL-IS3SIHDZ-Bjzz0r--.js} +1 -1
  103. package/dist/viewer/{nn-NO-6E72VCQL-BNIuUKOs.js → nn-NO-6E72VCQL-m2jjAc9n.js} +1 -1
  104. package/dist/viewer/{oc-FR-POXYY2M6-Bz0jVYcW.js → oc-FR-POXYY2M6-CAVYt9Ft.js} +1 -1
  105. package/dist/viewer/{pa-IN-N4M65BXN-Diu6ZQtk.js → pa-IN-N4M65BXN-CrcUCfFF.js} +1 -1
  106. package/dist/viewer/{pegDiagram-XKGWAZYB-COMSnXOr.js → pegDiagram-XKGWAZYB-MIcAh6C6.js} +1 -1
  107. package/dist/viewer/percentages-BXMCSKIN-I1K7WJgu.js +1 -0
  108. package/dist/viewer/{pieDiagram-E7YTZNPT-gHe-bm7N.js → pieDiagram-E7YTZNPT-mI3-_ikZ.js} +1 -1
  109. package/dist/viewer/{pl-PL-T2D74RX3-CCwgP0Tt.js → pl-PL-T2D74RX3-CGPvBMhq.js} +1 -1
  110. package/dist/viewer/{prod-iZwju1YX.js → prod-DdQVR1xL.js} +8 -8
  111. package/dist/viewer/{pt-BR-5N22H2LF-CNn18ypM.js → pt-BR-5N22H2LF-jUQJyEPF.js} +1 -1
  112. package/dist/viewer/{pt-PT-UZXXM6DQ-BMoRZ8jH.js → pt-PT-UZXXM6DQ-4quEbcoT.js} +1 -1
  113. package/dist/viewer/{quadrantDiagram-AXDQQJYC-YkFWTX48.js → quadrantDiagram-AXDQQJYC-qOr_Ag5n.js} +1 -1
  114. package/dist/viewer/{railroadDiagram-O6MQD6OU-BP58ggYs.js → railroadDiagram-O6MQD6OU-C8uzuX6Z.js} +1 -1
  115. package/dist/viewer/{requirementDiagram-BXWQKSXE-B4RcZ6Uz.js → requirementDiagram-BXWQKSXE-Dz0j-_Ul.js} +1 -1
  116. package/dist/viewer/{ro-RO-JPDTUUEW-SoalcNvO.js → ro-RO-JPDTUUEW-Fux6vqWg.js} +1 -1
  117. package/dist/viewer/{ru-RU-B4JR7IUQ-DkWHaRhg.js → ru-RU-B4JR7IUQ-Dfr69XLN.js} +1 -1
  118. package/dist/viewer/{sequenceDiagram-WJ2MYXX4-C5uL0tpK.js → sequenceDiagram-WJ2MYXX4-DJU5fD19.js} +1 -1
  119. package/dist/viewer/{si-LK-N5RQ5JYF-eD68JhLY.js → si-LK-N5RQ5JYF-Cb-bjtRn.js} +1 -1
  120. package/dist/viewer/{sk-SK-C5VTKIMK-EXqkY3Ta.js → sk-SK-C5VTKIMK-CohdnzY8.js} +1 -1
  121. package/dist/viewer/{sl-SI-NN7IZMDC-D2V_J_sw.js → sl-SI-NN7IZMDC-DHVdRHE2.js} +1 -1
  122. package/dist/viewer/{stateDiagram-D77RDMKH-DkyLdU7q.js → stateDiagram-D77RDMKH-Rooio_TB.js} +1 -1
  123. package/dist/viewer/stateDiagram-v2-MP3YSRHH-DU1T3Lmf.js +1 -0
  124. package/dist/viewer/subset-shared.chunk-CrkhCoQF.js +1 -0
  125. package/dist/viewer/{subset-worker.chunk-B92dIZyQ.js → subset-worker.chunk-Zq5HEGfq.js} +1 -1
  126. package/dist/viewer/{sv-SE-XGPEYMSR-Bzbzaslo.js → sv-SE-XGPEYMSR-BU075tJ9.js} +1 -1
  127. package/dist/viewer/{swimlanes-42K2YHIH-BWEGkPBm.js → swimlanes-42K2YHIH-BBJBvoSV.js} +1 -1
  128. package/dist/viewer/swimlanesDiagram-VR7AAH4N-NfEcSN_S.js +8 -0
  129. package/dist/viewer/{ta-IN-2NMHFXQM-BkRw8Ab-.js → ta-IN-2NMHFXQM-D5U6fuX5.js} +1 -1
  130. package/dist/viewer/{th-TH-HPSO5L25-DpxjfRSg.js → th-TH-HPSO5L25-5svbXPdz.js} +1 -1
  131. package/dist/viewer/{timeline-definition-24CTP7MA-BEYELt88.js → timeline-definition-24CTP7MA-B0TrCHZJ.js} +1 -1
  132. package/dist/viewer/{tr-TR-DEFEU3FU-CDIHZRzE.js → tr-TR-DEFEU3FU-CtJIUVOL.js} +1 -1
  133. package/dist/viewer/{uk-UA-QMV73CPH-BX8bS5mk.js → uk-UA-QMV73CPH-BUwW5t5R.js} +1 -1
  134. package/dist/viewer/{vennDiagram-4TSXK5OY-CWnDIkB0.js → vennDiagram-4TSXK5OY-I1KbtT6m.js} +1 -1
  135. package/dist/viewer/{vi-VN-M7AON7JQ-uPTH0PFh.js → vi-VN-M7AON7JQ-CEi077aa.js} +1 -1
  136. package/dist/viewer/{wardleyDiagram-VM6X3IG4-DazKGA6Y.js → wardleyDiagram-VM6X3IG4-BBsUCECp.js} +1 -1
  137. package/dist/viewer/{xychartDiagram-S5SC5T6Z-sQuCm3yV.js → xychartDiagram-S5SC5T6Z-CVMwOWKp.js} +1 -1
  138. package/dist/viewer/{zh-CN-LNUGB5OW-CSw936pf.js → zh-CN-LNUGB5OW-BSFQBwv1.js} +1 -1
  139. package/dist/viewer/{zh-HK-E62DVLB3-D5pp2ILq.js → zh-HK-E62DVLB3-C_UX1aQ7.js} +1 -1
  140. package/dist/viewer/{zh-TW-RAJ6MFWO-DUVdEREg.js → zh-TW-RAJ6MFWO-BvBIQhnc.js} +1 -1
  141. package/package.json +7 -5
  142. package/dist/start-server.sh +0 -359
  143. package/dist/viewer/DocumentPage-DQmrD0th.js +0 -1
  144. package/dist/viewer/classDiagram-ZZMXUADV-BJqflR68.js +0 -1
  145. package/dist/viewer/classDiagram-v2-VYDZK3BY-BJqflR68.js +0 -1
  146. package/dist/viewer/flowDiagram-HODETNUW-BIce5Xbz.js +0 -1
  147. package/dist/viewer/percentages-BXMCSKIN-C4UC-sd0.js +0 -1
  148. package/dist/viewer/stateDiagram-v2-MP3YSRHH-BMCqlN4T.js +0 -1
  149. package/dist/viewer/subset-shared.chunk-pCVh-jxe.js +0 -1
  150. package/dist/viewer/swimlanesDiagram-VR7AAH4N-a8X5vJTG.js +0 -8
@@ -1 +1 @@
1
- import"./prod-iZwju1YX.js";var e={paste:`貼上`,pasteAsPlaintext:``,pasteCharts:`貼上圖表`,selectAll:`全選`,multiSelect:`多重選取`,moveCanvas:`移動畫布`,cut:`剪下`,copy:`複製`,copyAsPng:`以 PNG 格式複製`,copyAsSvg:`以 SVG 格式複製`,copyText:``,copySource:``,convertToCode:``,bringForward:`往上一層移動`,sendToBack:`移到最底層`,bringToFront:`移到最上層`,sendBackward:`往下一層移動`,delete:`刪除`,copyStyles:`複製樣式`,pasteStyles:`套用樣式`,stroke:`筆跡顏色`,background:`填充顏色`,fill:`背景樣式`,strokeWidth:`筆跡寬度`,strokeStyle:`筆跡線條`,strokeStyle_solid:`實線`,strokeStyle_dashed:`虛線(較密)`,strokeStyle_dotted:`虛線(較疏)`,sloppiness:`筆跡風格`,opacity:`透明度`,textAlign:`文字對齊`,edges:`邊角樣式`,sharp:`銳角`,round:`圓角`,arrowheads:`箭嘴`,arrowhead_none:`無箭嘴`,arrowhead_arrow:`普通箭嘴`,arrowhead_bar:`平頭條狀`,arrowhead_circle:``,arrowhead_circle_outline:``,arrowhead_triangle:`三角箭嘴`,arrowhead_triangle_outline:``,arrowhead_diamond:``,arrowhead_diamond_outline:``,fontSize:`字型大小`,fontFamily:`字體`,addWatermark:`加入「使用 Excalidraw 製圖」水印`,handDrawn:`手繪體`,normal:`電腦字體`,code:`等寬體`,small:`細`,medium:`中`,large:`大`,veryLarge:`勁大`,solid:`實心`,hachure:`斜線`,zigzag:``,crossHatch:`交叉格仔`,thin:`幼`,bold:`粗`,left:`靠左對齊`,center:`置中對齊`,right:`靠右對齊`,extraBold:`勁粗`,architect:`手繪風格`,artist:`藝術家風格`,cartoonist:`卡通風格`,fileTitle:`檔案名稱`,colorPicker:``,canvasColors:``,canvasBackground:`畫布背景顏色`,drawingCanvas:`畫布`,layers:`圖層`,actions:`動作`,language:`🌏 語言`,liveCollaboration:``,duplicateSelection:`製作副本`,untitled:`未命名的作品`,name:``,yourName:`你的名稱`,madeWithExcalidraw:`使用 Excalidraw 製圖`,group:`建立物件群組`,ungroup:`取消物件群組`,collaborators:`已連線的協作者`,showGrid:`顯示網格`,addToLibrary:`加入作品庫`,removeFromLibrary:`從作品庫中移除`,libraryLoadingMessage:`正在載入作品庫…`,libraries:`瀏覽作品庫`,loadingScene:`載入畫布中…`,align:`物件對齊`,alignTop:`水平置頂`,alignBottom:`水平置底`,alignLeft:`垂直靠左對齊`,alignRight:`垂直靠右對齊`,centerVertically:`垂直置中`,centerHorizontally:`水平置中`,distributeHorizontally:`左右等距`,distributeVertically:`上下等距`,flipHorizontal:`左右反轉`,flipVertical:`上下反轉`,viewMode:`唯讀模式`,share:``,showStroke:``,showBackground:``,toggleTheme:``,personalLib:``,excalidrawLib:``,decreaseFontSize:``,increaseFontSize:``,unbindText:``,bindText:``,createContainerFromText:``,link:{edit:``,editEmbed:``,create:``,createEmbed:``,label:``,labelEmbed:``,empty:``},lineEditor:{edit:``,exit:``},elementLock:{lock:``,unlock:``,lockAll:``,unlockAll:``},statusPublished:``,sidebarLock:``,selectAllElementsInFrame:``,removeAllElementsFromFrame:``,eyeDropper:``,textToDiagram:``,prompt:``},t={noItems:``,hint_emptyLibrary:``,hint_emptyPrivateLibrary:``},n={clearReset:`清空畫布`,exportJSON:``,exportImage:``,export:``,copyToClipboard:``,save:``,saveAs:``,load:``,getShareableLink:``,close:``,selectLanguage:``,scrollBackToContent:``,zoomIn:``,zoomOut:``,resetZoom:``,menu:``,done:``,edit:``,undo:``,redo:``,resetLibrary:``,createNewRoom:``,fullScreen:``,darkMode:``,lightMode:``,zenMode:``,objectsSnapMode:``,exitZenMode:``,cancel:``,clear:``,remove:``,embed:``,publishLibrary:``,submit:``,confirm:``,embeddableInteractionButton:``},r={clearReset:`【‼️ 警告 ‼️ 無法復原的動作】你確定要清空呢塊畫布嗎?`,couldNotCreateShareableLink:``,couldNotCreateShareableLinkTooBig:``,couldNotLoadInvalidFile:``,importBackendFailed:``,cannotExportEmptyCanvas:`無嘢可以匯出喎~畫吓嘢先?`,couldNotCopyToClipboard:``,decryptFailed:``,uploadedSecurly:``,loadSceneOverridePrompt:``,collabStopOverridePrompt:``,errorAddingToLibrary:``,errorRemovingFromLibrary:``,confirmAddLibrary:``,imageDoesNotContainScene:``,cannotRestoreFromImage:``,invalidSceneUrl:``,resetLibrary:``,removeItemsFromsLibrary:``,invalidEncryptionKey:``,collabOfflineWarning:``},i={unsupportedFileType:``,imageInsertError:``,fileTooBig:``,svgImageInsertError:``,failedToFetchImage:``,invalidSVGString:``,cannotResolveCollabServer:``,importLibraryError:``,collabSaveFailed:``,collabSaveFailed_sizeExceeded:``,imageToolNotSupported:``,brave_measure_text_error:{line1:``,line2:``,line3:``,line4:``},libraryElementTypeError:{embeddable:``,iframe:``,image:``},asyncPasteFailedOnRead:``,asyncPasteFailedOnParse:``,copyToSystemClipboardFailed:``},a={selection:``,image:``,rectangle:``,diamond:``,ellipse:``,arrow:``,line:``,freedraw:``,text:``,library:``,lock:``,penMode:``,link:``,eraser:``,frame:``,magicframe:``,embeddable:``,laser:``,hand:``,extraTools:``,mermaidToExcalidraw:``,magicSettings:``},o={canvasActions:`畫布動作`,selectedShapeActions:``,shapes:``},s={canvasPanning:``,linearElement:``,freeDraw:``,text:``,embeddable:``,text_selected:``,text_editing:``,linearElementMulti:``,lockAngle:``,resize:``,resizeImage:``,rotate:``,lineEditor_info:``,lineEditor_pointSelected:``,lineEditor_nothingSelected:``,placeImage:``,publishLibrary:``,bindTextToElement:``,deepBoxSelect:``,eraserRevert:``,firefox_clipboard_write:``,disableSnapping:``},c={cannotShowPreview:`無法顯示預覽`,canvasTooBig:`塊畫布太大啦,縮細啲先啦?`,canvasTooBigTip:``},l={headingMain:``,clearCanvasMessage:`如果重新整理頁面都係睇唔到,你可以<button>清空畫布</button>`,clearCanvasCaveat:`(注意:呢個動作會直接丟棄你嘅作品,並且無法復原)`,trackedToSentry:``,openIssueMessage:``,sceneContent:``},u={desc_intro:``,desc_privacy:``,button_startSession:``,button_stopSession:``,desc_inProgressIntro:``,desc_shareLink:``,desc_exitSession:``,shareTitle:``},d={title:``},f={disk_title:``,disk_details:``,disk_button:``,link_title:``,link_details:``,link_button:``,excalidrawplus_description:``,excalidrawplus_button:``,excalidrawplus_exportError:``},p={blog:``,click:``,deepSelect:``,deepBoxSelect:``,curvedArrow:``,curvedLine:``,documentation:``,doubleClick:``,drag:``,editor:``,editLineArrowPoints:``,editText:``,github:``,howto:``,or:``,preventBinding:``,tools:``,shortcuts:``,textFinish:``,textNewLine:``,title:``,view:``,zoomToFit:``,zoomToSelection:``,toggleElementLock:``,movePageUpDown:``,movePageLeftRight:``},m={title:``},h={title:``,itemName:``,authorName:``,githubUsername:``,twitterUsername:``,libraryName:``,libraryDesc:``,website:``,placeholder:{authorName:``,libraryName:``,libraryDesc:``,githubHandle:``,twitterHandle:``,website:``},errors:{required:``,website:``},noteDescription:``,noteGuidelines:``,noteLicense:``,noteItems:``,atleastOneLibItem:``,republishWarning:``},g={title:``,content:``},_={resetLibrary:``,removeItemsFromLib:``},v={header:``,label:{withBackground:``,onlySelected:``,darkMode:``,embedScene:``,scale:``,padding:``},tooltip:{embedScene:``},title:{exportToPng:``,exportToSvg:``,copyPngToClipboard:``},button:{exportToPng:``,exportToSvg:``,copyPngToClipboard:``}},y={tooltip:``,link:``},b={angle:``,element:``,elements:``,height:``,scene:``,selected:``,storage:``,title:``,total:``,version:``,versionCopy:``,versionNotAvailable:``,width:``},x={addedToLibrary:``,copyStyles:``,copyToClipboard:``,copyToClipboardAsPng:``,fileSaved:``,fileSavedToFilename:``,canvas:`畫布`,selection:``,pasteAsSingleElement:``,unableToEmbed:``,unrecognizedLinkFormat:``},S={transparent:``,black:``,white:``,red:``,pink:``,grape:``,violet:``,gray:``,blue:``,cyan:``,teal:``,green:``,yellow:``,orange:``,bronze:``},C={app:{center_heading:``,center_heading_plus:``,menuHint:``},defaults:{menuHint:``,center_heading:``,toolbarHint:``,helpHint:``}},w={mostUsedCustomColors:``,colors:``,shades:``,hexCode:``,noShades:``},T={action:{exportToImage:{title:``,button:``,description:``},saveToDisk:{title:``,button:``,description:``},excalidrawPlus:{title:``,button:``,description:``}},modal:{loadFromFile:{title:``,button:``,description:``},shareableLink:{title:``,button:``,description:``}}},E={title:``,button:``,description:``,syntax:``,preview:``},D={labels:e,library:t,buttons:n,alerts:r,errors:i,toolBar:a,headings:o,hints:s,canvasError:c,errorSplash:l,roomDialog:u,errorDialog:d,exportDialog:f,helpDialog:p,clearCanvasDialog:m,publishDialog:h,publishSuccessDialog:g,confirmDialog:_,imageExportDialog:v,encrypted:y,stats:b,toast:x,colors:S,welcomeScreen:C,colorPicker:w,overwriteConfirm:T,mermaid:E};export{r as alerts,n as buttons,c as canvasError,m as clearCanvasDialog,w as colorPicker,S as colors,_ as confirmDialog,D as default,y as encrypted,d as errorDialog,l as errorSplash,i as errors,f as exportDialog,o as headings,p as helpDialog,s as hints,v as imageExportDialog,e as labels,t as library,E as mermaid,T as overwriteConfirm,h as publishDialog,g as publishSuccessDialog,u as roomDialog,b as stats,x as toast,a as toolBar,C as welcomeScreen};
1
+ import"./prod-DdQVR1xL.js";var e={paste:`貼上`,pasteAsPlaintext:``,pasteCharts:`貼上圖表`,selectAll:`全選`,multiSelect:`多重選取`,moveCanvas:`移動畫布`,cut:`剪下`,copy:`複製`,copyAsPng:`以 PNG 格式複製`,copyAsSvg:`以 SVG 格式複製`,copyText:``,copySource:``,convertToCode:``,bringForward:`往上一層移動`,sendToBack:`移到最底層`,bringToFront:`移到最上層`,sendBackward:`往下一層移動`,delete:`刪除`,copyStyles:`複製樣式`,pasteStyles:`套用樣式`,stroke:`筆跡顏色`,background:`填充顏色`,fill:`背景樣式`,strokeWidth:`筆跡寬度`,strokeStyle:`筆跡線條`,strokeStyle_solid:`實線`,strokeStyle_dashed:`虛線(較密)`,strokeStyle_dotted:`虛線(較疏)`,sloppiness:`筆跡風格`,opacity:`透明度`,textAlign:`文字對齊`,edges:`邊角樣式`,sharp:`銳角`,round:`圓角`,arrowheads:`箭嘴`,arrowhead_none:`無箭嘴`,arrowhead_arrow:`普通箭嘴`,arrowhead_bar:`平頭條狀`,arrowhead_circle:``,arrowhead_circle_outline:``,arrowhead_triangle:`三角箭嘴`,arrowhead_triangle_outline:``,arrowhead_diamond:``,arrowhead_diamond_outline:``,fontSize:`字型大小`,fontFamily:`字體`,addWatermark:`加入「使用 Excalidraw 製圖」水印`,handDrawn:`手繪體`,normal:`電腦字體`,code:`等寬體`,small:`細`,medium:`中`,large:`大`,veryLarge:`勁大`,solid:`實心`,hachure:`斜線`,zigzag:``,crossHatch:`交叉格仔`,thin:`幼`,bold:`粗`,left:`靠左對齊`,center:`置中對齊`,right:`靠右對齊`,extraBold:`勁粗`,architect:`手繪風格`,artist:`藝術家風格`,cartoonist:`卡通風格`,fileTitle:`檔案名稱`,colorPicker:``,canvasColors:``,canvasBackground:`畫布背景顏色`,drawingCanvas:`畫布`,layers:`圖層`,actions:`動作`,language:`🌏 語言`,liveCollaboration:``,duplicateSelection:`製作副本`,untitled:`未命名的作品`,name:``,yourName:`你的名稱`,madeWithExcalidraw:`使用 Excalidraw 製圖`,group:`建立物件群組`,ungroup:`取消物件群組`,collaborators:`已連線的協作者`,showGrid:`顯示網格`,addToLibrary:`加入作品庫`,removeFromLibrary:`從作品庫中移除`,libraryLoadingMessage:`正在載入作品庫…`,libraries:`瀏覽作品庫`,loadingScene:`載入畫布中…`,align:`物件對齊`,alignTop:`水平置頂`,alignBottom:`水平置底`,alignLeft:`垂直靠左對齊`,alignRight:`垂直靠右對齊`,centerVertically:`垂直置中`,centerHorizontally:`水平置中`,distributeHorizontally:`左右等距`,distributeVertically:`上下等距`,flipHorizontal:`左右反轉`,flipVertical:`上下反轉`,viewMode:`唯讀模式`,share:``,showStroke:``,showBackground:``,toggleTheme:``,personalLib:``,excalidrawLib:``,decreaseFontSize:``,increaseFontSize:``,unbindText:``,bindText:``,createContainerFromText:``,link:{edit:``,editEmbed:``,create:``,createEmbed:``,label:``,labelEmbed:``,empty:``},lineEditor:{edit:``,exit:``},elementLock:{lock:``,unlock:``,lockAll:``,unlockAll:``},statusPublished:``,sidebarLock:``,selectAllElementsInFrame:``,removeAllElementsFromFrame:``,eyeDropper:``,textToDiagram:``,prompt:``},t={noItems:``,hint_emptyLibrary:``,hint_emptyPrivateLibrary:``},n={clearReset:`清空畫布`,exportJSON:``,exportImage:``,export:``,copyToClipboard:``,save:``,saveAs:``,load:``,getShareableLink:``,close:``,selectLanguage:``,scrollBackToContent:``,zoomIn:``,zoomOut:``,resetZoom:``,menu:``,done:``,edit:``,undo:``,redo:``,resetLibrary:``,createNewRoom:``,fullScreen:``,darkMode:``,lightMode:``,zenMode:``,objectsSnapMode:``,exitZenMode:``,cancel:``,clear:``,remove:``,embed:``,publishLibrary:``,submit:``,confirm:``,embeddableInteractionButton:``},r={clearReset:`【‼️ 警告 ‼️ 無法復原的動作】你確定要清空呢塊畫布嗎?`,couldNotCreateShareableLink:``,couldNotCreateShareableLinkTooBig:``,couldNotLoadInvalidFile:``,importBackendFailed:``,cannotExportEmptyCanvas:`無嘢可以匯出喎~畫吓嘢先?`,couldNotCopyToClipboard:``,decryptFailed:``,uploadedSecurly:``,loadSceneOverridePrompt:``,collabStopOverridePrompt:``,errorAddingToLibrary:``,errorRemovingFromLibrary:``,confirmAddLibrary:``,imageDoesNotContainScene:``,cannotRestoreFromImage:``,invalidSceneUrl:``,resetLibrary:``,removeItemsFromsLibrary:``,invalidEncryptionKey:``,collabOfflineWarning:``},i={unsupportedFileType:``,imageInsertError:``,fileTooBig:``,svgImageInsertError:``,failedToFetchImage:``,invalidSVGString:``,cannotResolveCollabServer:``,importLibraryError:``,collabSaveFailed:``,collabSaveFailed_sizeExceeded:``,imageToolNotSupported:``,brave_measure_text_error:{line1:``,line2:``,line3:``,line4:``},libraryElementTypeError:{embeddable:``,iframe:``,image:``},asyncPasteFailedOnRead:``,asyncPasteFailedOnParse:``,copyToSystemClipboardFailed:``},a={selection:``,image:``,rectangle:``,diamond:``,ellipse:``,arrow:``,line:``,freedraw:``,text:``,library:``,lock:``,penMode:``,link:``,eraser:``,frame:``,magicframe:``,embeddable:``,laser:``,hand:``,extraTools:``,mermaidToExcalidraw:``,magicSettings:``},o={canvasActions:`畫布動作`,selectedShapeActions:``,shapes:``},s={canvasPanning:``,linearElement:``,freeDraw:``,text:``,embeddable:``,text_selected:``,text_editing:``,linearElementMulti:``,lockAngle:``,resize:``,resizeImage:``,rotate:``,lineEditor_info:``,lineEditor_pointSelected:``,lineEditor_nothingSelected:``,placeImage:``,publishLibrary:``,bindTextToElement:``,deepBoxSelect:``,eraserRevert:``,firefox_clipboard_write:``,disableSnapping:``},c={cannotShowPreview:`無法顯示預覽`,canvasTooBig:`塊畫布太大啦,縮細啲先啦?`,canvasTooBigTip:``},l={headingMain:``,clearCanvasMessage:`如果重新整理頁面都係睇唔到,你可以<button>清空畫布</button>`,clearCanvasCaveat:`(注意:呢個動作會直接丟棄你嘅作品,並且無法復原)`,trackedToSentry:``,openIssueMessage:``,sceneContent:``},u={desc_intro:``,desc_privacy:``,button_startSession:``,button_stopSession:``,desc_inProgressIntro:``,desc_shareLink:``,desc_exitSession:``,shareTitle:``},d={title:``},f={disk_title:``,disk_details:``,disk_button:``,link_title:``,link_details:``,link_button:``,excalidrawplus_description:``,excalidrawplus_button:``,excalidrawplus_exportError:``},p={blog:``,click:``,deepSelect:``,deepBoxSelect:``,curvedArrow:``,curvedLine:``,documentation:``,doubleClick:``,drag:``,editor:``,editLineArrowPoints:``,editText:``,github:``,howto:``,or:``,preventBinding:``,tools:``,shortcuts:``,textFinish:``,textNewLine:``,title:``,view:``,zoomToFit:``,zoomToSelection:``,toggleElementLock:``,movePageUpDown:``,movePageLeftRight:``},m={title:``},h={title:``,itemName:``,authorName:``,githubUsername:``,twitterUsername:``,libraryName:``,libraryDesc:``,website:``,placeholder:{authorName:``,libraryName:``,libraryDesc:``,githubHandle:``,twitterHandle:``,website:``},errors:{required:``,website:``},noteDescription:``,noteGuidelines:``,noteLicense:``,noteItems:``,atleastOneLibItem:``,republishWarning:``},g={title:``,content:``},_={resetLibrary:``,removeItemsFromLib:``},v={header:``,label:{withBackground:``,onlySelected:``,darkMode:``,embedScene:``,scale:``,padding:``},tooltip:{embedScene:``},title:{exportToPng:``,exportToSvg:``,copyPngToClipboard:``},button:{exportToPng:``,exportToSvg:``,copyPngToClipboard:``}},y={tooltip:``,link:``},b={angle:``,element:``,elements:``,height:``,scene:``,selected:``,storage:``,title:``,total:``,version:``,versionCopy:``,versionNotAvailable:``,width:``},x={addedToLibrary:``,copyStyles:``,copyToClipboard:``,copyToClipboardAsPng:``,fileSaved:``,fileSavedToFilename:``,canvas:`畫布`,selection:``,pasteAsSingleElement:``,unableToEmbed:``,unrecognizedLinkFormat:``},S={transparent:``,black:``,white:``,red:``,pink:``,grape:``,violet:``,gray:``,blue:``,cyan:``,teal:``,green:``,yellow:``,orange:``,bronze:``},C={app:{center_heading:``,center_heading_plus:``,menuHint:``},defaults:{menuHint:``,center_heading:``,toolbarHint:``,helpHint:``}},w={mostUsedCustomColors:``,colors:``,shades:``,hexCode:``,noShades:``},T={action:{exportToImage:{title:``,button:``,description:``},saveToDisk:{title:``,button:``,description:``},excalidrawPlus:{title:``,button:``,description:``}},modal:{loadFromFile:{title:``,button:``,description:``},shareableLink:{title:``,button:``,description:``}}},E={title:``,button:``,description:``,syntax:``,preview:``},D={labels:e,library:t,buttons:n,alerts:r,errors:i,toolBar:a,headings:o,hints:s,canvasError:c,errorSplash:l,roomDialog:u,errorDialog:d,exportDialog:f,helpDialog:p,clearCanvasDialog:m,publishDialog:h,publishSuccessDialog:g,confirmDialog:_,imageExportDialog:v,encrypted:y,stats:b,toast:x,colors:S,welcomeScreen:C,colorPicker:w,overwriteConfirm:T,mermaid:E};export{r as alerts,n as buttons,c as canvasError,m as clearCanvasDialog,w as colorPicker,S as colors,_ as confirmDialog,D as default,y as encrypted,d as errorDialog,l as errorSplash,i as errors,f as exportDialog,o as headings,p as helpDialog,s as hints,v as imageExportDialog,e as labels,t as library,E as mermaid,T as overwriteConfirm,h as publishDialog,g as publishSuccessDialog,u as roomDialog,b as stats,x as toast,a as toolBar,C as welcomeScreen};
@@ -1,4 +1,4 @@
1
- import"./prod-iZwju1YX.js";var e={paste:`貼上`,pasteAsPlaintext:`以純文字貼上`,pasteCharts:`貼上圖表`,selectAll:`全選`,multiSelect:`將物件加入選取範圍`,moveCanvas:`移動畫布`,cut:`剪下`,copy:`複製`,copyAsPng:`以PNG格式儲存到剪貼板`,copyAsSvg:`以SVG格式複製到剪貼板`,copyText:`以文字格式複製至剪貼簿`,copySource:`複製來源至剪貼簿`,convertToCode:`轉換為程式碼`,bringForward:`上移一層`,sendToBack:`移到最底層`,bringToFront:`置於最頂層`,sendBackward:`往後移一層`,delete:`刪除`,copyStyles:`複製樣式`,pasteStyles:`貼上樣式`,stroke:`筆畫`,background:`背景`,fill:`填滿`,strokeWidth:`筆跡寬度`,strokeStyle:`筆畫樣式`,strokeStyle_solid:`實線`,strokeStyle_dashed:`虛線`,strokeStyle_dotted:`點線`,sloppiness:`線條風格`,opacity:`透明度`,textAlign:`文字對齊`,edges:`邊緣`,sharp:`尖銳`,round:`平滑`,arrowheads:`箭頭`,arrowhead_none:`無`,arrowhead_arrow:`箭頭`,arrowhead_bar:`條狀箭頭`,arrowhead_circle:`圓形`,arrowhead_circle_outline:`圓形(外框)`,arrowhead_triangle:`三角形`,arrowhead_triangle_outline:`三角形(外框)`,arrowhead_diamond:`菱形`,arrowhead_diamond_outline:`菱形(外框)`,fontSize:`字型大小`,fontFamily:`字體集`,addWatermark:`加上 "Made with Excalidraw" 浮水印`,handDrawn:`手寫`,normal:`一般`,code:`代碼`,small:`小`,medium:`中`,large:`大`,veryLarge:`特大`,solid:`實心`,hachure:`斜線筆觸`,zigzag:`Z字形`,crossHatch:`交叉筆觸`,thin:`細`,bold:`粗`,left:`左側`,center:`置中`,right:`右側`,extraBold:`極粗`,architect:`精確`,artist:`藝術`,cartoonist:`卡通`,fileTitle:`檔案名稱`,colorPicker:`色彩選擇工具`,canvasColors:`使用於畫布`,canvasBackground:`Canvas 背景`,drawingCanvas:`繪圖 canvas`,layers:`圖層`,actions:`動作`,language:`語言`,liveCollaboration:`即時協作...`,duplicateSelection:`複製`,untitled:`無標題`,name:`名稱`,yourName:`你的名稱`,madeWithExcalidraw:`以 Excalidraw 製作`,group:`建立群組`,ungroup:`取消群組`,collaborators:`協作者`,showGrid:`顯示格線`,addToLibrary:`加入資料庫`,removeFromLibrary:`從資料庫中移除`,libraryLoadingMessage:`資料庫讀取中…`,libraries:`瀏覽資料庫`,loadingScene:`場景讀取中…`,align:`對齊`,alignTop:`對齊頂部`,alignBottom:`對齊底部`,alignLeft:`對齊左側`,alignRight:`對齊右側`,centerVertically:`垂直置中`,centerHorizontally:`水平置中`,distributeHorizontally:`水平分布`,distributeVertically:`垂直分布`,flipHorizontal:`水平翻轉`,flipVertical:`垂直翻轉`,viewMode:`檢視模式`,share:`共享`,showStroke:`顯示線條檢色器`,showBackground:`顯示背景檢色器`,toggleTheme:`切換主題`,personalLib:`個人資料庫`,excalidrawLib:`Excalidraw 資料庫`,decreaseFontSize:`縮小文字`,increaseFontSize:`放大文字`,unbindText:`取消綁定文字`,bindText:`結合文字至容器`,createContainerFromText:`將文字包於容器中`,link:{edit:`編輯連結`,editEmbed:`編輯連結&嵌入`,create:`建立連結`,createEmbed:`建立連結&嵌入`,label:`連結`,labelEmbed:`連結&嵌入`,empty:`未設定連結`},lineEditor:{edit:`編輯線條`,exit:`結束線條編輯`},elementLock:{lock:`鎖定`,unlock:`解鎖`,lockAll:`全部鎖定`,unlockAll:`全部解鎖`},statusPublished:`已發布`,sidebarLock:`側欄維持開啟`,selectAllElementsInFrame:`選取框架內的所有元素`,removeAllElementsFromFrame:`從框架內移除所有元素`,eyeDropper:`從畫布中選取顏色`,textToDiagram:`文字轉圖表`,prompt:`提示詞`},t={noItems:`尚未加入任何物件...`,hint_emptyLibrary:`選取畫布上的物件以加入,或從下方的公開 repository 中安裝資料庫`,hint_emptyPrivateLibrary:`選擇畫布上的物件以在此加入`},n={clearReset:`重置 canvas`,exportJSON:`匯出至檔案`,exportImage:`匯出圖片`,export:`儲存至...`,copyToClipboard:`複製至剪貼簿`,save:`儲存目前檔案`,saveAs:`儲存為`,load:`開啟`,getShareableLink:`取得共享連結`,close:`關閉`,selectLanguage:`選擇語言`,scrollBackToContent:`捲動回到內容`,zoomIn:`放大`,zoomOut:`縮小`,resetZoom:`重設縮放`,menu:`選單`,done:`完成`,edit:`編輯`,undo:`復原`,redo:`重做`,resetLibrary:`重設資料庫`,createNewRoom:`建立新協作會議室`,fullScreen:`全螢幕`,darkMode:`深色模式`,lightMode:`淺色模式`,zenMode:`專注模式`,objectsSnapMode:`吸附至物件`,exitZenMode:`離開專注模式`,cancel:`取消`,clear:`清除`,remove:`刪除`,embed:`切換嵌入`,publishLibrary:`發布`,submit:`送出`,confirm:`確認`,embeddableInteractionButton:`點擊以互動`},r={clearReset:`這將會清除整個 canvas。你確定嗎?`,couldNotCreateShareableLink:`無法建立共享連結。`,couldNotCreateShareableLinkTooBig:`無法建立共享連結:場景太大`,couldNotLoadInvalidFile:`無法讀取失效的檔案。`,importBackendFailed:`後端讀取失敗。`,cannotExportEmptyCanvas:`無法輸出空白的 canvas。`,couldNotCopyToClipboard:`無法複製到剪貼簿`,decryptFailed:`無法解密資料。`,uploadedSecurly:`上傳已通過 end-to-end 加密,Excalidraw 伺服器和第三方無法皆讀取其內容。`,loadSceneOverridePrompt:`讀取外部圖樣將取代目前的內容。是否要繼續?`,collabStopOverridePrompt:`停止連線將覆蓋您先前於本機儲存的繪圖進度,是否確認?
1
+ import"./prod-DdQVR1xL.js";var e={paste:`貼上`,pasteAsPlaintext:`以純文字貼上`,pasteCharts:`貼上圖表`,selectAll:`全選`,multiSelect:`將物件加入選取範圍`,moveCanvas:`移動畫布`,cut:`剪下`,copy:`複製`,copyAsPng:`以PNG格式儲存到剪貼板`,copyAsSvg:`以SVG格式複製到剪貼板`,copyText:`以文字格式複製至剪貼簿`,copySource:`複製來源至剪貼簿`,convertToCode:`轉換為程式碼`,bringForward:`上移一層`,sendToBack:`移到最底層`,bringToFront:`置於最頂層`,sendBackward:`往後移一層`,delete:`刪除`,copyStyles:`複製樣式`,pasteStyles:`貼上樣式`,stroke:`筆畫`,background:`背景`,fill:`填滿`,strokeWidth:`筆跡寬度`,strokeStyle:`筆畫樣式`,strokeStyle_solid:`實線`,strokeStyle_dashed:`虛線`,strokeStyle_dotted:`點線`,sloppiness:`線條風格`,opacity:`透明度`,textAlign:`文字對齊`,edges:`邊緣`,sharp:`尖銳`,round:`平滑`,arrowheads:`箭頭`,arrowhead_none:`無`,arrowhead_arrow:`箭頭`,arrowhead_bar:`條狀箭頭`,arrowhead_circle:`圓形`,arrowhead_circle_outline:`圓形(外框)`,arrowhead_triangle:`三角形`,arrowhead_triangle_outline:`三角形(外框)`,arrowhead_diamond:`菱形`,arrowhead_diamond_outline:`菱形(外框)`,fontSize:`字型大小`,fontFamily:`字體集`,addWatermark:`加上 "Made with Excalidraw" 浮水印`,handDrawn:`手寫`,normal:`一般`,code:`代碼`,small:`小`,medium:`中`,large:`大`,veryLarge:`特大`,solid:`實心`,hachure:`斜線筆觸`,zigzag:`Z字形`,crossHatch:`交叉筆觸`,thin:`細`,bold:`粗`,left:`左側`,center:`置中`,right:`右側`,extraBold:`極粗`,architect:`精確`,artist:`藝術`,cartoonist:`卡通`,fileTitle:`檔案名稱`,colorPicker:`色彩選擇工具`,canvasColors:`使用於畫布`,canvasBackground:`Canvas 背景`,drawingCanvas:`繪圖 canvas`,layers:`圖層`,actions:`動作`,language:`語言`,liveCollaboration:`即時協作...`,duplicateSelection:`複製`,untitled:`無標題`,name:`名稱`,yourName:`你的名稱`,madeWithExcalidraw:`以 Excalidraw 製作`,group:`建立群組`,ungroup:`取消群組`,collaborators:`協作者`,showGrid:`顯示格線`,addToLibrary:`加入資料庫`,removeFromLibrary:`從資料庫中移除`,libraryLoadingMessage:`資料庫讀取中…`,libraries:`瀏覽資料庫`,loadingScene:`場景讀取中…`,align:`對齊`,alignTop:`對齊頂部`,alignBottom:`對齊底部`,alignLeft:`對齊左側`,alignRight:`對齊右側`,centerVertically:`垂直置中`,centerHorizontally:`水平置中`,distributeHorizontally:`水平分布`,distributeVertically:`垂直分布`,flipHorizontal:`水平翻轉`,flipVertical:`垂直翻轉`,viewMode:`檢視模式`,share:`共享`,showStroke:`顯示線條檢色器`,showBackground:`顯示背景檢色器`,toggleTheme:`切換主題`,personalLib:`個人資料庫`,excalidrawLib:`Excalidraw 資料庫`,decreaseFontSize:`縮小文字`,increaseFontSize:`放大文字`,unbindText:`取消綁定文字`,bindText:`結合文字至容器`,createContainerFromText:`將文字包於容器中`,link:{edit:`編輯連結`,editEmbed:`編輯連結&嵌入`,create:`建立連結`,createEmbed:`建立連結&嵌入`,label:`連結`,labelEmbed:`連結&嵌入`,empty:`未設定連結`},lineEditor:{edit:`編輯線條`,exit:`結束線條編輯`},elementLock:{lock:`鎖定`,unlock:`解鎖`,lockAll:`全部鎖定`,unlockAll:`全部解鎖`},statusPublished:`已發布`,sidebarLock:`側欄維持開啟`,selectAllElementsInFrame:`選取框架內的所有元素`,removeAllElementsFromFrame:`從框架內移除所有元素`,eyeDropper:`從畫布中選取顏色`,textToDiagram:`文字轉圖表`,prompt:`提示詞`},t={noItems:`尚未加入任何物件...`,hint_emptyLibrary:`選取畫布上的物件以加入,或從下方的公開 repository 中安裝資料庫`,hint_emptyPrivateLibrary:`選擇畫布上的物件以在此加入`},n={clearReset:`重置 canvas`,exportJSON:`匯出至檔案`,exportImage:`匯出圖片`,export:`儲存至...`,copyToClipboard:`複製至剪貼簿`,save:`儲存目前檔案`,saveAs:`儲存為`,load:`開啟`,getShareableLink:`取得共享連結`,close:`關閉`,selectLanguage:`選擇語言`,scrollBackToContent:`捲動回到內容`,zoomIn:`放大`,zoomOut:`縮小`,resetZoom:`重設縮放`,menu:`選單`,done:`完成`,edit:`編輯`,undo:`復原`,redo:`重做`,resetLibrary:`重設資料庫`,createNewRoom:`建立新協作會議室`,fullScreen:`全螢幕`,darkMode:`深色模式`,lightMode:`淺色模式`,zenMode:`專注模式`,objectsSnapMode:`吸附至物件`,exitZenMode:`離開專注模式`,cancel:`取消`,clear:`清除`,remove:`刪除`,embed:`切換嵌入`,publishLibrary:`發布`,submit:`送出`,confirm:`確認`,embeddableInteractionButton:`點擊以互動`},r={clearReset:`這將會清除整個 canvas。你確定嗎?`,couldNotCreateShareableLink:`無法建立共享連結。`,couldNotCreateShareableLinkTooBig:`無法建立共享連結:場景太大`,couldNotLoadInvalidFile:`無法讀取失效的檔案。`,importBackendFailed:`後端讀取失敗。`,cannotExportEmptyCanvas:`無法輸出空白的 canvas。`,couldNotCopyToClipboard:`無法複製到剪貼簿`,decryptFailed:`無法解密資料。`,uploadedSecurly:`上傳已通過 end-to-end 加密,Excalidraw 伺服器和第三方無法皆讀取其內容。`,loadSceneOverridePrompt:`讀取外部圖樣將取代目前的內容。是否要繼續?`,collabStopOverridePrompt:`停止連線將覆蓋您先前於本機儲存的繪圖進度,是否確認?
2
2
 
3
3
  (如要保留原有的本機繪圖進度,直接關閉瀏覽器分頁即可。)`,errorAddingToLibrary:`無法於此資料庫加入項目`,errorRemovingFromLibrary:`無法由此資料庫移除項目`,confirmAddLibrary:`這將會將 {{numShapes}} 個圖形加入你的資料庫,你確定嗎?`,imageDoesNotContainScene:`此圖檔中未包含場景資料。輸出檔案時是否有包含場景資料?`,cannotRestoreFromImage:`無法由此檔案回復場景。`,invalidSceneUrl:`無法由提供的 URL 匯入場景。可能是發生異常,或未包含有效的 Excalidraw JSON 資料。`,resetLibrary:`這會清除您的資料庫,是否確定?`,removeItemsFromsLibrary:`從資料庫刪除 {{count}} 項?`,invalidEncryptionKey:`加密鍵必須為22字元。即時協作已停用。`,collabOfflineWarning:`沒有可用的網路連線。
4
4
  變更無法儲存!`},i={unsupportedFileType:`不支援的檔案類型。`,imageInsertError:`無法插入圖片。請稍後再試…`,fileTooBig:`檔案過大。可接受的最大尺寸為 {{maxSize}} 。`,svgImageInsertError:`無法插入 SVG 圖片。此 SVG 檔案有問題。`,failedToFetchImage:`無法獲取圖片。`,invalidSVGString:`無效的 SVG。`,cannotResolveCollabServer:`無法連結至 collab 伺服器。請重新整理後再試一次。`,importLibraryError:`無法載入資料庫`,collabSaveFailed:`無法儲存至後端資料庫。若此問題持續發生,請將檔案儲存於本機以確保資料不會遺失。`,collabSaveFailed_sizeExceeded:`無法儲存至後端資料庫,可能的原因為畫布尺寸過大。請將檔案儲存於本機以確保資料不會遺失。`,imageToolNotSupported:`圖片已停用`,brave_measure_text_error:{line1:`看起來您開啟了 Brave 瀏覽器的 <bold>Aggressively Block Fingerprinting</bold> 設定。`,line2:`這可能造成您畫布中 <bold>文字元素</bold> 的異常。`,line3:`我們強烈建議您關閉此設定。您可以依照 <link>這些步驟</link> 來進行。`,line4:`若關閉此設定並未修復文字元素的顯示問題,請回報於我們 GitHub 上的 <issueLink>issue</issueLink>,或在 <discordLink>Discord</discordLink> 上告訴我們。`},libraryElementTypeError:{embeddable:`可嵌入元素無法加入資料庫`,iframe:`IFrame 元素無法加入資料庫`,image:`即將支援加入圖片至資料庫!`},asyncPasteFailedOnRead:`無法貼上(無法由系統剪貼簿讀入)`,asyncPasteFailedOnParse:`無法貼上`,copyToSystemClipboardFailed:`無法複製至剪貼簿`},a={selection:`選取`,image:`插入圖片`,rectangle:`長方形`,diamond:`菱形`,ellipse:`橢圓`,arrow:`箭頭`,line:`線條`,freedraw:`繪圖`,text:`文字`,library:`資料庫`,lock:`可連續使用選取的工具`,penMode:`筆模式 - 避免觸摸`,link:`為所選的形狀增加\b/更新連結`,eraser:`橡皮擦`,frame:`框架工具`,magicframe:`線框稿轉為程式碼`,embeddable:`嵌入網站`,laser:`雷射筆`,hand:`手形(平移工具)`,extraTools:`更多工具`,mermaidToExcalidraw:`Mermaid 至 Excalidraw`,magicSettings:`AI 設定`},o={canvasActions:`canvas 動作`,selectedShapeActions:`選取圖形動作`,shapes:`形狀`},s={canvasPanning:`若要移動畫布,請在拖曳時按住滑鼠滾輪或空白鍵,或使用手形工具`,linearElement:`點擊以繪製多點曲線;或拖曳以繪製直線`,freeDraw:`點擊並拖曳來繪圖,放開即結束`,text:`提示:亦可使用選取工具在任何地方雙擊來加入文字`,embeddable:`點擊並拖移以建立嵌入網站`,text_selected:`雙擊滑鼠或按 Enter 以編輯文字`,text_editing:`按跳脫鍵或 Ctrl 或 Cmd + Enter 以結束編輯`,linearElementMulti:`按下 Escape 或 Enter 以結束繪製`,lockAngle:`按住 SHIFT 可限制旋轉角度`,resize:`縮放時按住 Shift 可保持原比例縮放;\\n按住 Alt 可由中心點進行縮放`,resizeImage:`按住 SHIFT 可任意縮放,按住 ALT 可由中央縮放。`,rotate:`旋轉時按住 Shift 可限制旋轉角度`,lineEditor_info:`按住 Ctrl 或 Cmd 並雙擊或按住 Ctrl 或 Cmd + Enter 來編輯控制點`,lineEditor_pointSelected:`按下 Delete 可移除錨點;Ctrl 或 Cmd + D 可複製;或可拖曳來移動`,lineEditor_nothingSelected:`選擇要編輯的錨點(按住 SHIFT 可多選),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ryugi-artifacts",
3
- "version": "1.7.4",
3
+ "version": "1.9.0",
4
4
  "type": "module",
5
5
  "description": "Server and viewer for the Ryugi artifacts app",
6
6
  "license": "MIT",
@@ -15,7 +15,7 @@
15
15
  "files": [
16
16
  "bin",
17
17
  "dist/server.cjs",
18
- "dist/start-server.sh",
18
+ "dist/cli.cjs",
19
19
  "dist/viewer",
20
20
  "dist/runtime"
21
21
  ],
@@ -24,14 +24,15 @@
24
24
  "provenance": true
25
25
  },
26
26
  "scripts": {
27
- "build": "pnpm run build:server && pnpm run build:viewer && pnpm run build:runtime",
28
- "build:server": "esbuild src/server/main.ts --bundle --platform=node --target=node18 --format=cjs --alias:loro-crdt=loro-crdt/base64 --outfile=dist/server.cjs && node -e \"const fs=require('node:fs');fs.copyFileSync('dist/server.cjs','../skills/artifacts/app/server.cjs');fs.copyFileSync('../skills/artifacts/app/start-server.sh','dist/start-server.sh')\"",
27
+ "build": "pnpm run build:server && pnpm run build:cli && pnpm run build:viewer && pnpm run build:runtime",
28
+ "build:server": "esbuild src/server/main.ts --bundle --platform=node --target=node18 --format=cjs --alias:loro-crdt=loro-crdt/base64 --outfile=dist/server.cjs && node -e \"const fs=require('node:fs');fs.copyFileSync('dist/server.cjs','../skills/artifacts/app/server.cjs')\"",
29
29
  "prepublishOnly": "pnpm build",
30
30
  "build:viewer": "NODE_ENV=production vite build && node -e \"const fs=require('node:fs');const to='../skills/artifacts/app/viewer';fs.rmSync(to,{recursive:true,force:true});fs.cpSync('dist/viewer',to,{recursive:true})\"",
31
31
  "build:runtime": "NODE_ENV=production vite build -c vite.runtime.config.ts && node scripts/inline-runtime-css.mjs",
32
32
  "dev": "vite",
33
33
  "test": "vitest run",
34
- "typecheck": "tsc --noEmit -p tsconfig.json"
34
+ "typecheck": "tsc --noEmit -p tsconfig.json",
35
+ "build:cli": "node scripts/build-cli.mjs"
35
36
  },
36
37
  "devDependencies": {
37
38
  "@base-ui/react": "^1.9.0",
@@ -57,6 +58,7 @@
57
58
  "@lexical/react": "0.52.0",
58
59
  "@lexical/rich-text": "0.52.0",
59
60
  "@lexical/table": "0.52.0",
61
+ "@lobehub/icons": "6.0.0",
60
62
  "@lobehub/ui": "6.5.1",
61
63
  "@stylexjs/stylex": "0.19.1",
62
64
  "@stylexjs/unplugin": "0.19.1",
@@ -1,359 +0,0 @@
1
- #!/usr/bin/env bash
2
- # Start the artifacts server for a project and print its connection info as JSON.
3
- # Usage: start-server.sh [--project-dir <path>] [--artifact <type>/<id>] [--host <bind-host>]
4
- # [--url-host <display-host>] [--idle-timeout-minutes <n>] [--open] [--no-open]
5
- # [--foreground] [--background]
6
- #
7
- # --project-dir <path> Project root (default: current directory). Artifacts live in
8
- # <path>/.ryugi/artifacts/<type>/<id>/ and persist after the server stops.
9
- # --artifact <t>/<id> Also print "link", the URL that opens that artifact.
10
- # --host <bind-host> Interface to bind (default 127.0.0.1). Use 0.0.0.0 in remote or
11
- # containerized environments.
12
- # --url-host <host> Hostname shown in the returned URL.
13
- # --idle-timeout-minutes <n> Stop after n minutes without activity (default 240).
14
- # --open Open the browser when the first artifact is ready (default).
15
- # --no-open Do not open a browser (for headless or scripted use).
16
- # --foreground Run in the current terminal instead of backgrounding.
17
- # --background Force background mode (overrides the Codex/Windows auto-foreground).
18
- #
19
- # If a server is already running for the project, its info is printed with "reused": true.
20
- # Every run registers the calling session as an owner; the server stops when all owners exit.
21
-
22
- SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
23
-
24
- PROJECT_DIR="$PWD"
25
- FOREGROUND="false"
26
- FORCE_BACKGROUND="false"
27
- BIND_HOST="127.0.0.1"
28
- URL_HOST=""
29
- ARTIFACT=""
30
- OPEN="${ARTIFACTS_OPEN:-1}"
31
- while [[ $# -gt 0 ]]; do
32
- case "$1" in
33
- --project-dir) PROJECT_DIR="$2"; shift 2 ;;
34
- --artifact)
35
- if ! [[ "${2:-}" =~ ^(artboard|document|html)/[a-z0-9][a-z0-9-]*$ ]]; then
36
- echo '{"error": "--artifact must be <type>/<id>: type artboard, document or html, id of lowercase letters, digits and hyphens"}'
37
- exit 1
38
- fi
39
- ARTIFACT="$2"
40
- shift 2
41
- ;;
42
- --host) BIND_HOST="$2"; shift 2 ;;
43
- --url-host) URL_HOST="$2"; shift 2 ;;
44
- --idle-timeout-minutes)
45
- if ! [[ "$2" =~ ^[0-9]+$ ]] || [[ "$2" -lt 1 ]]; then
46
- echo '{"error": "--idle-timeout-minutes must be a positive integer"}'
47
- exit 1
48
- fi
49
- export ARTIFACTS_IDLE_TIMEOUT_MS=$(( $2 * 60 * 1000 ))
50
- shift 2
51
- ;;
52
- --open) OPEN=1; shift ;;
53
- --no-open) OPEN=0; shift ;;
54
- --foreground|--no-daemon) FOREGROUND="true"; shift ;;
55
- --background|--daemon) FORCE_BACKGROUND="true"; shift ;;
56
- *) echo "{\"error\": \"Unknown argument: $1\"}"; exit 1 ;;
57
- esac
58
- done
59
-
60
- if [[ -z "$URL_HOST" ]]; then
61
- if [[ "$BIND_HOST" == "127.0.0.1" || "$BIND_HOST" == "localhost" ]]; then
62
- URL_HOST="localhost"
63
- else
64
- URL_HOST="$BIND_HOST"
65
- fi
66
- fi
67
-
68
- is_windows_like_shell() {
69
- case "${OSTYPE:-}" in msys*|cygwin*|mingw*) return 0 ;; esac
70
- [[ -n "${MSYSTEM:-}" ]] && return 0
71
- case "$(uname -s 2>/dev/null || true)" in MSYS*|MINGW*|CYGWIN*) return 0 ;; esac
72
- return 1
73
- }
74
-
75
- # Codex and Windows/Git Bash reap background processes.
76
- if [[ "$FOREGROUND" != "true" && "$FORCE_BACKGROUND" != "true" ]]; then
77
- if [[ -n "${CODEX_CI:-}" ]] || is_windows_like_shell; then
78
- FOREGROUND="true"
79
- fi
80
- fi
81
-
82
- # State files embed the session key; keep everything owner-only.
83
- umask 077
84
-
85
- if ! PROJECT_REAL="$(cd "$PROJECT_DIR" 2>/dev/null && pwd -P)"; then
86
- echo "{\"error\": \"Project directory not found: $PROJECT_DIR\"}"
87
- exit 1
88
- fi
89
- ROOT_DIR="$PROJECT_REAL/.ryugi/artifacts"
90
- STATE_DIR="$ROOT_DIR/.state"
91
- PID_FILE="$STATE_DIR/server.pid"
92
- LOG_FILE="$STATE_DIR/server.log"
93
- SERVER_ID_FILE="$STATE_DIR/server-instance-id"
94
- INFO_FILE="$STATE_DIR/server-info"
95
- VERSION_FILE="$STATE_DIR/server-version"
96
- OWNERS_FILE="$STATE_DIR/owners"
97
- mkdir -p "$STATE_DIR"
98
- [[ -f "$STATE_DIR/.gitignore" ]] || printf '*\n' > "$STATE_DIR/.gitignore"
99
-
100
- RELEASES_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/ryugi/artifacts"
101
- LATEST_CHECK_MS=$((24 * 60 * 60 * 1000))
102
- RETRY_CHECK_MS=$((60 * 60 * 1000))
103
- SERVER_VERSION=""
104
-
105
- # Modes: "cached" prints the release npm named within the last day; "checked <version>" records
106
- # what npm just said. When npm or the install fails, "installed" falls back to the newest release
107
- # already installed and records it so npm is asked again in an hour, not on every start.
108
- latest_version() {
109
- node -e '(() => {
110
- const fs = require("node:fs");
111
- const path = require("node:path");
112
- const [releases, maxAge, retryAfter, mode, fresh] = process.argv.slice(1);
113
- const file = path.join(releases, "latest.json");
114
- const valid = (v) => /^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/.test(v || "");
115
- const record = (version, checkedAt) => {
116
- fs.mkdirSync(releases, { recursive: true });
117
- fs.writeFileSync(`${file}.${process.pid}`, JSON.stringify({ version, checkedAt }));
118
- fs.renameSync(`${file}.${process.pid}`, file);
119
- };
120
- if (mode === "cached") {
121
- try {
122
- const { version, checkedAt } = JSON.parse(fs.readFileSync(file, "utf8"));
123
- if (valid(version) && Date.now() - checkedAt < Number(maxAge)) console.log(version);
124
- } catch {}
125
- return;
126
- }
127
- if (mode === "checked" && valid(fresh)) {
128
- record(fresh, Date.now());
129
- return console.log(fresh);
130
- }
131
- const parts = (v) => v.split(/[-+]/)[0].split(".").map(Number);
132
- const newer = (a, b) => { const x = parts(a), y = parts(b); for (let i = 0; i < 3; i++) if (x[i] !== y[i]) return x[i] - y[i]; return 0; };
133
- let installed = [];
134
- try { installed = fs.readdirSync(releases).filter((v) => valid(v) && fs.existsSync(path.join(releases, v, "node_modules/ryugi-artifacts/dist/server.cjs"))); } catch {}
135
- const newest = installed.sort(newer).pop();
136
- if (!newest) return;
137
- record(newest, Date.now() - Number(maxAge) + Number(retryAfter));
138
- console.log(newest);
139
- })()' "$RELEASES_DIR" "$LATEST_CHECK_MS" "$RETRY_CHECK_MS" "$@"
140
- }
141
-
142
- use_release() {
143
- SERVER_VERSION="$1"
144
- SERVER="$RELEASES_DIR/$1/node_modules/ryugi-artifacts/dist/server.cjs"
145
- }
146
-
147
- # A local build (pnpm build:server) wins; otherwise run the newest ryugi-artifacts release,
148
- # installed once per version. Runs before the project lock: a slow install must not outlive
149
- # the lock's stale threshold. npm installs into a staging dir that is renamed into place;
150
- # rename(2) refuses a non-empty target, so a concurrent start that finished first keeps its install.
151
- resolve_server() {
152
- if [[ -f "$SCRIPT_DIR/server.cjs" ]]; then
153
- SERVER="$SCRIPT_DIR/server.cjs"
154
- return 0
155
- fi
156
- local version cache staging fallback
157
- version="$(latest_version cached)"
158
- [[ -n "$version" ]] || version="$(latest_version checked "$(npm view ryugi-artifacts version --prefer-online --fetch-retries=0 --fetch-timeout=10000 2>/dev/null | tail -1 | tr -d '[:space:]')")"
159
- if [[ -z "$version" ]]; then
160
- node -e 'console.log(JSON.stringify({ error: `Could not reach npm for the latest ryugi-artifacts; the first start needs network access and a writable ${process.argv[1]}, so rerun outside the sandbox.` }))' "$RELEASES_DIR"
161
- return 1
162
- fi
163
- use_release "$version"
164
- cache="$RELEASES_DIR/$version"
165
- [[ -f "$SERVER" ]] && return 0
166
- staging="$cache.install.$$"
167
- rm -rf "$staging"
168
- mkdir -p "$staging"
169
- if ! npm install --prefix "$staging" --no-save --no-package-lock --no-audit --no-fund --loglevel=error \
170
- "ryugi-artifacts@$version" > "$staging.log" 2>&1 || [[ ! -f "$staging/node_modules/ryugi-artifacts/dist/server.cjs" ]]; then
171
- fallback="$(latest_version installed)"
172
- if [[ -n "$fallback" ]]; then
173
- rm -rf "$staging" "$staging.log"
174
- use_release "$fallback"
175
- return 0
176
- fi
177
- node -e 'console.log(JSON.stringify({ error: `Could not install ${process.argv[1]} from npm; the first start of each version needs network access and a writable ${process.argv[2]}, so rerun outside the sandbox. npm: ${process.argv[3].trim().split("\n").pop() || "failed"}` }))' \
178
- "ryugi-artifacts@$version" "$(dirname "$cache")" "$(cat "$staging.log")"
179
- rm -rf "$staging" "$staging.log"
180
- return 1
181
- fi
182
- rm -f "$staging.log"
183
- node -e 'try { require("node:fs").renameSync(process.argv[1], process.argv[2]) } catch {}' "$staging" "$cache"
184
- rm -rf "$staging"
185
- [[ -f "$SERVER" ]] && return 0
186
- echo "{\"error\": \"Installed ryugi-artifacts@$version but could not move it into $cache\"}"
187
- return 1
188
- }
189
-
190
- resolve_server || exit 1
191
-
192
- # Concurrent runs for one project must not both spawn a server: hold a lock from the
193
- # running-server check until the new server has written server-info.
194
- LOCK_DIR="$STATE_DIR/start.lock"
195
- release_lock() { rmdir "$LOCK_DIR" 2>/dev/null; return 0; }
196
- acquire_lock() {
197
- local _
198
- for _ in {1..150}; do
199
- if mkdir "$LOCK_DIR" 2>/dev/null; then
200
- trap release_lock EXIT
201
- return 0
202
- fi
203
- if [[ -n "$(find "$LOCK_DIR" -maxdepth 0 -mmin +1 2>/dev/null)" ]]; then
204
- rmdir "$LOCK_DIR" 2>/dev/null
205
- continue
206
- fi
207
- sleep 0.1
208
- done
209
- return 1
210
- }
211
- if ! acquire_lock; then
212
- echo '{"error": "Another start-server.sh run for this project is still starting; retry in a moment"}'
213
- exit 1
214
- fi
215
-
216
- command_has_server_id() {
217
- local pid="$1" expected_arg="--artifacts-server-id=$2" arg command_line
218
- if [[ -r "/proc/$pid/cmdline" ]]; then
219
- while IFS= read -r -d '' arg || [[ -n "$arg" ]]; do
220
- [[ "$arg" == "$expected_arg" ]] && return 0
221
- done < "/proc/$pid/cmdline"
222
- return 1
223
- fi
224
- command_line="$(ps -ww -p "$pid" -o command= 2>/dev/null || ps -f -p "$pid" 2>/dev/null | sed '1d' || true)"
225
- case " $command_line " in
226
- *" $expected_arg "*) return 0 ;;
227
- *) return 1 ;;
228
- esac
229
- }
230
-
231
- running_server_pid() {
232
- [[ -f "$PID_FILE" && -f "$SERVER_ID_FILE" ]] || return 1
233
- local pid id
234
- pid="$(cat "$PID_FILE")"
235
- id="$(tr -d '\r\n' < "$SERVER_ID_FILE")"
236
- kill -0 "$pid" 2>/dev/null || return 1
237
- command_has_server_id "$pid" "$id" || return 1
238
- echo "$pid"
239
- }
240
-
241
- # $PPID is the throwaway shell the harness spawned for this script; the harness is its parent.
242
- OWNER_PID="$(ps -o ppid= -p "$PPID" 2>/dev/null | tr -d ' ')"
243
- if [[ -z "$OWNER_PID" || "$OWNER_PID" == "1" ]]; then
244
- OWNER_PID="$PPID"
245
- fi
246
- # Node cannot see MSYS2 PIDs; an unverifiable owner would stop the server at the first check.
247
- if is_windows_like_shell; then
248
- OWNER_PID=""
249
- fi
250
-
251
- register_owner() {
252
- local tmp="$OWNERS_FILE.$$" pid
253
- {
254
- if [[ -f "$OWNERS_FILE" ]]; then
255
- while IFS= read -r pid; do
256
- [[ "$pid" =~ ^[0-9]+$ ]] && kill -0 "$pid" 2>/dev/null && printf '%s\n' "$pid"
257
- done < "$OWNERS_FILE"
258
- fi
259
- [[ -n "$OWNER_PID" ]] && printf '%s\n' "$OWNER_PID"
260
- } | sort -u > "$tmp"
261
- mv "$tmp" "$OWNERS_FILE"
262
- }
263
-
264
- # Prints the server info JSON with "link" for --artifact, and "reused" when $1 is true.
265
- emit_info() {
266
- node -e '
267
- const [json, reused, artifact] = process.argv.slice(1);
268
- const info = JSON.parse(json);
269
- if (reused === "true") info.reused = true;
270
- if (artifact) {
271
- const url = new URL(info.url);
272
- info.link = `${url.origin}/${artifact}?key=${url.searchParams.get("key")}`;
273
- }
274
- console.log(JSON.stringify(info));
275
- ' "$1" "$2" "$ARTIFACT"
276
- }
277
-
278
- # A server from an older release is replaced; the new one keeps its port and key, so open tabs reconnect.
279
- if RUNNING_PID="$(running_server_pid)" && [[ -f "$INFO_FILE" ]]; then
280
- if [[ -z "$SERVER_VERSION" || "$(cat "$VERSION_FILE" 2>/dev/null)" == "$SERVER_VERSION" ]]; then
281
- register_owner
282
- emit_info "$(cat "$INFO_FILE")" true
283
- exit 0
284
- fi
285
- kill -TERM "$RUNNING_PID" 2>/dev/null
286
- for _ in {1..50}; do
287
- kill -0 "$RUNNING_PID" 2>/dev/null || break
288
- sleep 0.1
289
- done
290
- if kill -0 "$RUNNING_PID" 2>/dev/null; then
291
- kill -KILL "$RUNNING_PID" 2>/dev/null
292
- for _ in {1..20}; do
293
- kill -0 "$RUNNING_PID" 2>/dev/null || break
294
- sleep 0.1
295
- done
296
- fi
297
- if kill -0 "$RUNNING_PID" 2>/dev/null; then
298
- echo "{\"error\": \"The running server (pid $RUNNING_PID) is on an older release and did not stop; stop it with stop-server.sh and retry\"}"
299
- exit 1
300
- fi
301
- fi
302
-
303
- register_owner
304
- rm -f "$INFO_FILE"
305
-
306
- SERVER_ID=""
307
- if [[ -r /dev/urandom ]]; then
308
- SERVER_ID="$(od -An -N24 -tx1 /dev/urandom 2>/dev/null | tr -d ' \n' || true)"
309
- fi
310
- if ! [[ "$SERVER_ID" =~ ^[A-Za-z0-9_-]{32,64}$ ]]; then
311
- SERVER_ID="$(printf '%08x%08x%08x%08x' "$$" "$(date +%s)" "${RANDOM:-0}" "${RANDOM:-0}")"
312
- fi
313
- printf '%s\n' "$SERVER_ID" > "$SERVER_ID_FILE"
314
- printf '%s\n' "$SERVER_VERSION" > "$VERSION_FILE"
315
-
316
- SERVER_ENV=(ARTIFACTS_ROOT="$ROOT_DIR" ARTIFACTS_HOST="$BIND_HOST" ARTIFACTS_URL_HOST="$URL_HOST" ARTIFACTS_OPEN="$OPEN")
317
- [[ -n "$ARTIFACT" ]] && SERVER_ENV+=(ARTIFACTS_OPEN_ARTIFACT="$ARTIFACT")
318
-
319
- if [[ "$FOREGROUND" == "true" ]]; then
320
- env "${SERVER_ENV[@]}" node "$SERVER" "--artifacts-server-id=$SERVER_ID" &
321
- SERVER_PID=$!
322
- echo "$SERVER_PID" > "$PID_FILE"
323
- trap 'kill -TERM "$SERVER_PID" 2>/dev/null || true' INT TERM
324
- for _ in {1..50}; do
325
- [[ -f "$INFO_FILE" ]] && break
326
- sleep 0.1
327
- done
328
- release_lock
329
- trap - EXIT
330
- wait "$SERVER_PID"
331
- exit $?
332
- fi
333
-
334
- nohup env "${SERVER_ENV[@]}" node "$SERVER" "--artifacts-server-id=$SERVER_ID" > "$LOG_FILE" 2>&1 &
335
- SERVER_PID=$!
336
- disown "$SERVER_PID" 2>/dev/null
337
- echo "$SERVER_PID" > "$PID_FILE"
338
-
339
- for _ in {1..50}; do
340
- if grep -q '"server-started"' "$LOG_FILE" 2>/dev/null; then
341
- for _ in {1..20}; do
342
- if ! kill -0 "$SERVER_PID" 2>/dev/null; then
343
- echo "{\"error\": \"Server started but was killed. Retry in a persistent terminal with: $SCRIPT_DIR/start-server.sh --project-dir $PROJECT_REAL --host $BIND_HOST --url-host $URL_HOST --foreground\"}"
344
- exit 1
345
- fi
346
- sleep 0.1
347
- done
348
- emit_info "$(grep '"server-started"' "$LOG_FILE" | head -1)" false
349
- exit 0
350
- fi
351
- if grep -q '"server-error"' "$LOG_FILE" 2>/dev/null; then
352
- grep '"server-error"' "$LOG_FILE" | head -1
353
- exit 1
354
- fi
355
- sleep 0.1
356
- done
357
-
358
- echo '{"error": "Server failed to start within 5 seconds"}'
359
- exit 1
@@ -1 +0,0 @@
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,d as i,f as a,i as o,o as s,p as c,s as l,t as u,u as d}from"./DocumentEditor-BS16Wb_Z.js";import{a as f,i as p,r as m,xn as h,yn as g}from"./index.js";var _={name:`message-square`,size:24,node:[[`path`,{d:`M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z`,key:`18887p`}]]};_.node;var v=h(_),y=e(t(),1),b=()=>({version:1,threads:[]});function x(e){if(e.status===`resolved`)return null;let t=e.messages.filter(e=>!e.deleted).at(-1);return t?t.author===`human`?`agent`:`human`:null}var S=n(),C=e=>new Date(e).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`});function w({placeholder:e,initial:t=``,autoFocus:n,onSubmit:r,onCancel:i,onChange:a}){let[o,s]=(0,y.useState)(t),c=e=>{s(e),a?.(e)},l=()=>{o.trim()&&(r(o.trim()),c(``))};return(0,S.jsxs)(`div`,{className:`x1n2onr6 x1nn3v0j xqin4a2 xsag5q8`,onClick:e=>e.stopPropagation(),children:[(0,S.jsx)(`textarea`,{autoFocus:n,value:o,rows:1,placeholder:e,onChange:e=>c(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.metaKey||e.ctrlKey)&&l(),e.key===`Escape`&&i?.()},className:`x1lliihq xh8yej3 x9f619 x1gg8mnh x1717udv xjfo4ez xc342km x1a2a7pz xjbqb8w xo2rkog xqfszdh xfifm61 x1dbl2gt xtt52l0 x5f5z56`}),(0,S.jsx)(`button`,{type:`button`,"aria-label":`发送`,title:`发送 ⌘↵`,disabled:!o.trim(),onClick:l,className:`x10l6tqk x131sewu x1jn9clo xgd8bvy x1fgtraw xrvj5dj x1ku5rj1 x1717udv xc342km x16rqkct x19ckca5 xs0jrwl x1ypdohk xtgyt42 x1hc1fzr x2wzlov`,children:(0,S.jsx)(g,{size:15,strokeWidth:2.4})})]})}function T({human:e}){return(0,S.jsx)(`span`,{...{0:{className:`xw4jnvo x1qx5ct2 x2lah0s x16rqkct xrvj5dj x1ku5rj1 xfungia x1k6wstc x1k89be0`},1:{className:`xw4jnvo x1qx5ct2 x2lah0s x16rqkct xrvj5dj x1ku5rj1 xfungia x1k6wstc x614ynp`}}[!!e|0],children:e?`你`:`A`})}function E({active:e,children:t}){return(0,S.jsx)(`div`,{...{0:{className:`xh8yej3 x9f619 xb3r6kr xixl9f9 x2fo67v xqfszdh xfifm61 x1dbl2gt xo2rkog xt0e3qv`},1:{className:`xh8yej3 x9f619 xb3r6kr xixl9f9 xqfszdh xfifm61 x1dbl2gt xo2rkog xt0e3qv x12ilycc x1d5q07e`}}[!!e|0],children:t})}function D({message:e,onEdit:t,onDelete:n}){let[r,i]=(0,y.useState)(!1),a=e.author===`human`;return(0,S.jsxs)(`div`,{className:`x14vqqas x14l7nz5`,children:[(0,S.jsxs)(`div`,{className:`x78zum5 x6s0dn4 x1j9xkj6 x1j6dyjg x1s688f xjpr12u`,children:[(0,S.jsx)(T,{human:a}),a?`你`:`Agent`,` `,(0,S.jsx)(`span`,{className:`xc7n51q xo1l8bm`,children:C(e.editedAt??e.at)}),a&&!e.deleted&&!r?(0,S.jsxs)(`span`,{className:`xvc5jky x78zum5 x17d4w8g`,children:[(0,S.jsx)(`button`,{type:`button`,onClick:()=>i(!0),className:`x1717udv xc342km xjbqb8w xddlp02 xytdrwj x1j6dyjg x1ypdohk`,children:`编辑`}),(0,S.jsx)(`button`,{type:`button`,onClick:n,className:`x1717udv xc342km xjbqb8w xddlp02 xytdrwj x1j6dyjg x1ypdohk`,children:`删除`})]}):null]}),e.deleted?(0,S.jsx)(`div`,{className:`xc7n51q x1k4tb9n`,children:`已删除`}):r?(0,S.jsx)(w,{autoFocus:!0,initial:e.text,placeholder:``,onSubmit:e=>(t(e),i(!1)),onCancel:()=>i(!1)}):(0,S.jsx)(`div`,{className:`x126k92a xj0a0fe`,children:e.text})]})}function O({thread:e,active:t,actions:n,onActivate:r}){let[i,a]=(0,y.useState)(!1),o=x(e),s=e.status===`resolved`,c=e.anchor.quote||`整段`;return s&&!i?(0,S.jsx)(E,{children:(0,S.jsxs)(`div`,{onClick:()=>a(!0),className:`x78zum5 x6s0dn4 x167g77z x1vvogim xaope02 xddlp02 x1ypdohk`,children:[`✓ 已解决 · `,(0,S.jsx)(`span`,{className:`x98rzlu xeuugli xb3r6kr xuxw1ft xlyipyv x7zghnd`,children:c})]})}):(0,S.jsx)(`div`,{onClick:r,children:(0,S.jsxs)(E,{active:t,children:[(0,S.jsxs)(`div`,{className:`x78zum5 x6s0dn4 x167g77z x889kno xqin4a2 x1j6dyjg`,children:[(0,S.jsx)(`span`,{className:`x98rzlu xeuugli xb3r6kr xuxw1ft xlyipyv x7zghnd`,children:c}),o===`human`?(0,S.jsx)(`span`,{className:`x2lah0s xsplgde xdqyycr x1e6avla x1k6wstc xqdcvd7 x7zghnd`,children:`等你回复`}):null,o===`agent`?(0,S.jsx)(`span`,{title:`Agent 下一轮会读到这条`,className:`x2lah0s xsplgde xdqyycr x1e6avla x1k6wstc xlssvyo x19ay2w6`,children:`等 Agent`}):null,s?(0,S.jsx)(`button`,{type:`button`,title:`重新打开`,onClick:()=>(n.reopen(e.id),a(!1)),className:`x2lah0s x17z2i9w x17rw0jw xrvj5dj x1ku5rj1 x1717udv xc342km x1kogg8i xjbqb8w xj0l527 xddlp02 xytdrwj xfifm61 x1ypdohk`,children:`↺`}):(0,S.jsx)(`button`,{type:`button`,title:`标为已解决`,onClick:t=>(t.stopPropagation(),n.resolve(e.id)),className:`x2lah0s x17z2i9w x17rw0jw xrvj5dj x1ku5rj1 x1717udv xc342km x1kogg8i xjbqb8w xj0l527 xddlp02 xytdrwj xfifm61 x1ypdohk`,children:`✓`})]}),(0,S.jsx)(`div`,{className:`xp59q4u xqin4a2`,children:e.messages.map(t=>(0,S.jsx)(D,{message:t,onEdit:r=>n.edit(e.id,t.id,r),onDelete:()=>n.remove(e.id,t.id)},t.id))}),t&&!s?(0,S.jsx)(w,{placeholder:`回复…`,onSubmit:t=>n.reply(e.id,t)}):null]})})}function k(e,t,n){let r=[...e].sort((e,t)=>e.anchorTop-t.anchorTop),i={},a=n?r.findIndex(e=>e.id===n):-1,o=Math.max(a,0),s=-1/0;for(let e=o;e<r.length;e++){let n=r[e],a=Math.max(n.anchorTop,s);i[n.id]=a,s=a+n.height+t}if(a>0){let e=i[r[a].id];for(let n=a-1;n>=0;n--){let a=r[n],o=Math.min(a.anchorTop,e-t-a.height);i[a.id]=o,e=o}}return i}function A(e,t,n){let r=t.x-n;return e.x<r?`M${e.x} ${e.y} H${r} L${t.x} ${t.y}`:`M${e.x} ${e.y} L${t.x} ${t.y}`}function ee(e,t,n,r){return{left:Math.max(t.left,Math.min(e.left,t.right-n)),top:e.bottom+r}}function te(e,t,n,r,i){return{left:Math.max(t.left,Math.min(e.left,t.right-n)),top:e.top-r-i}}var j=12,M=40,N=18;function P({id:e,onHeight:t,children:n}){let r=(0,y.useRef)(null);return(0,y.useLayoutEffect)(()=>{let n=r.current;if(!n)return;let i=new ResizeObserver(()=>t(e,n.offsetHeight));return i.observe(n),t(e,n.offsetHeight),()=>i.disconnect()},[e,t]),(0,S.jsx)(`div`,{ref:r,children:n})}function F({narrow:e,threads:t,anchors:n,activeId:r,actions:i,onActivate:a,railRef:o}){let[s,c]=(0,y.useState)({}),[l,u]=(0,y.useState)([]),d=(0,y.useRef)(null),f=(0,y.useRef)((e,t)=>c(n=>n[e]===t?n:{...n,[e]:t})).current,p=(0,y.useCallback)(e=>{d.current=e,o(e)},[o]),m=new Map(n.map(e=>[e.threadId,e.top])),h=t.filter(e=>m.has(e.id)),g=t.filter(e=>!m.has(e.id)&&!e.messages.every(e=>e.deleted)),_=h.map(e=>({id:e.id,anchorTop:m.get(e.id),height:s[e.id]??120})),v=k(_,j,r??void 0),b=Math.max(0,..._.map(e=>(v[e.id]??0)+e.height)),x=JSON.stringify(v);(0,y.useLayoutEffect)(()=>{let r=d.current;if(e||!r)return u([]);let i=r.getBoundingClientRect(),a=new Set(t.filter(e=>e.status===`open`).map(e=>e.id)),o=[];for(let e of n){let t=v[e.threadId],n=e.range.getClientRects(),r=n[n.length-1];if(t===void 0||!r||!a.has(e.threadId))continue;let s={x:r.right-i.left,y:r.bottom-i.top};o.push({id:e.threadId,d:A(s,{x:0,y:t+N},M)})}u(o)},[e,n,t,x]);let C=e=>(0,S.jsx)(O,{thread:e,active:e.id===r,actions:i,onActivate:()=>a(e.id)});return e?(0,S.jsxs)(`div`,{ref:p,className:`x78zum5 xdt5ytf x1v2ro7d xh8yej3 x7ep2pv xvueqy4`,children:[[...h].sort((e,t)=>m.get(e.id)-m.get(t.id)).map(e=>(0,S.jsx)(`div`,{children:C(e)},e.id)),g.length>0?(0,S.jsx)(`div`,{className:`xqui205 x1e56ztr xddlp02 xqfszdh x1j6dyjg`,children:`原文已删除`}):null,g.map(e=>(0,S.jsx)(`div`,{children:C(e)},e.id))]}):(0,S.jsxs)(`aside`,{ref:p,className:`x1n2onr6 xh8yej3 x2lah0s`,style:{minHeight:b},children:[(0,S.jsx)(`svg`,{className:`x10l6tqk x13vifvy xu96u03 x1i1rx1s xjm9jq1 x1rea2x4 x47corl`,children:l.map(e=>(0,S.jsx)(`path`,{d:e.d,fill:`none`,stroke:e.id===r?`#c9a03a`:`currentColor`,strokeOpacity:e.id===r?1:.25,strokeDasharray:e.id===r?void 0:`3 3`},e.id))}),h.map(e=>(0,S.jsx)(`div`,{className:`x10l6tqk xu96u03 xh8yej3 x14h5d43 xx6bhzk`,style:{top:v[e.id]},children:(0,S.jsx)(P,{id:e.id,onHeight:f,children:C(e)})},e.id)),g.length>0?(0,S.jsxs)(`div`,{style:{position:`absolute`,top:b+j,left:0,width:`100%`},children:[(0,S.jsx)(`div`,{className:`xqui205 x1e56ztr xddlp02 xqfszdh x1j6dyjg`,children:`原文已删除`}),g.map(e=>(0,S.jsx)(`div`,{style:{marginBottom:j},children:C(e)},e.id))]}):null]})}var I={h2:0,h3:1};function L({editor:e}){let[t,n]=(0,y.useState)([]),[r,i]=(0,y.useState)(null);return(0,y.useEffect)(()=>{if(!e)return;let t=()=>n(e.getEditorState().read(()=>a().getChildren().filter(e=>e.getType()===`heading`&&e.getTag()in I).map(e=>({key:e.getKey(),text:e.getTextContent(),depth:I[e.getTag()]}))));return t(),e.registerUpdateListener(t)},[e]),(0,y.useEffect)(()=>{if(!e)return;let n=()=>{let n=t[0]?.key??null;for(let r of t){let t=e.getElementByKey(r.key);t&&t.getBoundingClientRect().top<120&&(n=r.key)}i(n)};return n(),window.addEventListener(`scroll`,n,{passive:!0}),()=>window.removeEventListener(`scroll`,n)},[e,t]),t.length===0?(0,S.jsx)(`nav`,{className:`x7wzq59 x1huftch x1y8v6su xqfszdh xfifm61 x1vrqzgy xddlp02`}):(0,S.jsxs)(`nav`,{"aria-label":`目录`,className:`x7wzq59 x1huftch x1y8v6su xqfszdh xfifm61 x1vrqzgy xddlp02`,children:[(0,S.jsx)(`div`,{className:`x12nagc x1bo0w0s x1j6dyjg x1s688f x1vyo3qp`,children:`目录`}),t.map(t=>(0,S.jsx)(`button`,{type:`button`,onClick:()=>e?.getElementByKey(t.key)?.scrollIntoView({behavior:`smooth`,block:`start`}),...{0:{className:`x1lliihq xh8yej3 xb3r6kr xlyipyv xuxw1ft x1717udv xe2zdcy x18xomjl xc342km xyumdvf x1t7ytsu xv5lvn5 xjbqb8w x1heor9g xytdrwj xln7xf2 x1yc453h x1ypdohk`},2:{className:`x1lliihq xh8yej3 xb3r6kr xlyipyv xuxw1ft x1717udv x18xomjl xc342km xyumdvf x1t7ytsu xv5lvn5 xjbqb8w x1heor9g xytdrwj xln7xf2 x1yc453h x1ypdohk xz7312c`},1:{className:`x1lliihq xh8yej3 xb3r6kr xlyipyv xuxw1ft x1717udv xe2zdcy x18xomjl xc342km xyumdvf x1t7ytsu xjbqb8w xln7xf2 x1yc453h x1ypdohk xo2rkog xk50ysn xq73ly0`},3:{className:`x1lliihq xh8yej3 xb3r6kr xlyipyv xuxw1ft x1717udv x18xomjl xc342km xyumdvf x1t7ytsu xjbqb8w xln7xf2 x1yc453h x1ypdohk xz7312c xo2rkog xk50ysn xq73ly0`}}[(t.depth>0)<<1|t.key===r],children:t.text},t.key))]})}function R({left:e,top:t,quote:n,initial:r,restored:i,leaving:a,onChange:o,onSubmit:s,onCancel:c,ref:l}){return(0,S.jsx)(`div`,{ref:l,...{0:{className:`x10l6tqk x1u8a7rm xj6ak53 xowlrko xllfotl xatqbsq x1u6ievf`},1:{className:`x10l6tqk x1u8a7rm xj6ak53 x1u6ievf xxp0q0x x12l1aco xn0cd8s x47corl`}}[!!a|0],style:{left:e,top:t},children:(0,S.jsxs)(E,{active:!0,children:[(0,S.jsxs)(`div`,{className:`x78zum5 x1pha0wt x167g77z xz9dl7a x1hr3lfm xqfszdh x1j6dyjg`,children:[(0,S.jsxs)(`span`,{className:`x98rzlu xeuugli xb3r6kr xuxw1ft xlyipyv xddlp02`,children:[`“`,n,`”`]}),i?(0,S.jsx)(`span`,{className:`x2lah0s x7zghnd`,children:`已恢复上次的草稿`}):null]}),(0,S.jsx)(w,{autoFocus:!0,initial:r,placeholder:`写下你的问题或意见…`,onChange:o,onSubmit:s,onCancel:c})]})})}function ne({left:e,top:t,onComment:n,onCopy:r,ref:i}){return(0,S.jsxs)(`div`,{ref:i,className:`x10l6tqk x1u8a7rm x78zum5 x195vfkc xc9qbxq x9f619 xfawy5m x1q4ynmn xnntjla x1d5q07e xi1bcxy x773k2o xa3vuyk`,style:{left:e,top:t},onMouseDown:e=>e.preventDefault(),children:[(0,S.jsxs)(`button`,{type:`button`,onClick:n,className:`x78zum5 x6s0dn4 x17d4w8g xt970qd x1awh872 xc342km xu4hgxq xjbqb8w x1h20h33 xus9egd xqfszdh xfifm61 x1ypdohk`,children:[(0,S.jsx)(v,{size:14}),`评论`]}),(0,S.jsx)(`button`,{type:`button`,onClick:r,className:`x78zum5 x6s0dn4 x17d4w8g xt970qd x1awh872 xc342km xu4hgxq xjbqb8w x1h20h33 xus9egd xqfszdh xfifm61 x1ypdohk x1ks1olk`,children:`复制`})]})}function re({id:e,agentEditing:t,agentSection:n,offline:r,openComments:i}){return(0,S.jsxs)(`header`,{className:`x7wzq59 x13vifvy x1n327nk xdd8jsf x78zum5 x6s0dn4 x1v2ro7d x4l9tsp x1rozbrz xqfszdh`,children:[(0,S.jsxs)(`span`,{className:`xddlp02 xfifm61 xuxw1ft`,children:[`document / `,(0,S.jsx)(`span`,{className:`xo2rkog x1s688f`,children:e})]}),t?(0,S.jsxs)(`span`,{className:`x78zum5 x6s0dn4 x17d4w8g xj8oexa x1awh872 x1e6avla xlssvyo x19ay2w6 x1j6dyjg xuxw1ft`,children:[(0,S.jsx)(`i`,{className:`x1v4s8kt xols6we x16rqkct xtwfq29`}),`Agent 正在编辑`,n?` ${n}`:``]}):null,r?(0,S.jsx)(`span`,{className:`x78zum5 x6s0dn4 x17d4w8g xj8oexa x1awh872 x1e6avla x1j6dyjg xuxw1ft xqdcvd7 x7zghnd`,children:`未同步,正在重试`}):null,(0,S.jsx)(`span`,{className:`x98rzlu`}),(0,S.jsxs)(`span`,{className:`xddlp02 xfifm61 xuxw1ft`,children:[`评论 `,i]}),(0,S.jsx)(f,{artifact:`document/${e}`})]})}function z(e,t){if(!t)return`block`;let n=e.indexOf(t);return n===-1?`block`:{start:n,end:n+t.length}}function B(e,t,n){let r=document.createRange(),i=document.createTreeWalker(e,NodeFilter.SHOW_TEXT),a=0,o=!1;for(let e=i.nextNode();e;e=i.nextNode()){let i=a+e.length;if(!o&&t<=i&&(r.setStart(e,t-a),o=!0),o&&n<=i)return r.setEnd(e,n-a),r;a=i}return r.selectNodeContents(e),r}function ie(e,t,n){let[r,i]=(0,y.useState)([]);return(0,y.useEffect)(()=>{if(!e||!n)return;let r=()=>{let r=e.getEditorState().read(()=>{let e=new Map;for(let t of a().getChildren()){let n=c(t,d);n&&e.set(n,t.getKey())}return e}),o=n.getBoundingClientRect().top-n.scrollTop,s=[];for(let n of t){let t=r.get(n.anchor.blockId),i=t?e.getElementByKey(t):null;if(!i)continue;let a=z(i.textContent??``,n.anchor.quote),c=a===`block`?B(i,0,1/0):B(i,a.start,a.end),l=c.getClientRects()[0]??i.getBoundingClientRect();s.push({threadId:n.id,top:l.top-o,range:c})}i(s)};r();let o=0,s=()=>{cancelAnimationFrame(o),o=requestAnimationFrame(r)},l=e.registerUpdateListener(s),u=new ResizeObserver(s);u.observe(n);let f=e.getRootElement();return f&&u.observe(f),()=>{cancelAnimationFrame(o),l(),u.disconnect()}},[e,t,n]),r}function ae(e,t,n){(0,y.useEffect)(()=>{if(typeof CSS>`u`||!(`highlights`in CSS))return;let r=new Set(t.filter(e=>e.status===`open`).map(e=>e.id)),i=e.filter(e=>r.has(e.threadId)&&e.threadId!==n).map(e=>e.range),a=e.filter(e=>e.threadId===n).map(e=>e.range);return CSS.highlights.set(`ryugi-comment`,new Highlight(...i)),CSS.highlights.set(`ryugi-comment-active`,new Highlight(...a)),()=>{CSS.highlights.delete(`ryugi-comment`),CSS.highlights.delete(`ryugi-comment-active`)}},[e,t,n])}function V(e){(0,y.useEffect)(()=>{if(e&&typeof CSS<`u`&&`highlights`in CSS)return CSS.highlights.set(`ryugi-comment-draft`,new Highlight(e)),()=>{CSS.highlights.delete(`ryugi-comment-draft`)}},[e])}function oe(e,t,n){for(let r of e)for(let e of r.range.getClientRects())if(t>=e.left&&t<=e.right&&n>=e.top&&n<=e.bottom)return r.threadId;return null}var H=(e,t)=>`${e}\n${t}`;function U(){let e=new Map;return{save(t,n){n.trim()?e.set(t,n):e.delete(t)},take(t){return e.get(t)??``}}}function se(e){let t=(0,y.useMemo)(U,[]),[n,r]=(0,y.useState)(null),[i,a]=(0,y.useState)(!1),o=(0,y.useRef)(``),s=(0,y.useRef)(0),c=(0,y.useRef)(null),l=(0,y.useRef)(null);V(i?null:n?.target.range??null);let u=(0,y.useCallback)(n=>{window.clearTimeout(s.current);let i=t.take(H(n.blockId,n.quote));o.current=i,a(!1),r({target:n,initial:i}),window.getSelection()?.removeAllRanges(),e()},[t,e]),d=(0,y.useCallback)(e=>{n&&(t.save(H(n.target.blockId,n.target.quote),e?o.current:``),a(!0),s.current=window.setTimeout(()=>{r(null),a(!1)},120))},[n,t]);return(0,y.useEffect)(()=>{if(!n||i)return;let e=e=>{let t=e.target;c.current?.contains(t)||l.current?.contains(t)||d(!0)};return document.addEventListener(`pointerdown`,e,!0),()=>document.removeEventListener(`pointerdown`,e,!0)},[n,i,d]),(0,y.useEffect)(()=>()=>window.clearTimeout(s.current),[]),{draft:n,leaving:i,restored:!!n?.initial,open:u,close:d,onText:e=>{o.current=e},panelRef:c,toolbarRef:l}}var W=200;function ce(e,t){let[n,r]=(0,y.useState)(null);return(0,y.useEffect)(()=>{if(!e||!t)return;let n=0,a=()=>{let n=window.getSelection(),a=e.getRootElement();if(!n||n.isCollapsed||n.rangeCount===0||!a?.contains(n.anchorNode)){r(null);return}let o=n.toString().trim(),s=e.read(()=>{let e=n.anchorNode&&i(n.anchorNode)?.getTopLevelElement(),t=n.focusNode&&i(n.focusNode)?.getTopLevelElement();return!e||!t||!e.is(t)?null:c(e,d)||null});if(!s||!o){r(null);return}let l=n.getRangeAt(0),u=[...l.getClientRects()],f=u[0]??l.getBoundingClientRect(),p=u.at(-1)??f,m=t.getBoundingClientRect();r({blockId:s,quote:o.slice(0,500),left:f.left-m.left,bottom:p.bottom-m.top,top:f.top-m.top,right:p.right-m.left,range:l.cloneRange()})},o=()=>{clearTimeout(n),n=window.setTimeout(a,W)};return document.addEventListener(`selectionchange`,o),()=>{clearTimeout(n),document.removeEventListener(`selectionchange`,o)}},[e,t]),[n,()=>r(null)]}function G(e){return{left:e.offsetLeft,right:Math.min(e.offsetLeft+e.offsetWidth,window.innerWidth-16)}}function K(e){let t=(0,y.useMemo)(()=>window.matchMedia(e),[e]),[n,r]=(0,y.useState)(t.matches);return(0,y.useEffect)(()=>{let e=()=>r(t.matches);return t.addEventListener(`change`,e),()=>t.removeEventListener(`change`,e)},[t]),n}function le(){let e=(0,y.useMemo)(()=>window.matchMedia(`(prefers-color-scheme: dark)`),[]),[t,n]=(0,y.useState)(e.matches);return(0,y.useEffect)(()=>{let t=()=>n(e.matches);return e.addEventListener(`change`,t),()=>e.removeEventListener(`change`,t)},[e]),t}function ue(e){(0,y.useEffect)(()=>{if(!e)return;let t=document.createElement(`base`);return t.href=e,document.head.prepend(t),()=>t.remove()},[e])}function q({id:e}){let[t,n]=(0,y.useState)(null),[i,a]=(0,y.useState)(null),[c,d]=(0,y.useState)(b),[f,h]=(0,y.useState)(null),[g,_]=(0,y.useState)(!1),[v,x]=(0,y.useState)(null),[C,w]=(0,y.useState)(!1),[T,E]=(0,y.useState)(null),[D,O]=(0,y.useState)(null),[k,A]=(0,y.useState)(null),[j,M]=(0,y.useState)(null),[N,P]=(0,y.useState)(null),I=K(`(max-width: 1100px)`),z=!K(`(max-width: 1480px)`),B=(0,y.useMemo)(l,[]),V=le(),H=`document/${e}`,U=(0,y.useCallback)(async()=>{let t=await fetch(`/api/artifacts/document/${e}`,{cache:`no-store`});t.ok&&n(await t.json())},[e]);(0,y.useEffect)(()=>{let t=!1;return(async()=>{try{await U();let n=await fetch(`/api/document/${e}/state`,{cache:`no-store`}),i=await n.json();if(!n.ok||!i.snapshot)throw Error(i.error??`load failed (${n.status})`);if(t)return;let s=new r;s.setRecordTimestamp(!0),s.setChangeMergeInterval(20),s.import(o(i.snapshot)),_(!!i.streaming),d(i.comments??b()),a(s)}catch(e){t||h(e.message)}})(),()=>{t=!0}},[e,U]);let{send:W}=p(e=>{e.artifact===H&&(e.type===`change`?U():e.type===`doc-status`?_(e.streaming):e.type===`doc-comments`&&d(e.comments),B.emit(e))},()=>B.emit({type:`open`}));ue(t?.contentBase);let q=(0,y.useMemo)(()=>({artifact:H,contentBase:t?.contentBase??``,channel:B,send:W}),[H,t?.contentBase,B,W]);(0,y.useEffect)(()=>{document.title=t?.title||e},[t?.title,e]);let de=c.threads.filter(e=>e.status===`open`).length,J=ie(T,c.threads,D);ae(J,c.threads,k);let[Y,X]=ce(T,j),Z=se(X),{draft:Q}=Z,$=(0,y.useCallback)(async t=>{let n=await fetch(`/api/document/${e}/comments`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});n.ok&&d((await n.json()).comments)},[e]),fe=(0,y.useMemo)(()=>({reply:(e,t)=>void $({op:`reply`,threadId:e,text:t}),edit:(e,t,n)=>void $({op:`edit`,threadId:e,messageId:t,text:n}),remove:(e,t)=>void $({op:`delete`,threadId:e,messageId:t}),resolve:e=>void $({op:`resolve`,threadId:e}),reopen:e=>void $({op:`reopen`,threadId:e})}),[$]);return f?(0,S.jsx)(`div`,{className:`x1o8uwn5 x2b8uid x1bo0w0s xqfszdh xif65rj`,children:f}):i?(0,S.jsxs)(`div`,{className:`x1us19tq x1rozbrz xo2rkog`,className:`ryugi-doc ${{className:`x1us19tq x1rozbrz xo2rkog`}.className??``}`,children:[(0,S.jsx)(re,{id:e,agentEditing:g,agentSection:v,offline:C,openComments:de}),(0,S.jsxs)(`main`,{ref:M,...{0:{className:`x1n2onr6 xrvj5dj xc94fvo xl56j7k xwaa2ar x1axd487 x4l9tsp`},2:{className:`x1n2onr6 xrvj5dj xl56j7k xwaa2ar x1axd487 x4l9tsp x1yfmpbe`},1:{className:`x1n2onr6 xc94fvo xl56j7k xwaa2ar x1axd487 x78zum5 xdt5ytf x1qjc9v5 x17qtykl`},3:{className:`x1n2onr6 xl56j7k xwaa2ar x1axd487 x1yfmpbe x78zum5 xdt5ytf x1qjc9v5 x17qtykl`}}[!z<<1|!!I],children:[z&&!I?(0,S.jsx)(L,{editor:T}):null,(0,S.jsx)(`article`,{ref:P,className:`xh8yej3 xrgej4m xeuugli`,style:I?{marginInline:`auto`}:void 0,onClick:e=>A(oe(J,e.clientX,e.clientY)),children:(0,S.jsx)(s.Provider,{value:q,children:(0,S.jsx)(u,{id:e,doc:i,channel:B,theme:V?`dark`:`light`,onAgentSection:x,onOffline:w,onEditorReady:E})})}),(0,S.jsx)(`div`,{className:`x1n2onr6`,children:(0,S.jsx)(F,{narrow:I,threads:c.threads,anchors:J,activeId:k,actions:fe,onActivate:A,railRef:O})}),Y&&!Q&&N?(0,S.jsx)(ne,{ref:Z.toolbarRef,...te(Y,G(N),138,36,8),onComment:()=>Z.open(Y),onCopy:()=>{navigator.clipboard?.writeText(Y.quote),window.getSelection()?.removeAllRanges(),X()}}):null,Q&&N?(0,S.jsx)(R,{ref:Z.panelRef,...ee(Q.target,G(N),340,8),quote:Q.target.quote,initial:Q.initial,restored:Z.restored,leaving:Z.leaving,onChange:Z.onText,onSubmit:e=>{$({op:`create`,blockId:Q.target.blockId,quote:Q.target.quote,text:e}),Z.close(!1)},onCancel:()=>Z.close(!0)},`${Q.target.blockId}:${Q.target.quote}`):null]}),(0,S.jsx)(m,{warnings:t?.warnings??[]})]}):(0,S.jsx)(`div`,{className:`x1o8uwn5 x2b8uid x1bo0w0s xqfszdh xif65rj`,children:`Loading…`})}export{q as default};
@@ -1 +0,0 @@
1
- import"./chunk-75Z2AOVW-Dmt3SQH3.js";import"./src-Caqqw6Gw.js";import{n as e}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import"./chunk-DU6HZSFF-C0GRIO4w.js";import"./chunk-P2QGCYS3-BVqK-Rk9.js";import"./chunk-PWAF6VOD-CcIRMiiP.js";import"./chunk-GMAD6QVW-Do0Tih79.js";import"./chunk-4HAMMTFA-B7k7y3et.js";import"./chunk-GVQU2GXP-C9mWLYpa.js";import"./chunk-L3NEJ4N5-D_AVAMEp.js";import"./chunk-OSK3NFVY-BKczRUt9.js";import"./dist-CitzQ6z1.js";import"./chunk-F27PBJKO-cC_G0fXX.js";import"./chunk-XXDRQBXY-CRm7H5Qv.js";import"./chunk-POPQ4Y6H-4s63FXj5.js";import{i as t,n,r,t as i}from"./chunk-TICWLB2K-v1pSr6BB.js";var a={parser:n,get db(){return new i},renderer:r,styles:t,init:e(e=>{e.class||={},e.class.arrowMarkerAbsolute=e.arrowMarkerAbsolute},`init`)};export{a as diagram};
@@ -1 +0,0 @@
1
- import"./chunk-75Z2AOVW-Dmt3SQH3.js";import"./src-Caqqw6Gw.js";import{n as e}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import"./chunk-DU6HZSFF-C0GRIO4w.js";import"./chunk-P2QGCYS3-BVqK-Rk9.js";import"./chunk-PWAF6VOD-CcIRMiiP.js";import"./chunk-GMAD6QVW-Do0Tih79.js";import"./chunk-4HAMMTFA-B7k7y3et.js";import"./chunk-GVQU2GXP-C9mWLYpa.js";import"./chunk-L3NEJ4N5-D_AVAMEp.js";import"./chunk-OSK3NFVY-BKczRUt9.js";import"./dist-CitzQ6z1.js";import"./chunk-F27PBJKO-cC_G0fXX.js";import"./chunk-XXDRQBXY-CRm7H5Qv.js";import"./chunk-POPQ4Y6H-4s63FXj5.js";import{i as t,n,r,t as i}from"./chunk-TICWLB2K-v1pSr6BB.js";var a={parser:n,get db(){return new i},renderer:r,styles:t,init:e(e=>{e.class||={},e.class.arrowMarkerAbsolute=e.arrowMarkerAbsolute},`init`)};export{a as diagram};
@@ -1 +0,0 @@
1
- import"./chunk-75Z2AOVW-Dmt3SQH3.js";import"./src-Caqqw6Gw.js";import"./chunk-DU6HZSFF-C0GRIO4w.js";import"./chunk-P2QGCYS3-BVqK-Rk9.js";import"./chunk-PWAF6VOD-CcIRMiiP.js";import"./chunk-GMAD6QVW-Do0Tih79.js";import"./chunk-4HAMMTFA-B7k7y3et.js";import"./chunk-GVQU2GXP-C9mWLYpa.js";import"./chunk-L3NEJ4N5-D_AVAMEp.js";import"./chunk-OSK3NFVY-BKczRUt9.js";import"./dist-CitzQ6z1.js";import"./chunk-F27PBJKO-cC_G0fXX.js";import"./chunk-XXDRQBXY-CRm7H5Qv.js";import"./chunk-POPQ4Y6H-4s63FXj5.js";export{n as diagram}from"./chunk-SHT3W25Y-D8R29R_u.js";
@@ -1 +0,0 @@
1
- export{n as default,r as en,i as kaa}from"./prod-iZwju1YX.js";
@@ -1 +0,0 @@
1
- import"./chunk-75Z2AOVW-Dmt3SQH3.js";import"./src-Caqqw6Gw.js";import{n as e}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import"./chunk-DU6HZSFF-C0GRIO4w.js";import"./chunk-P2QGCYS3-BVqK-Rk9.js";import"./chunk-PWAF6VOD-CcIRMiiP.js";import"./chunk-GMAD6QVW-Do0Tih79.js";import"./chunk-4HAMMTFA-B7k7y3et.js";import"./chunk-GVQU2GXP-C9mWLYpa.js";import"./chunk-L3NEJ4N5-D_AVAMEp.js";import"./chunk-OSK3NFVY-BKczRUt9.js";import"./dist-CitzQ6z1.js";import"./chunk-F27PBJKO-cC_G0fXX.js";import"./chunk-XXDRQBXY-CRm7H5Qv.js";import"./chunk-POPQ4Y6H-4s63FXj5.js";import{i as t,n,r,t as i}from"./chunk-IMKFNOWR-BqsuylOZ.js";var a={parser:n,get db(){return new i(2)},renderer:r,styles:t,init:e(e=>{e.state||={},e.state.arrowMarkerAbsolute=e.arrowMarkerAbsolute},`init`)};export{a as diagram};
@@ -1 +0,0 @@
1
- import"./prod-iZwju1YX.js";export{n as Commands,i as subsetToBase64,r as subsetToBinary,t as toBase64}from"./chunk-EIO257PC-CNxgWaGL.js";
@@ -1,8 +0,0 @@
1
- import"./chunk-75Z2AOVW-Dmt3SQH3.js";import"./src-Caqqw6Gw.js";import{n as e}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import"./chunk-DU6HZSFF-C0GRIO4w.js";import"./chunk-P2QGCYS3-BVqK-Rk9.js";import"./chunk-PWAF6VOD-CcIRMiiP.js";import"./chunk-GMAD6QVW-Do0Tih79.js";import"./chunk-4HAMMTFA-B7k7y3et.js";import"./chunk-GVQU2GXP-C9mWLYpa.js";import"./chunk-L3NEJ4N5-D_AVAMEp.js";import"./chunk-OSK3NFVY-BKczRUt9.js";import"./dist-CitzQ6z1.js";import"./chunk-F27PBJKO-cC_G0fXX.js";import"./chunk-XXDRQBXY-CRm7H5Qv.js";import"./chunk-POPQ4Y6H-4s63FXj5.js";import{r as t,t as n}from"./chunk-SHT3W25Y-D8R29R_u.js";var r=n({defaultLayout:`swimlane`,styles:e(e=>`${t(e)}
2
- .swimlane.cluster rect {
3
- stroke: ${e.clusterBorder} !important;
4
- }
5
- [data-look="neo"].cluster rect {
6
- filter: none;
7
- }
8
- `,`getStyles`)});export{r as diagram};