chainlesschain 0.162.80 → 0.162.81

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 (157) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/assets/{AIOps-CwebRiRI.js → AIOps-Dlv6UdSz.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-C7h2xsW3.js → ActionButton-D8Ml3nvH.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-BRdOQzzK.js → Analytics-WyKO87FA.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-D_i-Jbsu.js → AppLayout-skfxIMCm.js} +4 -4
  6. package/src/assets/web-panel/assets/{Audit-AgCF_nLK.js → Audit-j2y2koUY.js} +1 -1
  7. package/src/assets/web-panel/assets/{Backup-Be9up1Uo.js → Backup-0kvzhUvr.js} +1 -1
  8. package/src/assets/web-panel/assets/{BaseInput-2j-7gyTU.js → BaseInput-B10JtuYe.js} +1 -1
  9. package/src/assets/web-panel/assets/{Chat-ZyYadHdk.js → Chat-DiaMhkhZ.js} +5 -5
  10. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CwnbmcAg.js → ChatBubbleRenderer-CLREcJSS.js} +1 -1
  11. package/src/assets/web-panel/assets/{Checkbox-Di0bejSO.js → Checkbox-DLNTFkf4.js} +1 -1
  12. package/src/assets/web-panel/assets/{Codegen-BgEwqrVh.js → Codegen-BP5LgMVn.js} +1 -1
  13. package/src/assets/web-panel/assets/{Col-FIduoerd.js → Col-B7G-aBBF.js} +1 -1
  14. package/src/assets/web-panel/assets/{Community-Bf7olKXg.js → Community-Dvbmd8mi.js} +1 -1
  15. package/src/assets/web-panel/assets/{Compact-CsjIF6B3.js → Compact-Cv9rLQT6.js} +1 -1
  16. package/src/assets/web-panel/assets/{Compliance-CQchRaQh.js → Compliance-Dz9W_4jg.js} +1 -1
  17. package/src/assets/web-panel/assets/{Cowork-gJzDgX9E.js → Cowork-CH-FUjD5.js} +3 -3
  18. package/src/assets/web-panel/assets/{Cron-CDjeagXb.js → Cron-Bo5BlAIn.js} +2 -2
  19. package/src/assets/web-panel/assets/{Crosschain-D4UE5bt0.js → Crosschain-D_8EQFYJ.js} +1 -1
  20. package/src/assets/web-panel/assets/{DID-OwvsxTzD.js → DID-B8H4mnKZ.js} +2 -2
  21. package/src/assets/web-panel/assets/{Dashboard-CbmOlZ1l.js → Dashboard-BaGc9qhg.js} +2 -2
  22. package/src/assets/web-panel/assets/{Dropdown-B6tBUMev.js → Dropdown-S1uJJIZw.js} +1 -1
  23. package/src/assets/web-panel/assets/{EmailListRenderer-DnM2-O3n.js → EmailListRenderer-Blbx1vAz.js} +1 -1
  24. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DPD9znJH.js → FamilyGuardDashboard-sgVrRdsF.js} +1 -1
  25. package/src/assets/web-panel/assets/{Federation-DjUj87Vr.js → Federation-BLxRz3p8.js} +1 -1
  26. package/src/assets/web-panel/assets/{FormItemContext-DyPgrKLf.js → FormItemContext-BxKKaAvu.js} +1 -1
  27. package/src/assets/web-panel/assets/{GenericCardRenderer-D3fmbO1W.js → GenericCardRenderer-DV_5bwaD.js} +1 -1
  28. package/src/assets/web-panel/assets/{Git-IvwC_R2h.js → Git-CruaPzKp.js} +2 -2
  29. package/src/assets/web-panel/assets/{Governance-CTVEvxpW.js → Governance-DfTPUmy7.js} +1 -1
  30. package/src/assets/web-panel/assets/{Inference-DQlp7Rf1.js → Inference-C_9udVIW.js} +1 -1
  31. package/src/assets/web-panel/assets/{KnowledgeGraph-Cg8pVh5j.js → KnowledgeGraph-n01U-gjh.js} +1 -1
  32. package/src/assets/web-panel/assets/{Logs-D7kLXyaK.js → Logs-BeL1ewRb.js} +2 -2
  33. package/src/assets/web-panel/assets/{Marketplace-QOj6g-oT.js → Marketplace-Dgz01hmL.js} +1 -1
  34. package/src/assets/web-panel/assets/{McpTools-PO9yrTD6.js → McpTools-ZloXEm4I.js} +5 -5
  35. package/src/assets/web-panel/assets/{Memory-B1FwSFmt.js → Memory-CDSdtHpU.js} +2 -2
  36. package/src/assets/web-panel/assets/{MobileBridge-CYiQSoKu.js → MobileBridge-BuPJZd8T.js} +3 -3
  37. package/src/assets/web-panel/assets/MobileProjects-CNCkKgp0.js +1 -0
  38. package/src/assets/web-panel/assets/{Mtc-B4pMzmr7.js → Mtc-lGsvongM.js} +2 -2
  39. package/src/assets/web-panel/assets/{MtcAudit-D6-KGsvR.js → MtcAudit-CXteXVZ6.js} +4 -4
  40. package/src/assets/web-panel/assets/{Multisig-BlZigJMj.js → Multisig-CKak-PIq.js} +3 -3
  41. package/src/assets/web-panel/assets/{NLProgramming-Dhy92OLw.js → NLProgramming-Ch7cCyUr.js} +1 -1
  42. package/src/assets/web-panel/assets/{Notes-DOSv2Lb0.js → Notes-BdV01ItX.js} +3 -3
  43. package/src/assets/web-panel/assets/{NotificationSettings-FRWsHQfi.js → NotificationSettings-BMNRh2T1.js} +1 -1
  44. package/src/assets/web-panel/assets/{OrderTableRenderer-xRSRWRZg.js → OrderTableRenderer-99Kf8rfj.js} +1 -1
  45. package/src/assets/web-panel/assets/{Organization-DApwYY-B.js → Organization-COrs55I2.js} +3 -3
  46. package/src/assets/web-panel/assets/{Overflow-DyJQHxIY.js → Overflow-BkhsAG7t.js} +1 -1
  47. package/src/assets/web-panel/assets/{P2P-NKTPd_Bn.js → P2P-DsZbxioI.js} +2 -2
  48. package/src/assets/web-panel/assets/{PdhVaultBrowser-DCgGt1BE.js → PdhVaultBrowser-CidkBfvk.js} +3 -3
  49. package/src/assets/web-panel/assets/{Permissions-BX9MCb2z.js → Permissions-C72ZZFud.js} +4 -4
  50. package/src/assets/web-panel/assets/{PersonalDataHub-Bcg4az84.js → PersonalDataHub-VUIbdk-a.js} +2 -2
  51. package/src/assets/web-panel/assets/{Pipeline-DjsbfwbG.js → Pipeline-C8fL1ObU.js} +1 -1
  52. package/src/assets/web-panel/assets/{Privacy-kDWl06vo.js → Privacy-BT5s1GOI.js} +1 -1
  53. package/src/assets/web-panel/assets/{ProjectInit-yCe-Imkv.js → ProjectInit-QH98UOrt.js} +2 -2
  54. package/src/assets/web-panel/assets/{ProjectSettings-tVcxlGJ5.js → ProjectSettings-BRLFP-Mm.js} +2 -2
  55. package/src/assets/web-panel/assets/Projects-CCBcFgso.js +1 -0
  56. package/src/assets/web-panel/assets/{Providers-CciGxskW.js → Providers-sCK5cGnJ.js} +1 -1
  57. package/src/assets/web-panel/assets/{QuickAsk-It17rT4F.js → QuickAsk-D_-8ZAob.js} +1 -1
  58. package/src/assets/web-panel/assets/{Recommend-CixKdpBl.js → Recommend-CU6okV6s.js} +1 -1
  59. package/src/assets/web-panel/assets/{Reputation-LB0_D2lx.js → Reputation-BGQa7J_F.js} +1 -1
  60. package/src/assets/web-panel/assets/{Row-BoiDd-zb.js → Row-DRa2ug0L.js} +1 -1
  61. package/src/assets/web-panel/assets/{RssFeed-yA5FdTgh.js → RssFeed-DnKZJmxw.js} +2 -2
  62. package/src/assets/web-panel/assets/{Search-xYldUFeJ.js → Search-B9RFzDJk.js} +1 -1
  63. package/src/assets/web-panel/assets/{Security-BtRMnkFm.js → Security-Dp4TuZMq.js} +4 -4
  64. package/src/assets/web-panel/assets/{Services-CNKTgE2v.js → Services-ChramMT4.js} +2 -2
  65. package/src/assets/web-panel/assets/{Skeleton-B9goiUo_.js → Skeleton-B6gdSkvx.js} +1 -1
  66. package/src/assets/web-panel/assets/{Skills-CUf2Z5Ge.js → Skills-_WvlZ1oz.js} +1 -1
  67. package/src/assets/web-panel/assets/{Sla-TPga8c2I.js → Sla-CJH6QKOR.js} +1 -1
  68. package/src/assets/web-panel/assets/{SpeechSettings-B8zrmLP6.js → SpeechSettings-Dk4n0g4i.js} +1 -1
  69. package/src/assets/web-panel/assets/{SyncSettings-DGyAbZ84.js → SyncSettings-BsOtJ1J_.js} +2 -2
  70. package/src/assets/web-panel/assets/{Tasks-DPeVrQNM.js → Tasks-cmCb3C73.js} +1 -1
  71. package/src/assets/web-panel/assets/{Templates-CNLco6pc.js → Templates-CgAJvAus.js} +1 -1
  72. package/src/assets/web-panel/assets/{Tenant-CL9Eczo8.js → Tenant-C4wfs3-U.js} +1 -1
  73. package/src/assets/web-panel/assets/{Terminal-DGLvbp97.js → Terminal-wV9QMWnm.js} +2 -2
  74. package/src/assets/web-panel/assets/{TimelineRenderer-Cv0LxMwd.js → TimelineRenderer-CTlQQgk4.js} +1 -1
  75. package/src/assets/web-panel/assets/{Tokens-DLhHgtcS.js → Tokens-CErFY1CD.js} +1 -1
  76. package/src/assets/web-panel/assets/{Trigger-DzDaE-An.js → Trigger-BaIuVgr-.js} +1 -1
  77. package/src/assets/web-panel/assets/{Trust-CRh-fhYe.js → Trust-CvD7xCNO.js} +1 -1
  78. package/src/assets/web-panel/assets/{UkeySign-_xBJ16UC.js → UkeySign-Bie2ESVD.js} +1 -1
  79. package/src/assets/web-panel/assets/{VideoEditing-Z5m_edIa.js → VideoEditing-FGGdGzJU.js} +1 -1
  80. package/src/assets/web-panel/assets/{Wallet-DgmchNit.js → Wallet-CVKgofd3.js} +4 -4
  81. package/src/assets/web-panel/assets/{WebAuthn-BxuKxjuf.js → WebAuthn-F93LUUrd.js} +5 -5
  82. package/src/assets/web-panel/assets/{WorkflowEditor-luJ180aM.js → WorkflowEditor-pzCW9tTg.js} +1 -1
  83. package/src/assets/web-panel/assets/{chat-DzglnTps.js → chat-D-f2Co-q.js} +1 -1
  84. package/src/assets/web-panel/assets/{colors-DelLNoxZ.js → colors-Cy43g4nC.js} +1 -1
  85. package/src/assets/web-panel/assets/{compact-item-BZaabUge.js → compact-item-BRdySqtK.js} +1 -1
  86. package/src/assets/web-panel/assets/{createContext-DqTSTjmk.js → createContext-DgMYbuMm.js} +1 -1
  87. package/src/assets/web-panel/assets/devWarning-Bo9SkRXX.js +1 -0
  88. package/src/assets/web-panel/assets/{hasIn-CAeHUQj2.js → hasIn-BDsRbw2n.js} +1 -1
  89. package/src/assets/web-panel/assets/{index-CKZQVcH1.js → index-0pfP3jJF.js} +1 -1
  90. package/src/assets/web-panel/assets/{index-Dk1R9vFq.js → index-29RDMTEv.js} +1 -1
  91. package/src/assets/web-panel/assets/{index-DtfTElxo.js → index-B3JHZM8X.js} +1 -1
  92. package/src/assets/web-panel/assets/{index-CppTZ4SW.js → index-B6RFEGBP.js} +1 -1
  93. package/src/assets/web-panel/assets/{index-NZBXGj64.js → index-B8UJW5kE.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-Xo2WWPZ4.js → index-B8WL38cq.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-BAcpfWwI.js → index-B9VxLQsa.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-CDw1am9U.js → index-BBVC3LOh.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-CV4FisuU.js → index-BG9nDhg3.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-D-lVDXUg.js → index-Bao4b1Wk.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-Bv2Tp7kz.js → index-Bdwey8Sa.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-7FxBHcH8.js → index-Bk9ONVVr.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-WzAdJ0PX.js → index-BpjInZGD.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-Clq1OP4B.js → index-BuDKBx6m.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DXvcxNo5.js → index-C64xX0ec.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CI5cynRw.js → index-CBwzy6n6.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-OGKhEFZZ.js → index-CEDPIN8q.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DU9QWJO5.js → index-CUFP4IGX.js} +1 -1
  107. package/src/assets/web-panel/assets/index-CYUiucwy.js +1 -0
  108. package/src/assets/web-panel/assets/{index-KeadEGaZ.js → index-CpEZoTIi.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-D-QuIaEh.js → index-Cr6Lwc-2.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-BTbN0V4A.js → index-CsWz3uZ2.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DE4-6oHW.js → index-CsYLEuFv.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-RZ23Wlp8.js → index-CvEvH5gF.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DrSuq6t6.js → index-D5zFNpqL.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-vLR-ssxc.js → index-DFNfqFW5.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DhMSUhbW.js → index-DGWnHsSt.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DSATjRyg.js → index-DQbOCjW_.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-Cj7oeTxA.js → index-DWece4X2.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CBZPDGTg.js → index-DYzfPThz.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DM7xncnU.js → index-DjQ8sTHg.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-kJ30C4m8.js → index-Dqoh6hTU.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DRt2lx0X.js → index-Dw-h05cX.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-BAfdWN9t.js → index-IKV6oagF.js} +1 -1
  123. package/src/assets/web-panel/assets/index-SQQL0zZc.js +1 -0
  124. package/src/assets/web-panel/assets/{index-CBtnHlYF.js → index-UGuq7Obe.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-CaSLz8-6.js → index-ZPxEzory.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-BzLgm3Jm.js → index-oXX0i2Jf.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-BR-DF81e.js → index-qW3-iWXU.js} +3 -3
  128. package/src/assets/web-panel/assets/{initDefaultProps-BiHvIjo1.js → initDefaultProps-C2kJNJ3d.js} +1 -1
  129. package/src/assets/web-panel/assets/{motion-COD0OBOe.js → motion-70hfHSsm.js} +1 -1
  130. package/src/assets/web-panel/assets/{move-DJNLMhIj.js → move-D92_uw4u.js} +1 -1
  131. package/src/assets/web-panel/assets/{omit-4qrDRhlN.js → omit-uVUZsfxV.js} +1 -1
  132. package/src/assets/web-panel/assets/{pickAttrs-3jv8tAgW.js → pickAttrs-yMW0EAaP.js} +1 -1
  133. package/src/assets/web-panel/assets/{placementArrow-N1UVUOH_.js → placementArrow-Db5e4sO2.js} +1 -1
  134. package/src/assets/web-panel/assets/{responsiveObserve-D67_gjCH.js → responsiveObserve-CGNzIrU2.js} +1 -1
  135. package/src/assets/web-panel/assets/{slide-DiDh7_u4.js → slide-C--_RIUp.js} +1 -1
  136. package/src/assets/web-panel/assets/{statusUtils-Dzz3tSiz.js → statusUtils-w3HjrMR0.js} +1 -1
  137. package/src/assets/web-panel/assets/{styleChecker-L-tgt7xx.js → styleChecker-5lfAQjNF.js} +1 -1
  138. package/src/assets/web-panel/assets/{useFlexGapSupport-vAgElNal.js → useFlexGapSupport-CyEQZPR5.js} +1 -1
  139. package/src/assets/web-panel/assets/{useFs-af0c_HYI.js → useFs--1NzerQB.js} +1 -1
  140. package/src/assets/web-panel/assets/{usePersonalDataHub-V9U2Mbny.js → usePersonalDataHub-CSbkSUR-.js} +1 -1
  141. package/src/assets/web-panel/assets/{vnode-C7zS_LLr.js → vnode-Dhxh6GKW.js} +1 -1
  142. package/src/assets/web-panel/assets/{zoom-DdXBDemd.js → zoom-_o37plKh.js} +1 -1
  143. package/src/assets/web-panel/index.html +1 -1
  144. package/src/lib/did-v2-manager.js +1 -1
  145. package/src/lib/llm-providers.js +44 -14
  146. package/src/lib/notifiers/_http.js +31 -0
  147. package/src/lib/notifiers/dingtalk.js +2 -1
  148. package/src/lib/notifiers/feishu.js +2 -1
  149. package/src/lib/notifiers/telegram.js +14 -9
  150. package/src/lib/notifiers/wecom.js +3 -1
  151. package/src/lib/plugin-ecosystem.js +1 -1
  152. package/src/lib/version-checker.js +33 -4
  153. package/src/assets/web-panel/assets/MobileProjects-BThUga4r.js +0 -1
  154. package/src/assets/web-panel/assets/Projects-DGL4Za4o.js +0 -1
  155. package/src/assets/web-panel/assets/devWarning-CJLMPKYL.js +0 -1
  156. package/src/assets/web-panel/assets/index-7CJalvEf.js +0 -1
  157. package/src/assets/web-panel/assets/index-_hLbeSOT.js +0 -1
@@ -1,2 +1,2 @@
1
- import{I as f,J as C,U as p,c as a,K as o,V as b,S as P,o as Q,b as G,a as H,r as k,P as u,Q as g,R as x}from"./vendor-BvqAck49.js";import{_ as te,u as X,d as i}from"./index-BR-DF81e.js";import{a1 as oe,am as re,au as le,z as ne,av as se,R as ie}from"./icons-DP3uiYxy.js";const de={__name:"SyncSettings",setup(Y,{expose:r}){r();const v=X(),e=k(!1),V=k(""),I=k(0),w=k(0),N=k(0),_=k(0),R=k(!1),h=k(!1),m=k(""),y=k(""),A=k(!1),S=k([]),E=[{title:"ID",dataIndex:"id",key:"id",width:220,ellipsis:!0},{title:"资源 ID",dataIndex:"resource_id",key:"resource_id",ellipsis:!0},{title:"类型",dataIndex:"resource_type",key:"resource_type",width:120},{title:"操作",key:"action",width:200}];async function U(){e.value=!0,V.value="";try{const t=await v.sendRaw({type:"sync.status"},15e3),l=t?.result;if(!t?.ok||!l?.success)throw new Error(l?.error||t?.error||"获取失败");I.value=Number(l.totalResources??0),w.value=Number(l.pending??0),N.value=Number(l.synced??0),_.value=Number(l.conflicts??0),_.value>0?await O():S.value=[]}catch(t){V.value="获取状态失败:"+(t?.message||String(t))}finally{e.value=!1}}async function O(){A.value=!0;try{const t=await v.sendRaw({type:"sync.conflicts"},15e3),l=Array.isArray(t?.result?.conflicts)?t.result.conflicts:[];S.value=l}catch{S.value=[]}finally{A.value=!1}}async function T(){R.value=!0,y.value="sync.push";try{const t=await v.sendRaw({type:"sync.push"},6e4),l=t?.result;m.value=JSON.stringify(l,null,2),t?.ok&&l?.success?(i.success(`推送完成 (${l.pushed??0} / ${l.total??0})`),await U()):i.error("推送失败:"+(l?.error||t?.error||""))}catch(t){m.value=t?.message||String(t),i.error("推送失败:"+(t?.message||""))}finally{R.value=!1}}async function L(){h.value=!0,y.value="sync.pull";try{const t=await v.sendRaw({type:"sync.pull"},6e4),l=t?.result;m.value=JSON.stringify(l,null,2),t?.ok&&l?.success?(i.success(`拉取完成 (检查 ${l.checked??0}, 更新 ${l.updated??0})`),await U()):i.error("拉取失败:"+(l?.error||t?.error||""))}catch(t){m.value=t?.message||String(t),i.error("拉取失败:"+(t?.message||""))}finally{h.value=!1}}async function z(t,l){try{const c=await v.sendRaw({type:"sync.resolve",conflictId:t,side:l},3e4),K=c?.result;c?.ok&&K?.success?(i.success(`已用${l==="local"?"本地":"远程"}版本解决`),await U()):i.error("解决失败:"+(K?.error||c?.error||""))}catch(c){i.error("解决失败:"+(c?.message||""))}}const n=H({configured:!1,maskedPassword:"",form:{url:"",username:"",password:"",remotePath:"/chainlesschain"},status:null,saving:!1,testing:!1,running:!1,busy:G(()=>n.saving||n.testing||n.running)}),D=G(()=>{const t=n.status?.lastRunStatus;return t==="success"?"green":t==="conflict"?"orange":t==="failed"?"red":"default"}),B=G(()=>{const t=n.status?.lastRunStatus;return t?t==="success"?"成功":t==="conflict"?"有冲突跳过":t==="failed"?"失败":t:n.configured?"已配置":"未配置"});function j(t){const l=new Date(t);return`${l.toLocaleDateString()} ${l.toLocaleTimeString()}`}async function s(){try{const t=await v.sendRaw({type:"sync.webdav.config-get"},1e4);if(!t||t.ok===!1)return;const l=t.result?.data||{};n.form.url=l.url||"",n.form.username=l.username||"",n.form.remotePath=l.remotePath||"/chainlesschain",n.form.password="",n.maskedPassword=l.password||"",n.configured=!!l.configured,n.status=l.status||null}catch(t){console.warn("[SyncSettings] webdav.config-get failed:",t?.message)}}async function W(){n.saving=!0;try{const t=await v.sendRaw({type:"sync.webdav.config-set",payload:{url:n.form.url.trim(),username:n.form.username,password:n.form.password,remotePath:n.form.remotePath||"/"}},15e3),l=t?.result;t?.ok&&l?.success?(i.success("WebDAV 配置已保存"),n.form.password="",await s()):i.error("保存失败:"+(l?.error||t?.error||"未知错误"))}catch(t){i.error("保存失败:"+(t?.message||""))}finally{n.saving=!1}}async function J(){n.form.url&&n.form.password&&!n.configured&&await W(),n.testing=!0;try{const t=await v.sendRaw({type:"sync.webdav.test"},3e4),l=t?.result;t?.ok&&l?.success?i.success("WebDAV 连接成功"):i.error("连接失败:"+(l?.error||t?.error||"未知错误"))}catch(t){i.error("连接失败:"+(t?.message||""))}finally{n.testing=!1}}async function Z(){n.running=!0;try{const t=await v.sendRaw({type:"sync.webdav.run"},3e5),l=t?.result;if(t?.ok&&l?.success){const c=`推送 ${l.pushed} / 跳过 ${l.skipped} / 删除 ${l.deleted}`;l.status==="conflict"?i.warning("同步完成(有跳过):"+c):i.success("同步完成:"+c)}else i.error("同步失败:"+(l?.error||t?.error||"未知错误"));await s()}catch(t){i.error("同步失败:"+(t?.message||""))}finally{n.running=!1}}async function $(){try{const t=await v.sendRaw({type:"sync.webdav.config-clear"},5e3),l=t?.result;t?.ok&&l?.success?(i.success("已清除 WebDAV 凭证"),n.form.url="",n.form.username="",n.form.password="",n.form.remotePath="/chainlesschain",n.configured=!1,n.maskedPassword="",n.status=null):i.error("清除失败:"+(l?.error||t?.error||"未知错误"))}catch(t){i.error("清除失败:"+(t?.message||""))}}const d=H({configured:!1,maskedPassword:"",saving:!1,form:{enabled:!1,autoSync:!1,remoteUrl:"",repoPath:"",authorName:"",authorEmail:"",username:"",password:""}});async function M(){try{const t=await v.sendRaw({type:"git.config-get"},1e4);if(!t||t.ok===!1)return;const l=t.result;if(!l?.success)return;const c=l.data||{};d.form.enabled=!!c.enabled,d.form.autoSync=!!c.autoSync,d.form.remoteUrl=c.remoteUrl||"",d.form.repoPath=c.repoPath||"",d.form.authorName=c.authorName||"",d.form.authorEmail=c.authorEmail||"",d.form.username=c.auth?.username||"",d.form.password="",d.maskedPassword=c.auth?.password||c.auth?.token||"",d.configured=!!c.configured}catch(t){console.warn("[SyncSettings] git.config-get failed:",t?.message)}}async function ee(){d.saving=!0;try{const t={enabled:d.form.enabled,autoSync:d.form.autoSync,remoteUrl:d.form.remoteUrl.trim(),repoPath:d.form.repoPath.trim(),authorName:d.form.authorName,authorEmail:d.form.authorEmail,auth:{username:d.form.username,password:d.form.password}},l=await v.sendRaw({type:"git.config-set",payload:t},15e3),c=l?.result;l?.ok&&c?.success?(i.success("Git 配置已保存"),d.form.password="",await M()):i.error("保存失败:"+(c?.error||l?.error||"未知错误"))}catch(t){i.error("保存失败:"+(t?.message||""))}finally{d.saving=!1}}async function ae(){try{const t=await v.sendRaw({type:"git.config-clear"},5e3),l=t?.result;t?.ok&&l?.success?(i.success("已清除 Git 凭证"),d.form.username="",d.form.password="",d.form.enabled=!1,d.maskedPassword="",d.configured=!1):i.error("清除失败:"+(l?.error||t?.error||"未知错误"))}catch(t){i.error("清除失败:"+(t?.message||""))}}async function q(){await Promise.all([U(),s(),M()])}Q(q);const F={ws:v,statusLoading:e,statusError:V,totalResources:I,pending:w,synced:N,conflicts:_,pushLoading:R,pullLoading:h,lastActionResult:m,lastActionLabel:y,conflictsLoading:A,conflictList:S,conflictColumns:E,fetchStatus:U,fetchConflicts:O,doPush:T,doPull:L,resolveOne:z,webdav:n,webdavStatusColor:D,webdavStatusLabel:B,formatTime:j,webdavLoad:s,webdavSave:W,webdavTest:J,webdavRun:Z,webdavClear:$,gitcfg:d,gitConfigLoad:M,gitConfigSave:ee,gitConfigClear:ae,refreshAll:q,ref:k,reactive:H,computed:G,onMounted:Q,get message(){return i},get ReloadOutlined(){return ie},get CloudSyncOutlined(){return se},get CloudUploadOutlined(){return ne},get CloudDownloadOutlined(){return le},get WarningOutlined(){return re},get BranchesOutlined(){return oe},get useWsStore(){return X}};return Object.defineProperty(F,"__isScriptSetup",{enumerable:!1,value:!0}),F}},ce={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},ue={key:0,style:{"margin-top":"16px"}},fe={key:0},me={key:1,style:{color:"var(--text-secondary)"}},ge={key:0},ye={key:1,style:{color:"var(--text-secondary)"}},ve={style:{color:"#ff4d4f","word-break":"break-all"}},pe={key:0,style:{"text-align":"center",padding:"30px"}},we={key:2,style:{"margin-top":"12px",color:"#ff4d4f","font-size":"12px"}},be={key:0,style:{"margin-top":"16px"}},_e={style:{color:"var(--text-secondary)","font-size":"11px","margin-bottom":"6px"}},ke={style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","border-radius":"6px",padding:"12px",color:"var(--text-primary)","font-size":"12px","max-height":"200px","overflow-y":"auto","white-space":"pre-wrap","font-family":"'Cascadia Code', 'Fira Code', Consolas, monospace"}},he={key:0,style:{"text-align":"center",padding:"30px"}};function xe(Y,r,v,e,V,I){const w=f("a-button"),N=f("a-alert"),_=f("a-space"),R=f("a-tag"),h=f("a-input"),m=f("a-form-item"),y=f("a-col"),A=f("a-input-password"),S=f("a-row"),E=f("a-popconfirm"),U=f("a-form"),O=f("a-descriptions-item"),T=f("a-descriptions"),L=f("a-card"),z=f("a-switch"),n=f("a-spin"),D=f("a-statistic"),B=f("a-empty"),j=f("a-table");return u(),C("div",null,[p("div",ce,[r[13]||(r[13]=p("div",null,[p("h2",{class:"page-title"},"同步设置"),p("p",{class:"page-sub"},"通过 web-shell sync.* WS topic 直连主进程同步引擎")],-1)),a(w,{type:"primary",ghost:"",loading:e.statusLoading,onClick:e.refreshAll},{icon:o(()=>[a(e.ReloadOutlined)]),default:o(()=>[r[12]||(r[12]=g(" 刷新 ",-1))]),_:1},8,["loading"])]),b(` 多 provider / WebDAV 提示(保留:本页 push/pull 仍是 cc CLI 桥;
2
- WebDAV 已在下面单独段独立支持,由 web-shell 的 sync.webdav.* WS topic 直连主进程)`),a(N,{type:"info","show-icon":"",message:"本页 status / push / pull 通过 web-shell sync.* WS topic 直连 main 进程;WebDAV 在下方独立段",description:"其它 provider(Git / P2P / S3 等)的细粒度配置仍在 V5/V6 桌面 shell。",style:{"margin-bottom":"16px"}}),b(" WebDAV 同步段 (Phase 3c.4 — web-shell parity) "),a(L,{style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{title:o(()=>[a(_,null,{default:o(()=>[a(e.CloudSyncOutlined),r[14]||(r[14]=p("span",null,"WebDAV 网盘同步",-1))]),_:1})]),extra:o(()=>[e.webdav.configured?(u(),P(R,{key:0,color:e.webdavStatusColor},{default:o(()=>[g(x(e.webdavStatusLabel),1)]),_:1},8,["color"])):(u(),P(R,{key:1,color:"default"},{default:o(()=>[...r[15]||(r[15]=[g("未配置",-1)])]),_:1}))]),default:o(()=>[a(U,{model:e.webdav.form,layout:"vertical",disabled:e.webdav.busy},{default:o(()=>[a(m,{label:"服务器 URL",required:""},{default:o(()=>[a(h,{value:e.webdav.form.url,"onUpdate:value":r[0]||(r[0]=s=>e.webdav.form.url=s),placeholder:"https://dav.jianguoyun.com/dav/","allow-clear":""},null,8,["value"])]),_:1}),a(S,{gutter:16},{default:o(()=>[a(y,{xs:24,sm:12},{default:o(()=>[a(m,{label:"用户名"},{default:o(()=>[a(h,{value:e.webdav.form.username,"onUpdate:value":r[1]||(r[1]=s=>e.webdav.form.username=s),placeholder:"user@example.com","allow-clear":""},null,8,["value"])]),_:1})]),_:1}),a(y,{xs:24,sm:12},{default:o(()=>[a(m,{label:"密码"},{default:o(()=>[a(A,{value:e.webdav.form.password,"onUpdate:value":r[2]||(r[2]=s=>e.webdav.form.password=s),placeholder:e.webdav.configured?e.webdav.maskedPassword||"(已保存,留空保持不变)":"请输入密码",autocomplete:"new-password"},null,8,["value","placeholder"])]),_:1})]),_:1})]),_:1}),a(m,{label:"远端路径"},{default:o(()=>[a(h,{value:e.webdav.form.remotePath,"onUpdate:value":r[3]||(r[3]=s=>e.webdav.form.remotePath=s),placeholder:"/chainlesschain","allow-clear":""},null,8,["value"])]),_:1}),a(_,{wrap:""},{default:o(()=>[a(w,{type:"primary",loading:e.webdav.saving,onClick:e.webdavSave},{default:o(()=>[...r[16]||(r[16]=[g("保存",-1)])]),_:1},8,["loading"]),a(w,{loading:e.webdav.testing,onClick:e.webdavTest},{default:o(()=>[...r[17]||(r[17]=[g("测试连接",-1)])]),_:1},8,["loading"]),a(w,{type:"primary",loading:e.webdav.running,disabled:!e.webdav.configured,onClick:e.webdavRun},{icon:o(()=>[a(e.CloudUploadOutlined)]),default:o(()=>[r[18]||(r[18]=g(" 立即同步 ",-1))]),_:1},8,["loading","disabled"]),e.webdav.configured?(u(),P(E,{key:0,title:"确定要清除 WebDAV 凭证吗?已推送到远端的文件不会被删除。","ok-text":"清除","cancel-text":"取消",onConfirm:e.webdavClear},{default:o(()=>[a(w,{danger:""},{default:o(()=>[...r[19]||(r[19]=[g("断开连接",-1)])]),_:1})]),_:1})):b("v-if",!0)]),_:1})]),_:1},8,["model","disabled"]),e.webdav.status?(u(),C("div",ue,[a(T,{column:2,size:"small",bordered:""},{default:o(()=>[a(O,{label:"上次同步"},{default:o(()=>[e.webdav.status.lastSyncAt?(u(),C("span",fe,x(e.formatTime(e.webdav.status.lastSyncAt)),1)):(u(),C("span",me,"未同步过"))]),_:1}),a(O,{label:"耗时"},{default:o(()=>[e.webdav.status.lastRunDurationMs!=null?(u(),C("span",ge,x(e.webdav.status.lastRunDurationMs)+" ms",1)):(u(),C("span",ye,"—"))]),_:1}),a(O,{label:"累积推送",span:2},{default:o(()=>[r[20]||(r[20]=g(" 已推送 ",-1)),p("b",null,x(e.webdav.status.itemsPushed),1),r[21]||(r[21]=g(" · 已跳过 ",-1)),p("b",null,x(e.webdav.status.itemsSkipped),1),r[22]||(r[22]=g(" · 已删除 ",-1)),p("b",null,x(e.webdav.status.itemsDeleted),1)]),_:1}),e.webdav.status.lastRunError?(u(),P(O,{key:0,label:"错误",span:2},{default:o(()=>[p("span",ve,x(e.webdav.status.lastRunError),1)]),_:1})):b("v-if",!0)]),_:1})])):b("v-if",!0)]),_:1}),b(" Git 仓库配置段 (Phase 3c.5) "),a(L,{style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{title:o(()=>[a(_,null,{default:o(()=>[a(e.BranchesOutlined),r[23]||(r[23]=p("span",null,"Git 仓库",-1))]),_:1})]),extra:o(()=>[a(R,{color:e.gitcfg.configured&&e.gitcfg.form.enabled?"green":"default"},{default:o(()=>[g(x(e.gitcfg.configured?e.gitcfg.form.enabled?"已启用":"已配置未启用":"未配置"),1)]),_:1},8,["color"])]),default:o(()=>[a(U,{model:e.gitcfg.form,layout:"vertical",disabled:e.gitcfg.saving},{default:o(()=>[a(S,{gutter:16},{default:o(()=>[a(y,{xs:24,sm:12},{default:o(()=>[a(m,{label:"启用 Git 同步"},{default:o(()=>[a(z,{checked:e.gitcfg.form.enabled,"onUpdate:checked":r[4]||(r[4]=s=>e.gitcfg.form.enabled=s)},null,8,["checked"])]),_:1})]),_:1}),a(y,{xs:24,sm:12},{default:o(()=>[a(m,{label:"自动同步"},{default:o(()=>[a(z,{checked:e.gitcfg.form.autoSync,"onUpdate:checked":r[5]||(r[5]=s=>e.gitcfg.form.autoSync=s)},null,8,["checked"])]),_:1})]),_:1})]),_:1}),a(m,{label:"远程仓库 URL"},{default:o(()=>[a(h,{value:e.gitcfg.form.remoteUrl,"onUpdate:value":r[6]||(r[6]=s=>e.gitcfg.form.remoteUrl=s),placeholder:"https://github.com/user/repo.git","allow-clear":""},null,8,["value"])]),_:1}),a(m,{label:"本地仓库路径"},{default:o(()=>[a(h,{value:e.gitcfg.form.repoPath,"onUpdate:value":r[7]||(r[7]=s=>e.gitcfg.form.repoPath=s),placeholder:"留空使用默认 (userData/git-repo)","allow-clear":""},null,8,["value"])]),_:1}),a(S,{gutter:16},{default:o(()=>[a(y,{xs:24,sm:12},{default:o(()=>[a(m,{label:"作者名"},{default:o(()=>[a(h,{value:e.gitcfg.form.authorName,"onUpdate:value":r[8]||(r[8]=s=>e.gitcfg.form.authorName=s),placeholder:"ChainlessChain User","allow-clear":""},null,8,["value"])]),_:1})]),_:1}),a(y,{xs:24,sm:12},{default:o(()=>[a(m,{label:"作者邮箱"},{default:o(()=>[a(h,{value:e.gitcfg.form.authorEmail,"onUpdate:value":r[9]||(r[9]=s=>e.gitcfg.form.authorEmail=s),placeholder:"user@chainlesschain.com","allow-clear":""},null,8,["value"])]),_:1})]),_:1})]),_:1}),a(S,{gutter:16},{default:o(()=>[a(y,{xs:24,sm:12},{default:o(()=>[a(m,{label:"用户名"},{default:o(()=>[a(h,{value:e.gitcfg.form.username,"onUpdate:value":r[10]||(r[10]=s=>e.gitcfg.form.username=s),placeholder:"GitHub 用户名 / 邮箱","allow-clear":""},null,8,["value"])]),_:1})]),_:1}),a(y,{xs:24,sm:12},{default:o(()=>[a(m,{label:"密码 / Token",help:e.gitcfg.configured&&!e.gitcfg.form.password?"留空则沿用已保存的值":""},{default:o(()=>[a(A,{value:e.gitcfg.form.password,"onUpdate:value":r[11]||(r[11]=s=>e.gitcfg.form.password=s),placeholder:e.gitcfg.configured?e.gitcfg.maskedPassword||"(已保存,留空保持不变)":"Personal Access Token 或密码",autocomplete:"new-password"},null,8,["value","placeholder"])]),_:1},8,["help"])]),_:1})]),_:1}),a(N,{type:"warning","show-icon":"",message:"Git 凭证当前以明文存储在 git-config.json — 建议使用 Personal Access Token 而非账号密码,且 token 范围尽量收敛 (repo 即可)。",style:{"margin-bottom":"16px"}}),a(_,{wrap:""},{default:o(()=>[a(w,{type:"primary",loading:e.gitcfg.saving,onClick:e.gitConfigSave},{default:o(()=>[...r[24]||(r[24]=[g("保存",-1)])]),_:1},8,["loading"]),e.gitcfg.configured?(u(),P(E,{key:0,title:"确定要清除 Git 凭证吗?远程仓库 URL / 路径会保留。","ok-text":"清除","cancel-text":"取消",onConfirm:e.gitConfigClear},{default:o(()=>[a(w,{danger:""},{default:o(()=>[...r[25]||(r[25]=[g("清除凭证",-1)])]),_:1})]),_:1})):b("v-if",!0)]),_:1})]),_:1},8,["model","disabled"])]),_:1}),b(" 状态卡片 "),a(L,{style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{title:o(()=>[a(_,null,{default:o(()=>[a(e.CloudSyncOutlined),r[26]||(r[26]=p("span",null,"同步状态",-1))]),_:1})]),extra:o(()=>[a(R,{color:e.conflicts>0?"red":e.synced>0?"green":"default"},{default:o(()=>[g(x(e.conflicts>0?`${e.conflicts} 个冲突`:e.totalResources===0?"无资源":"正常"),1)]),_:1},8,["color"])]),default:o(()=>[e.statusLoading?(u(),C("div",pe,[a(n)])):(u(),P(S,{key:1,gutter:[16,16]},{default:o(()=>[a(y,{xs:12,sm:6},{default:o(()=>[a(D,{title:"资源总数",value:e.totalResources,"value-style":{fontSize:"20px"}},null,8,["value"])]),_:1}),a(y,{xs:12,sm:6},{default:o(()=>[a(D,{title:"待同步",value:e.pending,"value-style":{color:e.pending>0?"#faad14":"#888",fontSize:"20px"}},null,8,["value","value-style"])]),_:1}),a(y,{xs:12,sm:6},{default:o(()=>[a(D,{title:"已同步",value:e.synced,"value-style":{color:e.synced>0?"#52c41a":"#888",fontSize:"20px"}},null,8,["value","value-style"])]),_:1}),a(y,{xs:12,sm:6},{default:o(()=>[a(D,{title:"冲突",value:e.conflicts,"value-style":{color:e.conflicts>0?"#ff4d4f":"#888",fontSize:"20px"}},null,8,["value","value-style"])]),_:1})]),_:1})),e.statusError?(u(),C("div",we,x(e.statusError),1)):b("v-if",!0)]),_:1}),b(" 操作 "),a(L,{style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{title:o(()=>[a(_,null,{default:o(()=>[a(e.CloudUploadOutlined),r[27]||(r[27]=p("span",null,"同步操作",-1))]),_:1})]),default:o(()=>[a(_,null,{default:o(()=>[a(w,{type:"primary",loading:e.pushLoading,onClick:e.doPush},{icon:o(()=>[a(e.CloudUploadOutlined)]),default:o(()=>[r[28]||(r[28]=g(" 推送本地变更 (push) ",-1))]),_:1},8,["loading"]),a(w,{loading:e.pullLoading,onClick:e.doPull},{icon:o(()=>[a(e.CloudDownloadOutlined)]),default:o(()=>[r[29]||(r[29]=g(" 拉取远程变更 (pull) ",-1))]),_:1},8,["loading"])]),_:1}),e.lastActionResult?(u(),C("div",be,[p("div",_e," 最近一次操作 ("+x(e.lastActionLabel)+") ",1),p("pre",ke,x(e.lastActionResult),1)])):b("v-if",!0)]),_:1}),b(" 冲突列表 "),e.conflicts>0?(u(),P(L,{key:0,style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{title:o(()=>[a(_,null,{default:o(()=>[a(e.WarningOutlined,{style:{color:"#ff4d4f"}}),r[30]||(r[30]=p("span",null,"待解决冲突",-1))]),_:1})]),default:o(()=>[e.conflictsLoading?(u(),C("div",he,[a(n)])):e.conflictList.length===0?(u(),P(B,{key:1,description:"没有详细冲突数据"})):(u(),P(j,{key:2,columns:e.conflictColumns,"data-source":e.conflictList,pagination:{pageSize:10},size:"small","row-key":"id"},{bodyCell:o(({column:s,record:W})=>[s.key==="action"?(u(),P(_,{key:0},{default:o(()=>[a(w,{size:"small",type:"link",onClick:J=>e.resolveOne(W.id,"local")},{default:o(()=>[...r[31]||(r[31]=[g("用本地版本",-1)])]),_:1},8,["onClick"]),a(w,{size:"small",type:"link",onClick:J=>e.resolveOne(W.id,"remote")},{default:o(()=>[...r[32]||(r[32]=[g("用远程版本",-1)])]),_:1},8,["onClick"])]),_:2},1024)):b("v-if",!0)]),_:1},8,["data-source"]))]),_:1})):b("v-if",!0)])}const Re=te(de,[["render",xe],["__scopeId","data-v-0e30ca29"],["__file","/tmp/cc-web-panel-Hs0OhX/repo/packages/web-panel/src/views/SyncSettings.vue"]]);export{Re as default};
1
+ import{I as f,J as C,U as p,c as a,K as o,V as b,S as P,o as Q,b as G,a as q,r as k,P as u,Q as g,R as x}from"./vendor-BvqAck49.js";import{_ as te,u as X,d as i}from"./index-qW3-iWXU.js";import{a1 as oe,am as re,au as le,z as ne,av as se,R as ie}from"./icons-DP3uiYxy.js";const de={__name:"SyncSettings",setup(Y,{expose:r}){r();const v=X(),e=k(!1),V=k(""),I=k(0),w=k(0),N=k(0),_=k(0),R=k(!1),h=k(!1),m=k(""),y=k(""),A=k(!1),S=k([]),E=[{title:"ID",dataIndex:"id",key:"id",width:220,ellipsis:!0},{title:"资源 ID",dataIndex:"resource_id",key:"resource_id",ellipsis:!0},{title:"类型",dataIndex:"resource_type",key:"resource_type",width:120},{title:"操作",key:"action",width:200}];async function U(){e.value=!0,V.value="";try{const t=await v.sendRaw({type:"sync.status"},15e3),l=t?.result;if(!t?.ok||!l?.success)throw new Error(l?.error||t?.error||"获取失败");I.value=Number(l.totalResources??0),w.value=Number(l.pending??0),N.value=Number(l.synced??0),_.value=Number(l.conflicts??0),_.value>0?await O():S.value=[]}catch(t){V.value="获取状态失败:"+(t?.message||String(t))}finally{e.value=!1}}async function O(){A.value=!0;try{const t=await v.sendRaw({type:"sync.conflicts"},15e3),l=Array.isArray(t?.result?.conflicts)?t.result.conflicts:[];S.value=l}catch{S.value=[]}finally{A.value=!1}}async function T(){R.value=!0,y.value="sync.push";try{const t=await v.sendRaw({type:"sync.push"},6e4),l=t?.result;m.value=JSON.stringify(l,null,2),t?.ok&&l?.success?(i.success(`推送完成 (${l.pushed??0} / ${l.total??0})`),await U()):i.error("推送失败:"+(l?.error||t?.error||""))}catch(t){m.value=t?.message||String(t),i.error("推送失败:"+(t?.message||""))}finally{R.value=!1}}async function L(){h.value=!0,y.value="sync.pull";try{const t=await v.sendRaw({type:"sync.pull"},6e4),l=t?.result;m.value=JSON.stringify(l,null,2),t?.ok&&l?.success?(i.success(`拉取完成 (检查 ${l.checked??0}, 更新 ${l.updated??0})`),await U()):i.error("拉取失败:"+(l?.error||t?.error||""))}catch(t){m.value=t?.message||String(t),i.error("拉取失败:"+(t?.message||""))}finally{h.value=!1}}async function z(t,l){try{const c=await v.sendRaw({type:"sync.resolve",conflictId:t,side:l},3e4),K=c?.result;c?.ok&&K?.success?(i.success(`已用${l==="local"?"本地":"远程"}版本解决`),await U()):i.error("解决失败:"+(K?.error||c?.error||""))}catch(c){i.error("解决失败:"+(c?.message||""))}}const n=q({configured:!1,maskedPassword:"",form:{url:"",username:"",password:"",remotePath:"/chainlesschain"},status:null,saving:!1,testing:!1,running:!1,busy:G(()=>n.saving||n.testing||n.running)}),D=G(()=>{const t=n.status?.lastRunStatus;return t==="success"?"green":t==="conflict"?"orange":t==="failed"?"red":"default"}),B=G(()=>{const t=n.status?.lastRunStatus;return t?t==="success"?"成功":t==="conflict"?"有冲突跳过":t==="failed"?"失败":t:n.configured?"已配置":"未配置"});function j(t){const l=new Date(t);return`${l.toLocaleDateString()} ${l.toLocaleTimeString()}`}async function s(){try{const t=await v.sendRaw({type:"sync.webdav.config-get"},1e4);if(!t||t.ok===!1)return;const l=t.result?.data||{};n.form.url=l.url||"",n.form.username=l.username||"",n.form.remotePath=l.remotePath||"/chainlesschain",n.form.password="",n.maskedPassword=l.password||"",n.configured=!!l.configured,n.status=l.status||null}catch(t){console.warn("[SyncSettings] webdav.config-get failed:",t?.message)}}async function W(){n.saving=!0;try{const t=await v.sendRaw({type:"sync.webdav.config-set",payload:{url:n.form.url.trim(),username:n.form.username,password:n.form.password,remotePath:n.form.remotePath||"/"}},15e3),l=t?.result;t?.ok&&l?.success?(i.success("WebDAV 配置已保存"),n.form.password="",await s()):i.error("保存失败:"+(l?.error||t?.error||"未知错误"))}catch(t){i.error("保存失败:"+(t?.message||""))}finally{n.saving=!1}}async function J(){n.form.url&&n.form.password&&!n.configured&&await W(),n.testing=!0;try{const t=await v.sendRaw({type:"sync.webdav.test"},3e4),l=t?.result;t?.ok&&l?.success?i.success("WebDAV 连接成功"):i.error("连接失败:"+(l?.error||t?.error||"未知错误"))}catch(t){i.error("连接失败:"+(t?.message||""))}finally{n.testing=!1}}async function Z(){n.running=!0;try{const t=await v.sendRaw({type:"sync.webdav.run"},3e5),l=t?.result;if(t?.ok&&l?.success){const c=`推送 ${l.pushed} / 跳过 ${l.skipped} / 删除 ${l.deleted}`;l.status==="conflict"?i.warning("同步完成(有跳过):"+c):i.success("同步完成:"+c)}else i.error("同步失败:"+(l?.error||t?.error||"未知错误"));await s()}catch(t){i.error("同步失败:"+(t?.message||""))}finally{n.running=!1}}async function $(){try{const t=await v.sendRaw({type:"sync.webdav.config-clear"},5e3),l=t?.result;t?.ok&&l?.success?(i.success("已清除 WebDAV 凭证"),n.form.url="",n.form.username="",n.form.password="",n.form.remotePath="/chainlesschain",n.configured=!1,n.maskedPassword="",n.status=null):i.error("清除失败:"+(l?.error||t?.error||"未知错误"))}catch(t){i.error("清除失败:"+(t?.message||""))}}const d=q({configured:!1,maskedPassword:"",saving:!1,form:{enabled:!1,autoSync:!1,remoteUrl:"",repoPath:"",authorName:"",authorEmail:"",username:"",password:""}});async function M(){try{const t=await v.sendRaw({type:"git.config-get"},1e4);if(!t||t.ok===!1)return;const l=t.result;if(!l?.success)return;const c=l.data||{};d.form.enabled=!!c.enabled,d.form.autoSync=!!c.autoSync,d.form.remoteUrl=c.remoteUrl||"",d.form.repoPath=c.repoPath||"",d.form.authorName=c.authorName||"",d.form.authorEmail=c.authorEmail||"",d.form.username=c.auth?.username||"",d.form.password="",d.maskedPassword=c.auth?.password||c.auth?.token||"",d.configured=!!c.configured}catch(t){console.warn("[SyncSettings] git.config-get failed:",t?.message)}}async function ee(){d.saving=!0;try{const t={enabled:d.form.enabled,autoSync:d.form.autoSync,remoteUrl:d.form.remoteUrl.trim(),repoPath:d.form.repoPath.trim(),authorName:d.form.authorName,authorEmail:d.form.authorEmail,auth:{username:d.form.username,password:d.form.password}},l=await v.sendRaw({type:"git.config-set",payload:t},15e3),c=l?.result;l?.ok&&c?.success?(i.success("Git 配置已保存"),d.form.password="",await M()):i.error("保存失败:"+(c?.error||l?.error||"未知错误"))}catch(t){i.error("保存失败:"+(t?.message||""))}finally{d.saving=!1}}async function ae(){try{const t=await v.sendRaw({type:"git.config-clear"},5e3),l=t?.result;t?.ok&&l?.success?(i.success("已清除 Git 凭证"),d.form.username="",d.form.password="",d.form.enabled=!1,d.maskedPassword="",d.configured=!1):i.error("清除失败:"+(l?.error||t?.error||"未知错误"))}catch(t){i.error("清除失败:"+(t?.message||""))}}async function F(){await Promise.all([U(),s(),M()])}Q(F);const H={ws:v,statusLoading:e,statusError:V,totalResources:I,pending:w,synced:N,conflicts:_,pushLoading:R,pullLoading:h,lastActionResult:m,lastActionLabel:y,conflictsLoading:A,conflictList:S,conflictColumns:E,fetchStatus:U,fetchConflicts:O,doPush:T,doPull:L,resolveOne:z,webdav:n,webdavStatusColor:D,webdavStatusLabel:B,formatTime:j,webdavLoad:s,webdavSave:W,webdavTest:J,webdavRun:Z,webdavClear:$,gitcfg:d,gitConfigLoad:M,gitConfigSave:ee,gitConfigClear:ae,refreshAll:F,ref:k,reactive:q,computed:G,onMounted:Q,get message(){return i},get ReloadOutlined(){return ie},get CloudSyncOutlined(){return se},get CloudUploadOutlined(){return ne},get CloudDownloadOutlined(){return le},get WarningOutlined(){return re},get BranchesOutlined(){return oe},get useWsStore(){return X}};return Object.defineProperty(H,"__isScriptSetup",{enumerable:!1,value:!0}),H}},ce={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},ue={key:0,style:{"margin-top":"16px"}},fe={key:0},me={key:1,style:{color:"var(--text-secondary)"}},ge={key:0},ye={key:1,style:{color:"var(--text-secondary)"}},ve={style:{color:"#ff4d4f","word-break":"break-all"}},pe={key:0,style:{"text-align":"center",padding:"30px"}},we={key:2,style:{"margin-top":"12px",color:"#ff4d4f","font-size":"12px"}},be={key:0,style:{"margin-top":"16px"}},_e={style:{color:"var(--text-secondary)","font-size":"11px","margin-bottom":"6px"}},ke={style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","border-radius":"6px",padding:"12px",color:"var(--text-primary)","font-size":"12px","max-height":"200px","overflow-y":"auto","white-space":"pre-wrap","font-family":"'Cascadia Code', 'Fira Code', Consolas, monospace"}},he={key:0,style:{"text-align":"center",padding:"30px"}};function xe(Y,r,v,e,V,I){const w=f("a-button"),N=f("a-alert"),_=f("a-space"),R=f("a-tag"),h=f("a-input"),m=f("a-form-item"),y=f("a-col"),A=f("a-input-password"),S=f("a-row"),E=f("a-popconfirm"),U=f("a-form"),O=f("a-descriptions-item"),T=f("a-descriptions"),L=f("a-card"),z=f("a-switch"),n=f("a-spin"),D=f("a-statistic"),B=f("a-empty"),j=f("a-table");return u(),C("div",null,[p("div",ce,[r[13]||(r[13]=p("div",null,[p("h2",{class:"page-title"},"同步设置"),p("p",{class:"page-sub"},"通过 web-shell sync.* WS topic 直连主进程同步引擎")],-1)),a(w,{type:"primary",ghost:"",loading:e.statusLoading,onClick:e.refreshAll},{icon:o(()=>[a(e.ReloadOutlined)]),default:o(()=>[r[12]||(r[12]=g(" 刷新 ",-1))]),_:1},8,["loading"])]),b(` 多 provider / WebDAV 提示(保留:本页 push/pull 仍是 cc CLI 桥;
2
+ WebDAV 已在下面单独段独立支持,由 web-shell 的 sync.webdav.* WS topic 直连主进程)`),a(N,{type:"info","show-icon":"",message:"本页 status / push / pull 通过 web-shell sync.* WS topic 直连 main 进程;WebDAV 在下方独立段",description:"其它 provider(Git / P2P / S3 等)的细粒度配置仍在 V5/V6 桌面 shell。",style:{"margin-bottom":"16px"}}),b(" WebDAV 同步段 (Phase 3c.4 — web-shell parity) "),a(L,{style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{title:o(()=>[a(_,null,{default:o(()=>[a(e.CloudSyncOutlined),r[14]||(r[14]=p("span",null,"WebDAV 网盘同步",-1))]),_:1})]),extra:o(()=>[e.webdav.configured?(u(),P(R,{key:0,color:e.webdavStatusColor},{default:o(()=>[g(x(e.webdavStatusLabel),1)]),_:1},8,["color"])):(u(),P(R,{key:1,color:"default"},{default:o(()=>[...r[15]||(r[15]=[g("未配置",-1)])]),_:1}))]),default:o(()=>[a(U,{model:e.webdav.form,layout:"vertical",disabled:e.webdav.busy},{default:o(()=>[a(m,{label:"服务器 URL",required:""},{default:o(()=>[a(h,{value:e.webdav.form.url,"onUpdate:value":r[0]||(r[0]=s=>e.webdav.form.url=s),placeholder:"https://dav.jianguoyun.com/dav/","allow-clear":""},null,8,["value"])]),_:1}),a(S,{gutter:16},{default:o(()=>[a(y,{xs:24,sm:12},{default:o(()=>[a(m,{label:"用户名"},{default:o(()=>[a(h,{value:e.webdav.form.username,"onUpdate:value":r[1]||(r[1]=s=>e.webdav.form.username=s),placeholder:"user@example.com","allow-clear":""},null,8,["value"])]),_:1})]),_:1}),a(y,{xs:24,sm:12},{default:o(()=>[a(m,{label:"密码"},{default:o(()=>[a(A,{value:e.webdav.form.password,"onUpdate:value":r[2]||(r[2]=s=>e.webdav.form.password=s),placeholder:e.webdav.configured?e.webdav.maskedPassword||"(已保存,留空保持不变)":"请输入密码",autocomplete:"new-password"},null,8,["value","placeholder"])]),_:1})]),_:1})]),_:1}),a(m,{label:"远端路径"},{default:o(()=>[a(h,{value:e.webdav.form.remotePath,"onUpdate:value":r[3]||(r[3]=s=>e.webdav.form.remotePath=s),placeholder:"/chainlesschain","allow-clear":""},null,8,["value"])]),_:1}),a(_,{wrap:""},{default:o(()=>[a(w,{type:"primary",loading:e.webdav.saving,onClick:e.webdavSave},{default:o(()=>[...r[16]||(r[16]=[g("保存",-1)])]),_:1},8,["loading"]),a(w,{loading:e.webdav.testing,onClick:e.webdavTest},{default:o(()=>[...r[17]||(r[17]=[g("测试连接",-1)])]),_:1},8,["loading"]),a(w,{type:"primary",loading:e.webdav.running,disabled:!e.webdav.configured,onClick:e.webdavRun},{icon:o(()=>[a(e.CloudUploadOutlined)]),default:o(()=>[r[18]||(r[18]=g(" 立即同步 ",-1))]),_:1},8,["loading","disabled"]),e.webdav.configured?(u(),P(E,{key:0,title:"确定要清除 WebDAV 凭证吗?已推送到远端的文件不会被删除。","ok-text":"清除","cancel-text":"取消",onConfirm:e.webdavClear},{default:o(()=>[a(w,{danger:""},{default:o(()=>[...r[19]||(r[19]=[g("断开连接",-1)])]),_:1})]),_:1})):b("v-if",!0)]),_:1})]),_:1},8,["model","disabled"]),e.webdav.status?(u(),C("div",ue,[a(T,{column:2,size:"small",bordered:""},{default:o(()=>[a(O,{label:"上次同步"},{default:o(()=>[e.webdav.status.lastSyncAt?(u(),C("span",fe,x(e.formatTime(e.webdav.status.lastSyncAt)),1)):(u(),C("span",me,"未同步过"))]),_:1}),a(O,{label:"耗时"},{default:o(()=>[e.webdav.status.lastRunDurationMs!=null?(u(),C("span",ge,x(e.webdav.status.lastRunDurationMs)+" ms",1)):(u(),C("span",ye,"—"))]),_:1}),a(O,{label:"累积推送",span:2},{default:o(()=>[r[20]||(r[20]=g(" 已推送 ",-1)),p("b",null,x(e.webdav.status.itemsPushed),1),r[21]||(r[21]=g(" · 已跳过 ",-1)),p("b",null,x(e.webdav.status.itemsSkipped),1),r[22]||(r[22]=g(" · 已删除 ",-1)),p("b",null,x(e.webdav.status.itemsDeleted),1)]),_:1}),e.webdav.status.lastRunError?(u(),P(O,{key:0,label:"错误",span:2},{default:o(()=>[p("span",ve,x(e.webdav.status.lastRunError),1)]),_:1})):b("v-if",!0)]),_:1})])):b("v-if",!0)]),_:1}),b(" Git 仓库配置段 (Phase 3c.5) "),a(L,{style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{title:o(()=>[a(_,null,{default:o(()=>[a(e.BranchesOutlined),r[23]||(r[23]=p("span",null,"Git 仓库",-1))]),_:1})]),extra:o(()=>[a(R,{color:e.gitcfg.configured&&e.gitcfg.form.enabled?"green":"default"},{default:o(()=>[g(x(e.gitcfg.configured?e.gitcfg.form.enabled?"已启用":"已配置未启用":"未配置"),1)]),_:1},8,["color"])]),default:o(()=>[a(U,{model:e.gitcfg.form,layout:"vertical",disabled:e.gitcfg.saving},{default:o(()=>[a(S,{gutter:16},{default:o(()=>[a(y,{xs:24,sm:12},{default:o(()=>[a(m,{label:"启用 Git 同步"},{default:o(()=>[a(z,{checked:e.gitcfg.form.enabled,"onUpdate:checked":r[4]||(r[4]=s=>e.gitcfg.form.enabled=s)},null,8,["checked"])]),_:1})]),_:1}),a(y,{xs:24,sm:12},{default:o(()=>[a(m,{label:"自动同步"},{default:o(()=>[a(z,{checked:e.gitcfg.form.autoSync,"onUpdate:checked":r[5]||(r[5]=s=>e.gitcfg.form.autoSync=s)},null,8,["checked"])]),_:1})]),_:1})]),_:1}),a(m,{label:"远程仓库 URL"},{default:o(()=>[a(h,{value:e.gitcfg.form.remoteUrl,"onUpdate:value":r[6]||(r[6]=s=>e.gitcfg.form.remoteUrl=s),placeholder:"https://github.com/user/repo.git","allow-clear":""},null,8,["value"])]),_:1}),a(m,{label:"本地仓库路径"},{default:o(()=>[a(h,{value:e.gitcfg.form.repoPath,"onUpdate:value":r[7]||(r[7]=s=>e.gitcfg.form.repoPath=s),placeholder:"留空使用默认 (userData/git-repo)","allow-clear":""},null,8,["value"])]),_:1}),a(S,{gutter:16},{default:o(()=>[a(y,{xs:24,sm:12},{default:o(()=>[a(m,{label:"作者名"},{default:o(()=>[a(h,{value:e.gitcfg.form.authorName,"onUpdate:value":r[8]||(r[8]=s=>e.gitcfg.form.authorName=s),placeholder:"ChainlessChain User","allow-clear":""},null,8,["value"])]),_:1})]),_:1}),a(y,{xs:24,sm:12},{default:o(()=>[a(m,{label:"作者邮箱"},{default:o(()=>[a(h,{value:e.gitcfg.form.authorEmail,"onUpdate:value":r[9]||(r[9]=s=>e.gitcfg.form.authorEmail=s),placeholder:"user@chainlesschain.com","allow-clear":""},null,8,["value"])]),_:1})]),_:1})]),_:1}),a(S,{gutter:16},{default:o(()=>[a(y,{xs:24,sm:12},{default:o(()=>[a(m,{label:"用户名"},{default:o(()=>[a(h,{value:e.gitcfg.form.username,"onUpdate:value":r[10]||(r[10]=s=>e.gitcfg.form.username=s),placeholder:"GitHub 用户名 / 邮箱","allow-clear":""},null,8,["value"])]),_:1})]),_:1}),a(y,{xs:24,sm:12},{default:o(()=>[a(m,{label:"密码 / Token",help:e.gitcfg.configured&&!e.gitcfg.form.password?"留空则沿用已保存的值":""},{default:o(()=>[a(A,{value:e.gitcfg.form.password,"onUpdate:value":r[11]||(r[11]=s=>e.gitcfg.form.password=s),placeholder:e.gitcfg.configured?e.gitcfg.maskedPassword||"(已保存,留空保持不变)":"Personal Access Token 或密码",autocomplete:"new-password"},null,8,["value","placeholder"])]),_:1},8,["help"])]),_:1})]),_:1}),a(N,{type:"warning","show-icon":"",message:"Git 凭证当前以明文存储在 git-config.json — 建议使用 Personal Access Token 而非账号密码,且 token 范围尽量收敛 (repo 即可)。",style:{"margin-bottom":"16px"}}),a(_,{wrap:""},{default:o(()=>[a(w,{type:"primary",loading:e.gitcfg.saving,onClick:e.gitConfigSave},{default:o(()=>[...r[24]||(r[24]=[g("保存",-1)])]),_:1},8,["loading"]),e.gitcfg.configured?(u(),P(E,{key:0,title:"确定要清除 Git 凭证吗?远程仓库 URL / 路径会保留。","ok-text":"清除","cancel-text":"取消",onConfirm:e.gitConfigClear},{default:o(()=>[a(w,{danger:""},{default:o(()=>[...r[25]||(r[25]=[g("清除凭证",-1)])]),_:1})]),_:1})):b("v-if",!0)]),_:1})]),_:1},8,["model","disabled"])]),_:1}),b(" 状态卡片 "),a(L,{style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{title:o(()=>[a(_,null,{default:o(()=>[a(e.CloudSyncOutlined),r[26]||(r[26]=p("span",null,"同步状态",-1))]),_:1})]),extra:o(()=>[a(R,{color:e.conflicts>0?"red":e.synced>0?"green":"default"},{default:o(()=>[g(x(e.conflicts>0?`${e.conflicts} 个冲突`:e.totalResources===0?"无资源":"正常"),1)]),_:1},8,["color"])]),default:o(()=>[e.statusLoading?(u(),C("div",pe,[a(n)])):(u(),P(S,{key:1,gutter:[16,16]},{default:o(()=>[a(y,{xs:12,sm:6},{default:o(()=>[a(D,{title:"资源总数",value:e.totalResources,"value-style":{fontSize:"20px"}},null,8,["value"])]),_:1}),a(y,{xs:12,sm:6},{default:o(()=>[a(D,{title:"待同步",value:e.pending,"value-style":{color:e.pending>0?"#faad14":"#888",fontSize:"20px"}},null,8,["value","value-style"])]),_:1}),a(y,{xs:12,sm:6},{default:o(()=>[a(D,{title:"已同步",value:e.synced,"value-style":{color:e.synced>0?"#52c41a":"#888",fontSize:"20px"}},null,8,["value","value-style"])]),_:1}),a(y,{xs:12,sm:6},{default:o(()=>[a(D,{title:"冲突",value:e.conflicts,"value-style":{color:e.conflicts>0?"#ff4d4f":"#888",fontSize:"20px"}},null,8,["value","value-style"])]),_:1})]),_:1})),e.statusError?(u(),C("div",we,x(e.statusError),1)):b("v-if",!0)]),_:1}),b(" 操作 "),a(L,{style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{title:o(()=>[a(_,null,{default:o(()=>[a(e.CloudUploadOutlined),r[27]||(r[27]=p("span",null,"同步操作",-1))]),_:1})]),default:o(()=>[a(_,null,{default:o(()=>[a(w,{type:"primary",loading:e.pushLoading,onClick:e.doPush},{icon:o(()=>[a(e.CloudUploadOutlined)]),default:o(()=>[r[28]||(r[28]=g(" 推送本地变更 (push) ",-1))]),_:1},8,["loading"]),a(w,{loading:e.pullLoading,onClick:e.doPull},{icon:o(()=>[a(e.CloudDownloadOutlined)]),default:o(()=>[r[29]||(r[29]=g(" 拉取远程变更 (pull) ",-1))]),_:1},8,["loading"])]),_:1}),e.lastActionResult?(u(),C("div",be,[p("div",_e," 最近一次操作 ("+x(e.lastActionLabel)+") ",1),p("pre",ke,x(e.lastActionResult),1)])):b("v-if",!0)]),_:1}),b(" 冲突列表 "),e.conflicts>0?(u(),P(L,{key:0,style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{title:o(()=>[a(_,null,{default:o(()=>[a(e.WarningOutlined,{style:{color:"#ff4d4f"}}),r[30]||(r[30]=p("span",null,"待解决冲突",-1))]),_:1})]),default:o(()=>[e.conflictsLoading?(u(),C("div",he,[a(n)])):e.conflictList.length===0?(u(),P(B,{key:1,description:"没有详细冲突数据"})):(u(),P(j,{key:2,columns:e.conflictColumns,"data-source":e.conflictList,pagination:{pageSize:10},size:"small","row-key":"id"},{bodyCell:o(({column:s,record:W})=>[s.key==="action"?(u(),P(_,{key:0},{default:o(()=>[a(w,{size:"small",type:"link",onClick:J=>e.resolveOne(W.id,"local")},{default:o(()=>[...r[31]||(r[31]=[g("用本地版本",-1)])]),_:1},8,["onClick"]),a(w,{size:"small",type:"link",onClick:J=>e.resolveOne(W.id,"remote")},{default:o(()=>[...r[32]||(r[32]=[g("用远程版本",-1)])]),_:1},8,["onClick"])]),_:2},1024)):b("v-if",!0)]),_:1},8,["data-source"]))]),_:1})):b("v-if",!0)])}const Re=te(de,[["render",xe],["__scopeId","data-v-0e30ca29"],["__file","/tmp/cc-web-panel-DGmtsL/repo/packages/web-panel/src/views/SyncSettings.vue"]]);export{Re as default};
@@ -1 +1 @@
1
- import{E as V,b as z,r as D,I as p,J as c,U as _,c as n,K as a,S as T,V as w,o as P,x as I,P as i,Q as g,R as r,F as h,Z as B}from"./vendor-BvqAck49.js";import{u as R,_ as F}from"./index-BR-DF81e.js";import{R as E}from"./icons-DP3uiYxy.js";const O=V("tasks",()=>{const k=D([]),l=D(!1);let u=null,e=null;const x=z(()=>k.value.filter(t=>t.status==="running")),b=z(()=>k.value.filter(t=>t.status==="pending")),y=z(()=>k.value.filter(t=>t.status==="completed"||t.status==="failed"||t.status==="timeout"));async function f(){const t=R();l.value=!0;try{const s=await t.sendRaw({type:"tasks-list"});s&&Array.isArray(s.tasks)&&(k.value=s.tasks)}catch{}finally{l.value=!1}}async function o(t){const s=R();try{await s.sendRaw({type:"tasks-stop",taskId:t})}catch{}finally{await f()}}const d=D(null);function m(t=5e3){v(),f(),u=setInterval(f,t),C()}function v(){u&&(clearInterval(u),u=null),e&&(e(),e=null)}function C(){const t=R();if(e)return;const s=S=>{S.type==="task:notification"&&S.payload?.task&&(d.value=S.payload.task,f(),setTimeout(()=>{d.value=null},8e3))};e=t.onRuntimeEvent(s)}function N(t){return!t||t<0?"-":t<1e3?`${t}ms`:t<6e4?`${(t/1e3).toFixed(1)}s`:`${(t/6e4).toFixed(1)}m`}function A(t){switch(t){case"running":return"processing";case"pending":return"default";case"completed":return"success";case"failed":return"error";case"timeout":return"warning";default:return"default"}}return{tasks:k,loading:l,running:x,pending:b,completed:y,lastNotification:d,fetchTasks:f,stopTask:o,startPolling:m,stopPolling:v,formatDuration:N,getStatusColor:A}}),U={__name:"Tasks",setup(k,{expose:l}){l();const u=O(),e=[{title:"状态",key:"status",width:90},{title:"描述",key:"description",ellipsis:!0},{title:"类型",dataIndex:"type",width:100},{title:"耗时",key:"duration",width:90},{title:"创建时间",key:"createdAt",width:180},{title:"结果",key:"result",ellipsis:!0},{title:"操作",key:"action",width:80}];function x(o){return o.status==="running"&&o.startedAt?u.formatDuration(Date.now()-o.startedAt):o.completedAt&&o.startedAt?u.formatDuration(o.completedAt-o.startedAt):"-"}function b(o){return o?new Date(o).toLocaleString():"-"}function y(o,d){return o?o.length>d?`${o.slice(0,d)}...`:o:""}P(()=>u.startPolling(5e3)),I(()=>u.stopPolling());const f={store:u,columns:e,getDuration:x,formatTime:b,truncate:y,onMounted:P,onUnmounted:I,get ReloadOutlined(){return E},get useTasksStore(){return O}};return Object.defineProperty(f,"__isScriptSetup",{enumerable:!1,value:!0}),f}},L={class:"page-header"},j={key:0,class:"error-text"},H={key:1},J={class:"task-header"},K={class:"task-desc"},M={class:"task-id"},Q={class:"task-meta"},W=["title"],X={key:0,class:"error-text"},Z={key:1,class:"success-text"},q={key:2,class:"muted-text"};function G(k,l,u,e,x,b){const y=p("a-button"),f=p("a-space"),o=p("a-alert"),d=p("a-statistic"),m=p("a-card"),v=p("a-col"),C=p("a-row"),N=p("a-tag"),A=p("a-table");return i(),c("div",null,[_("div",L,[l[3]||(l[3]=_("div",null,[_("h2",{class:"page-title"},"后台任务"),_("p",{class:"page-sub"},"查看后台任务队列、实时通知和任务执行结果。")],-1)),n(f,null,{default:a(()=>[n(y,{ghost:"",loading:e.store.loading,onClick:l[0]||(l[0]=t=>e.store.fetchTasks())},{icon:a(()=>[n(e.ReloadOutlined)]),default:a(()=>[l[2]||(l[2]=g(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),e.store.lastNotification?(i(),T(o,{key:0,type:e.store.lastNotification.status==="completed"?"success":"error","show-icon":"",closable:"",class:"banner",onClose:l[1]||(l[1]=t=>e.store.lastNotification=null)},{message:a(()=>[g(" 任务"+r(e.store.lastNotification.status==="completed"?"完成":"结束")+": "+r(e.store.lastNotification.description||e.store.lastNotification.id.slice(0,16)),1)]),description:a(()=>[e.store.lastNotification.error?(i(),c("span",j,r(e.store.lastNotification.error),1)):e.store.lastNotification.result?(i(),c("span",H,r(e.truncate(String(e.store.lastNotification.result),120)),1)):w("v-if",!0)]),_:1},8,["type"])):w("v-if",!0),n(C,{gutter:[16,16],class:"stats-row"},{default:a(()=>[n(v,{xs:12,sm:6},{default:a(()=>[n(m,{class:"stat-card",size:"small"},{default:a(()=>[n(d,{title:"全部任务",value:e.store.tasks.length},null,8,["value"])]),_:1})]),_:1}),n(v,{xs:12,sm:6},{default:a(()=>[n(m,{class:"stat-card",size:"small"},{default:a(()=>[n(d,{title:"运行中",value:e.store.running.length},null,8,["value"])]),_:1})]),_:1}),n(v,{xs:12,sm:6},{default:a(()=>[n(m,{class:"stat-card",size:"small"},{default:a(()=>[n(d,{title:"等待中",value:e.store.pending.length},null,8,["value"])]),_:1})]),_:1}),n(v,{xs:12,sm:6},{default:a(()=>[n(m,{class:"stat-card",size:"small"},{default:a(()=>[n(d,{title:"已完成",value:e.store.completed.length},null,8,["value"])]),_:1})]),_:1})]),_:1}),e.store.running.length>0?(i(),T(m,{key:1,title:"运行中的任务",class:"panel-card",size:"small"},{default:a(()=>[(i(!0),c(h,null,B(e.store.running,t=>(i(),c("div",{key:t.id,class:"task-item running"},[_("div",J,[n(N,{color:e.store.getStatusColor(t.status)},{default:a(()=>[g(r(t.status.toUpperCase()),1)]),_:2},1032,["color"]),_("span",K,r(t.description),1),_("span",M,r(t.id.slice(0,16)),1)]),_("div",Q,[_("span",null,"类型: "+r(t.type||"-"),1),_("span",null,"已运行: "+r(e.store.formatDuration(Date.now()-t.startedAt)),1),n(y,{size:"small",danger:"",onClick:s=>e.store.stopTask(t.id)},{default:a(()=>[...l[4]||(l[4]=[g("停止",-1)])]),_:1},8,["onClick"])])]))),128))]),_:1})):w("v-if",!0),n(m,{class:"panel-card"},{default:a(()=>[n(A,{columns:e.columns,"data-source":e.store.tasks,pagination:{pageSize:15,size:"small"},loading:e.store.loading,"row-key":"id",size:"small"},{bodyCell:a(({column:t,record:s})=>[t.key==="status"?(i(),T(N,{key:0,color:e.store.getStatusColor(s.status)},{default:a(()=>[g(r(s.status),1)]),_:2},1032,["color"])):t.key==="description"?(i(),c("span",{key:1,title:s.command},r(s.description),9,W)):t.key==="duration"?(i(),c(h,{key:2},[g(r(e.getDuration(s)),1)],64)):t.key==="createdAt"?(i(),c(h,{key:3},[g(r(e.formatTime(s.createdAt)),1)],64)):t.key==="result"?(i(),c(h,{key:4},[s.error?(i(),c("span",X,r(e.truncate(s.error,60)),1)):s.result?(i(),c("span",Z,r(e.truncate(String(s.result),60)),1)):(i(),c("span",q,"-"))],64)):t.key==="action"?(i(),c(h,{key:5},[s.status==="running"?(i(),T(y,{key:0,size:"small",danger:"",onClick:S=>e.store.stopTask(s.id)},{default:a(()=>[...l[5]||(l[5]=[g(" 停止 ",-1)])]),_:1},8,["onClick"])):w("v-if",!0)],64)):w("v-if",!0)]),_:1},8,["data-source","loading"])]),_:1})])}const et=F(U,[["render",G],["__scopeId","data-v-da5ff6a2"],["__file","/tmp/cc-web-panel-Hs0OhX/repo/packages/web-panel/src/views/Tasks.vue"]]);export{et as default};
1
+ import{E as B,b as D,r as z,I as p,J as c,U as _,c as n,K as a,S as T,V as w,o as P,x as I,P as i,Q as g,R as r,F as h,Z as F}from"./vendor-BvqAck49.js";import{u as R,_ as O}from"./index-qW3-iWXU.js";import{R as E}from"./icons-DP3uiYxy.js";const V=B("tasks",()=>{const k=z([]),l=z(!1);let u=null,e=null;const x=D(()=>k.value.filter(t=>t.status==="running")),b=D(()=>k.value.filter(t=>t.status==="pending")),y=D(()=>k.value.filter(t=>t.status==="completed"||t.status==="failed"||t.status==="timeout"));async function f(){const t=R();l.value=!0;try{const s=await t.sendRaw({type:"tasks-list"});s&&Array.isArray(s.tasks)&&(k.value=s.tasks)}catch{}finally{l.value=!1}}async function o(t){const s=R();try{await s.sendRaw({type:"tasks-stop",taskId:t})}catch{}finally{await f()}}const d=z(null);function m(t=5e3){v(),f(),u=setInterval(f,t),C()}function v(){u&&(clearInterval(u),u=null),e&&(e(),e=null)}function C(){const t=R();if(e)return;const s=S=>{S.type==="task:notification"&&S.payload?.task&&(d.value=S.payload.task,f(),setTimeout(()=>{d.value=null},8e3))};e=t.onRuntimeEvent(s)}function N(t){return!t||t<0?"-":t<1e3?`${t}ms`:t<6e4?`${(t/1e3).toFixed(1)}s`:`${(t/6e4).toFixed(1)}m`}function A(t){switch(t){case"running":return"processing";case"pending":return"default";case"completed":return"success";case"failed":return"error";case"timeout":return"warning";default:return"default"}}return{tasks:k,loading:l,running:x,pending:b,completed:y,lastNotification:d,fetchTasks:f,stopTask:o,startPolling:m,stopPolling:v,formatDuration:N,getStatusColor:A}}),L={__name:"Tasks",setup(k,{expose:l}){l();const u=V(),e=[{title:"状态",key:"status",width:90},{title:"描述",key:"description",ellipsis:!0},{title:"类型",dataIndex:"type",width:100},{title:"耗时",key:"duration",width:90},{title:"创建时间",key:"createdAt",width:180},{title:"结果",key:"result",ellipsis:!0},{title:"操作",key:"action",width:80}];function x(o){return o.status==="running"&&o.startedAt?u.formatDuration(Date.now()-o.startedAt):o.completedAt&&o.startedAt?u.formatDuration(o.completedAt-o.startedAt):"-"}function b(o){return o?new Date(o).toLocaleString():"-"}function y(o,d){return o?o.length>d?`${o.slice(0,d)}...`:o:""}P(()=>u.startPolling(5e3)),I(()=>u.stopPolling());const f={store:u,columns:e,getDuration:x,formatTime:b,truncate:y,onMounted:P,onUnmounted:I,get ReloadOutlined(){return E},get useTasksStore(){return V}};return Object.defineProperty(f,"__isScriptSetup",{enumerable:!1,value:!0}),f}},U={class:"page-header"},j={key:0,class:"error-text"},G={key:1},J={class:"task-header"},K={class:"task-desc"},M={class:"task-id"},Q={class:"task-meta"},W=["title"],Z={key:0,class:"error-text"},q={key:1,class:"success-text"},H={key:2,class:"muted-text"};function X(k,l,u,e,x,b){const y=p("a-button"),f=p("a-space"),o=p("a-alert"),d=p("a-statistic"),m=p("a-card"),v=p("a-col"),C=p("a-row"),N=p("a-tag"),A=p("a-table");return i(),c("div",null,[_("div",U,[l[3]||(l[3]=_("div",null,[_("h2",{class:"page-title"},"后台任务"),_("p",{class:"page-sub"},"查看后台任务队列、实时通知和任务执行结果。")],-1)),n(f,null,{default:a(()=>[n(y,{ghost:"",loading:e.store.loading,onClick:l[0]||(l[0]=t=>e.store.fetchTasks())},{icon:a(()=>[n(e.ReloadOutlined)]),default:a(()=>[l[2]||(l[2]=g(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),e.store.lastNotification?(i(),T(o,{key:0,type:e.store.lastNotification.status==="completed"?"success":"error","show-icon":"",closable:"",class:"banner",onClose:l[1]||(l[1]=t=>e.store.lastNotification=null)},{message:a(()=>[g(" 任务"+r(e.store.lastNotification.status==="completed"?"完成":"结束")+": "+r(e.store.lastNotification.description||e.store.lastNotification.id.slice(0,16)),1)]),description:a(()=>[e.store.lastNotification.error?(i(),c("span",j,r(e.store.lastNotification.error),1)):e.store.lastNotification.result?(i(),c("span",G,r(e.truncate(String(e.store.lastNotification.result),120)),1)):w("v-if",!0)]),_:1},8,["type"])):w("v-if",!0),n(C,{gutter:[16,16],class:"stats-row"},{default:a(()=>[n(v,{xs:12,sm:6},{default:a(()=>[n(m,{class:"stat-card",size:"small"},{default:a(()=>[n(d,{title:"全部任务",value:e.store.tasks.length},null,8,["value"])]),_:1})]),_:1}),n(v,{xs:12,sm:6},{default:a(()=>[n(m,{class:"stat-card",size:"small"},{default:a(()=>[n(d,{title:"运行中",value:e.store.running.length},null,8,["value"])]),_:1})]),_:1}),n(v,{xs:12,sm:6},{default:a(()=>[n(m,{class:"stat-card",size:"small"},{default:a(()=>[n(d,{title:"等待中",value:e.store.pending.length},null,8,["value"])]),_:1})]),_:1}),n(v,{xs:12,sm:6},{default:a(()=>[n(m,{class:"stat-card",size:"small"},{default:a(()=>[n(d,{title:"已完成",value:e.store.completed.length},null,8,["value"])]),_:1})]),_:1})]),_:1}),e.store.running.length>0?(i(),T(m,{key:1,title:"运行中的任务",class:"panel-card",size:"small"},{default:a(()=>[(i(!0),c(h,null,F(e.store.running,t=>(i(),c("div",{key:t.id,class:"task-item running"},[_("div",J,[n(N,{color:e.store.getStatusColor(t.status)},{default:a(()=>[g(r(t.status.toUpperCase()),1)]),_:2},1032,["color"]),_("span",K,r(t.description),1),_("span",M,r(t.id.slice(0,16)),1)]),_("div",Q,[_("span",null,"类型: "+r(t.type||"-"),1),_("span",null,"已运行: "+r(e.store.formatDuration(Date.now()-t.startedAt)),1),n(y,{size:"small",danger:"",onClick:s=>e.store.stopTask(t.id)},{default:a(()=>[...l[4]||(l[4]=[g("停止",-1)])]),_:1},8,["onClick"])])]))),128))]),_:1})):w("v-if",!0),n(m,{class:"panel-card"},{default:a(()=>[n(A,{columns:e.columns,"data-source":e.store.tasks,pagination:{pageSize:15,size:"small"},loading:e.store.loading,"row-key":"id",size:"small"},{bodyCell:a(({column:t,record:s})=>[t.key==="status"?(i(),T(N,{key:0,color:e.store.getStatusColor(s.status)},{default:a(()=>[g(r(s.status),1)]),_:2},1032,["color"])):t.key==="description"?(i(),c("span",{key:1,title:s.command},r(s.description),9,W)):t.key==="duration"?(i(),c(h,{key:2},[g(r(e.getDuration(s)),1)],64)):t.key==="createdAt"?(i(),c(h,{key:3},[g(r(e.formatTime(s.createdAt)),1)],64)):t.key==="result"?(i(),c(h,{key:4},[s.error?(i(),c("span",Z,r(e.truncate(s.error,60)),1)):s.result?(i(),c("span",q,r(e.truncate(String(s.result),60)),1)):(i(),c("span",H,"-"))],64)):t.key==="action"?(i(),c(h,{key:5},[s.status==="running"?(i(),T(y,{key:0,size:"small",danger:"",onClick:S=>e.store.stopTask(s.id)},{default:a(()=>[...l[5]||(l[5]=[g(" 停止 ",-1)])]),_:1},8,["onClick"])):w("v-if",!0)],64)):w("v-if",!0)]),_:1},8,["data-source","loading"])]),_:1})])}const et=O(L,[["render",X],["__scopeId","data-v-da5ff6a2"],["__file","/tmp/cc-web-panel-DGmtsL/repo/packages/web-panel/src/views/Tasks.vue"]]);export{et as default};
@@ -1 +1 @@
1
- import{I as m,J as I,U as r,R as s,c as a,K as o,V as b,N as G,o as X,a as Y,b as Z,r as u,P as d,F as K,Z as V,S as v,Q as c}from"./vendor-BvqAck49.js";import{_ as pe,b as $,u as ee,d as g}from"./index-BR-DF81e.js";import{u as te}from"./useFs-af0c_HYI.js";import{aL as me,aK as de,ap as ue,aa as ge,aQ as fe,aR as _e,as as ye,a4 as ve,H as xe,a9 as be}from"./icons-DP3uiYxy.js";import"./useShellMode-CgR0wCYM.js";const H="cc_prompt_templates",he={__name:"Templates",setup(oe,{expose:l}){l();const{t:i}=$(),e=ee(),M=G(),A=te(),f=u(!1),h=u(!1),R=u("project"),w=u(""),k=u(null),P=u(!1),S=u(""),F=["code-project","data-science","devops","medical-triage","agriculture-expert","general-assistant","ai-media-creator","ai-doc-creator","empty"],N=Z(()=>F.map(n=>({name:n,description:i(`templates.project.items.${n}`)})));function J(n){S.value=n,P.value=!0}async function E(){P.value=!1;const n=S.value;if(n){w.value=n,k.value=null;try{const p=`init --template ${n} --yes`,{output:z,exitCode:T}=await e.execute(p,3e4);k.value={success:T===0,output:z}}catch(p){k.value={success:!1,output:i("templates.messages.initFailed",{err:p.message})}}finally{w.value=""}}}const B=u(!1),O=u([]),x=u(""),j=u(null);async function L(){B.value=!0;try{const{output:n}=await e.execute("bi templates --json",15e3),p=JSON.parse(n);O.value=Array.isArray(p)?p:p.templates||[]}catch{O.value=[]}finally{B.value=!1}}async function U(n){x.value=n,j.value=null;try{const p=`bi dashboard create --template ${n} --json`,{output:z,exitCode:T}=await e.execute(p,3e4);j.value={success:T===0,output:z}}catch(p){j.value={success:!1,output:i("templates.messages.createFailed",{err:p.message})}}finally{x.value=""}}const t=u([]),C=u(!1),_=Y({name:"",category:"general",content:""});function q(){try{const n=localStorage.getItem(H);t.value=n?JSON.parse(n):[]}catch{t.value=[]}}function D(){localStorage.setItem(H,JSON.stringify(t.value))}function ae(){!_.name||!_.content||(t.value.push({name:_.name,category:_.category,content:_.content}),D(),Q(),g.success(i("templates.messages.promptSaved")))}function Q(){C.value=!1,_.name="",_.category="general",_.content=""}async function ne(){if(t.value.length){f.value=!0;try{const n=await A.saveJson({schema:1,prompts:t.value},{defaultPath:`prompt-templates-${new Date().toISOString().slice(0,10)}.json`});if(n.canceled)return;g.success(n.path?i("templates.messages.exportOk",{count:t.value.length,path:n.path}):i("templates.messages.exportOkDefault"))}catch(n){g.error(i("templates.messages.exportFailed",{err:n.message||n}))}finally{f.value=!1}}}async function le(){h.value=!0;try{const n=await A.pickFileText({title:i("templates.prompts.filePickerTitle"),filters:[{name:"JSON",extensions:["json"]}]});if(!n||n.canceled)return;if(n.reason==="too_large"){g.error(i("templates.messages.fileTooLarge"));return}let p;try{p=JSON.parse(n.content||"")}catch(y){g.error(i("templates.messages.jsonParseFailed",{err:y.message}));return}const z=Array.isArray(p)?p:Array.isArray(p?.prompts)?p.prompts:null;if(!z){g.error(i("templates.messages.fileShapeUnknown",{expected:"prompts: [...]"}));return}let T=0;for(const y of z)!y||typeof y!="object"||typeof y.name!="string"||typeof y.content!="string"||(t.value.push({name:y.name,category:typeof y.category=="string"?y.category:"general",content:y.content}),T++);T?(D(),g.success(i("templates.messages.importedCount",{count:T}))):g.warning(i("templates.messages.importEmpty"))}catch(n){g.error(i("templates.messages.importFailed",{err:n.message||n}))}finally{h.value=!1}}function se(n){t.value.splice(n,1),D(),g.success(i("templates.messages.promptDeleted"))}function re(n){navigator.clipboard.writeText(n.content).then(()=>{g.success(i("templates.messages.copiedClipboard"))}).catch(()=>{g.error(i("templates.messages.copyFailed"))})}function ie(n){M.push({path:"/chat",query:{prompt:n.content}})}function ce(n){return{general:"blue",code:"green",writing:"orange",analysis:"purple"}[n]||"default"}X(()=>{q(),L()});const W={t:i,ws:e,router:M,fs:A,exportingPrompts:f,importingPrompts:h,activeTab:R,initLoading:w,initResult:k,showInitConfirm:P,pendingTemplate:S,PROJECT_TEMPLATE_NAMES:F,projectTemplates:N,confirmInit:J,doInit:E,biLoading:B,biTemplates:O,biCreating:x,biResult:j,loadBiTemplates:L,createBiDashboard:U,STORAGE_KEY:H,promptTemplates:t,showPromptModal:C,newPrompt:_,loadPromptTemplates:q,persistPrompts:D,savePrompt:ae,resetPromptForm:Q,exportPrompts:ne,importPrompts:le,deletePrompt:se,copyPrompt:re,usePrompt:ie,categoryColor:ce,ref:u,computed:Z,reactive:Y,onMounted:X,get useI18n(){return $},get useRouter(){return G},get AppstoreOutlined(){return be},get BarChartOutlined(){return xe},get FileTextOutlined(){return ve},get PlusOutlined(){return ye},get CopyOutlined(){return _e},get DeleteOutlined(){return fe},get RocketOutlined(){return ge},get PlayCircleOutlined(){return ue},get ExportOutlined(){return de},get ImportOutlined(){return me},get message(){return g},get useWsStore(){return ee},get useFs(){return te}};return Object.defineProperty(W,"__isScriptSetup",{enumerable:!1,value:!0}),W}},we={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},ke={class:"page-title"},Pe={class:"page-sub"},Oe={style:{display:"flex","align-items":"flex-start",gap:"10px"}},Ce={style:{flex:"1","min-width":"0"}},Te={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px","font-family":"monospace","margin-bottom":"4px"}},je={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5"}},ze={style:{"margin-top":"12px","text-align":"right"}},Ie={style:{margin:"0","font-size":"12px","white-space":"pre-wrap","max-height":"200px","overflow-y":"auto"}},Re={key:0,style:{"text-align":"center",padding:"40px"}},Se={style:{color:"var(--text-muted)","margin-top":"8px"}},Fe={style:{display:"flex","align-items":"flex-start",gap:"10px"}},Be={style:{flex:"1","min-width":"0"}},Ae={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px","margin-bottom":"4px"}},Ne={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5"}},Ee={key:0,style:{"margin-top":"4px"}},Le={style:{"margin-top":"12px","text-align":"right"}},De={style:{margin:"0","font-size":"12px","white-space":"pre-wrap","max-height":"200px","overflow-y":"auto"}},Me={style:{"margin-bottom":"16px",display:"flex",gap:"8px"}},Je={style:{display:"flex","align-items":"center",gap:"8px","margin-bottom":"8px"}},Ue={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px",flex:"1",overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},Ke={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5","max-height":"60px",overflow:"hidden","text-overflow":"ellipsis","white-space":"pre-wrap"}},Ve={style:{"margin-top":"12px",display:"flex",gap:"8px","justify-content":"flex-end"}},He={style:{color:"var(--text-muted)","font-size":"12px"}};function qe(oe,l,i,e,M,A){const f=m("a-button"),h=m("a-card"),R=m("a-col"),w=m("a-row"),k=m("a-alert"),P=m("a-tab-pane"),S=m("a-spin"),F=m("a-empty"),N=m("a-tag"),J=m("a-tabs"),E=m("a-modal"),B=m("a-input"),O=m("a-form-item"),x=m("a-select-option"),j=m("a-select"),L=m("a-textarea"),U=m("a-form");return d(),I("div",null,[r("div",we,[r("div",null,[r("h2",ke,s(e.t("templates.title")),1),r("p",Pe,s(e.t("templates.subtitle")),1)])]),a(J,{activeKey:e.activeTab,"onUpdate:activeKey":l[3]||(l[3]=t=>e.activeTab=t),type:"card"},{default:o(()=>[b(" Tab 1: Project templates "),a(P,{key:"project"},{tab:o(()=>[a(e.AppstoreOutlined),c(" "+s(e.t("templates.tabs.project")),1)]),default:o(()=>[a(w,{gutter:[16,16]},{default:o(()=>[(d(!0),I(K,null,V(e.projectTemplates,t=>(d(),v(R,{key:t.name,xs:24,sm:12,lg:8},{default:o(()=>[a(h,{size:"small",hoverable:"",class:"template-card",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[r("div",Oe,[a(e.RocketOutlined,{style:{"font-size":"24px",color:"#1677ff","flex-shrink":"0","margin-top":"2px"}}),r("div",Ce,[r("div",Te,s(t.name),1),r("div",je,s(t.description),1)])]),r("div",ze,[a(f,{type:"primary",size:"small",loading:e.initLoading===t.name,onClick:C=>e.confirmInit(t.name)},{icon:o(()=>[a(e.PlayCircleOutlined)]),default:o(()=>[c(" "+s(e.t("templates.project.initButton")),1)]),_:1},8,["loading","onClick"])])]),_:2},1024)]),_:2},1024))),128))]),_:1}),e.initResult?(d(),v(k,{key:0,message:e.initResult.success?e.t("templates.project.initSuccessAlert"):e.t("templates.project.initFailureAlert"),type:e.initResult.success?"success":"error","show-icon":"",closable:"",style:{"margin-top":"16px"},onClose:l[0]||(l[0]=t=>e.initResult=null)},{description:o(()=>[r("pre",Ie,s(e.initResult.output),1)]),_:1},8,["message","type"])):b("v-if",!0)]),_:1}),b(" Tab 2: BI templates "),a(P,{key:"bi"},{tab:o(()=>[a(e.BarChartOutlined),c(" "+s(e.t("templates.tabs.bi")),1)]),default:o(()=>[e.biLoading?(d(),I("div",Re,[a(S),r("div",Se,s(e.t("templates.bi.loadingHint")),1)])):e.biTemplates.length?(d(),v(w,{key:2,gutter:[16,16]},{default:o(()=>[(d(!0),I(K,null,V(e.biTemplates,t=>(d(),v(R,{key:t.id,xs:24,sm:12,lg:8},{default:o(()=>[a(h,{size:"small",hoverable:"",class:"template-card",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[r("div",Fe,[a(e.BarChartOutlined,{style:{"font-size":"24px",color:"#722ed1","flex-shrink":"0","margin-top":"2px"}}),r("div",Be,[r("div",Ae,s(t.name),1),r("div",Ne,s(t.description||e.t("templates.bi.noDescription")),1),t.id?(d(),I("div",Ee,[a(N,{size:"small",color:"purple"},{default:o(()=>[c(s(t.id),1)]),_:2},1024)])):b("v-if",!0)])]),r("div",Le,[a(f,{type:"primary",size:"small",loading:e.biCreating===t.id,onClick:C=>e.createBiDashboard(t.id)},{icon:o(()=>[a(e.PlayCircleOutlined)]),default:o(()=>[c(" "+s(e.t("templates.bi.createButton")),1)]),_:1},8,["loading","onClick"])])]),_:2},1024)]),_:2},1024))),128))]),_:1})):(d(),v(F,{key:1,description:e.t("templates.bi.emptyText")},null,8,["description"])),e.biResult?(d(),v(k,{key:3,message:e.biResult.success?e.t("templates.bi.createSuccessAlert"):e.t("templates.bi.createFailureAlert"),type:e.biResult.success?"success":"error","show-icon":"",closable:"",style:{"margin-top":"16px"},onClose:l[1]||(l[1]=t=>e.biResult=null)},{description:o(()=>[r("pre",De,s(e.biResult.output),1)]),_:1},8,["message","type"])):b("v-if",!0)]),_:1}),b(" Tab 3: Prompt templates "),a(P,{key:"prompts"},{tab:o(()=>[a(e.FileTextOutlined),c(" "+s(e.t("templates.tabs.prompts")),1)]),default:o(()=>[r("div",Me,[a(f,{type:"primary",onClick:l[2]||(l[2]=t=>e.showPromptModal=!0)},{icon:o(()=>[a(e.PlusOutlined)]),default:o(()=>[c(" "+s(e.t("templates.prompts.newButton")),1)]),_:1}),a(f,{disabled:!e.promptTemplates.length,loading:e.exportingPrompts,onClick:e.exportPrompts},{icon:o(()=>[a(e.ExportOutlined)]),default:o(()=>[c(" "+s(e.t("templates.prompts.exportAll")),1)]),_:1},8,["disabled","loading"]),a(f,{loading:e.importingPrompts,onClick:e.importPrompts},{icon:o(()=>[a(e.ImportOutlined)]),default:o(()=>[c(" "+s(e.t("templates.prompts.import")),1)]),_:1},8,["loading"])]),e.promptTemplates.length?(d(),v(w,{key:1,gutter:[16,16]},{default:o(()=>[(d(!0),I(K,null,V(e.promptTemplates,(t,C)=>(d(),v(R,{key:C,xs:24,sm:12,lg:8},{default:o(()=>[a(h,{size:"small",class:"template-card",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[r("div",Je,[a(e.FileTextOutlined,{style:{"font-size":"18px",color:"#52c41a"}}),r("span",Ue,s(t.name),1),a(N,{color:e.categoryColor(t.category),size:"small"},{default:o(()=>[c(s(t.category),1)]),_:2},1032,["color"])]),r("div",Ke,s(t.content.length>120?t.content.slice(0,120)+"...":t.content),1),r("div",Ve,[a(f,{size:"small",onClick:_=>e.usePrompt(t)},{icon:o(()=>[a(e.RocketOutlined)]),default:o(()=>[c(" "+s(e.t("templates.prompts.useButton")),1)]),_:1},8,["onClick"]),a(f,{size:"small",onClick:_=>e.copyPrompt(t)},{icon:o(()=>[a(e.CopyOutlined)]),default:o(()=>[c(" "+s(e.t("templates.prompts.copyButton")),1)]),_:1},8,["onClick"]),a(f,{size:"small",danger:"",onClick:_=>e.deletePrompt(C)},{icon:o(()=>[a(e.DeleteOutlined)]),default:o(()=>[c(" "+s(e.t("templates.prompts.deleteButton")),1)]),_:1},8,["onClick"])])]),_:2},1024)]),_:2},1024))),128))]),_:1})):(d(),v(F,{key:0,description:e.t("templates.prompts.emptyText")},null,8,["description"]))]),_:1})]),_:1},8,["activeKey"]),b(" Init Confirmation Modal "),a(E,{open:e.showInitConfirm,"onUpdate:open":l[4]||(l[4]=t=>e.showInitConfirm=t),title:e.t("templates.project.confirmTitle"),onOk:e.doInit,onCancel:l[5]||(l[5]=t=>e.showInitConfirm=!1),"ok-text":e.t("templates.project.confirmOk"),"cancel-text":e.t("common.cancel")},{default:o(()=>[r("p",null,[c(s(e.t("templates.project.confirmIntro"))+" ",1),r("strong",null,s(e.pendingTemplate),1),c(" "+s(e.t("templates.project.confirmIntroSuffix")),1)]),r("p",He,s(e.t("templates.project.confirmHint")),1)]),_:1},8,["open","title","ok-text","cancel-text"]),b(" New Prompt Modal "),a(E,{open:e.showPromptModal,"onUpdate:open":l[9]||(l[9]=t=>e.showPromptModal=t),title:e.t("templates.prompts.modalTitle"),onOk:e.savePrompt,onCancel:e.resetPromptForm,"ok-text":e.t("templates.prompts.modalOk"),"cancel-text":e.t("common.cancel"),"ok-button-props":{disabled:!e.newPrompt.name||!e.newPrompt.content}},{default:o(()=>[a(U,{layout:"vertical"},{default:o(()=>[a(O,{label:e.t("templates.prompts.nameLabel"),required:""},{default:o(()=>[a(B,{value:e.newPrompt.name,"onUpdate:value":l[6]||(l[6]=t=>e.newPrompt.name=t),placeholder:e.t("templates.prompts.namePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),a(O,{label:e.t("templates.prompts.categoryLabel")},{default:o(()=>[a(j,{value:e.newPrompt.category,"onUpdate:value":l[7]||(l[7]=t=>e.newPrompt.category=t),style:{width:"100%"}},{default:o(()=>[a(x,{value:"general"},{default:o(()=>[...l[10]||(l[10]=[c("general",-1)])]),_:1}),a(x,{value:"code"},{default:o(()=>[...l[11]||(l[11]=[c("code",-1)])]),_:1}),a(x,{value:"writing"},{default:o(()=>[...l[12]||(l[12]=[c("writing",-1)])]),_:1}),a(x,{value:"analysis"},{default:o(()=>[...l[13]||(l[13]=[c("analysis",-1)])]),_:1})]),_:1},8,["value"])]),_:1},8,["label"]),a(O,{label:e.t("templates.prompts.contentLabel"),required:""},{default:o(()=>[a(L,{value:e.newPrompt.content,"onUpdate:value":l[8]||(l[8]=t=>e.newPrompt.content=t),rows:6,placeholder:e.t("templates.prompts.contentPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"])]),_:1})]),_:1},8,["open","title","ok-text","cancel-text","ok-button-props"])])}const Ze=pe(he,[["render",qe],["__scopeId","data-v-82f40809"],["__file","/tmp/cc-web-panel-Hs0OhX/repo/packages/web-panel/src/views/Templates.vue"]]);export{Ze as default};
1
+ import{I as m,J as I,U as r,R as s,c as a,K as o,V as b,N as W,o as Y,a as Z,b as X,r as u,P as d,F as K,Z as V,S as v,Q as c}from"./vendor-BvqAck49.js";import{_ as pe,b as $,u as ee,d as g}from"./index-qW3-iWXU.js";import{u as te}from"./useFs--1NzerQB.js";import{aL as me,aK as de,ap as ue,aa as ge,aQ as fe,aR as _e,as as ye,a4 as ve,H as xe,a9 as be}from"./icons-DP3uiYxy.js";import"./useShellMode-CgR0wCYM.js";const q="cc_prompt_templates",he={__name:"Templates",setup(oe,{expose:l}){l();const{t:i}=$(),e=ee(),M=W(),A=te(),f=u(!1),h=u(!1),R=u("project"),w=u(""),k=u(null),P=u(!1),S=u(""),F=["code-project","data-science","devops","medical-triage","agriculture-expert","general-assistant","ai-media-creator","ai-doc-creator","empty"],L=X(()=>F.map(n=>({name:n,description:i(`templates.project.items.${n}`)})));function J(n){S.value=n,P.value=!0}async function N(){P.value=!1;const n=S.value;if(n){w.value=n,k.value=null;try{const p=`init --template ${n} --yes`,{output:z,exitCode:T}=await e.execute(p,3e4);k.value={success:T===0,output:z}}catch(p){k.value={success:!1,output:i("templates.messages.initFailed",{err:p.message})}}finally{w.value=""}}}const B=u(!1),O=u([]),x=u(""),j=u(null);async function D(){B.value=!0;try{const{output:n}=await e.execute("bi templates --json",15e3),p=JSON.parse(n);O.value=Array.isArray(p)?p:p.templates||[]}catch{O.value=[]}finally{B.value=!1}}async function U(n){x.value=n,j.value=null;try{const p=`bi dashboard create --template ${n} --json`,{output:z,exitCode:T}=await e.execute(p,3e4);j.value={success:T===0,output:z}}catch(p){j.value={success:!1,output:i("templates.messages.createFailed",{err:p.message})}}finally{x.value=""}}const t=u([]),C=u(!1),_=Z({name:"",category:"general",content:""});function H(){try{const n=localStorage.getItem(q);t.value=n?JSON.parse(n):[]}catch{t.value=[]}}function E(){localStorage.setItem(q,JSON.stringify(t.value))}function ae(){!_.name||!_.content||(t.value.push({name:_.name,category:_.category,content:_.content}),E(),G(),g.success(i("templates.messages.promptSaved")))}function G(){C.value=!1,_.name="",_.category="general",_.content=""}async function ne(){if(t.value.length){f.value=!0;try{const n=await A.saveJson({schema:1,prompts:t.value},{defaultPath:`prompt-templates-${new Date().toISOString().slice(0,10)}.json`});if(n.canceled)return;g.success(n.path?i("templates.messages.exportOk",{count:t.value.length,path:n.path}):i("templates.messages.exportOkDefault"))}catch(n){g.error(i("templates.messages.exportFailed",{err:n.message||n}))}finally{f.value=!1}}}async function le(){h.value=!0;try{const n=await A.pickFileText({title:i("templates.prompts.filePickerTitle"),filters:[{name:"JSON",extensions:["json"]}]});if(!n||n.canceled)return;if(n.reason==="too_large"){g.error(i("templates.messages.fileTooLarge"));return}let p;try{p=JSON.parse(n.content||"")}catch(y){g.error(i("templates.messages.jsonParseFailed",{err:y.message}));return}const z=Array.isArray(p)?p:Array.isArray(p?.prompts)?p.prompts:null;if(!z){g.error(i("templates.messages.fileShapeUnknown",{expected:"prompts: [...]"}));return}let T=0;for(const y of z)!y||typeof y!="object"||typeof y.name!="string"||typeof y.content!="string"||(t.value.push({name:y.name,category:typeof y.category=="string"?y.category:"general",content:y.content}),T++);T?(E(),g.success(i("templates.messages.importedCount",{count:T}))):g.warning(i("templates.messages.importEmpty"))}catch(n){g.error(i("templates.messages.importFailed",{err:n.message||n}))}finally{h.value=!1}}function se(n){t.value.splice(n,1),E(),g.success(i("templates.messages.promptDeleted"))}function re(n){navigator.clipboard.writeText(n.content).then(()=>{g.success(i("templates.messages.copiedClipboard"))}).catch(()=>{g.error(i("templates.messages.copyFailed"))})}function ie(n){M.push({path:"/chat",query:{prompt:n.content}})}function ce(n){return{general:"blue",code:"green",writing:"orange",analysis:"purple"}[n]||"default"}Y(()=>{H(),D()});const Q={t:i,ws:e,router:M,fs:A,exportingPrompts:f,importingPrompts:h,activeTab:R,initLoading:w,initResult:k,showInitConfirm:P,pendingTemplate:S,PROJECT_TEMPLATE_NAMES:F,projectTemplates:L,confirmInit:J,doInit:N,biLoading:B,biTemplates:O,biCreating:x,biResult:j,loadBiTemplates:D,createBiDashboard:U,STORAGE_KEY:q,promptTemplates:t,showPromptModal:C,newPrompt:_,loadPromptTemplates:H,persistPrompts:E,savePrompt:ae,resetPromptForm:G,exportPrompts:ne,importPrompts:le,deletePrompt:se,copyPrompt:re,usePrompt:ie,categoryColor:ce,ref:u,computed:X,reactive:Z,onMounted:Y,get useI18n(){return $},get useRouter(){return W},get AppstoreOutlined(){return be},get BarChartOutlined(){return xe},get FileTextOutlined(){return ve},get PlusOutlined(){return ye},get CopyOutlined(){return _e},get DeleteOutlined(){return fe},get RocketOutlined(){return ge},get PlayCircleOutlined(){return ue},get ExportOutlined(){return de},get ImportOutlined(){return me},get message(){return g},get useWsStore(){return ee},get useFs(){return te}};return Object.defineProperty(Q,"__isScriptSetup",{enumerable:!1,value:!0}),Q}},we={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},ke={class:"page-title"},Pe={class:"page-sub"},Oe={style:{display:"flex","align-items":"flex-start",gap:"10px"}},Ce={style:{flex:"1","min-width":"0"}},Te={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px","font-family":"monospace","margin-bottom":"4px"}},je={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5"}},ze={style:{"margin-top":"12px","text-align":"right"}},Ie={style:{margin:"0","font-size":"12px","white-space":"pre-wrap","max-height":"200px","overflow-y":"auto"}},Re={key:0,style:{"text-align":"center",padding:"40px"}},Se={style:{color:"var(--text-muted)","margin-top":"8px"}},Fe={style:{display:"flex","align-items":"flex-start",gap:"10px"}},Be={style:{flex:"1","min-width":"0"}},Ae={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px","margin-bottom":"4px"}},Le={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5"}},Ne={key:0,style:{"margin-top":"4px"}},De={style:{"margin-top":"12px","text-align":"right"}},Ee={style:{margin:"0","font-size":"12px","white-space":"pre-wrap","max-height":"200px","overflow-y":"auto"}},Me={style:{"margin-bottom":"16px",display:"flex",gap:"8px"}},Je={style:{display:"flex","align-items":"center",gap:"8px","margin-bottom":"8px"}},Ue={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px",flex:"1",overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},Ke={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5","max-height":"60px",overflow:"hidden","text-overflow":"ellipsis","white-space":"pre-wrap"}},Ve={style:{"margin-top":"12px",display:"flex",gap:"8px","justify-content":"flex-end"}},qe={style:{color:"var(--text-muted)","font-size":"12px"}};function He(oe,l,i,e,M,A){const f=m("a-button"),h=m("a-card"),R=m("a-col"),w=m("a-row"),k=m("a-alert"),P=m("a-tab-pane"),S=m("a-spin"),F=m("a-empty"),L=m("a-tag"),J=m("a-tabs"),N=m("a-modal"),B=m("a-input"),O=m("a-form-item"),x=m("a-select-option"),j=m("a-select"),D=m("a-textarea"),U=m("a-form");return d(),I("div",null,[r("div",we,[r("div",null,[r("h2",ke,s(e.t("templates.title")),1),r("p",Pe,s(e.t("templates.subtitle")),1)])]),a(J,{activeKey:e.activeTab,"onUpdate:activeKey":l[3]||(l[3]=t=>e.activeTab=t),type:"card"},{default:o(()=>[b(" Tab 1: Project templates "),a(P,{key:"project"},{tab:o(()=>[a(e.AppstoreOutlined),c(" "+s(e.t("templates.tabs.project")),1)]),default:o(()=>[a(w,{gutter:[16,16]},{default:o(()=>[(d(!0),I(K,null,V(e.projectTemplates,t=>(d(),v(R,{key:t.name,xs:24,sm:12,lg:8},{default:o(()=>[a(h,{size:"small",hoverable:"",class:"template-card",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[r("div",Oe,[a(e.RocketOutlined,{style:{"font-size":"24px",color:"#1677ff","flex-shrink":"0","margin-top":"2px"}}),r("div",Ce,[r("div",Te,s(t.name),1),r("div",je,s(t.description),1)])]),r("div",ze,[a(f,{type:"primary",size:"small",loading:e.initLoading===t.name,onClick:C=>e.confirmInit(t.name)},{icon:o(()=>[a(e.PlayCircleOutlined)]),default:o(()=>[c(" "+s(e.t("templates.project.initButton")),1)]),_:1},8,["loading","onClick"])])]),_:2},1024)]),_:2},1024))),128))]),_:1}),e.initResult?(d(),v(k,{key:0,message:e.initResult.success?e.t("templates.project.initSuccessAlert"):e.t("templates.project.initFailureAlert"),type:e.initResult.success?"success":"error","show-icon":"",closable:"",style:{"margin-top":"16px"},onClose:l[0]||(l[0]=t=>e.initResult=null)},{description:o(()=>[r("pre",Ie,s(e.initResult.output),1)]),_:1},8,["message","type"])):b("v-if",!0)]),_:1}),b(" Tab 2: BI templates "),a(P,{key:"bi"},{tab:o(()=>[a(e.BarChartOutlined),c(" "+s(e.t("templates.tabs.bi")),1)]),default:o(()=>[e.biLoading?(d(),I("div",Re,[a(S),r("div",Se,s(e.t("templates.bi.loadingHint")),1)])):e.biTemplates.length?(d(),v(w,{key:2,gutter:[16,16]},{default:o(()=>[(d(!0),I(K,null,V(e.biTemplates,t=>(d(),v(R,{key:t.id,xs:24,sm:12,lg:8},{default:o(()=>[a(h,{size:"small",hoverable:"",class:"template-card",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[r("div",Fe,[a(e.BarChartOutlined,{style:{"font-size":"24px",color:"#722ed1","flex-shrink":"0","margin-top":"2px"}}),r("div",Be,[r("div",Ae,s(t.name),1),r("div",Le,s(t.description||e.t("templates.bi.noDescription")),1),t.id?(d(),I("div",Ne,[a(L,{size:"small",color:"purple"},{default:o(()=>[c(s(t.id),1)]),_:2},1024)])):b("v-if",!0)])]),r("div",De,[a(f,{type:"primary",size:"small",loading:e.biCreating===t.id,onClick:C=>e.createBiDashboard(t.id)},{icon:o(()=>[a(e.PlayCircleOutlined)]),default:o(()=>[c(" "+s(e.t("templates.bi.createButton")),1)]),_:1},8,["loading","onClick"])])]),_:2},1024)]),_:2},1024))),128))]),_:1})):(d(),v(F,{key:1,description:e.t("templates.bi.emptyText")},null,8,["description"])),e.biResult?(d(),v(k,{key:3,message:e.biResult.success?e.t("templates.bi.createSuccessAlert"):e.t("templates.bi.createFailureAlert"),type:e.biResult.success?"success":"error","show-icon":"",closable:"",style:{"margin-top":"16px"},onClose:l[1]||(l[1]=t=>e.biResult=null)},{description:o(()=>[r("pre",Ee,s(e.biResult.output),1)]),_:1},8,["message","type"])):b("v-if",!0)]),_:1}),b(" Tab 3: Prompt templates "),a(P,{key:"prompts"},{tab:o(()=>[a(e.FileTextOutlined),c(" "+s(e.t("templates.tabs.prompts")),1)]),default:o(()=>[r("div",Me,[a(f,{type:"primary",onClick:l[2]||(l[2]=t=>e.showPromptModal=!0)},{icon:o(()=>[a(e.PlusOutlined)]),default:o(()=>[c(" "+s(e.t("templates.prompts.newButton")),1)]),_:1}),a(f,{disabled:!e.promptTemplates.length,loading:e.exportingPrompts,onClick:e.exportPrompts},{icon:o(()=>[a(e.ExportOutlined)]),default:o(()=>[c(" "+s(e.t("templates.prompts.exportAll")),1)]),_:1},8,["disabled","loading"]),a(f,{loading:e.importingPrompts,onClick:e.importPrompts},{icon:o(()=>[a(e.ImportOutlined)]),default:o(()=>[c(" "+s(e.t("templates.prompts.import")),1)]),_:1},8,["loading"])]),e.promptTemplates.length?(d(),v(w,{key:1,gutter:[16,16]},{default:o(()=>[(d(!0),I(K,null,V(e.promptTemplates,(t,C)=>(d(),v(R,{key:C,xs:24,sm:12,lg:8},{default:o(()=>[a(h,{size:"small",class:"template-card",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[r("div",Je,[a(e.FileTextOutlined,{style:{"font-size":"18px",color:"#52c41a"}}),r("span",Ue,s(t.name),1),a(L,{color:e.categoryColor(t.category),size:"small"},{default:o(()=>[c(s(t.category),1)]),_:2},1032,["color"])]),r("div",Ke,s(t.content.length>120?t.content.slice(0,120)+"...":t.content),1),r("div",Ve,[a(f,{size:"small",onClick:_=>e.usePrompt(t)},{icon:o(()=>[a(e.RocketOutlined)]),default:o(()=>[c(" "+s(e.t("templates.prompts.useButton")),1)]),_:1},8,["onClick"]),a(f,{size:"small",onClick:_=>e.copyPrompt(t)},{icon:o(()=>[a(e.CopyOutlined)]),default:o(()=>[c(" "+s(e.t("templates.prompts.copyButton")),1)]),_:1},8,["onClick"]),a(f,{size:"small",danger:"",onClick:_=>e.deletePrompt(C)},{icon:o(()=>[a(e.DeleteOutlined)]),default:o(()=>[c(" "+s(e.t("templates.prompts.deleteButton")),1)]),_:1},8,["onClick"])])]),_:2},1024)]),_:2},1024))),128))]),_:1})):(d(),v(F,{key:0,description:e.t("templates.prompts.emptyText")},null,8,["description"]))]),_:1})]),_:1},8,["activeKey"]),b(" Init Confirmation Modal "),a(N,{open:e.showInitConfirm,"onUpdate:open":l[4]||(l[4]=t=>e.showInitConfirm=t),title:e.t("templates.project.confirmTitle"),onOk:e.doInit,onCancel:l[5]||(l[5]=t=>e.showInitConfirm=!1),"ok-text":e.t("templates.project.confirmOk"),"cancel-text":e.t("common.cancel")},{default:o(()=>[r("p",null,[c(s(e.t("templates.project.confirmIntro"))+" ",1),r("strong",null,s(e.pendingTemplate),1),c(" "+s(e.t("templates.project.confirmIntroSuffix")),1)]),r("p",qe,s(e.t("templates.project.confirmHint")),1)]),_:1},8,["open","title","ok-text","cancel-text"]),b(" New Prompt Modal "),a(N,{open:e.showPromptModal,"onUpdate:open":l[9]||(l[9]=t=>e.showPromptModal=t),title:e.t("templates.prompts.modalTitle"),onOk:e.savePrompt,onCancel:e.resetPromptForm,"ok-text":e.t("templates.prompts.modalOk"),"cancel-text":e.t("common.cancel"),"ok-button-props":{disabled:!e.newPrompt.name||!e.newPrompt.content}},{default:o(()=>[a(U,{layout:"vertical"},{default:o(()=>[a(O,{label:e.t("templates.prompts.nameLabel"),required:""},{default:o(()=>[a(B,{value:e.newPrompt.name,"onUpdate:value":l[6]||(l[6]=t=>e.newPrompt.name=t),placeholder:e.t("templates.prompts.namePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),a(O,{label:e.t("templates.prompts.categoryLabel")},{default:o(()=>[a(j,{value:e.newPrompt.category,"onUpdate:value":l[7]||(l[7]=t=>e.newPrompt.category=t),style:{width:"100%"}},{default:o(()=>[a(x,{value:"general"},{default:o(()=>[...l[10]||(l[10]=[c("general",-1)])]),_:1}),a(x,{value:"code"},{default:o(()=>[...l[11]||(l[11]=[c("code",-1)])]),_:1}),a(x,{value:"writing"},{default:o(()=>[...l[12]||(l[12]=[c("writing",-1)])]),_:1}),a(x,{value:"analysis"},{default:o(()=>[...l[13]||(l[13]=[c("analysis",-1)])]),_:1})]),_:1},8,["value"])]),_:1},8,["label"]),a(O,{label:e.t("templates.prompts.contentLabel"),required:""},{default:o(()=>[a(D,{value:e.newPrompt.content,"onUpdate:value":l[8]||(l[8]=t=>e.newPrompt.content=t),rows:6,placeholder:e.t("templates.prompts.contentPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"])]),_:1})]),_:1},8,["open","title","ok-text","cancel-text","ok-button-props"])])}const Xe=pe(he,[["render",He],["__scopeId","data-v-82f40809"],["__file","/tmp/cc-web-panel-DGmtsL/repo/packages/web-panel/src/views/Templates.vue"]]);export{Xe as default};
@@ -1 +1 @@
1
- import{I as v,J as p,U as g,R as s,c as o,K as n,V as y,S as _,o as it,a as X,b as Z,r as S,P as d,Q as m,F as C,Z as w}from"./vendor-BvqAck49.js";import{_ as Nt,u as ut,b as dt,d as b}from"./index-BR-DF81e.js";import{s as Ut}from"./community-parser-CO25nZFt.js";import{a8 as jt,aY as Mt,ac as Et,b4 as Bt,n as Dt,as as Qt,R as Kt}from"./icons-DP3uiYxy.js";function J(e){const l=Ut(e);if(!l)return null;try{return JSON.parse(l)}catch{}const u=l.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!u)return null;try{return JSON.parse(u[0])}catch{return null}}const Vt=Object.freeze(["free","starter","pro","enterprise"]),Wt=Object.freeze(["active","suspended","deleted"]),Jt=Object.freeze(["api_calls","storage_bytes","ai_requests"]);function z(e,l=0){return typeof e=="number"&&Number.isFinite(e)?e:l}function Yt(e,l=0){if(!e||typeof e!="object")return null;const u=e.id||"";if(!u)return null;const t=e.quotas&&typeof e.quotas=="object"?{...e.quotas}:{};return{key:u,id:u,name:String(e.name||u),monthlyFee:e.monthlyFee==null?null:z(e.monthlyFee,null),quotas:t,features:Array.isArray(e.features)?e.features.filter(D=>typeof D=="string"):[],_idx:l}}function ct(e){const l=J(e);return Array.isArray(l)?l.map(Yt).filter(Boolean):[]}function Gt(e,l=0){if(!e||typeof e!="object")return null;const u=e.id||"";return u?{key:u,id:u,name:String(e.name||u),unit:String(e.unit||""),_idx:l}:null}function mt(e){const l=J(e);return Array.isArray(l)?l.map(Gt).filter(Boolean):[]}function Ht(e,l=0){if(!e||typeof e!="object")return null;const u=e.id||"";return u?{key:u,id:u,name:String(e.name||""),slug:String(e.slug||""),config:e.config??null,status:String(e.status||"active").toLowerCase(),plan:String(e.plan||"free").toLowerCase(),dbPath:e.dbPath||null,ownerId:e.ownerId||"",createdAt:e.createdAt??null,updatedAt:e.updatedAt??null,deletedAt:e.deletedAt??null,_idx:l}:null}function ft(e){const l=J(e);return Array.isArray(l)?l.map(Ht).filter(Boolean):[]}function Xt(e,l=0){if(!e||typeof e!="object")return null;const u=e.id||"";return u?{key:u,id:u,tenantId:String(e.tenantId||""),plan:String(e.plan||"free").toLowerCase(),status:String(e.status||"active").toLowerCase(),startedAt:e.startedAt??null,expiresAt:e.expiresAt??null,cancelledAt:e.cancelledAt??null,paymentMethod:e.paymentMethod||null,amount:e.amount==null?null:z(e.amount,null),createdAt:e.createdAt??null,_idx:l}:null}function pt(e){const l=J(e);return Array.isArray(l)?l.map(Xt).filter(Boolean):[]}function bt(e){const l=J(e);return!l||typeof l!="object"||Array.isArray(l)?null:{tenantId:String(l.tenantId||""),plan:String(l.plan||"free").toLowerCase(),metric:String(l.metric||""),period:String(l.period||""),limit:l.limit==null?null:z(l.limit,null),used:z(l.used,0),remaining:l.remaining==null?null:z(l.remaining,null),unlimited:!!l.unlimited,exceeded:!!l.exceeded}}const Zt={tenantCount:0,byStatus:{active:0,suspended:0,deleted:0},byPlan:{free:0,starter:0,pro:0,enterprise:0},subscriptionCount:0,activeSubscriptions:0,usageRecordCount:0,totalUsage:{api_calls:0,storage_bytes:0,ai_requests:0}};function yt(e){const l=JSON.parse(JSON.stringify(Zt)),u=J(e);if(!u||typeof u!="object"||Array.isArray(u))return l;if(l.tenantCount=z(u.tenantCount,0),l.subscriptionCount=z(u.subscriptionCount,0),l.activeSubscriptions=z(u.activeSubscriptions,0),l.usageRecordCount=z(u.usageRecordCount,0),u.byStatus&&typeof u.byStatus=="object")for(const t of Object.keys(l.byStatus))l.byStatus[t]=z(u.byStatus[t],0);if(u.byPlan&&typeof u.byPlan=="object")for(const t of Object.keys(l.byPlan))l.byPlan[t]=z(u.byPlan[t],0);if(u.totalUsage&&typeof u.totalUsage=="object")for(const t of Object.keys(l.totalUsage))l.totalUsage[t]=z(u.totalUsage[t],0);return l}function $t(e){if(e==null||e==="")return"—";const l=typeof e=="number"?new Date(e):new Date(String(e));return isNaN(l.getTime())?String(e):l.toLocaleString("zh-CN",{hour12:!1})}function nt(e){return typeof e!="number"||!Number.isFinite(e)||e<0?"—":e===0?"0":e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:e<1024*1024*1024?`${(e/1024/1024).toFixed(1)} MB`:`${(e/1024/1024/1024).toFixed(2)} GB`}function gt(e=new Date){const l=e.getFullYear(),u=String(e.getMonth()+1).padStart(2,"0");return`${l}-${u}`}const te={__name:"Tenant",setup(e,{expose:l}){l();const u=ut(),{t}=dt(),D=S(!1),$=S(!1),x=S(!1),j=S(!1),Q=S(!1),M=S([]),K=S([]),I=S([]),R=S([]),P=S({tenantCount:0,byStatus:{active:0,suspended:0,deleted:0},byPlan:{free:0,starter:0,pro:0,enterprise:0},subscriptionCount:0,activeSubscriptions:0,usageRecordCount:0,totalUsage:{api_calls:0,storage_bytes:0,ai_requests:0}}),Y=S("tenants"),A=S(""),O=S(""),E=S(!1),V=S(!1),G=S(!1),B=S(!1),T=X({name:"",slug:"",plan:"free",owner:""}),k=X({tenantId:"",plan:"pro",amount:null,duration:720*60*60*1e3}),F=S(""),q=X({tenantId:null,metric:"api_calls",period:""}),h=X({tenantId:null,metric:"api_calls",value:1,period:""}),N=S(null),W=Z(()=>[{title:t("tenant.tenantCols.name"),key:"name"},{title:t("tenant.tenantCols.plan"),key:"plan",width:"110px"},{title:t("tenant.tenantCols.status"),key:"status",width:"100px"},{title:t("tenant.tenantCols.owner"),key:"owner",width:"160px"},{title:t("tenant.tenantCols.createdAt"),key:"createdAt",width:"160px"},{title:t("tenant.tenantCols.action"),key:"action",width:"280px"}]),tt=Z(()=>[{title:t("tenant.subscriptionCols.tenant"),key:"tenant"},{title:t("tenant.subscriptionCols.plan"),key:"plan",width:"110px"},{title:t("tenant.subscriptionCols.amount"),key:"amount",width:"100px"},{title:t("tenant.subscriptionCols.status"),key:"status",width:"110px"},{title:t("tenant.subscriptionCols.startedAt"),key:"startedAt",width:"160px"},{title:t("tenant.subscriptionCols.expiresAt"),key:"expiresAt",width:"160px"},{title:t("tenant.subscriptionCols.action"),key:"action",width:"120px"}]),et=Z(()=>{let r=M.value;return A.value&&(r=r.filter(i=>i.plan===A.value)),O.value&&(r=r.filter(i=>i.status===O.value)),r}),a=Z(()=>K.value.filter(r=>r.status==="active"&&typeof r.amount=="number").reduce((r,i)=>r+i.amount,0));function c(r){const i=`tenant.planLabels.${r}`,f=t(i);return f===i?r:f}function L(r){return{free:"default",starter:"blue",pro:"purple",enterprise:"gold"}[r]||"default"}function vt(r){const i=`tenant.tenantStatusLabels.${r}`,f=t(i);return f===i?r:f}function _t(r){return{active:"green",suspended:"orange",deleted:"default"}[r]||"default"}function kt(r){const i=`tenant.subStatusLabels.${r}`,f=t(i);return f===i?r:f}function ht(r){return{active:"green",cancelled:"default",expired:"red",past_due:"orange"}[r]||"default"}function St(r){const i=M.value.find(f=>f.id===r);return i?i.name:t("tenant.deletedTenant")}function Ct(r,i){return r==null?"—":i==="storage_bytes"?nt(r):String(r)}function Ft(r,i){return r==null?t("tenant.planCard.unlimited"):i==="storage_bytes"?nt(r):r.toLocaleString()}function qt({key:r}){r==="tenant"?E.value=!0:r==="quota"?(N.value=null,G.value=!0):r==="record"&&(B.value=!0)}async function U(){D.value=!0;try{const[r,i,f,H,Pt]=await Promise.all([u.execute("tenant list --json",1e4).catch(()=>({output:""})),u.execute("tenant subscriptions --json",1e4).catch(()=>({output:""})),u.execute("tenant plans --json",8e3).catch(()=>({output:""})),u.execute("tenant metrics --json",8e3).catch(()=>({output:""})),u.execute("tenant stats --json",8e3).catch(()=>({output:""}))]);M.value=ft(r.output),K.value=pt(i.output),I.value=ct(f.output),R.value=mt(H.output),P.value=yt(Pt.output)}catch(r){b.error(t("tenant.msg.loadFailed")+": "+(r?.message||r))}finally{D.value=!1}}async function wt(){const r=T.name.trim(),i=T.slug.trim();if(!r||!i){b.warning(t("tenant.msg.createFieldsEmpty"));return}if(!/^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]$/.test(i)){b.warning(t("tenant.msg.slugInvalid"));return}$.value=!0;try{const f=[`tenant create "${r.replace(/"/g,'\\"')}" "${i.replace(/"/g,'\\"')}"`];f.push(`--plan ${T.plan}`),T.owner.trim()&&f.push(`--owner "${T.owner.trim().replace(/"/g,'\\"')}"`),f.push("--json");const{output:H}=await u.execute(f.join(" "),1e4);if(/error|Error|失败/i.test(H)&&!/"id"/.test(H)){b.error(t("tenant.msg.createFailed")+": "+H.slice(0,120));return}b.success(t("tenant.msg.createSuccess")),E.value=!1,lt(),await U()}catch(f){b.error(t("tenant.msg.createFailed")+": "+(f?.message||f))}finally{$.value=!1}}function xt(r){k.tenantId=r.id,k.plan=r.plan==="free"?"starter":r.plan,k.amount=null,k.duration=720*60*60*1e3,F.value=r.name,V.value=!0}async function At(){x.value=!0;try{const r=[`tenant subscribe ${k.tenantId}`];r.push(`--plan ${k.plan}`),k.amount!=null&&r.push(`--amount ${k.amount}`),k.duration&&r.push(`--duration-ms ${k.duration}`),r.push("--json");const{output:i}=await u.execute(r.join(" "),1e4);if(/error|Error|失败/i.test(i)&&!/"id"/.test(i)){b.error(t("tenant.msg.subscribeFailed")+": "+i.slice(0,120));return}b.success(t("tenant.msg.subscribeSuccess")),V.value=!1,ot(),Y.value="subscriptions",await U()}catch(r){b.error(t("tenant.msg.subscribeFailed")+": "+(r?.message||r))}finally{x.value=!1}}async function Tt(r,i){if(i!==r.plan)try{const{output:f}=await u.execute(`tenant configure ${r.id} --plan ${i} --json`,8e3);if(/error|Error/i.test(f)&&!/"id"/.test(f)){b.error(t("tenant.msg.planChangeFailed")+": "+f.slice(0,120));return}b.success(t("tenant.msg.planChangeSuccess",{plan:c(i)})),await U()}catch(f){b.error(t("tenant.msg.planChangeFailed")+": "+(f?.message||f))}}async function Lt(r,i){try{const{output:f}=await u.execute(`tenant configure ${r.id} --status ${i} --json`,8e3);if(/error|Error/i.test(f)&&!/"id"/.test(f)){b.error(t("tenant.msg.statusChangeFailed")+": "+f.slice(0,120));return}b.success(t(i==="active"?"tenant.msg.activated":"tenant.msg.suspended")),await U()}catch(f){b.error(t("tenant.msg.statusChangeFailed")+": "+(f?.message||f))}}async function zt(r){try{const{output:i}=await u.execute(`tenant delete ${r.id} --json`,8e3);if(/error|Error/i.test(i)&&!/deleted|removed/.test(i)){b.error(t("tenant.msg.deleteFailed")+": "+i.slice(0,120));return}b.success(t("tenant.msg.deleteSuccess")),await U()}catch(i){b.error(t("tenant.msg.deleteFailed")+": "+(i?.message||i))}}async function Rt(r){try{const{output:i}=await u.execute(`tenant cancel ${r.tenantId}`,8e3);if(/error|Error/i.test(i)&&!/cancelled|cancel/i.test(i)){b.error(t("tenant.msg.cancelFailed")+": "+i.slice(0,120));return}b.success(t("tenant.msg.cancelSuccess")),await U()}catch(i){b.error(t("tenant.msg.cancelFailed")+": "+(i?.message||i))}}async function Ot(){if(!q.tenantId){b.warning(t("tenant.msg.tenantEmpty"));return}j.value=!0,N.value=null;try{const r=[`tenant check-quota ${q.tenantId} ${q.metric}`];q.period.trim()&&r.push(`--period ${q.period.trim()}`),r.push("--json");const{output:i}=await u.execute(r.join(" "),8e3),f=bt(i);if(!f){b.error(t("tenant.msg.checkFailed")+": "+i.slice(0,120));return}N.value=f,f.exceeded&&b.warning(t("tenant.msg.exceededWarning"))}catch(r){b.error(t("tenant.msg.checkFailed")+": "+(r?.message||r))}finally{j.value=!1}}async function It(){if(!h.tenantId){b.warning(t("tenant.msg.tenantEmpty"));return}if(h.value==null||h.value<0){b.warning(t("tenant.msg.valueInvalid"));return}Q.value=!0;try{const r=[`tenant record ${h.tenantId} ${h.metric} ${h.value}`];h.period.trim()&&r.push(`--period ${h.period.trim()}`),r.push("--json");const{output:i}=await u.execute(r.join(" "),8e3);if(/error|Error/i.test(i)&&!/"id"|"tenant"/.test(i)){b.error(t("tenant.msg.recordFailed")+": "+i.slice(0,120));return}b.success(t("tenant.msg.recordSuccess")),B.value=!1,rt(),await U()}catch(r){b.error(t("tenant.msg.recordFailed")+": "+(r?.message||r))}finally{Q.value=!1}}function lt(){T.name="",T.slug="",T.plan="free",T.owner=""}function ot(){k.tenantId="",k.plan="pro",k.amount=null,k.duration=720*60*60*1e3,F.value=""}function rt(){h.tenantId=null,h.metric="api_calls",h.value=1,h.period=""}function at(r){r.period||(r.period=gt())}at(q),at(h),it(U);const st={ws:u,t,loading:D,creating:$,subscribing:x,checking:j,recording:Q,tenants:M,subscriptions:K,plans:I,metrics:R,stats:P,activeTab:Y,planFilter:A,statusFilter:O,showCreateModal:E,showSubscribeModal:V,showQuotaModal:G,showRecordModal:B,createForm:T,subscribeForm:k,subscribeTargetName:F,quotaForm:q,recordForm:h,quotaResult:N,tenantColumns:W,subscriptionColumns:tt,filteredTenants:et,estimatedMrr:a,planLabel:c,planColor:L,tenantStatusLabel:vt,tenantStatusColor:_t,subStatusLabel:kt,subStatusColor:ht,tenantName:St,formatMetricValue:Ct,formatQuota:Ft,handleNewClick:qt,loadAll:U,createTenant:wt,openSubscribe:xt,subscribeTenant:At,changePlan:Tt,setStatus:Lt,deleteTenant:zt,cancelSubscription:Rt,checkQuota:Ot,recordUsage:It,resetCreateForm:lt,resetSubscribeForm:ot,resetRecordForm:rt,ensurePeriodDefault:at,ref:S,computed:Z,onMounted:it,reactive:X,get ReloadOutlined(){return Kt},get PlusOutlined(){return Qt},get BankOutlined(){return Dt},get CreditCardOutlined(){return Bt},get DashboardOutlined(){return Et},get LineChartOutlined(){return Mt},get ApiOutlined(){return jt},get message(){return b},get useI18n(){return dt},get useWsStore(){return ut},get parsePlans(){return ct},get parseMetrics(){return mt},get parseTenants(){return ft},get parseSubscriptions(){return pt},get parseQuotaResult(){return bt},get parseStats(){return yt},get formatTenantTime(){return $t},get formatBytes(){return nt},get currentPeriod(){return gt},get PLAN_IDS(){return Vt},get TENANT_STATUSES(){return Wt},get KNOWN_METRICS(){return Jt}};return Object.defineProperty(st,"__isScriptSetup",{enumerable:!1,value:!0}),st}},ee={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},ae={class:"page-title"},ne={class:"page-sub"},le={style:{color:"var(--text-secondary)","font-size":"12px","margin-left":"8px"}},oe={class:"filter-bar"},re={style:{color:"var(--text-primary)","font-weight":"500"}},se={style:{color:"var(--text-secondary)","font-size":"11px","margin-top":"2px","font-family":"monospace"}},ie={key:0,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"11px"}},ue={key:1,style:{color:"var(--text-muted)"}},de={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},ce={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},me={style:{color:"var(--text-primary)","font-weight":"500"}},fe={style:{color:"var(--text-secondary)","font-size":"11px","font-family":"monospace"}},pe={key:0,style:{color:"#722ed1","font-weight":"500"}},be={key:1,style:{color:"var(--text-muted)"}},ye={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},ge={key:5,style:{color:"var(--text-secondary)","font-size":"11px"}},ve={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},_e={class:"plan-fee"},ke={key:0},he={class:"plan-fee-unit"},Se={key:1,style:{color:"#722ed1"}},Ce={class:"plan-section"},Fe={class:"plan-section-title"},qe={class:"plan-quota-label"},we={class:"plan-quota-value"},xe={class:"plan-section"},Ae={class:"plan-section-title"},Te={style:{"margin-top":"12px","font-size":"12px",color:"var(--text-secondary)"}},Le={style:{"font-family":"monospace",color:"var(--text-primary)"}},ze={key:0},Re={style:{"font-family":"monospace"}},Oe={key:1,style:{"margin-top":"8px"}};function Ie(e,l,u,t,D,$){const x=v("a-button"),j=v("a-menu-item"),Q=v("a-menu"),M=v("a-dropdown"),K=v("a-space"),I=v("a-statistic"),R=v("a-card"),P=v("a-col"),Y=v("a-row"),A=v("a-tag"),O=v("a-radio-button"),E=v("a-radio-group"),V=v("a-popconfirm"),G=v("a-table"),B=v("a-tab-pane"),T=v("a-tabs"),k=v("a-input"),F=v("a-form-item"),q=v("a-select-option"),h=v("a-select"),N=v("a-form"),W=v("a-modal"),tt=v("a-input-number"),et=v("a-progress");return d(),p("div",null,[g("div",ee,[g("div",null,[g("h2",ae,s(e.$t("tenant.title")),1),g("p",ne,s(e.$t("tenant.subtitle")),1)]),o(K,null,{default:n(()=>[o(x,{loading:t.loading,onClick:t.loadAll},{icon:n(()=>[o(t.ReloadOutlined)]),default:n(()=>[m(" "+s(e.$t("tenant.refresh")),1)]),_:1},8,["loading"]),o(M,{trigger:["click"]},{overlay:n(()=>[o(Q,{onClick:t.handleNewClick},{default:n(()=>[o(j,{key:"tenant"},{default:n(()=>[o(t.BankOutlined),m(" "+s(e.$t("tenant.actions.tenant")),1)]),_:1}),o(j,{key:"quota"},{default:n(()=>[o(t.DashboardOutlined),m(" "+s(e.$t("tenant.actions.quota")),1)]),_:1}),o(j,{key:"record"},{default:n(()=>[o(t.LineChartOutlined),m(" "+s(e.$t("tenant.actions.record")),1)]),_:1})]),_:1})]),default:n(()=>[o(x,{type:"primary"},{icon:n(()=>[o(t.PlusOutlined)]),default:n(()=>[m(" "+s(e.$t("tenant.actionDropdown")),1)]),_:1})]),_:1})]),_:1})]),y(" Stat cards "),o(Y,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:n(()=>[o(P,{xs:12,sm:8,lg:5},{default:n(()=>[o(R,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(I,{title:e.$t("tenant.stats.total"),value:t.stats.tenantCount,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:n(()=>[o(t.BankOutlined)]),_:1},8,["title","value"])]),_:1})]),_:1}),o(P,{xs:12,sm:8,lg:5},{default:n(()=>[o(R,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(I,{title:e.$t("tenant.stats.active"),value:t.stats.activeSubscriptions,"value-style":{color:t.stats.activeSubscriptions>0?"#52c41a":"#888",fontSize:"20px"}},{prefix:n(()=>[o(t.CreditCardOutlined)]),_:1},8,["title","value","value-style"])]),_:1})]),_:1}),o(P,{xs:12,sm:8,lg:5},{default:n(()=>[o(R,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(I,{title:e.$t("tenant.stats.mrr"),value:t.estimatedMrr,precision:0,prefix:"¥","value-style":{color:"#722ed1",fontSize:"20px"}},null,8,["title","value"])]),_:1})]),_:1}),o(P,{xs:12,sm:8,lg:5},{default:n(()=>[o(R,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(I,{title:e.$t("tenant.stats.apiCalls"),value:t.stats.totalUsage.api_calls,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:n(()=>[o(t.ApiOutlined)]),_:1},8,["title","value"])]),_:1})]),_:1}),o(P,{xs:24,sm:8,lg:4},{default:n(()=>[o(R,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(I,{title:e.$t("tenant.stats.storage"),value:t.formatBytes(t.stats.totalUsage.storage_bytes),"value-style":{color:"#faad14",fontSize:"18px"}},null,8,["title","value"])]),_:1})]),_:1})]),_:1}),y(" Plan distribution "),t.stats.tenantCount>0?(d(),_(R,{key:0,title:e.$t("tenant.plansCard"),size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"},"body-style":{padding:"12px 16px"}},{default:n(()=>[o(K,{size:[12,8],wrap:""},{default:n(()=>[(d(!0),p(C,null,w(t.PLAN_IDS,a=>(d(),_(A,{key:a,color:t.planColor(a)},{default:n(()=>[m(s(t.planLabel(a))+": "+s(t.stats.byPlan[a]||0),1)]),_:2},1032,["color"]))),128)),g("span",le,s(e.$t("tenant.summarySuffix",{active:t.stats.byStatus.active,suspended:t.stats.byStatus.suspended,deleted:t.stats.byStatus.deleted})),1)]),_:1})]),_:1},8,["title"])):y("v-if",!0),y(" Tabs "),o(T,{activeKey:t.activeTab,"onUpdate:activeKey":l[2]||(l[2]=a=>t.activeTab=a),class:"tenant-tabs"},{default:n(()=>[y(" ── Tenants tab ───────────────────────────────────────────── "),o(B,{key:"tenants",tab:e.$t("tenant.tabs.tenants")},{default:n(()=>[g("div",oe,[o(E,{value:t.planFilter,"onUpdate:value":l[0]||(l[0]=a=>t.planFilter=a),size:"small"},{default:n(()=>[o(O,{value:""},{default:n(()=>[m(s(e.$t("tenant.filter.allPlans")),1)]),_:1}),(d(!0),p(C,null,w(t.PLAN_IDS,a=>(d(),_(O,{key:a,value:a},{default:n(()=>[m(s(t.planLabel(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),o(E,{value:t.statusFilter,"onUpdate:value":l[1]||(l[1]=a=>t.statusFilter=a),size:"small","button-style":"solid"},{default:n(()=>[o(O,{value:""},{default:n(()=>[m(s(e.$t("tenant.filter.allStatuses")),1)]),_:1}),(d(!0),p(C,null,w(t.TENANT_STATUSES,a=>(d(),_(O,{key:a,value:a},{default:n(()=>[m(s(t.tenantStatusLabel(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),o(G,{columns:t.tenantColumns,"data-source":t.filteredTenants,pagination:{pageSize:20,showTotal:a=>e.$t("tenant.table.totalSuffix",{n:a})},size:"small",loading:t.loading,style:{background:"var(--bg-card)"}},{bodyCell:n(({column:a,record:c})=>[a.key==="name"?(d(),p(C,{key:0},[g("span",re,s(c.name),1),g("div",se,s(c.slug),1)],64)):y("v-if",!0),a.key==="plan"?(d(),_(A,{key:1,color:t.planColor(c.plan)},{default:n(()=>[m(s(t.planLabel(c.plan)),1)]),_:2},1032,["color"])):y("v-if",!0),a.key==="status"?(d(),_(A,{key:2,color:t.tenantStatusColor(c.status)},{default:n(()=>[m(s(t.tenantStatusLabel(c.status)),1)]),_:2},1032,["color"])):y("v-if",!0),a.key==="owner"?(d(),p(C,{key:3},[c.ownerId?(d(),p("span",ie,s(c.ownerId),1)):(d(),p("span",ue,"—"))],64)):y("v-if",!0),a.key==="createdAt"?(d(),p("span",de,s(t.formatTenantTime(c.createdAt)),1)):y("v-if",!0),a.key==="action"?(d(),p(C,{key:5},[o(x,{size:"small",type:"link",onClick:L=>t.openSubscribe(c)},{default:n(()=>[m(s(e.$t("tenant.table.actionSubscribe")),1)]),_:1},8,["onClick"]),o(M,{trigger:["click"]},{overlay:n(()=>[o(Q,{onClick:L=>t.changePlan(c,L.key)},{default:n(()=>[(d(!0),p(C,null,w(t.PLAN_IDS,L=>(d(),_(j,{key:L,disabled:L===c.plan},{default:n(()=>[m(s(t.planLabel(L)),1)]),_:2},1032,["disabled"]))),128))]),_:2},1032,["onClick"])]),default:n(()=>[o(x,{size:"small",type:"link"},{default:n(()=>[m(s(e.$t("tenant.table.actionPlanDropdown")),1)]),_:1})]),_:2},1024),c.status==="active"?(d(),_(x,{key:0,size:"small",type:"link",onClick:L=>t.setStatus(c,"suspended")},{default:n(()=>[m(s(e.$t("tenant.table.actionSuspend")),1)]),_:1},8,["onClick"])):c.status==="suspended"?(d(),_(x,{key:1,size:"small",type:"link",onClick:L=>t.setStatus(c,"active")},{default:n(()=>[m(s(e.$t("tenant.table.actionActivate")),1)]),_:1},8,["onClick"])):y("v-if",!0),c.status!=="deleted"?(d(),_(V,{key:2,title:e.$t("tenant.deleteConfirm.title"),"ok-text":e.$t("tenant.deleteConfirm.ok"),"cancel-text":e.$t("tenant.deleteConfirm.cancel"),onConfirm:L=>t.deleteTenant(c)},{default:n(()=>[o(x,{size:"small",type:"link",danger:""},{default:n(()=>[m(s(e.$t("tenant.deleteConfirm.ok")),1)]),_:1})]),_:1},8,["title","ok-text","cancel-text","onConfirm"])):y("v-if",!0)],64)):y("v-if",!0)]),emptyText:n(()=>[g("div",ce,[o(t.BankOutlined,{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),m(" "+s(t.planFilter||t.statusFilter?e.$t("tenant.table.emptyTenantsFiltered"):e.$t("tenant.table.emptyTenants")),1)])]),_:1},8,["columns","data-source","pagination","loading"])]),_:1},8,["tab"]),y(" ── Subscriptions tab ─────────────────────────────────────── "),o(B,{key:"subscriptions",tab:e.$t("tenant.tabs.subscriptions")},{default:n(()=>[o(G,{columns:t.subscriptionColumns,"data-source":t.subscriptions,pagination:{pageSize:20,showTotal:a=>e.$t("tenant.table.totalSuffix",{n:a})},size:"small",loading:t.loading,style:{background:"var(--bg-card)"}},{bodyCell:n(({column:a,record:c})=>[a.key==="tenant"?(d(),p(C,{key:0},[g("span",me,s(t.tenantName(c.tenantId)),1),g("div",fe,s(c.tenantId.slice(0,8)),1)],64)):y("v-if",!0),a.key==="plan"?(d(),_(A,{key:1,color:t.planColor(c.plan)},{default:n(()=>[m(s(t.planLabel(c.plan)),1)]),_:2},1032,["color"])):y("v-if",!0),a.key==="amount"?(d(),p(C,{key:2},[c.amount!=null?(d(),p("span",pe,"¥"+s(c.amount),1)):(d(),p("span",be,"—"))],64)):y("v-if",!0),a.key==="status"?(d(),_(A,{key:3,color:t.subStatusColor(c.status)},{default:n(()=>[m(s(t.subStatusLabel(c.status)),1)]),_:2},1032,["color"])):y("v-if",!0),a.key==="startedAt"?(d(),p("span",ye,s(t.formatTenantTime(c.startedAt)),1)):y("v-if",!0),a.key==="expiresAt"?(d(),p("span",ge,s(t.formatTenantTime(c.expiresAt)),1)):y("v-if",!0),a.key==="action"?(d(),p(C,{key:6},[c.status==="active"?(d(),_(V,{key:0,title:e.$t("tenant.cancelConfirm.title"),"ok-text":e.$t("tenant.cancelConfirm.ok"),"cancel-text":e.$t("tenant.cancelConfirm.cancel"),onConfirm:L=>t.cancelSubscription(c)},{default:n(()=>[o(x,{size:"small",type:"link",danger:""},{default:n(()=>[m(s(e.$t("tenant.cancelConfirm.ok")),1)]),_:1})]),_:1},8,["title","ok-text","cancel-text","onConfirm"])):y("v-if",!0)],64)):y("v-if",!0)]),emptyText:n(()=>[g("div",ve,[o(t.CreditCardOutlined,{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),m(" "+s(e.$t("tenant.table.emptySubscriptions")),1)])]),_:1},8,["columns","data-source","pagination","loading"])]),_:1},8,["tab"]),y(" ── Plans catalogue tab ──────────────────────────────────── "),o(B,{key:"plans",tab:e.$t("tenant.tabs.plans")},{default:n(()=>[o(Y,{gutter:[16,16]},{default:n(()=>[(d(!0),p(C,null,w(t.plans,a=>(d(),_(P,{key:a.id,xs:24,sm:12,lg:6},{default:n(()=>[o(R,{title:a.name,size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{extra:n(()=>[o(A,{color:t.planColor(a.id)},{default:n(()=>[m(s(a.id),1)]),_:2},1032,["color"])]),default:n(()=>[g("div",_e,[a.monthlyFee!=null?(d(),p("span",ke,[m("¥"+s(a.monthlyFee)+" ",1),g("span",he,s(e.$t("tenant.planCard.monthlySuffix")),1)])):(d(),p("span",Se,s(e.$t("tenant.planCard.contactSales")),1))]),g("div",Ce,[g("div",Fe,s(e.$t("tenant.planCard.quotas")),1),(d(!0),p(C,null,w(t.metrics,c=>(d(),p("div",{key:c.id,class:"plan-quota-row"},[g("span",qe,s(c.name),1),g("span",we,s(t.formatQuota(a.quotas?.[c.id],c.id)),1)]))),128))]),g("div",xe,[g("div",Ae,s(e.$t("tenant.planCard.features")),1),(d(!0),p(C,null,w(a.features,c=>(d(),_(A,{key:c,style:{"font-size":"10px",margin:"1px"}},{default:n(()=>[m(s(c),1)]),_:2},1024))),128))])]),_:2},1032,["title"])]),_:2},1024))),128))]),_:1})]),_:1},8,["tab"])]),_:1},8,["activeKey"]),y(" ── Create tenant modal ──────────────────────────────────── "),o(W,{open:t.showCreateModal,"onUpdate:open":l[7]||(l[7]=a=>t.showCreateModal=a),title:e.$t("tenant.create_modal.title"),"confirm-loading":t.creating,width:520,"ok-text":e.$t("tenant.create_modal.ok"),"cancel-text":e.$t("tenant.create_modal.cancel"),onOk:t.createTenant,onCancel:t.resetCreateForm},{default:n(()=>[o(N,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:n(()=>[o(F,{label:e.$t("tenant.create_modal.nameLabel"),required:""},{default:n(()=>[o(k,{value:t.createForm.name,"onUpdate:value":l[3]||(l[3]=a=>t.createForm.name=a),placeholder:e.$t("tenant.create_modal.namePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),o(F,{label:e.$t("tenant.create_modal.slugLabel"),required:""},{default:n(()=>[o(k,{value:t.createForm.slug,"onUpdate:value":l[4]||(l[4]=a=>t.createForm.slug=a),placeholder:e.$t("tenant.create_modal.slugPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),o(F,{label:e.$t("tenant.create_modal.planLabel")},{default:n(()=>[o(h,{value:t.createForm.plan,"onUpdate:value":l[5]||(l[5]=a=>t.createForm.plan=a)},{default:n(()=>[(d(!0),p(C,null,w(t.PLAN_IDS,a=>(d(),_(q,{key:a,value:a},{default:n(()=>[m(s(t.planLabel(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1},8,["label"]),o(F,{label:e.$t("tenant.create_modal.ownerLabel")},{default:n(()=>[o(k,{value:t.createForm.owner,"onUpdate:value":l[6]||(l[6]=a=>t.createForm.owner=a),placeholder:e.$t("tenant.create_modal.ownerPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"])]),_:1})]),_:1},8,["open","title","confirm-loading","ok-text","cancel-text"]),y(" ── Subscribe modal ──────────────────────────────────────── "),o(W,{open:t.showSubscribeModal,"onUpdate:open":l[11]||(l[11]=a=>t.showSubscribeModal=a),title:e.$t("tenant.subscribe_modal.title",{name:t.subscribeTargetName}),"confirm-loading":t.subscribing,width:500,"ok-text":e.$t("tenant.subscribe_modal.ok"),"cancel-text":e.$t("tenant.subscribe_modal.cancel"),onOk:t.subscribeTenant,onCancel:t.resetSubscribeForm},{default:n(()=>[o(N,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:n(()=>[o(F,{label:e.$t("tenant.subscribe_modal.planLabel"),required:""},{default:n(()=>[o(h,{value:t.subscribeForm.plan,"onUpdate:value":l[8]||(l[8]=a=>t.subscribeForm.plan=a)},{default:n(()=>[(d(!0),p(C,null,w(t.PLAN_IDS,a=>(d(),_(q,{key:a,value:a},{default:n(()=>[m(s(t.planLabel(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1},8,["label"]),o(F,{label:e.$t("tenant.subscribe_modal.amountLabel")},{default:n(()=>[o(tt,{value:t.subscribeForm.amount,"onUpdate:value":l[9]||(l[9]=a=>t.subscribeForm.amount=a),min:0,placeholder:e.$t("tenant.subscribe_modal.amountPlaceholder"),style:{width:"100%"}},null,8,["value","placeholder"])]),_:1},8,["label"]),o(F,{label:e.$t("tenant.subscribe_modal.durationLabel")},{default:n(()=>[o(E,{value:t.subscribeForm.duration,"onUpdate:value":l[10]||(l[10]=a=>t.subscribeForm.duration=a)},{default:n(()=>[o(O,{value:720*60*60*1e3},{default:n(()=>[m(s(e.$t("tenant.subscribe_modal.duration30")),1)]),_:1}),o(O,{value:2160*60*60*1e3},{default:n(()=>[m(s(e.$t("tenant.subscribe_modal.duration90")),1)]),_:1}),o(O,{value:365*24*60*60*1e3},{default:n(()=>[m(s(e.$t("tenant.subscribe_modal.duration365")),1)]),_:1})]),_:1},8,["value"])]),_:1},8,["label"])]),_:1})]),_:1},8,["open","title","confirm-loading","ok-text","cancel-text"]),y(" ── Quota check modal ────────────────────────────────────── "),o(W,{open:t.showQuotaModal,"onUpdate:open":l[15]||(l[15]=a=>t.showQuotaModal=a),title:e.$t("tenant.quota_modal.title"),"confirm-loading":t.checking,width:500,"ok-text":e.$t("tenant.quota_modal.ok"),"cancel-text":e.$t("tenant.quota_modal.cancel"),onOk:t.checkQuota},{default:n(()=>[o(N,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:n(()=>[o(F,{label:e.$t("tenant.quota_modal.tenantLabel"),required:""},{default:n(()=>[o(h,{value:t.quotaForm.tenantId,"onUpdate:value":l[12]||(l[12]=a=>t.quotaForm.tenantId=a),"show-search":"",placeholder:e.$t("tenant.quota_modal.tenantPlaceholder")},{default:n(()=>[(d(!0),p(C,null,w(t.tenants,a=>(d(),_(q,{key:a.id,value:a.id},{default:n(()=>[m(s(a.name)+" ("+s(a.slug)+")",1)]),_:2},1032,["value"]))),128))]),_:1},8,["value","placeholder"])]),_:1},8,["label"]),o(F,{label:e.$t("tenant.quota_modal.metricLabel"),required:""},{default:n(()=>[o(h,{value:t.quotaForm.metric,"onUpdate:value":l[13]||(l[13]=a=>t.quotaForm.metric=a)},{default:n(()=>[(d(!0),p(C,null,w(t.KNOWN_METRICS,a=>(d(),_(q,{key:a,value:a},{default:n(()=>[m(s(a),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1},8,["label"]),o(F,{label:e.$t("tenant.quota_modal.periodLabel")},{default:n(()=>[o(k,{value:t.quotaForm.period,"onUpdate:value":l[14]||(l[14]=a=>t.quotaForm.period=a),placeholder:e.$t("tenant.quota_modal.periodPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"])]),_:1}),t.quotaResult?(d(),_(R,{key:0,size:"small",style:{background:"var(--bg-base)","margin-top":"8px"}},{default:n(()=>[o(I,{title:e.$t("tenant.quota_modal.resultTitle"),value:t.quotaResult.unlimited?e.$t("tenant.quota_modal.unlimited"):t.quotaResult.exceeded?e.$t("tenant.quota_modal.exceeded"):e.$t("tenant.quota_modal.ok_state"),"value-style":{color:t.quotaResult.exceeded?"#ff4d4f":t.quotaResult.unlimited?"#722ed1":"#52c41a"}},null,8,["title","value","value-style"]),g("div",Te,[g("div",null,[m(s(e.$t("tenant.quota_modal.planLine"))+" ",1),o(A,{color:t.planColor(t.quotaResult.plan)},{default:n(()=>[m(s(t.planLabel(t.quotaResult.plan)),1)]),_:1},8,["color"])]),g("div",null,s(e.$t("tenant.quota_modal.periodLine",{period:t.quotaResult.period})),1),g("div",null,[m(s(e.$t("tenant.quota_modal.usedLine"))+" ",1),g("span",Le,s(t.formatMetricValue(t.quotaResult.used,t.quotaResult.metric)),1)]),t.quotaResult.unlimited?y("v-if",!0):(d(),p("div",ze,[m(s(e.$t("tenant.quota_modal.limitLine"))+" ",1),g("span",Re,s(t.formatMetricValue(t.quotaResult.limit,t.quotaResult.metric)),1)])),!t.quotaResult.unlimited&&t.quotaResult.limit>0?(d(),p("div",Oe,[o(et,{percent:Math.min(100,Math.round(100*t.quotaResult.used/t.quotaResult.limit)),size:"small",status:t.quotaResult.exceeded?"exception":"active"},null,8,["percent","status"])])):y("v-if",!0)])]),_:1})):y("v-if",!0)]),_:1},8,["open","title","confirm-loading","ok-text","cancel-text"]),y(" ── Record usage modal ───────────────────────────────────── "),o(W,{open:t.showRecordModal,"onUpdate:open":l[20]||(l[20]=a=>t.showRecordModal=a),title:e.$t("tenant.record_modal.title"),"confirm-loading":t.recording,width:500,"ok-text":e.$t("tenant.record_modal.ok"),"cancel-text":e.$t("tenant.record_modal.cancel"),onOk:t.recordUsage,onCancel:t.resetRecordForm},{default:n(()=>[o(N,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:n(()=>[o(F,{label:e.$t("tenant.record_modal.tenantLabel"),required:""},{default:n(()=>[o(h,{value:t.recordForm.tenantId,"onUpdate:value":l[16]||(l[16]=a=>t.recordForm.tenantId=a),"show-search":"",placeholder:e.$t("tenant.record_modal.tenantPlaceholder")},{default:n(()=>[(d(!0),p(C,null,w(t.tenants,a=>(d(),_(q,{key:a.id,value:a.id},{default:n(()=>[m(s(a.name)+" ("+s(a.slug)+")",1)]),_:2},1032,["value"]))),128))]),_:1},8,["value","placeholder"])]),_:1},8,["label"]),o(F,{label:e.$t("tenant.record_modal.metricLabel"),required:""},{default:n(()=>[o(h,{value:t.recordForm.metric,"onUpdate:value":l[17]||(l[17]=a=>t.recordForm.metric=a)},{default:n(()=>[(d(!0),p(C,null,w(t.KNOWN_METRICS,a=>(d(),_(q,{key:a,value:a},{default:n(()=>[m(s(a),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1},8,["label"]),o(F,{label:e.$t("tenant.record_modal.valueLabel"),required:""},{default:n(()=>[o(tt,{value:t.recordForm.value,"onUpdate:value":l[18]||(l[18]=a=>t.recordForm.value=a),min:0,style:{width:"100%"}},null,8,["value"])]),_:1},8,["label"]),o(F,{label:e.$t("tenant.record_modal.periodLabel")},{default:n(()=>[o(k,{value:t.recordForm.period,"onUpdate:value":l[19]||(l[19]=a=>t.recordForm.period=a),placeholder:e.$t("tenant.record_modal.periodPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"])]),_:1})]),_:1},8,["open","title","confirm-loading","ok-text","cancel-text"])])}const Me=Nt(te,[["render",Ie],["__scopeId","data-v-c93a3192"],["__file","/tmp/cc-web-panel-Hs0OhX/repo/packages/web-panel/src/views/Tenant.vue"]]);export{Me as default};
1
+ import{I as v,J as p,U as g,R as s,c as o,K as n,V as y,S as _,o as it,a as H,b as X,r as h,P as d,Q as m,F as C,Z as w}from"./vendor-BvqAck49.js";import{_ as Nt,u as ut,b as dt,d as b}from"./index-qW3-iWXU.js";import{s as Ut}from"./community-parser-CO25nZFt.js";import{a8 as jt,aY as Mt,ac as Et,b4 as Bt,n as Dt,as as Qt,R as Kt}from"./icons-DP3uiYxy.js";function J(e){const l=Ut(e);if(!l)return null;try{return JSON.parse(l)}catch{}const u=l.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!u)return null;try{return JSON.parse(u[0])}catch{return null}}const Vt=Object.freeze(["free","starter","pro","enterprise"]),Wt=Object.freeze(["active","suspended","deleted"]),Jt=Object.freeze(["api_calls","storage_bytes","ai_requests"]);function z(e,l=0){return typeof e=="number"&&Number.isFinite(e)?e:l}function Gt(e,l=0){if(!e||typeof e!="object")return null;const u=e.id||"";if(!u)return null;const t=e.quotas&&typeof e.quotas=="object"?{...e.quotas}:{};return{key:u,id:u,name:String(e.name||u),monthlyFee:e.monthlyFee==null?null:z(e.monthlyFee,null),quotas:t,features:Array.isArray(e.features)?e.features.filter(D=>typeof D=="string"):[],_idx:l}}function ct(e){const l=J(e);return Array.isArray(l)?l.map(Gt).filter(Boolean):[]}function Yt(e,l=0){if(!e||typeof e!="object")return null;const u=e.id||"";return u?{key:u,id:u,name:String(e.name||u),unit:String(e.unit||""),_idx:l}:null}function mt(e){const l=J(e);return Array.isArray(l)?l.map(Yt).filter(Boolean):[]}function Zt(e,l=0){if(!e||typeof e!="object")return null;const u=e.id||"";return u?{key:u,id:u,name:String(e.name||""),slug:String(e.slug||""),config:e.config??null,status:String(e.status||"active").toLowerCase(),plan:String(e.plan||"free").toLowerCase(),dbPath:e.dbPath||null,ownerId:e.ownerId||"",createdAt:e.createdAt??null,updatedAt:e.updatedAt??null,deletedAt:e.deletedAt??null,_idx:l}:null}function ft(e){const l=J(e);return Array.isArray(l)?l.map(Zt).filter(Boolean):[]}function Ht(e,l=0){if(!e||typeof e!="object")return null;const u=e.id||"";return u?{key:u,id:u,tenantId:String(e.tenantId||""),plan:String(e.plan||"free").toLowerCase(),status:String(e.status||"active").toLowerCase(),startedAt:e.startedAt??null,expiresAt:e.expiresAt??null,cancelledAt:e.cancelledAt??null,paymentMethod:e.paymentMethod||null,amount:e.amount==null?null:z(e.amount,null),createdAt:e.createdAt??null,_idx:l}:null}function pt(e){const l=J(e);return Array.isArray(l)?l.map(Ht).filter(Boolean):[]}function bt(e){const l=J(e);return!l||typeof l!="object"||Array.isArray(l)?null:{tenantId:String(l.tenantId||""),plan:String(l.plan||"free").toLowerCase(),metric:String(l.metric||""),period:String(l.period||""),limit:l.limit==null?null:z(l.limit,null),used:z(l.used,0),remaining:l.remaining==null?null:z(l.remaining,null),unlimited:!!l.unlimited,exceeded:!!l.exceeded}}const Xt={tenantCount:0,byStatus:{active:0,suspended:0,deleted:0},byPlan:{free:0,starter:0,pro:0,enterprise:0},subscriptionCount:0,activeSubscriptions:0,usageRecordCount:0,totalUsage:{api_calls:0,storage_bytes:0,ai_requests:0}};function yt(e){const l=JSON.parse(JSON.stringify(Xt)),u=J(e);if(!u||typeof u!="object"||Array.isArray(u))return l;if(l.tenantCount=z(u.tenantCount,0),l.subscriptionCount=z(u.subscriptionCount,0),l.activeSubscriptions=z(u.activeSubscriptions,0),l.usageRecordCount=z(u.usageRecordCount,0),u.byStatus&&typeof u.byStatus=="object")for(const t of Object.keys(l.byStatus))l.byStatus[t]=z(u.byStatus[t],0);if(u.byPlan&&typeof u.byPlan=="object")for(const t of Object.keys(l.byPlan))l.byPlan[t]=z(u.byPlan[t],0);if(u.totalUsage&&typeof u.totalUsage=="object")for(const t of Object.keys(l.totalUsage))l.totalUsage[t]=z(u.totalUsage[t],0);return l}function $t(e){if(e==null||e==="")return"—";const l=typeof e=="number"?new Date(e):new Date(String(e));return isNaN(l.getTime())?String(e):l.toLocaleString("zh-CN",{hour12:!1})}function nt(e){return typeof e!="number"||!Number.isFinite(e)||e<0?"—":e===0?"0":e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:e<1024*1024*1024?`${(e/1024/1024).toFixed(1)} MB`:`${(e/1024/1024/1024).toFixed(2)} GB`}function gt(e=new Date){const l=e.getFullYear(),u=String(e.getMonth()+1).padStart(2,"0");return`${l}-${u}`}const te={__name:"Tenant",setup(e,{expose:l}){l();const u=ut(),{t}=dt(),D=h(!1),$=h(!1),x=h(!1),j=h(!1),Q=h(!1),M=h([]),K=h([]),O=h([]),R=h([]),P=h({tenantCount:0,byStatus:{active:0,suspended:0,deleted:0},byPlan:{free:0,starter:0,pro:0,enterprise:0},subscriptionCount:0,activeSubscriptions:0,usageRecordCount:0,totalUsage:{api_calls:0,storage_bytes:0,ai_requests:0}}),G=h("tenants"),A=h(""),I=h(""),E=h(!1),V=h(!1),Y=h(!1),B=h(!1),T=H({name:"",slug:"",plan:"free",owner:""}),k=H({tenantId:"",plan:"pro",amount:null,duration:720*60*60*1e3}),F=h(""),q=H({tenantId:null,metric:"api_calls",period:""}),S=H({tenantId:null,metric:"api_calls",value:1,period:""}),N=h(null),W=X(()=>[{title:t("tenant.tenantCols.name"),key:"name"},{title:t("tenant.tenantCols.plan"),key:"plan",width:"110px"},{title:t("tenant.tenantCols.status"),key:"status",width:"100px"},{title:t("tenant.tenantCols.owner"),key:"owner",width:"160px"},{title:t("tenant.tenantCols.createdAt"),key:"createdAt",width:"160px"},{title:t("tenant.tenantCols.action"),key:"action",width:"280px"}]),tt=X(()=>[{title:t("tenant.subscriptionCols.tenant"),key:"tenant"},{title:t("tenant.subscriptionCols.plan"),key:"plan",width:"110px"},{title:t("tenant.subscriptionCols.amount"),key:"amount",width:"100px"},{title:t("tenant.subscriptionCols.status"),key:"status",width:"110px"},{title:t("tenant.subscriptionCols.startedAt"),key:"startedAt",width:"160px"},{title:t("tenant.subscriptionCols.expiresAt"),key:"expiresAt",width:"160px"},{title:t("tenant.subscriptionCols.action"),key:"action",width:"120px"}]),et=X(()=>{let r=M.value;return A.value&&(r=r.filter(i=>i.plan===A.value)),I.value&&(r=r.filter(i=>i.status===I.value)),r}),a=X(()=>K.value.filter(r=>r.status==="active"&&typeof r.amount=="number").reduce((r,i)=>r+i.amount,0));function c(r){const i=`tenant.planLabels.${r}`,f=t(i);return f===i?r:f}function L(r){return{free:"default",starter:"blue",pro:"purple",enterprise:"gold"}[r]||"default"}function vt(r){const i=`tenant.tenantStatusLabels.${r}`,f=t(i);return f===i?r:f}function _t(r){return{active:"green",suspended:"orange",deleted:"default"}[r]||"default"}function kt(r){const i=`tenant.subStatusLabels.${r}`,f=t(i);return f===i?r:f}function St(r){return{active:"green",cancelled:"default",expired:"red",past_due:"orange"}[r]||"default"}function ht(r){const i=M.value.find(f=>f.id===r);return i?i.name:t("tenant.deletedTenant")}function Ct(r,i){return r==null?"—":i==="storage_bytes"?nt(r):String(r)}function Ft(r,i){return r==null?t("tenant.planCard.unlimited"):i==="storage_bytes"?nt(r):r.toLocaleString()}function qt({key:r}){r==="tenant"?E.value=!0:r==="quota"?(N.value=null,Y.value=!0):r==="record"&&(B.value=!0)}async function U(){D.value=!0;try{const[r,i,f,Z,Pt]=await Promise.all([u.execute("tenant list --json",1e4).catch(()=>({output:""})),u.execute("tenant subscriptions --json",1e4).catch(()=>({output:""})),u.execute("tenant plans --json",8e3).catch(()=>({output:""})),u.execute("tenant metrics --json",8e3).catch(()=>({output:""})),u.execute("tenant stats --json",8e3).catch(()=>({output:""}))]);M.value=ft(r.output),K.value=pt(i.output),O.value=ct(f.output),R.value=mt(Z.output),P.value=yt(Pt.output)}catch(r){b.error(t("tenant.msg.loadFailed")+": "+(r?.message||r))}finally{D.value=!1}}async function wt(){const r=T.name.trim(),i=T.slug.trim();if(!r||!i){b.warning(t("tenant.msg.createFieldsEmpty"));return}if(!/^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]$/.test(i)){b.warning(t("tenant.msg.slugInvalid"));return}$.value=!0;try{const f=[`tenant create "${r.replace(/"/g,'\\"')}" "${i.replace(/"/g,'\\"')}"`];f.push(`--plan ${T.plan}`),T.owner.trim()&&f.push(`--owner "${T.owner.trim().replace(/"/g,'\\"')}"`),f.push("--json");const{output:Z}=await u.execute(f.join(" "),1e4);if(/error|Error|失败/i.test(Z)&&!/"id"/.test(Z)){b.error(t("tenant.msg.createFailed")+": "+Z.slice(0,120));return}b.success(t("tenant.msg.createSuccess")),E.value=!1,lt(),await U()}catch(f){b.error(t("tenant.msg.createFailed")+": "+(f?.message||f))}finally{$.value=!1}}function xt(r){k.tenantId=r.id,k.plan=r.plan==="free"?"starter":r.plan,k.amount=null,k.duration=720*60*60*1e3,F.value=r.name,V.value=!0}async function At(){x.value=!0;try{const r=[`tenant subscribe ${k.tenantId}`];r.push(`--plan ${k.plan}`),k.amount!=null&&r.push(`--amount ${k.amount}`),k.duration&&r.push(`--duration-ms ${k.duration}`),r.push("--json");const{output:i}=await u.execute(r.join(" "),1e4);if(/error|Error|失败/i.test(i)&&!/"id"/.test(i)){b.error(t("tenant.msg.subscribeFailed")+": "+i.slice(0,120));return}b.success(t("tenant.msg.subscribeSuccess")),V.value=!1,ot(),G.value="subscriptions",await U()}catch(r){b.error(t("tenant.msg.subscribeFailed")+": "+(r?.message||r))}finally{x.value=!1}}async function Tt(r,i){if(i!==r.plan)try{const{output:f}=await u.execute(`tenant configure ${r.id} --plan ${i} --json`,8e3);if(/error|Error/i.test(f)&&!/"id"/.test(f)){b.error(t("tenant.msg.planChangeFailed")+": "+f.slice(0,120));return}b.success(t("tenant.msg.planChangeSuccess",{plan:c(i)})),await U()}catch(f){b.error(t("tenant.msg.planChangeFailed")+": "+(f?.message||f))}}async function Lt(r,i){try{const{output:f}=await u.execute(`tenant configure ${r.id} --status ${i} --json`,8e3);if(/error|Error/i.test(f)&&!/"id"/.test(f)){b.error(t("tenant.msg.statusChangeFailed")+": "+f.slice(0,120));return}b.success(t(i==="active"?"tenant.msg.activated":"tenant.msg.suspended")),await U()}catch(f){b.error(t("tenant.msg.statusChangeFailed")+": "+(f?.message||f))}}async function zt(r){try{const{output:i}=await u.execute(`tenant delete ${r.id} --json`,8e3);if(/error|Error/i.test(i)&&!/deleted|removed/.test(i)){b.error(t("tenant.msg.deleteFailed")+": "+i.slice(0,120));return}b.success(t("tenant.msg.deleteSuccess")),await U()}catch(i){b.error(t("tenant.msg.deleteFailed")+": "+(i?.message||i))}}async function Rt(r){try{const{output:i}=await u.execute(`tenant cancel ${r.tenantId}`,8e3);if(/error|Error/i.test(i)&&!/cancelled|cancel/i.test(i)){b.error(t("tenant.msg.cancelFailed")+": "+i.slice(0,120));return}b.success(t("tenant.msg.cancelSuccess")),await U()}catch(i){b.error(t("tenant.msg.cancelFailed")+": "+(i?.message||i))}}async function It(){if(!q.tenantId){b.warning(t("tenant.msg.tenantEmpty"));return}j.value=!0,N.value=null;try{const r=[`tenant check-quota ${q.tenantId} ${q.metric}`];q.period.trim()&&r.push(`--period ${q.period.trim()}`),r.push("--json");const{output:i}=await u.execute(r.join(" "),8e3),f=bt(i);if(!f){b.error(t("tenant.msg.checkFailed")+": "+i.slice(0,120));return}N.value=f,f.exceeded&&b.warning(t("tenant.msg.exceededWarning"))}catch(r){b.error(t("tenant.msg.checkFailed")+": "+(r?.message||r))}finally{j.value=!1}}async function Ot(){if(!S.tenantId){b.warning(t("tenant.msg.tenantEmpty"));return}if(S.value==null||S.value<0){b.warning(t("tenant.msg.valueInvalid"));return}Q.value=!0;try{const r=[`tenant record ${S.tenantId} ${S.metric} ${S.value}`];S.period.trim()&&r.push(`--period ${S.period.trim()}`),r.push("--json");const{output:i}=await u.execute(r.join(" "),8e3);if(/error|Error/i.test(i)&&!/"id"|"tenant"/.test(i)){b.error(t("tenant.msg.recordFailed")+": "+i.slice(0,120));return}b.success(t("tenant.msg.recordSuccess")),B.value=!1,rt(),await U()}catch(r){b.error(t("tenant.msg.recordFailed")+": "+(r?.message||r))}finally{Q.value=!1}}function lt(){T.name="",T.slug="",T.plan="free",T.owner=""}function ot(){k.tenantId="",k.plan="pro",k.amount=null,k.duration=720*60*60*1e3,F.value=""}function rt(){S.tenantId=null,S.metric="api_calls",S.value=1,S.period=""}function at(r){r.period||(r.period=gt())}at(q),at(S),it(U);const st={ws:u,t,loading:D,creating:$,subscribing:x,checking:j,recording:Q,tenants:M,subscriptions:K,plans:O,metrics:R,stats:P,activeTab:G,planFilter:A,statusFilter:I,showCreateModal:E,showSubscribeModal:V,showQuotaModal:Y,showRecordModal:B,createForm:T,subscribeForm:k,subscribeTargetName:F,quotaForm:q,recordForm:S,quotaResult:N,tenantColumns:W,subscriptionColumns:tt,filteredTenants:et,estimatedMrr:a,planLabel:c,planColor:L,tenantStatusLabel:vt,tenantStatusColor:_t,subStatusLabel:kt,subStatusColor:St,tenantName:ht,formatMetricValue:Ct,formatQuota:Ft,handleNewClick:qt,loadAll:U,createTenant:wt,openSubscribe:xt,subscribeTenant:At,changePlan:Tt,setStatus:Lt,deleteTenant:zt,cancelSubscription:Rt,checkQuota:It,recordUsage:Ot,resetCreateForm:lt,resetSubscribeForm:ot,resetRecordForm:rt,ensurePeriodDefault:at,ref:h,computed:X,onMounted:it,reactive:H,get ReloadOutlined(){return Kt},get PlusOutlined(){return Qt},get BankOutlined(){return Dt},get CreditCardOutlined(){return Bt},get DashboardOutlined(){return Et},get LineChartOutlined(){return Mt},get ApiOutlined(){return jt},get message(){return b},get useI18n(){return dt},get useWsStore(){return ut},get parsePlans(){return ct},get parseMetrics(){return mt},get parseTenants(){return ft},get parseSubscriptions(){return pt},get parseQuotaResult(){return bt},get parseStats(){return yt},get formatTenantTime(){return $t},get formatBytes(){return nt},get currentPeriod(){return gt},get PLAN_IDS(){return Vt},get TENANT_STATUSES(){return Wt},get KNOWN_METRICS(){return Jt}};return Object.defineProperty(st,"__isScriptSetup",{enumerable:!1,value:!0}),st}},ee={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},ae={class:"page-title"},ne={class:"page-sub"},le={style:{color:"var(--text-secondary)","font-size":"12px","margin-left":"8px"}},oe={class:"filter-bar"},re={style:{color:"var(--text-primary)","font-weight":"500"}},se={style:{color:"var(--text-secondary)","font-size":"11px","margin-top":"2px","font-family":"monospace"}},ie={key:0,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"11px"}},ue={key:1,style:{color:"var(--text-muted)"}},de={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},ce={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},me={style:{color:"var(--text-primary)","font-weight":"500"}},fe={style:{color:"var(--text-secondary)","font-size":"11px","font-family":"monospace"}},pe={key:0,style:{color:"#722ed1","font-weight":"500"}},be={key:1,style:{color:"var(--text-muted)"}},ye={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},ge={key:5,style:{color:"var(--text-secondary)","font-size":"11px"}},ve={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},_e={class:"plan-fee"},ke={key:0},Se={class:"plan-fee-unit"},he={key:1,style:{color:"#722ed1"}},Ce={class:"plan-section"},Fe={class:"plan-section-title"},qe={class:"plan-quota-label"},we={class:"plan-quota-value"},xe={class:"plan-section"},Ae={class:"plan-section-title"},Te={style:{"margin-top":"12px","font-size":"12px",color:"var(--text-secondary)"}},Le={style:{"font-family":"monospace",color:"var(--text-primary)"}},ze={key:0},Re={style:{"font-family":"monospace"}},Ie={key:1,style:{"margin-top":"8px"}};function Oe(e,l,u,t,D,$){const x=v("a-button"),j=v("a-menu-item"),Q=v("a-menu"),M=v("a-dropdown"),K=v("a-space"),O=v("a-statistic"),R=v("a-card"),P=v("a-col"),G=v("a-row"),A=v("a-tag"),I=v("a-radio-button"),E=v("a-radio-group"),V=v("a-popconfirm"),Y=v("a-table"),B=v("a-tab-pane"),T=v("a-tabs"),k=v("a-input"),F=v("a-form-item"),q=v("a-select-option"),S=v("a-select"),N=v("a-form"),W=v("a-modal"),tt=v("a-input-number"),et=v("a-progress");return d(),p("div",null,[g("div",ee,[g("div",null,[g("h2",ae,s(e.$t("tenant.title")),1),g("p",ne,s(e.$t("tenant.subtitle")),1)]),o(K,null,{default:n(()=>[o(x,{loading:t.loading,onClick:t.loadAll},{icon:n(()=>[o(t.ReloadOutlined)]),default:n(()=>[m(" "+s(e.$t("tenant.refresh")),1)]),_:1},8,["loading"]),o(M,{trigger:["click"]},{overlay:n(()=>[o(Q,{onClick:t.handleNewClick},{default:n(()=>[o(j,{key:"tenant"},{default:n(()=>[o(t.BankOutlined),m(" "+s(e.$t("tenant.actions.tenant")),1)]),_:1}),o(j,{key:"quota"},{default:n(()=>[o(t.DashboardOutlined),m(" "+s(e.$t("tenant.actions.quota")),1)]),_:1}),o(j,{key:"record"},{default:n(()=>[o(t.LineChartOutlined),m(" "+s(e.$t("tenant.actions.record")),1)]),_:1})]),_:1})]),default:n(()=>[o(x,{type:"primary"},{icon:n(()=>[o(t.PlusOutlined)]),default:n(()=>[m(" "+s(e.$t("tenant.actionDropdown")),1)]),_:1})]),_:1})]),_:1})]),y(" Stat cards "),o(G,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:n(()=>[o(P,{xs:12,sm:8,lg:5},{default:n(()=>[o(R,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(O,{title:e.$t("tenant.stats.total"),value:t.stats.tenantCount,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:n(()=>[o(t.BankOutlined)]),_:1},8,["title","value"])]),_:1})]),_:1}),o(P,{xs:12,sm:8,lg:5},{default:n(()=>[o(R,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(O,{title:e.$t("tenant.stats.active"),value:t.stats.activeSubscriptions,"value-style":{color:t.stats.activeSubscriptions>0?"#52c41a":"#888",fontSize:"20px"}},{prefix:n(()=>[o(t.CreditCardOutlined)]),_:1},8,["title","value","value-style"])]),_:1})]),_:1}),o(P,{xs:12,sm:8,lg:5},{default:n(()=>[o(R,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(O,{title:e.$t("tenant.stats.mrr"),value:t.estimatedMrr,precision:0,prefix:"¥","value-style":{color:"#722ed1",fontSize:"20px"}},null,8,["title","value"])]),_:1})]),_:1}),o(P,{xs:12,sm:8,lg:5},{default:n(()=>[o(R,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(O,{title:e.$t("tenant.stats.apiCalls"),value:t.stats.totalUsage.api_calls,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:n(()=>[o(t.ApiOutlined)]),_:1},8,["title","value"])]),_:1})]),_:1}),o(P,{xs:24,sm:8,lg:4},{default:n(()=>[o(R,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(O,{title:e.$t("tenant.stats.storage"),value:t.formatBytes(t.stats.totalUsage.storage_bytes),"value-style":{color:"#faad14",fontSize:"18px"}},null,8,["title","value"])]),_:1})]),_:1})]),_:1}),y(" Plan distribution "),t.stats.tenantCount>0?(d(),_(R,{key:0,title:e.$t("tenant.plansCard"),size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"},"body-style":{padding:"12px 16px"}},{default:n(()=>[o(K,{size:[12,8],wrap:""},{default:n(()=>[(d(!0),p(C,null,w(t.PLAN_IDS,a=>(d(),_(A,{key:a,color:t.planColor(a)},{default:n(()=>[m(s(t.planLabel(a))+": "+s(t.stats.byPlan[a]||0),1)]),_:2},1032,["color"]))),128)),g("span",le,s(e.$t("tenant.summarySuffix",{active:t.stats.byStatus.active,suspended:t.stats.byStatus.suspended,deleted:t.stats.byStatus.deleted})),1)]),_:1})]),_:1},8,["title"])):y("v-if",!0),y(" Tabs "),o(T,{activeKey:t.activeTab,"onUpdate:activeKey":l[2]||(l[2]=a=>t.activeTab=a),class:"tenant-tabs"},{default:n(()=>[y(" ── Tenants tab ───────────────────────────────────────────── "),o(B,{key:"tenants",tab:e.$t("tenant.tabs.tenants")},{default:n(()=>[g("div",oe,[o(E,{value:t.planFilter,"onUpdate:value":l[0]||(l[0]=a=>t.planFilter=a),size:"small"},{default:n(()=>[o(I,{value:""},{default:n(()=>[m(s(e.$t("tenant.filter.allPlans")),1)]),_:1}),(d(!0),p(C,null,w(t.PLAN_IDS,a=>(d(),_(I,{key:a,value:a},{default:n(()=>[m(s(t.planLabel(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),o(E,{value:t.statusFilter,"onUpdate:value":l[1]||(l[1]=a=>t.statusFilter=a),size:"small","button-style":"solid"},{default:n(()=>[o(I,{value:""},{default:n(()=>[m(s(e.$t("tenant.filter.allStatuses")),1)]),_:1}),(d(!0),p(C,null,w(t.TENANT_STATUSES,a=>(d(),_(I,{key:a,value:a},{default:n(()=>[m(s(t.tenantStatusLabel(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),o(Y,{columns:t.tenantColumns,"data-source":t.filteredTenants,pagination:{pageSize:20,showTotal:a=>e.$t("tenant.table.totalSuffix",{n:a})},size:"small",loading:t.loading,style:{background:"var(--bg-card)"}},{bodyCell:n(({column:a,record:c})=>[a.key==="name"?(d(),p(C,{key:0},[g("span",re,s(c.name),1),g("div",se,s(c.slug),1)],64)):y("v-if",!0),a.key==="plan"?(d(),_(A,{key:1,color:t.planColor(c.plan)},{default:n(()=>[m(s(t.planLabel(c.plan)),1)]),_:2},1032,["color"])):y("v-if",!0),a.key==="status"?(d(),_(A,{key:2,color:t.tenantStatusColor(c.status)},{default:n(()=>[m(s(t.tenantStatusLabel(c.status)),1)]),_:2},1032,["color"])):y("v-if",!0),a.key==="owner"?(d(),p(C,{key:3},[c.ownerId?(d(),p("span",ie,s(c.ownerId),1)):(d(),p("span",ue,"—"))],64)):y("v-if",!0),a.key==="createdAt"?(d(),p("span",de,s(t.formatTenantTime(c.createdAt)),1)):y("v-if",!0),a.key==="action"?(d(),p(C,{key:5},[o(x,{size:"small",type:"link",onClick:L=>t.openSubscribe(c)},{default:n(()=>[m(s(e.$t("tenant.table.actionSubscribe")),1)]),_:1},8,["onClick"]),o(M,{trigger:["click"]},{overlay:n(()=>[o(Q,{onClick:L=>t.changePlan(c,L.key)},{default:n(()=>[(d(!0),p(C,null,w(t.PLAN_IDS,L=>(d(),_(j,{key:L,disabled:L===c.plan},{default:n(()=>[m(s(t.planLabel(L)),1)]),_:2},1032,["disabled"]))),128))]),_:2},1032,["onClick"])]),default:n(()=>[o(x,{size:"small",type:"link"},{default:n(()=>[m(s(e.$t("tenant.table.actionPlanDropdown")),1)]),_:1})]),_:2},1024),c.status==="active"?(d(),_(x,{key:0,size:"small",type:"link",onClick:L=>t.setStatus(c,"suspended")},{default:n(()=>[m(s(e.$t("tenant.table.actionSuspend")),1)]),_:1},8,["onClick"])):c.status==="suspended"?(d(),_(x,{key:1,size:"small",type:"link",onClick:L=>t.setStatus(c,"active")},{default:n(()=>[m(s(e.$t("tenant.table.actionActivate")),1)]),_:1},8,["onClick"])):y("v-if",!0),c.status!=="deleted"?(d(),_(V,{key:2,title:e.$t("tenant.deleteConfirm.title"),"ok-text":e.$t("tenant.deleteConfirm.ok"),"cancel-text":e.$t("tenant.deleteConfirm.cancel"),onConfirm:L=>t.deleteTenant(c)},{default:n(()=>[o(x,{size:"small",type:"link",danger:""},{default:n(()=>[m(s(e.$t("tenant.deleteConfirm.ok")),1)]),_:1})]),_:1},8,["title","ok-text","cancel-text","onConfirm"])):y("v-if",!0)],64)):y("v-if",!0)]),emptyText:n(()=>[g("div",ce,[o(t.BankOutlined,{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),m(" "+s(t.planFilter||t.statusFilter?e.$t("tenant.table.emptyTenantsFiltered"):e.$t("tenant.table.emptyTenants")),1)])]),_:1},8,["columns","data-source","pagination","loading"])]),_:1},8,["tab"]),y(" ── Subscriptions tab ─────────────────────────────────────── "),o(B,{key:"subscriptions",tab:e.$t("tenant.tabs.subscriptions")},{default:n(()=>[o(Y,{columns:t.subscriptionColumns,"data-source":t.subscriptions,pagination:{pageSize:20,showTotal:a=>e.$t("tenant.table.totalSuffix",{n:a})},size:"small",loading:t.loading,style:{background:"var(--bg-card)"}},{bodyCell:n(({column:a,record:c})=>[a.key==="tenant"?(d(),p(C,{key:0},[g("span",me,s(t.tenantName(c.tenantId)),1),g("div",fe,s(c.tenantId.slice(0,8)),1)],64)):y("v-if",!0),a.key==="plan"?(d(),_(A,{key:1,color:t.planColor(c.plan)},{default:n(()=>[m(s(t.planLabel(c.plan)),1)]),_:2},1032,["color"])):y("v-if",!0),a.key==="amount"?(d(),p(C,{key:2},[c.amount!=null?(d(),p("span",pe,"¥"+s(c.amount),1)):(d(),p("span",be,"—"))],64)):y("v-if",!0),a.key==="status"?(d(),_(A,{key:3,color:t.subStatusColor(c.status)},{default:n(()=>[m(s(t.subStatusLabel(c.status)),1)]),_:2},1032,["color"])):y("v-if",!0),a.key==="startedAt"?(d(),p("span",ye,s(t.formatTenantTime(c.startedAt)),1)):y("v-if",!0),a.key==="expiresAt"?(d(),p("span",ge,s(t.formatTenantTime(c.expiresAt)),1)):y("v-if",!0),a.key==="action"?(d(),p(C,{key:6},[c.status==="active"?(d(),_(V,{key:0,title:e.$t("tenant.cancelConfirm.title"),"ok-text":e.$t("tenant.cancelConfirm.ok"),"cancel-text":e.$t("tenant.cancelConfirm.cancel"),onConfirm:L=>t.cancelSubscription(c)},{default:n(()=>[o(x,{size:"small",type:"link",danger:""},{default:n(()=>[m(s(e.$t("tenant.cancelConfirm.ok")),1)]),_:1})]),_:1},8,["title","ok-text","cancel-text","onConfirm"])):y("v-if",!0)],64)):y("v-if",!0)]),emptyText:n(()=>[g("div",ve,[o(t.CreditCardOutlined,{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),m(" "+s(e.$t("tenant.table.emptySubscriptions")),1)])]),_:1},8,["columns","data-source","pagination","loading"])]),_:1},8,["tab"]),y(" ── Plans catalogue tab ──────────────────────────────────── "),o(B,{key:"plans",tab:e.$t("tenant.tabs.plans")},{default:n(()=>[o(G,{gutter:[16,16]},{default:n(()=>[(d(!0),p(C,null,w(t.plans,a=>(d(),_(P,{key:a.id,xs:24,sm:12,lg:6},{default:n(()=>[o(R,{title:a.name,size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{extra:n(()=>[o(A,{color:t.planColor(a.id)},{default:n(()=>[m(s(a.id),1)]),_:2},1032,["color"])]),default:n(()=>[g("div",_e,[a.monthlyFee!=null?(d(),p("span",ke,[m("¥"+s(a.monthlyFee)+" ",1),g("span",Se,s(e.$t("tenant.planCard.monthlySuffix")),1)])):(d(),p("span",he,s(e.$t("tenant.planCard.contactSales")),1))]),g("div",Ce,[g("div",Fe,s(e.$t("tenant.planCard.quotas")),1),(d(!0),p(C,null,w(t.metrics,c=>(d(),p("div",{key:c.id,class:"plan-quota-row"},[g("span",qe,s(c.name),1),g("span",we,s(t.formatQuota(a.quotas?.[c.id],c.id)),1)]))),128))]),g("div",xe,[g("div",Ae,s(e.$t("tenant.planCard.features")),1),(d(!0),p(C,null,w(a.features,c=>(d(),_(A,{key:c,style:{"font-size":"10px",margin:"1px"}},{default:n(()=>[m(s(c),1)]),_:2},1024))),128))])]),_:2},1032,["title"])]),_:2},1024))),128))]),_:1})]),_:1},8,["tab"])]),_:1},8,["activeKey"]),y(" ── Create tenant modal ──────────────────────────────────── "),o(W,{open:t.showCreateModal,"onUpdate:open":l[7]||(l[7]=a=>t.showCreateModal=a),title:e.$t("tenant.create_modal.title"),"confirm-loading":t.creating,width:520,"ok-text":e.$t("tenant.create_modal.ok"),"cancel-text":e.$t("tenant.create_modal.cancel"),onOk:t.createTenant,onCancel:t.resetCreateForm},{default:n(()=>[o(N,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:n(()=>[o(F,{label:e.$t("tenant.create_modal.nameLabel"),required:""},{default:n(()=>[o(k,{value:t.createForm.name,"onUpdate:value":l[3]||(l[3]=a=>t.createForm.name=a),placeholder:e.$t("tenant.create_modal.namePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),o(F,{label:e.$t("tenant.create_modal.slugLabel"),required:""},{default:n(()=>[o(k,{value:t.createForm.slug,"onUpdate:value":l[4]||(l[4]=a=>t.createForm.slug=a),placeholder:e.$t("tenant.create_modal.slugPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),o(F,{label:e.$t("tenant.create_modal.planLabel")},{default:n(()=>[o(S,{value:t.createForm.plan,"onUpdate:value":l[5]||(l[5]=a=>t.createForm.plan=a)},{default:n(()=>[(d(!0),p(C,null,w(t.PLAN_IDS,a=>(d(),_(q,{key:a,value:a},{default:n(()=>[m(s(t.planLabel(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1},8,["label"]),o(F,{label:e.$t("tenant.create_modal.ownerLabel")},{default:n(()=>[o(k,{value:t.createForm.owner,"onUpdate:value":l[6]||(l[6]=a=>t.createForm.owner=a),placeholder:e.$t("tenant.create_modal.ownerPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"])]),_:1})]),_:1},8,["open","title","confirm-loading","ok-text","cancel-text"]),y(" ── Subscribe modal ──────────────────────────────────────── "),o(W,{open:t.showSubscribeModal,"onUpdate:open":l[11]||(l[11]=a=>t.showSubscribeModal=a),title:e.$t("tenant.subscribe_modal.title",{name:t.subscribeTargetName}),"confirm-loading":t.subscribing,width:500,"ok-text":e.$t("tenant.subscribe_modal.ok"),"cancel-text":e.$t("tenant.subscribe_modal.cancel"),onOk:t.subscribeTenant,onCancel:t.resetSubscribeForm},{default:n(()=>[o(N,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:n(()=>[o(F,{label:e.$t("tenant.subscribe_modal.planLabel"),required:""},{default:n(()=>[o(S,{value:t.subscribeForm.plan,"onUpdate:value":l[8]||(l[8]=a=>t.subscribeForm.plan=a)},{default:n(()=>[(d(!0),p(C,null,w(t.PLAN_IDS,a=>(d(),_(q,{key:a,value:a},{default:n(()=>[m(s(t.planLabel(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1},8,["label"]),o(F,{label:e.$t("tenant.subscribe_modal.amountLabel")},{default:n(()=>[o(tt,{value:t.subscribeForm.amount,"onUpdate:value":l[9]||(l[9]=a=>t.subscribeForm.amount=a),min:0,placeholder:e.$t("tenant.subscribe_modal.amountPlaceholder"),style:{width:"100%"}},null,8,["value","placeholder"])]),_:1},8,["label"]),o(F,{label:e.$t("tenant.subscribe_modal.durationLabel")},{default:n(()=>[o(E,{value:t.subscribeForm.duration,"onUpdate:value":l[10]||(l[10]=a=>t.subscribeForm.duration=a)},{default:n(()=>[o(I,{value:720*60*60*1e3},{default:n(()=>[m(s(e.$t("tenant.subscribe_modal.duration30")),1)]),_:1}),o(I,{value:2160*60*60*1e3},{default:n(()=>[m(s(e.$t("tenant.subscribe_modal.duration90")),1)]),_:1}),o(I,{value:365*24*60*60*1e3},{default:n(()=>[m(s(e.$t("tenant.subscribe_modal.duration365")),1)]),_:1})]),_:1},8,["value"])]),_:1},8,["label"])]),_:1})]),_:1},8,["open","title","confirm-loading","ok-text","cancel-text"]),y(" ── Quota check modal ────────────────────────────────────── "),o(W,{open:t.showQuotaModal,"onUpdate:open":l[15]||(l[15]=a=>t.showQuotaModal=a),title:e.$t("tenant.quota_modal.title"),"confirm-loading":t.checking,width:500,"ok-text":e.$t("tenant.quota_modal.ok"),"cancel-text":e.$t("tenant.quota_modal.cancel"),onOk:t.checkQuota},{default:n(()=>[o(N,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:n(()=>[o(F,{label:e.$t("tenant.quota_modal.tenantLabel"),required:""},{default:n(()=>[o(S,{value:t.quotaForm.tenantId,"onUpdate:value":l[12]||(l[12]=a=>t.quotaForm.tenantId=a),"show-search":"",placeholder:e.$t("tenant.quota_modal.tenantPlaceholder")},{default:n(()=>[(d(!0),p(C,null,w(t.tenants,a=>(d(),_(q,{key:a.id,value:a.id},{default:n(()=>[m(s(a.name)+" ("+s(a.slug)+")",1)]),_:2},1032,["value"]))),128))]),_:1},8,["value","placeholder"])]),_:1},8,["label"]),o(F,{label:e.$t("tenant.quota_modal.metricLabel"),required:""},{default:n(()=>[o(S,{value:t.quotaForm.metric,"onUpdate:value":l[13]||(l[13]=a=>t.quotaForm.metric=a)},{default:n(()=>[(d(!0),p(C,null,w(t.KNOWN_METRICS,a=>(d(),_(q,{key:a,value:a},{default:n(()=>[m(s(a),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1},8,["label"]),o(F,{label:e.$t("tenant.quota_modal.periodLabel")},{default:n(()=>[o(k,{value:t.quotaForm.period,"onUpdate:value":l[14]||(l[14]=a=>t.quotaForm.period=a),placeholder:e.$t("tenant.quota_modal.periodPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"])]),_:1}),t.quotaResult?(d(),_(R,{key:0,size:"small",style:{background:"var(--bg-base)","margin-top":"8px"}},{default:n(()=>[o(O,{title:e.$t("tenant.quota_modal.resultTitle"),value:t.quotaResult.unlimited?e.$t("tenant.quota_modal.unlimited"):t.quotaResult.exceeded?e.$t("tenant.quota_modal.exceeded"):e.$t("tenant.quota_modal.ok_state"),"value-style":{color:t.quotaResult.exceeded?"#ff4d4f":t.quotaResult.unlimited?"#722ed1":"#52c41a"}},null,8,["title","value","value-style"]),g("div",Te,[g("div",null,[m(s(e.$t("tenant.quota_modal.planLine"))+" ",1),o(A,{color:t.planColor(t.quotaResult.plan)},{default:n(()=>[m(s(t.planLabel(t.quotaResult.plan)),1)]),_:1},8,["color"])]),g("div",null,s(e.$t("tenant.quota_modal.periodLine",{period:t.quotaResult.period})),1),g("div",null,[m(s(e.$t("tenant.quota_modal.usedLine"))+" ",1),g("span",Le,s(t.formatMetricValue(t.quotaResult.used,t.quotaResult.metric)),1)]),t.quotaResult.unlimited?y("v-if",!0):(d(),p("div",ze,[m(s(e.$t("tenant.quota_modal.limitLine"))+" ",1),g("span",Re,s(t.formatMetricValue(t.quotaResult.limit,t.quotaResult.metric)),1)])),!t.quotaResult.unlimited&&t.quotaResult.limit>0?(d(),p("div",Ie,[o(et,{percent:Math.min(100,Math.round(100*t.quotaResult.used/t.quotaResult.limit)),size:"small",status:t.quotaResult.exceeded?"exception":"active"},null,8,["percent","status"])])):y("v-if",!0)])]),_:1})):y("v-if",!0)]),_:1},8,["open","title","confirm-loading","ok-text","cancel-text"]),y(" ── Record usage modal ───────────────────────────────────── "),o(W,{open:t.showRecordModal,"onUpdate:open":l[20]||(l[20]=a=>t.showRecordModal=a),title:e.$t("tenant.record_modal.title"),"confirm-loading":t.recording,width:500,"ok-text":e.$t("tenant.record_modal.ok"),"cancel-text":e.$t("tenant.record_modal.cancel"),onOk:t.recordUsage,onCancel:t.resetRecordForm},{default:n(()=>[o(N,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:n(()=>[o(F,{label:e.$t("tenant.record_modal.tenantLabel"),required:""},{default:n(()=>[o(S,{value:t.recordForm.tenantId,"onUpdate:value":l[16]||(l[16]=a=>t.recordForm.tenantId=a),"show-search":"",placeholder:e.$t("tenant.record_modal.tenantPlaceholder")},{default:n(()=>[(d(!0),p(C,null,w(t.tenants,a=>(d(),_(q,{key:a.id,value:a.id},{default:n(()=>[m(s(a.name)+" ("+s(a.slug)+")",1)]),_:2},1032,["value"]))),128))]),_:1},8,["value","placeholder"])]),_:1},8,["label"]),o(F,{label:e.$t("tenant.record_modal.metricLabel"),required:""},{default:n(()=>[o(S,{value:t.recordForm.metric,"onUpdate:value":l[17]||(l[17]=a=>t.recordForm.metric=a)},{default:n(()=>[(d(!0),p(C,null,w(t.KNOWN_METRICS,a=>(d(),_(q,{key:a,value:a},{default:n(()=>[m(s(a),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1},8,["label"]),o(F,{label:e.$t("tenant.record_modal.valueLabel"),required:""},{default:n(()=>[o(tt,{value:t.recordForm.value,"onUpdate:value":l[18]||(l[18]=a=>t.recordForm.value=a),min:0,style:{width:"100%"}},null,8,["value"])]),_:1},8,["label"]),o(F,{label:e.$t("tenant.record_modal.periodLabel")},{default:n(()=>[o(k,{value:t.recordForm.period,"onUpdate:value":l[19]||(l[19]=a=>t.recordForm.period=a),placeholder:e.$t("tenant.record_modal.periodPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"])]),_:1})]),_:1},8,["open","title","confirm-loading","ok-text","cancel-text"])])}const Me=Nt(te,[["render",Oe],["__scopeId","data-v-c93a3192"],["__file","/tmp/cc-web-panel-DGmtsL/repo/packages/web-panel/src/views/Tenant.vue"]]);export{Me as default};
@@ -1,3 +1,3 @@
1
1
  const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./xterm-BZcWGsqw.js","./markdown-CsiA8-E5.js","./markdown-Dfs9RUU9.css","./addon-fit-CK6X9sAG.js","./xterm-DFuMZ0ql.css"])))=>i.map(i=>d[i]);
2
- import{u as fe,_ as me,d as V,e as U}from"./index-BR-DF81e.js";import{I as z,J as x,U as _,Q as D,S as K,K as T,V as R,c as A,F as Q,Z as Y,R as E,o as Z,f as G,w as $,n as q,b as ee,r as S,P as y,_ as ve,a2 as we,a3 as he,a4 as _e}from"./vendor-BvqAck49.js";import{R as ye,b as pe,as as ge}from"./icons-DP3uiYxy.js";const k=new Map,C=new Map,N=new Set,F=new Set;let te=!1;function xe(c){te||(te=!0,c.onMessage(o=>{if(!(!o||typeof o.type!="string")){if(o.type==="terminal.stdout"){const{sessionId:s,data:e,seq:i}=o.payload||{};if(!s)return;let w;try{const d=atob(e||""),f=new Uint8Array(d.length);for(let n=0;n<d.length;n++)f[n]=d.charCodeAt(n);w=new TextDecoder("utf-8").decode(f)}catch{w=""}const u={sessionId:s,data:w,seq:i};k.get(s)?.forEach(d=>d(u)),N.forEach(d=>d(u))}else if(o.type==="terminal.exit"){const{sessionId:s,exitCode:e,signal:i}=o.payload||{};if(!s)return;const w={sessionId:s,exitCode:e,signal:i};C.get(s)?.forEach(u=>u(w)),F.forEach(u=>u(w))}}}))}function ne(c){const o=new TextEncoder().encode(c);let s="";for(let e=0;e<o.length;e++)s+=String.fromCharCode(o[e]);return btoa(s)}function ae(c){const o=atob(c||""),s=new Uint8Array(o.length);for(let e=0;e<o.length;e++)s[e]=o.charCodeAt(e);return new TextDecoder("utf-8").decode(s)}function oe(){const c=fe();xe(c);async function o(n={}){const a=await c.sendRaw({type:"terminal.create",payload:{shell:n.shell,cwd:n.cwd,env:n.env,cols:n.cols,rows:n.rows}});if(a.ok===!1)throw new Error(a.error||"terminal_create_failed");return a.result??a}async function s(){const n=await c.sendRaw({type:"terminal.list",payload:{}});if(n.ok===!1)throw new Error(n.error||"terminal_list_failed");const a=n.result??n;return Array.isArray(a.sessions)?a.sessions:[]}async function e(n,a){const r=await c.sendRaw({type:"terminal.stdin",payload:{sessionId:n,data:ne(String(a))}});if(r.ok===!1)throw new Error(r.error||"terminal_stdin_failed");return r.result??r}async function i(n,a,r){const h=await c.sendRaw({type:"terminal.resize",payload:{sessionId:n,cols:a,rows:r}});if(h.ok===!1)throw new Error(h.error||"terminal_resize_failed");return h.result??h}async function w(n){const a=await c.sendRaw({type:"terminal.close",payload:{sessionId:n}});if(a.ok===!1)throw new Error(a.error||"terminal_close_failed");return a.result??a}async function u(n,a=0){const r=await c.sendRaw({type:"terminal.history",payload:{sessionId:n,fromSeq:a}});if(r.ok===!1)throw new Error(r.error||"terminal_history_failed");const h=r.result??r;return{truncated:!!h.truncated,chunks:(h.chunks||[]).map(L=>({seq:L.seq,data:ae(L.data)}))}}function d(n,a){return n?(k.has(n)||k.set(n,new Set),k.get(n).add(a),()=>{k.get(n)?.delete(a),k.get(n)?.size===0&&k.delete(n)}):(N.add(a),()=>N.delete(a))}function f(n,a){return n?(C.has(n)||C.set(n,new Set),C.get(n).add(a),()=>{C.get(n)?.delete(a),C.get(n)?.size===0&&C.delete(n)}):(F.add(a),()=>F.delete(a))}return{create:o,list:s,stdin:e,resize:i,close:w,history:u,onStdout:d,onExit:f,_internal:{stdoutSubs:k,exitSubs:C,toBase64Utf8:ne,fromBase64Utf8:ae}}}const Se={__name:"Terminal",setup(c,{expose:o}){o();const s=oe(),e=S([]),i=S(null),w=S("pwsh"),u=S(!1),d=S(!1),f=S(""),n=S(""),a=S([]),r=[{value:"pwsh",label:"PowerShell"},{value:"cmd",label:"CMD"},{value:"bash",label:"Bash"},{value:"wsl",label:"WSL"}],h=ee(()=>e.value.find(t=>t.id===i.value));function L(t){return t?t.slice(0,8):""}let O=null,M=null;async function I(){if(O)return{xtermMod:O,fitAddonMod:M};try{O=await U(()=>import("./xterm-BZcWGsqw.js").then(t=>t.x),__vite__mapDeps([0,1,2]),import.meta.url),M=await U(()=>import("./addon-fit-CK6X9sAG.js").then(t=>t.a),__vite__mapDeps([3,1,2]),import.meta.url),await U(()=>Promise.resolve({}),__vite__mapDeps([4]),import.meta.url)}catch(t){throw n.value="xterm 资源加载失败:"+(t?.message||"未知错误"),t}return{xtermMod:O,fitAddonMod:M}}async function B(t){await q();const{xtermMod:l,fitAddonMod:p}=await I(),b=a.value.find(v=>v?.dataset?.sessionId===t.id);if(!b)return;const m=new l.Terminal({cursorBlink:!0,fontFamily:'Consolas, "Courier New", monospace',fontSize:13,theme:{background:"#1e1e1e",foreground:"#d4d4d4"},convertEol:!1}),P=new p.FitAddon;m.loadAddon(P),m.open(b);try{P.fit()}catch{}t.xterm=m,t.fitAddon=P;const ie=m.onData(v=>{s.stdin(t.id,v).catch(g=>{String(g?.message||"").includes("dangerous_keyword_blocked")?V.warning("该命令被桌面端拦截(高危关键字)"):V.error("stdin 失败: "+(g?.message||g))})}),ce=s.onStdout(t.id,({data:v,seq:g})=>{t.lastSeq=g,m.write(v)}),de=s.onExit(t.id,({exitCode:v,signal:g})=>{t.alive=!1,t.exitCode=v,t.signal=g,m.writeln(`\r
3
- \x1B[33m[session exited, code=${v}, signal=${g??"-"}]\x1B[0m`)});t.offs=()=>{try{ie.dispose?.()}catch{}ce(),de()};try{const{chunks:v,truncated:g}=await s.history(t.id,0);g&&m.writeln("\x1B[2m[history truncated — earlier output was evicted]\x1B[0m");for(const J of v)m.write(J.data),t.lastSeq=J.seq}catch(v){m.writeln(`\x1B[31m[history fetch failed: ${v?.message||v}]\x1B[0m`)}const H=new ResizeObserver(()=>{try{P.fit(),s.resize(t.id,m.cols,m.rows).catch(()=>{})}catch{}});H.observe(b);const ue=t.offs;t.offs=()=>{try{H.disconnect()}catch{}ue()}}async function re(){u.value=!0,f.value="";try{const t=await s.create({shell:w.value,cols:80,rows:24}),l={id:t.sessionId,shell:t.shell,cwd:"",alive:!0,lastSeq:0,exitCode:null,xterm:null,fitAddon:null,offs:()=>{}};e.value.push(l),i.value=l.id,await B(l)}catch(t){f.value=t?.message||String(t)}finally{u.value=!1}}async function se(t){try{await s.close(t)}catch(l){f.value=l?.message||String(l)}setTimeout(()=>W(t),500)}function W(t){const l=e.value.findIndex(b=>b.id===t);if(l===-1)return;const p=e.value[l];try{p.offs?.()}catch{}try{p.xterm?.dispose?.()}catch{}e.value.splice(l,1),i.value===t&&(i.value=e.value[0]?.id||null)}function le(t){i.value=t,q(()=>{const l=e.value.find(p=>p.id===t);try{l?.fitAddon?.fit()}catch{}})}async function X(){d.value=!0,f.value="";try{const t=await s.list();for(const l of t){const p=e.value.find(m=>m.id===l.id);if(p){p.alive=l.alive,p.lastSeq=l.lastSeq;continue}const b={id:l.id,shell:l.shell,cwd:l.cwd,alive:l.alive,lastSeq:l.lastSeq,exitCode:null,xterm:null,fitAddon:null,offs:()=>{}};e.value.push(b),await B(b)}!i.value&&e.value.length>0&&(i.value=e.value[0].id)}catch(t){f.value=t?.message||String(t)}finally{d.value=!1}}Z(async()=>{await X()}),G(()=>{for(const t of e.value){try{t.offs?.()}catch{}try{t.xterm?.dispose?.()}catch{}}}),$(i,()=>{q(()=>{const t=h.value;try{t?.fitAddon?.fit()}catch{}})});const j={term:s,sessions:e,activeId:i,newShell:w,creating:u,loadingList:d,error:f,warning:n,xtermContainers:a,shellOptions:r,active:h,shortId:L,get xtermMod(){return O},set xtermMod(t){O=t},get fitAddonMod(){return M},set fitAddonMod(t){M=t},loadXterm:I,mountXterm:B,onCreate:re,onClose:se,removeSession:W,activate:le,refreshList:X,ref:S,computed:ee,onMounted:Z,onBeforeUnmount:G,nextTick:q,watch:$,get message(){return V},get PlusOutlined(){return ge},get CloseOutlined(){return pe},get ReloadOutlined(){return ye},get useTerminal(){return oe}};return Object.defineProperty(j,"__isScriptSetup",{enumerable:!1,value:!0}),j}},be={class:"terminal-page"},ke={class:"terminal-header"},Ce={class:"page-sub"},Ae={class:"terminal-body"},Ee={class:"session-tabs"},Oe=["onClick"],Te={class:"session-shell"},Re={class:"session-id"},Me={key:0,class:"session-empty"},ze={class:"xterm-host"},Le=["data-session-id"],Pe={key:0,class:"xterm-placeholder"},De={key:1,class:"terminal-footer"},qe={key:0,class:"footer-exit"};function Be(c,o,s,e,i,w){const u=z("a-tag"),d=z("a-select"),f=z("a-button"),n=z("a-space"),a=z("a-alert");return y(),x("div",be,[_("div",ke,[_("div",null,[o[3]||(o[3]=_("h2",{class:"page-title"},"远程终端",-1)),_("p",Ce,[o[2]||(o[2]=D(" 桌面端托管的 PTY 会话;Android 端可远程操控同一通道 ",-1)),e.warning?(y(),K(u,{key:0,color:"orange",style:{"margin-left":"8px"}},{default:T(()=>[D(E(e.warning),1)]),_:1})):R("v-if",!0)])]),A(n,null,{default:T(()=>[A(d,{value:e.newShell,"onUpdate:value":o[0]||(o[0]=r=>e.newShell=r),style:{width:"130px"},size:"small",options:e.shellOptions},null,8,["value"]),A(f,{type:"primary",size:"small",loading:e.creating,onClick:e.onCreate},{icon:T(()=>[A(e.PlusOutlined)]),default:T(()=>[o[4]||(o[4]=D(" 新会话 ",-1))]),_:1},8,["loading"]),A(f,{size:"small",loading:e.loadingList,onClick:e.refreshList},{icon:T(()=>[A(e.ReloadOutlined)]),default:T(()=>[o[5]||(o[5]=D(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),e.error?(y(),K(a,{key:0,message:e.error,type:"error","show-icon":"",closable:"",style:{"margin-bottom":"12px"},onClose:o[1]||(o[1]=r=>e.error="")},null,8,["message"])):R("v-if",!0),_("div",Ae,[_("div",Ee,[(y(!0),x(Q,null,Y(e.sessions,r=>(y(),x("div",{key:r.id,class:ve(["session-tab",{active:r.id===e.activeId,dead:!r.alive}]),onClick:h=>e.activate(r.id)},[_("span",Te,E(r.shell),1),_("span",Re,E(e.shortId(r.id)),1),A(e.CloseOutlined,{class:"session-close",onClick:we(h=>e.onClose(r.id),["stop"])},null,8,["onClick"])],10,Oe))),128)),e.sessions.length===0?(y(),x("div",Me,' 点击 "新会话" 创建第一个终端 ')):R("v-if",!0)]),_("div",ze,[(y(!0),x(Q,null,Y(e.sessions,r=>he((y(),x("div",{key:r.id,ref_for:!0,ref:"xtermContainers","data-session-id":r.id,class:"xterm-container"},null,8,Le)),[[_e,r.id===e.activeId]])),128)),e.sessions.length===0?(y(),x("div",Pe,[...o[6]||(o[6]=[_("span",null,"无活跃会话",-1)])])):R("v-if",!0)])]),e.active?(y(),x("div",De,[_("span",null,E(e.active.shell)+" · "+E(e.active.cwd||"(默认 cwd)")+" · seq "+E(e.active.lastSeq),1),e.active.alive?R("v-if",!0):(y(),x("span",qe,"已退出 (code="+E(e.active.exitCode??"-")+")",1))])):R("v-if",!0)])}const Fe=me(Se,[["render",Be],["__scopeId","data-v-65366a29"],["__file","/tmp/cc-web-panel-Hs0OhX/repo/packages/web-panel/src/views/Terminal.vue"]]);export{Fe as default};
2
+ import{u as fe,_ as me,d as V,e as U}from"./index-qW3-iWXU.js";import{I as z,J as x,U as _,Q as P,S as K,K as T,V as R,c as A,F as Q,Z as Y,R as E,o as Z,f as H,w as $,n as q,b as ee,r as S,P as y,_ as ve,a2 as we,a3 as he,a4 as _e}from"./vendor-BvqAck49.js";import{R as ye,b as pe,as as ge}from"./icons-DP3uiYxy.js";const k=new Map,C=new Map,N=new Set,F=new Set;let te=!1;function xe(c){te||(te=!0,c.onMessage(o=>{if(!(!o||typeof o.type!="string")){if(o.type==="terminal.stdout"){const{sessionId:s,data:e,seq:i}=o.payload||{};if(!s)return;let w;try{const d=atob(e||""),f=new Uint8Array(d.length);for(let n=0;n<d.length;n++)f[n]=d.charCodeAt(n);w=new TextDecoder("utf-8").decode(f)}catch{w=""}const u={sessionId:s,data:w,seq:i};k.get(s)?.forEach(d=>d(u)),N.forEach(d=>d(u))}else if(o.type==="terminal.exit"){const{sessionId:s,exitCode:e,signal:i}=o.payload||{};if(!s)return;const w={sessionId:s,exitCode:e,signal:i};C.get(s)?.forEach(u=>u(w)),F.forEach(u=>u(w))}}}))}function ne(c){const o=new TextEncoder().encode(c);let s="";for(let e=0;e<o.length;e++)s+=String.fromCharCode(o[e]);return btoa(s)}function ae(c){const o=atob(c||""),s=new Uint8Array(o.length);for(let e=0;e<o.length;e++)s[e]=o.charCodeAt(e);return new TextDecoder("utf-8").decode(s)}function oe(){const c=fe();xe(c);async function o(n={}){const a=await c.sendRaw({type:"terminal.create",payload:{shell:n.shell,cwd:n.cwd,env:n.env,cols:n.cols,rows:n.rows}});if(a.ok===!1)throw new Error(a.error||"terminal_create_failed");return a.result??a}async function s(){const n=await c.sendRaw({type:"terminal.list",payload:{}});if(n.ok===!1)throw new Error(n.error||"terminal_list_failed");const a=n.result??n;return Array.isArray(a.sessions)?a.sessions:[]}async function e(n,a){const r=await c.sendRaw({type:"terminal.stdin",payload:{sessionId:n,data:ne(String(a))}});if(r.ok===!1)throw new Error(r.error||"terminal_stdin_failed");return r.result??r}async function i(n,a,r){const h=await c.sendRaw({type:"terminal.resize",payload:{sessionId:n,cols:a,rows:r}});if(h.ok===!1)throw new Error(h.error||"terminal_resize_failed");return h.result??h}async function w(n){const a=await c.sendRaw({type:"terminal.close",payload:{sessionId:n}});if(a.ok===!1)throw new Error(a.error||"terminal_close_failed");return a.result??a}async function u(n,a=0){const r=await c.sendRaw({type:"terminal.history",payload:{sessionId:n,fromSeq:a}});if(r.ok===!1)throw new Error(r.error||"terminal_history_failed");const h=r.result??r;return{truncated:!!h.truncated,chunks:(h.chunks||[]).map(L=>({seq:L.seq,data:ae(L.data)}))}}function d(n,a){return n?(k.has(n)||k.set(n,new Set),k.get(n).add(a),()=>{k.get(n)?.delete(a),k.get(n)?.size===0&&k.delete(n)}):(N.add(a),()=>N.delete(a))}function f(n,a){return n?(C.has(n)||C.set(n,new Set),C.get(n).add(a),()=>{C.get(n)?.delete(a),C.get(n)?.size===0&&C.delete(n)}):(F.add(a),()=>F.delete(a))}return{create:o,list:s,stdin:e,resize:i,close:w,history:u,onStdout:d,onExit:f,_internal:{stdoutSubs:k,exitSubs:C,toBase64Utf8:ne,fromBase64Utf8:ae}}}const Se={__name:"Terminal",setup(c,{expose:o}){o();const s=oe(),e=S([]),i=S(null),w=S("pwsh"),u=S(!1),d=S(!1),f=S(""),n=S(""),a=S([]),r=[{value:"pwsh",label:"PowerShell"},{value:"cmd",label:"CMD"},{value:"bash",label:"Bash"},{value:"wsl",label:"WSL"}],h=ee(()=>e.value.find(t=>t.id===i.value));function L(t){return t?t.slice(0,8):""}let O=null,M=null;async function I(){if(O)return{xtermMod:O,fitAddonMod:M};try{O=await U(()=>import("./xterm-BZcWGsqw.js").then(t=>t.x),__vite__mapDeps([0,1,2]),import.meta.url),M=await U(()=>import("./addon-fit-CK6X9sAG.js").then(t=>t.a),__vite__mapDeps([3,1,2]),import.meta.url),await U(()=>Promise.resolve({}),__vite__mapDeps([4]),import.meta.url)}catch(t){throw n.value="xterm 资源加载失败:"+(t?.message||"未知错误"),t}return{xtermMod:O,fitAddonMod:M}}async function B(t){await q();const{xtermMod:l,fitAddonMod:p}=await I(),b=a.value.find(v=>v?.dataset?.sessionId===t.id);if(!b)return;const m=new l.Terminal({cursorBlink:!0,fontFamily:'Consolas, "Courier New", monospace',fontSize:13,theme:{background:"#1e1e1e",foreground:"#d4d4d4"},convertEol:!1}),D=new p.FitAddon;m.loadAddon(D),m.open(b);try{D.fit()}catch{}t.xterm=m,t.fitAddon=D;const ie=m.onData(v=>{s.stdin(t.id,v).catch(g=>{String(g?.message||"").includes("dangerous_keyword_blocked")?V.warning("该命令被桌面端拦截(高危关键字)"):V.error("stdin 失败: "+(g?.message||g))})}),ce=s.onStdout(t.id,({data:v,seq:g})=>{t.lastSeq=g,m.write(v)}),de=s.onExit(t.id,({exitCode:v,signal:g})=>{t.alive=!1,t.exitCode=v,t.signal=g,m.writeln(`\r
3
+ \x1B[33m[session exited, code=${v}, signal=${g??"-"}]\x1B[0m`)});t.offs=()=>{try{ie.dispose?.()}catch{}ce(),de()};try{const{chunks:v,truncated:g}=await s.history(t.id,0);g&&m.writeln("\x1B[2m[history truncated — earlier output was evicted]\x1B[0m");for(const J of v)m.write(J.data),t.lastSeq=J.seq}catch(v){m.writeln(`\x1B[31m[history fetch failed: ${v?.message||v}]\x1B[0m`)}const G=new ResizeObserver(()=>{try{D.fit(),s.resize(t.id,m.cols,m.rows).catch(()=>{})}catch{}});G.observe(b);const ue=t.offs;t.offs=()=>{try{G.disconnect()}catch{}ue()}}async function re(){u.value=!0,f.value="";try{const t=await s.create({shell:w.value,cols:80,rows:24}),l={id:t.sessionId,shell:t.shell,cwd:"",alive:!0,lastSeq:0,exitCode:null,xterm:null,fitAddon:null,offs:()=>{}};e.value.push(l),i.value=l.id,await B(l)}catch(t){f.value=t?.message||String(t)}finally{u.value=!1}}async function se(t){try{await s.close(t)}catch(l){f.value=l?.message||String(l)}setTimeout(()=>W(t),500)}function W(t){const l=e.value.findIndex(b=>b.id===t);if(l===-1)return;const p=e.value[l];try{p.offs?.()}catch{}try{p.xterm?.dispose?.()}catch{}e.value.splice(l,1),i.value===t&&(i.value=e.value[0]?.id||null)}function le(t){i.value=t,q(()=>{const l=e.value.find(p=>p.id===t);try{l?.fitAddon?.fit()}catch{}})}async function X(){d.value=!0,f.value="";try{const t=await s.list();for(const l of t){const p=e.value.find(m=>m.id===l.id);if(p){p.alive=l.alive,p.lastSeq=l.lastSeq;continue}const b={id:l.id,shell:l.shell,cwd:l.cwd,alive:l.alive,lastSeq:l.lastSeq,exitCode:null,xterm:null,fitAddon:null,offs:()=>{}};e.value.push(b),await B(b)}!i.value&&e.value.length>0&&(i.value=e.value[0].id)}catch(t){f.value=t?.message||String(t)}finally{d.value=!1}}Z(async()=>{await X()}),H(()=>{for(const t of e.value){try{t.offs?.()}catch{}try{t.xterm?.dispose?.()}catch{}}}),$(i,()=>{q(()=>{const t=h.value;try{t?.fitAddon?.fit()}catch{}})});const j={term:s,sessions:e,activeId:i,newShell:w,creating:u,loadingList:d,error:f,warning:n,xtermContainers:a,shellOptions:r,active:h,shortId:L,get xtermMod(){return O},set xtermMod(t){O=t},get fitAddonMod(){return M},set fitAddonMod(t){M=t},loadXterm:I,mountXterm:B,onCreate:re,onClose:se,removeSession:W,activate:le,refreshList:X,ref:S,computed:ee,onMounted:Z,onBeforeUnmount:H,nextTick:q,watch:$,get message(){return V},get PlusOutlined(){return ge},get CloseOutlined(){return pe},get ReloadOutlined(){return ye},get useTerminal(){return oe}};return Object.defineProperty(j,"__isScriptSetup",{enumerable:!1,value:!0}),j}},be={class:"terminal-page"},ke={class:"terminal-header"},Ce={class:"page-sub"},Ae={class:"terminal-body"},Ee={class:"session-tabs"},Oe=["onClick"],Te={class:"session-shell"},Re={class:"session-id"},Me={key:0,class:"session-empty"},ze={class:"xterm-host"},Le=["data-session-id"],De={key:0,class:"xterm-placeholder"},Pe={key:1,class:"terminal-footer"},qe={key:0,class:"footer-exit"};function Be(c,o,s,e,i,w){const u=z("a-tag"),d=z("a-select"),f=z("a-button"),n=z("a-space"),a=z("a-alert");return y(),x("div",be,[_("div",ke,[_("div",null,[o[3]||(o[3]=_("h2",{class:"page-title"},"远程终端",-1)),_("p",Ce,[o[2]||(o[2]=P(" 桌面端托管的 PTY 会话;Android 端可远程操控同一通道 ",-1)),e.warning?(y(),K(u,{key:0,color:"orange",style:{"margin-left":"8px"}},{default:T(()=>[P(E(e.warning),1)]),_:1})):R("v-if",!0)])]),A(n,null,{default:T(()=>[A(d,{value:e.newShell,"onUpdate:value":o[0]||(o[0]=r=>e.newShell=r),style:{width:"130px"},size:"small",options:e.shellOptions},null,8,["value"]),A(f,{type:"primary",size:"small",loading:e.creating,onClick:e.onCreate},{icon:T(()=>[A(e.PlusOutlined)]),default:T(()=>[o[4]||(o[4]=P(" 新会话 ",-1))]),_:1},8,["loading"]),A(f,{size:"small",loading:e.loadingList,onClick:e.refreshList},{icon:T(()=>[A(e.ReloadOutlined)]),default:T(()=>[o[5]||(o[5]=P(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),e.error?(y(),K(a,{key:0,message:e.error,type:"error","show-icon":"",closable:"",style:{"margin-bottom":"12px"},onClose:o[1]||(o[1]=r=>e.error="")},null,8,["message"])):R("v-if",!0),_("div",Ae,[_("div",Ee,[(y(!0),x(Q,null,Y(e.sessions,r=>(y(),x("div",{key:r.id,class:ve(["session-tab",{active:r.id===e.activeId,dead:!r.alive}]),onClick:h=>e.activate(r.id)},[_("span",Te,E(r.shell),1),_("span",Re,E(e.shortId(r.id)),1),A(e.CloseOutlined,{class:"session-close",onClick:we(h=>e.onClose(r.id),["stop"])},null,8,["onClick"])],10,Oe))),128)),e.sessions.length===0?(y(),x("div",Me,' 点击 "新会话" 创建第一个终端 ')):R("v-if",!0)]),_("div",ze,[(y(!0),x(Q,null,Y(e.sessions,r=>he((y(),x("div",{key:r.id,ref_for:!0,ref:"xtermContainers","data-session-id":r.id,class:"xterm-container"},null,8,Le)),[[_e,r.id===e.activeId]])),128)),e.sessions.length===0?(y(),x("div",De,[...o[6]||(o[6]=[_("span",null,"无活跃会话",-1)])])):R("v-if",!0)])]),e.active?(y(),x("div",Pe,[_("span",null,E(e.active.shell)+" · "+E(e.active.cwd||"(默认 cwd)")+" · seq "+E(e.active.lastSeq),1),e.active.alive?R("v-if",!0):(y(),x("span",qe,"已退出 (code="+E(e.active.exitCode??"-")+")",1))])):R("v-if",!0)])}const Fe=me(Se,[["render",Be],["__scopeId","data-v-65366a29"],["__file","/tmp/cc-web-panel-DGmtsL/repo/packages/web-panel/src/views/Terminal.vue"]]);export{Fe as default};
@@ -1 +1 @@
1
- import{I as S,P as n,J as i,U as l,S as h,R as o,c,K as d,Q as u,V as g,b as a}from"./vendor-BvqAck49.js";import{_ as b}from"./index-BR-DF81e.js";import{aD as O,aH as D}from"./icons-DP3uiYxy.js";const C={__name:"TimelineRenderer",props:{event:{type:Object,required:!0}},setup(v,{expose:_}){_();const r=v,e=a(()=>r.event.content||{}),p=a(()=>{const t=r.event.source.adapter||"";return t.startsWith("travel-12306")||t.startsWith("travel-ctrip")}),m=a(()=>e.value.from&&e.value.to?`${e.value.from} → ${e.value.to}`:e.value.origin&&e.value.destination?`${e.value.origin} → ${e.value.destination}`:null),s=a(()=>r.event.place||e.value.placeName||e.value.poi),N=a(()=>e.value.trainNo),T=a(()=>e.value.flightNo),k=a(()=>e.value.title||e.value.text||e.value.description||"—"),x=a(()=>{const t=[];return e.value.departureTime&&t.push(`出发 ${e.value.departureTime}`),e.value.arrivalTime&&t.push(`到达 ${e.value.arrivalTime}`),e.value.duration&&t.push(`${e.value.duration}`),e.value.distance&&t.push(`${e.value.distance}`),t.length?t.join(" · "):null}),y=a(()=>{if(!r.event.occurredAt)return"";const t=new Date(r.event.occurredAt);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}),f={props:r,c:e,isTravel:p,route:m,placeName:s,trainNo:N,flightNo:T,fallbackText:k,extraDetail:x,formattedTime:y,computed:a,get CarOutlined(){return D},get EnvironmentOutlined(){return O}};return Object.defineProperty(f,"__isScriptSetup",{enumerable:!1,value:!0}),f}},V={class:"timeline-event"},w={class:"dot"},B={class:"card"},E={class:"head"},R={class:"time"},j={class:"primary"},H={key:0},A={key:1},I={key:2},M={key:0,class:"trip-no"},P={key:1,class:"extra"};function W(v,_,r,e,p,m){const s=S("a-tag");return n(),i("div",V,[l("div",w,[e.isTravel?(n(),h(e.CarOutlined,{key:0})):(n(),h(e.EnvironmentOutlined,{key:1}))]),l("div",B,[l("div",E,[l("span",R,o(e.formattedTime),1),c(s,{color:"cyan"},{default:d(()=>[u(o(r.event.source.adapter),1)]),_:1}),c(s,null,{default:d(()=>[u(o(r.event.subtype),1)]),_:1})]),l("div",j,[e.route?(n(),i("span",H,o(e.route),1)):e.placeName?(n(),i("span",A,"📍 "+o(e.placeName),1)):(n(),i("span",I,o(e.fallbackText),1))]),e.trainNo||e.flightNo?(n(),i("div",M,[c(s,{color:"blue"},{default:d(()=>[u(o(e.trainNo||e.flightNo),1)]),_:1})])):g("v-if",!0),e.extraDetail?(n(),i("div",P,o(e.extraDetail),1)):g("v-if",!0)])])}const K=b(C,[["render",W],["__scopeId","data-v-18400280"],["__file","/tmp/cc-web-panel-Hs0OhX/repo/packages/web-panel/src/components/pdh/renderers/TimelineRenderer.vue"]]);export{K as default};
1
+ import{I as S,P as n,J as i,U as l,S as h,R as o,c,K as d,Q as u,V as g,b as a}from"./vendor-BvqAck49.js";import{_ as b}from"./index-qW3-iWXU.js";import{aD as D,aH as O}from"./icons-DP3uiYxy.js";const C={__name:"TimelineRenderer",props:{event:{type:Object,required:!0}},setup(v,{expose:_}){_();const r=v,e=a(()=>r.event.content||{}),m=a(()=>{const t=r.event.source.adapter||"";return t.startsWith("travel-12306")||t.startsWith("travel-ctrip")}),p=a(()=>e.value.from&&e.value.to?`${e.value.from} → ${e.value.to}`:e.value.origin&&e.value.destination?`${e.value.origin} → ${e.value.destination}`:null),s=a(()=>r.event.place||e.value.placeName||e.value.poi),N=a(()=>e.value.trainNo),T=a(()=>e.value.flightNo),k=a(()=>e.value.title||e.value.text||e.value.description||"—"),x=a(()=>{const t=[];return e.value.departureTime&&t.push(`出发 ${e.value.departureTime}`),e.value.arrivalTime&&t.push(`到达 ${e.value.arrivalTime}`),e.value.duration&&t.push(`${e.value.duration}`),e.value.distance&&t.push(`${e.value.distance}`),t.length?t.join(" · "):null}),y=a(()=>{if(!r.event.occurredAt)return"";const t=new Date(r.event.occurredAt);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}),f={props:r,c:e,isTravel:m,route:p,placeName:s,trainNo:N,flightNo:T,fallbackText:k,extraDetail:x,formattedTime:y,computed:a,get CarOutlined(){return O},get EnvironmentOutlined(){return D}};return Object.defineProperty(f,"__isScriptSetup",{enumerable:!1,value:!0}),f}},V={class:"timeline-event"},w={class:"dot"},B={class:"card"},E={class:"head"},R={class:"time"},j={class:"primary"},A={key:0},H={key:1},I={key:2},M={key:0,class:"trip-no"},P={key:1,class:"extra"};function W(v,_,r,e,m,p){const s=S("a-tag");return n(),i("div",V,[l("div",w,[e.isTravel?(n(),h(e.CarOutlined,{key:0})):(n(),h(e.EnvironmentOutlined,{key:1}))]),l("div",B,[l("div",E,[l("span",R,o(e.formattedTime),1),c(s,{color:"cyan"},{default:d(()=>[u(o(r.event.source.adapter),1)]),_:1}),c(s,null,{default:d(()=>[u(o(r.event.subtype),1)]),_:1})]),l("div",j,[e.route?(n(),i("span",A,o(e.route),1)):e.placeName?(n(),i("span",H,"📍 "+o(e.placeName),1)):(n(),i("span",I,o(e.fallbackText),1))]),e.trainNo||e.flightNo?(n(),i("div",M,[c(s,{color:"blue"},{default:d(()=>[u(o(e.trainNo||e.flightNo),1)]),_:1})])):g("v-if",!0),e.extraDetail?(n(),i("div",P,o(e.extraDetail),1)):g("v-if",!0)])])}const J=b(C,[["render",W],["__scopeId","data-v-18400280"],["__file","/tmp/cc-web-panel-DGmtsL/repo/packages/web-panel/src/components/pdh/renderers/TimelineRenderer.vue"]]);export{J as default};