chainlesschain 0.162.182 → 0.162.184

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 (202) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/.build-hash +1 -1
  3. package/src/assets/web-panel/assets/{AIOps-DzZ5_xoj.js → AIOps-DzAl5fGx.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-DeLXddIg.js → ActionButton-DAHtMGeC.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-rvDCmet1.js → Analytics-BHQaexv5.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-Yt6QVDnp.js → AppLayout-Phz_pD0n.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-BS112K5L.js → Artifacts-DHt47kCA.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-0wJuQrNu.js → Audit--Y_8FULl.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-B90PMgbn.js → BackgroundAgents-N1zchH7D.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-TkgMglQQ.js → Backup-B_BoyN30.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-CQVS9p1l.js → BaseInput-Gl4uQHcT.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-YTjQHoC7.js → Chat-Cg-eIyAZ.js} +5 -5
  13. package/src/assets/web-panel/assets/ChatBubbleRenderer-BzeUi3JH.js +1 -0
  14. package/src/assets/web-panel/assets/{Checkbox-5bwaOabq.js → Checkbox-D0MGR2wA.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-BFmNQ_Xe.js → Codegen-BdObJEFn.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-BT_u4Dzp.js → Col--ghxXT3z.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-CJP52u5b.js → Community-BUFeXOqz.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-BpzhJE9i.js → Compact-DhQO2_Mr.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-Cg7rfslp.js → Compliance-3HoTqKYd.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-JisxL6Yy.js → Cowork-B3zmO4VW.js} +3 -3
  21. package/src/assets/web-panel/assets/{Cron-Bu7Ug_MC.js → Cron-CJDrZOcc.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-CvuqoLdj.js → Crosschain-SMl15obd.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-C2u9G8Pu.js → DID-CgTrTWrl.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-BFt5Yv3d.js → Dashboard-dXFKaKol.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-DIaT9Wxq.js → Dropdown-qQHEhCvI.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-D_A601Y4.js → EmailListRenderer-C_ej0MWH.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard--IyQ8I8w.js → FamilyGuardDashboard-D6ajoE7I.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-BihWHxuY.js → Federation-Cio2y49h.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-BB8dOXc_.js → FormItemContext-ClJz1cYp.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-DQYhj1HH.js → GenericCardRenderer-Dr_8Maca.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-B-2QZxGf.js → Git-CevLwp5u.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-CusSb-nG.js → Governance-CW9YyQUY.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-BAjmvPPL.js → Inference-CQqeAyER.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-DoNYWKYq.js → KnowledgeGraph-cuGVxHrw.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-B8fKWD-n.js → Logs-DIuHri5d.js} +2 -2
  36. package/src/assets/web-panel/assets/{MarkdownRenderer-BlJm1J7E.js → MarkdownRenderer-R91Qw5JA.js} +1 -1
  37. package/src/assets/web-panel/assets/{Marketplace-CyOscbSL.js → Marketplace-CY1VhFGx.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-Ex6Om5da.js → McpTools-BBAbi1vt.js} +5 -5
  39. package/src/assets/web-panel/assets/{Memory-CDcD8l8r.js → Memory-BWYGHxJA.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-xfBqoFDg.js → MobileBridge-CPIFkW7A.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-BwObMMA2.js → MobileProjects-DQyWxCho.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-CIWd36OV.js → Mtc-Bo3GnQbx.js} +4 -4
  43. package/src/assets/web-panel/assets/{MtcAudit-CPX0ouuA.js → MtcAudit-C8-c4rSW.js} +4 -4
  44. package/src/assets/web-panel/assets/{Multisig-BDJsIUuW.js → Multisig-ChqMTtoq.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-DEkbuD3N.js → NLProgramming-C48TyhvI.js} +1 -1
  46. package/src/assets/web-panel/assets/{Notes-DJpHRhH1.js → Notes-zogUFWxp.js} +3 -3
  47. package/src/assets/web-panel/assets/{NotificationSettings-C1UZ-Qd5.js → NotificationSettings-v-K9XpSB.js} +1 -1
  48. package/src/assets/web-panel/assets/OrderTableRenderer-P94JGGNz.js +1 -0
  49. package/src/assets/web-panel/assets/{Organization-Bbhj0fac.js → Organization-Boi1dQfR.js} +4 -4
  50. package/src/assets/web-panel/assets/{Overflow-1H04x3kx.js → Overflow-DM5YWwgA.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-CDpPe3et.js → P2P-C57LKpKK.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser-MUX0Bpvw.js → PdhVaultBrowser-BFkPqu6Q.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-A07-0Ci1.js → Permissions-D6fB9YSp.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-DhhDWxAZ.js → PersonalDataHub-Bp7EefEo.js} +5 -5
  55. package/src/assets/web-panel/assets/{Pipeline-CyfbJfe-.js → Pipeline-BVln3hZf.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-CNFps3ED.js → Privacy-Bf8P3nF6.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit--T-u3Dr5.js → ProjectInit-DM6wA2E2.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-DJmrK2fC.js → ProjectSettings-CGbc5Iho.js} +2 -2
  59. package/src/assets/web-panel/assets/Projects-D0p9EOxm.js +1 -0
  60. package/src/assets/web-panel/assets/{Providers-DLzzbOZd.js → Providers-B2kJcxS6.js} +1 -1
  61. package/src/assets/web-panel/assets/{QrScannerModal-CexOomKS.js → QrScannerModal-Cxu7dXYy.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-QklGi19_.js → QuickAsk-DTlrTPms.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-Bb9kwSw8.js → Recommend-Cm3X-cCj.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-DZuVNNN5.js → RemoteSession-DNb2kjvt.js} +2 -2
  65. package/src/assets/web-panel/assets/{Reputation-Dr5cLP0N.js → Reputation-CZUFFjc1.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-oCQHYv5t.js → Row-DAPgloxA.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-IFDEykIR.js → RssFeed-dsx9S793.js} +2 -2
  68. package/src/assets/web-panel/assets/{Search-CspVIxDc.js → Search-DnnC8kz-.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-Bm66o_DH.js → Security-VuZknRMK.js} +4 -4
  70. package/src/assets/web-panel/assets/{Services-DvanNqXl.js → Services-B3XNX8Vx.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-CHjEe9_O.js → Skeleton-Dl1nVtCj.js} +1 -1
  72. package/src/assets/web-panel/assets/Skills-CY09CZ_W.js +1 -0
  73. package/src/assets/web-panel/assets/{Sla-DxZm1491.js → Sla-HzU56n1z.js} +1 -1
  74. package/src/assets/web-panel/assets/{SpeechSettings-DWxEEclC.js → SpeechSettings-CRle7Jl2.js} +1 -1
  75. package/src/assets/web-panel/assets/{SyncSettings-FIvOFw5p.js → SyncSettings-DWadz7Sl.js} +2 -2
  76. package/src/assets/web-panel/assets/Tasks-CNVTDGg8.js +1 -0
  77. package/src/assets/web-panel/assets/{Templates-CaNjzV_t.js → Templates-BBAgvrlM.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-DjlP6TmH.js → Tenant-BsbbvGN8.js} +1 -1
  79. package/src/assets/web-panel/assets/Terminal-uscpZI4q.js +3 -0
  80. package/src/assets/web-panel/assets/{TimelineRenderer-DoZ8y7y8.js → TimelineRenderer-mTyjNE6r.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-390cg2TC.js → Tokens-Bz97oBgs.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-CLrtCj5_.js → Trigger-BTRKC140.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-DpESfSPn.js → Trust-B4A_KuyX.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-CN6279O0.js → UkeySign-DES9TmLU.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-DPtAUlSe.js → VideoEditing-ClXs7Qxp.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-nKOMV_1n.js → Wallet-IzZqFz-7.js} +4 -4
  87. package/src/assets/web-panel/assets/{WebAuthn-HuXlSOc4.js → WebAuthn-BtOP04g_.js} +5 -5
  88. package/src/assets/web-panel/assets/{WorkflowEditor-CUfFjARi.js → WorkflowEditor-_0cqnopY.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-6Eq0PcZJ.js → chat-ax7193uU.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-BP_Sf6Iy.js → colors-Bu4WGJah.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-BufMKIh5.js → compact-item-BX1dlTW0.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-BBMXxWSW.js → createContext-CktA_Dj7.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-x877iKKS.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-fUK_tRO2.js → hasIn-D5wd817l.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-t8N1tSeX.js → index-5PYYkr8S.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DLpIs_P_.js → index-A4uBPQCz.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DVsqvI4M.js → index-BAtBNfkr.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-Bkg4ZePE.js → index-BLLsUNDc.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-cpEli44X.js → index-BQtoRyTO.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-wKTLbKyc.js → index-BRfXoRuh.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-B7Etk0Te.js → index-Bad2CYeH.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-CwSf5pnf.js → index-BcGdL3sG.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-3FuwBewR.js → index-C3HmzCLt.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BHy6yNiF.js → index-C8DkWyNr.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-CgiECHu2.js → index-C8tLR2TG.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-C44atv4k.js → index-CP8ELJBc.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CW_G-MXw.js → index-CUForzsG.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-pum7HYBA.js → index-CYRE0NJA.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-BWKoBU8R.js → index-CeVZaJSC.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-D4_MuGkd.js → index-CfzxR61U.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-Dyngbd29.js → index-Ci3y1ZAv.js} +19 -19
  112. package/src/assets/web-panel/assets/{index-fzaMtSJ8.js → index-CjEJjl5C.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-Cp8vhyZy.js → index-Cv7bVWJ5.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DPdUNk1i.js → index-D-o4Rwjk.js} +1 -1
  115. package/src/assets/web-panel/assets/index-D7pfPouB.js +1 -0
  116. package/src/assets/web-panel/assets/{index-CeASi4fr.js → index-D9op8poE.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DASluSqY.js → index-DF1TysIF.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DocdRcbd.js → index-DYo9S5OT.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-2A5ph8b2.js → index-D_cycOET.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-wV6iGdpY.js → index-Db3CpWTr.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BMLHv389.js → index-DkD1K-fF.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-B9WYSn4m.js → index-DmPJ6T6F.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-uCbEN7cY.js → index-DmVUeWUk.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DmkMXwnR.js → index-Dzdr0zDf.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-CZ6Yt17L.js → index-PBLzwYnu.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CE2DdTP2.js → index-bFCaM7Eq.js} +1 -1
  127. package/src/assets/web-panel/assets/index-e4i-VLBd.js +1 -0
  128. package/src/assets/web-panel/assets/{index-GwdRUZ-x.js → index-h3KJZr95.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-B2vS66eI.js → index-iHcPtQ2e.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-6GmBa4Kg.js → index-jzlzm4VK.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-D9vU25ij.js → index-o14NNnxw.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-CGjmILDm.js → index-tYPSfGbd.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-LvCBfTLo.js → index-ytp2H5Zx.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-V5Fo95FM.js → initDefaultProps-D2Iut83B.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-BYWU0hUT.js → motion-BuaJVdK9.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-Cr1M-J2h.js → move-CaEuM92y.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-BysQKi2N.js → mtc-parser-wuKNBwys.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-D1zHU8GC.js → omit-7a3eklaq.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-CUArxtfi.js → pickAttrs-Dn4z7KvJ.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-ChoYEys0.js → placementArrow-DVn_qT4-.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-BQRs3Mo7.js → responsiveObserve-Dodz1OMQ.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-B8zbsCkg.js → slide-CxoGskbp.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-C2U8Gs6h.js → statusUtils-DBh_epQH.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-Dd8MgL_V.js → styleChecker-RXQ4gG5P.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-hknqY5NH.js → useFlexGapSupport-1Wxm0HEG.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-CLTAmcfw.js → useFs-CI_ySNxJ.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-ByegHbiB.js → usePersonalDataHub-C6973rZP.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-DqlAy5DP.js → vnode-CalynwKr.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-DiXiztQn.js → zoom-CM1cd-Q0.js} +1 -1
  150. package/src/assets/web-panel/index.html +1 -1
  151. package/src/commands/agenda.js +74 -1
  152. package/src/commands/agent.js +9 -0
  153. package/src/commands/background-session.js +60 -1
  154. package/src/commands/batch.js +160 -5
  155. package/src/commands/plugin.js +318 -43
  156. package/src/commands/session.js +44 -1
  157. package/src/commands/team.js +212 -6
  158. package/src/data/changelog.json +26 -0
  159. package/src/harness/jsonl-session-store.js +59 -6
  160. package/src/harness/mcp-client.js +65 -43
  161. package/src/lib/agent-batch.js +4 -1
  162. package/src/lib/agent-team/team-runner.js +19 -1
  163. package/src/lib/agent-team/team-worktree.js +3 -0
  164. package/src/lib/async-hook-supervisor.cjs +82 -10
  165. package/src/lib/async-hook-supervisor.js +50 -4
  166. package/src/lib/background-agent-supervisor.js +49 -0
  167. package/src/lib/collaboration-run-store.js +362 -0
  168. package/src/lib/hook-runner.cjs +98 -17
  169. package/src/lib/hook-runner.js +77 -6
  170. package/src/lib/hook-shell-command.cjs +148 -0
  171. package/src/lib/hooks-v2-runtime.js +188 -77
  172. package/src/lib/jsonl-session-store.js +2 -0
  173. package/src/lib/lsp/__tests__/lsp-client.test.js +18 -0
  174. package/src/lib/lsp/lsp-client.js +12 -1
  175. package/src/lib/plugin-monitor-supervisor.js +53 -16
  176. package/src/lib/plugin-runtime/bin.js +1 -1
  177. package/src/lib/plugin-runtime/install.js +465 -54
  178. package/src/lib/plugin-runtime/mcp.js +21 -2
  179. package/src/lib/plugin-runtime/monitors.js +19 -3
  180. package/src/lib/plugin-runtime/sandbox-policy.js +99 -0
  181. package/src/lib/plugin-runtime/scopes.js +13 -2
  182. package/src/lib/plugin-usage-attribution.js +44 -0
  183. package/src/lib/process-execution-broker/index.js +705 -13
  184. package/src/lib/process-execution-broker/linux-generic-bwrap-runtime.js +1347 -0
  185. package/src/lib/process-execution-broker/linux-generic-bwrap.js +1260 -0
  186. package/src/lib/process-execution-broker/platform-sandbox.js +1831 -157
  187. package/src/lib/session-usage.js +278 -1
  188. package/src/lib/stream-retry.js +29 -0
  189. package/src/repl/agent-repl.js +38 -9
  190. package/src/runtime/agent-core.js +32 -4
  191. package/src/runtime/headless-runner.js +46 -1
  192. package/src/runtime/headless-stream.js +54 -3
  193. package/src/runtime/mcp-config.js +15 -5
  194. package/src/assets/web-panel/assets/ChatBubbleRenderer-PR074hUN.js +0 -1
  195. package/src/assets/web-panel/assets/OrderTableRenderer-GlJtqLjT.js +0 -1
  196. package/src/assets/web-panel/assets/Projects-Qx_MdX9k.js +0 -1
  197. package/src/assets/web-panel/assets/Skills-Cb8jWjMX.js +0 -1
  198. package/src/assets/web-panel/assets/Tasks-CyuLnDFR.js +0 -1
  199. package/src/assets/web-panel/assets/Terminal-DwzGMniO.js +0 -3
  200. package/src/assets/web-panel/assets/devWarning-DgVKduH2.js +0 -1
  201. package/src/assets/web-panel/assets/index-DOZTSoS7.js +0 -1
  202. package/src/assets/web-panel/assets/index-DhpvjpqI.js +0 -1
@@ -1 +1 @@
1
- import{I as p,J as I,U as s,R as r,c as a,K as o,V as b,N as Q,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-Bn1JzzAn.js";import{_ as pe,b as $,u as ee,t as te,d as g}from"./index-Dyngbd29.js";import{u as oe}from"./useFs-CLTAmcfw.js";import{aM as de,aL as ue,aq as ge,ab as fe,aR as ye,aS as _e,at as ve,a5 as xe,J as be,aa as he}from"./icons-DG5UD-6K.js";import"./useShellMode-CgR0wCYM.js";const q="cc_prompt_templates",we={__name:"Templates",setup(ae,{expose:l}){l();const{t:i}=$(),e=ee(),J=Q(),B=oe(),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"],E=Z(()=>F.map(n=>({name:n,description:i(`templates.project.items.${n}`)})));function M(n){S.value=n,P.value=!0}async function L(){P.value=!1;const n=S.value;if(n){w.value=n,k.value=null;try{const m=`init --template ${n} --yes`,{output:z,exitCode:T}=await e.execute(m,3e4);k.value={success:T===0,output:z}}catch(m){k.value={success:!1,output:i("templates.messages.initFailed",{err:m.message})}}finally{w.value=""}}}const A=u(!1),O=u([]),x=u(""),j=u(null);async function N(){A.value=!0;try{const{output:n}=await e.execute("bi templates --json",15e3),m=te(n);O.value=Array.isArray(m)?m:m?.templates||[]}catch{O.value=[]}finally{A.value=!1}}async function U(n){x.value=n,j.value=null;try{const m=`bi dashboard create --template ${n} --json`,{output:z,exitCode:T}=await e.execute(m,3e4);j.value={success:T===0,output:z}}catch(m){j.value={success:!1,output:i("templates.messages.createFailed",{err:m.message})}}finally{x.value=""}}const t=u([]),C=u(!1),y=Y({name:"",category:"general",content:""});function H(){try{const n=localStorage.getItem(q);t.value=n?JSON.parse(n):[]}catch{t.value=[]}}function D(){localStorage.setItem(q,JSON.stringify(t.value))}function ne(){!y.name||!y.content||(t.value.push({name:y.name,category:y.category,content:y.content}),D(),W(),g.success(i("templates.messages.promptSaved")))}function W(){C.value=!1,y.name="",y.category="general",y.content=""}async function le(){if(t.value.length){f.value=!0;try{const n=await B.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 re(){h.value=!0;try{const n=await B.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 m;try{m=JSON.parse(n.content||"")}catch(_){g.error(i("templates.messages.jsonParseFailed",{err:_.message}));return}const z=Array.isArray(m)?m:Array.isArray(m?.prompts)?m.prompts:null;if(!z){g.error(i("templates.messages.fileShapeUnknown",{expected:"prompts: [...]"}));return}let T=0;for(const _ of z)!_||typeof _!="object"||typeof _.name!="string"||typeof _.content!="string"||(t.value.push({name:_.name,category:typeof _.category=="string"?_.category:"general",content:_.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 ie(n){navigator.clipboard.writeText(n.content).then(()=>{g.success(i("templates.messages.copiedClipboard"))}).catch(()=>{g.error(i("templates.messages.copyFailed"))})}function ce(n){J.push({path:"/chat",query:{prompt:n.content}})}function me(n){return{general:"blue",code:"green",writing:"orange",analysis:"purple"}[n]||"default"}X(()=>{H(),N()});const G={t:i,ws:e,router:J,fs:B,exportingPrompts:f,importingPrompts:h,activeTab:R,initLoading:w,initResult:k,showInitConfirm:P,pendingTemplate:S,PROJECT_TEMPLATE_NAMES:F,projectTemplates:E,confirmInit:M,doInit:L,biLoading:A,biTemplates:O,biCreating:x,biResult:j,loadBiTemplates:N,createBiDashboard:U,STORAGE_KEY:q,promptTemplates:t,showPromptModal:C,newPrompt:y,loadPromptTemplates:H,persistPrompts:D,savePrompt:ne,resetPromptForm:W,exportPrompts:le,importPrompts:re,deletePrompt:se,copyPrompt:ie,usePrompt:ce,categoryColor:me,ref:u,computed:Z,reactive:Y,onMounted:X,get useI18n(){return $},get useRouter(){return Q},get AppstoreOutlined(){return he},get BarChartOutlined(){return be},get FileTextOutlined(){return xe},get PlusOutlined(){return ve},get CopyOutlined(){return _e},get DeleteOutlined(){return ye},get RocketOutlined(){return fe},get PlayCircleOutlined(){return ge},get ExportOutlined(){return ue},get ImportOutlined(){return de},get message(){return g},get useWsStore(){return ee},get useFs(){return oe},get tryParseJson(){return te}};return Object.defineProperty(G,"__isScriptSetup",{enumerable:!1,value:!0}),G}},ke={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Pe={class:"page-title"},Oe={class:"page-sub"},Ce={style:{display:"flex","align-items":"flex-start",gap:"10px"}},Te={style:{flex:"1","min-width":"0"}},je={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px","font-family":"monospace","margin-bottom":"4px"}},ze={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5"}},Ie={style:{"margin-top":"12px","text-align":"right"}},Re={style:{margin:"0","font-size":"12px","white-space":"pre-wrap","max-height":"200px","overflow-y":"auto"}},Se={key:0,style:{"text-align":"center",padding:"40px"}},Fe={style:{color:"var(--text-muted)","margin-top":"8px"}},Ae={style:{display:"flex","align-items":"flex-start",gap:"10px"}},Be={style:{flex:"1","min-width":"0"}},Ee={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"}},Je={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"}},Ue={style:{display:"flex","align-items":"center",gap:"8px","margin-bottom":"8px"}},Ke={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px",flex:"1",overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},Ve={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5","max-height":"60px",overflow:"hidden","text-overflow":"ellipsis","white-space":"pre-wrap"}},qe={style:{"margin-top":"12px",display:"flex",gap:"8px","justify-content":"flex-end"}},He={style:{color:"var(--text-muted)","font-size":"12px"}};function We(ae,l,i,e,J,B){const f=p("a-button"),h=p("a-card"),R=p("a-col"),w=p("a-row"),k=p("a-alert"),P=p("a-tab-pane"),S=p("a-spin"),F=p("a-empty"),E=p("a-tag"),M=p("a-tabs"),L=p("a-modal"),A=p("a-input"),O=p("a-form-item"),x=p("a-select-option"),j=p("a-select"),N=p("a-textarea"),U=p("a-form");return d(),I("div",null,[s("div",ke,[s("div",null,[s("h2",Pe,r(e.t("templates.title")),1),s("p",Oe,r(e.t("templates.subtitle")),1)])]),a(M,{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(" "+r(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(()=>[s("div",Ce,[a(e.RocketOutlined,{style:{"font-size":"24px",color:"#1677ff","flex-shrink":"0","margin-top":"2px"}}),s("div",Te,[s("div",je,r(t.name),1),s("div",ze,r(t.description),1)])]),s("div",Ie,[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(" "+r(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(()=>[s("pre",Re,r(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(" "+r(e.t("templates.tabs.bi")),1)]),default:o(()=>[e.biLoading?(d(),I("div",Se,[a(S),s("div",Fe,r(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(()=>[s("div",Ae,[a(e.BarChartOutlined,{style:{"font-size":"24px",color:"#722ed1","flex-shrink":"0","margin-top":"2px"}}),s("div",Be,[s("div",Ee,r(t.name),1),s("div",Le,r(t.description||e.t("templates.bi.noDescription")),1),t.id?(d(),I("div",Ne,[a(E,{size:"small",color:"purple"},{default:o(()=>[c(r(t.id),1)]),_:2},1024)])):b("v-if",!0)])]),s("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(" "+r(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(()=>[s("pre",Je,r(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(" "+r(e.t("templates.tabs.prompts")),1)]),default:o(()=>[s("div",Me,[a(f,{type:"primary",onClick:l[2]||(l[2]=t=>e.showPromptModal=!0)},{icon:o(()=>[a(e.PlusOutlined)]),default:o(()=>[c(" "+r(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(" "+r(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(" "+r(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(()=>[s("div",Ue,[a(e.FileTextOutlined,{style:{"font-size":"18px",color:"#52c41a"}}),s("span",Ke,r(t.name),1),a(E,{color:e.categoryColor(t.category),size:"small"},{default:o(()=>[c(r(t.category),1)]),_:2},1032,["color"])]),s("div",Ve,r(t.content.length>120?t.content.slice(0,120)+"...":t.content),1),s("div",qe,[a(f,{size:"small",onClick:y=>e.usePrompt(t)},{icon:o(()=>[a(e.RocketOutlined)]),default:o(()=>[c(" "+r(e.t("templates.prompts.useButton")),1)]),_:1},8,["onClick"]),a(f,{size:"small",onClick:y=>e.copyPrompt(t)},{icon:o(()=>[a(e.CopyOutlined)]),default:o(()=>[c(" "+r(e.t("templates.prompts.copyButton")),1)]),_:1},8,["onClick"]),a(f,{size:"small",danger:"",onClick:y=>e.deletePrompt(C)},{icon:o(()=>[a(e.DeleteOutlined)]),default:o(()=>[c(" "+r(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(L,{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(()=>[s("p",null,[c(r(e.t("templates.project.confirmIntro"))+" ",1),s("strong",null,r(e.pendingTemplate),1),c(" "+r(e.t("templates.project.confirmIntroSuffix")),1)]),s("p",He,r(e.t("templates.project.confirmHint")),1)]),_:1},8,["open","title","ok-text","cancel-text"]),b(" New Prompt Modal "),a(L,{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(A,{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(N,{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 $e=pe(we,[["render",We],["__scopeId","data-v-82f40809"],["__file","/tmp/cc-web-panel-UAH1Xi/repo/packages/web-panel/src/views/Templates.vue"]]);export{$e as default};
1
+ import{I as p,J as I,U as s,R as r,c as a,K as o,V as b,N as G,o as Q,a as Y,b as X,r as u,P as d,F as K,Z as V,S as v,Q as c}from"./vendor-Bn1JzzAn.js";import{_ as pe,b as $,u as ee,t as te,d as g}from"./index-Ci3y1ZAv.js";import{u as oe}from"./useFs-CI_ySNxJ.js";import{aM as de,aL as ue,aq as ge,ab as fe,aR as ye,aS as _e,at as ve,a5 as xe,J as be,aa as he}from"./icons-DG5UD-6K.js";import"./useShellMode-CgR0wCYM.js";const q="cc_prompt_templates",we={__name:"Templates",setup(ae,{expose:l}){l();const{t:i}=$(),e=ee(),J=G(),A=oe(),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"],E=X(()=>F.map(n=>({name:n,description:i(`templates.project.items.${n}`)})));function M(n){S.value=n,P.value=!0}async function L(){P.value=!1;const n=S.value;if(n){w.value=n,k.value=null;try{const m=`init --template ${n} --yes`,{output:z,exitCode:T}=await e.execute(m,3e4);k.value={success:T===0,output:z}}catch(m){k.value={success:!1,output:i("templates.messages.initFailed",{err:m.message})}}finally{w.value=""}}}const B=u(!1),O=u([]),x=u(""),j=u(null);async function N(){B.value=!0;try{const{output:n}=await e.execute("bi templates --json",15e3),m=te(n);O.value=Array.isArray(m)?m:m?.templates||[]}catch{O.value=[]}finally{B.value=!1}}async function U(n){x.value=n,j.value=null;try{const m=`bi dashboard create --template ${n} --json`,{output:z,exitCode:T}=await e.execute(m,3e4);j.value={success:T===0,output:z}}catch(m){j.value={success:!1,output:i("templates.messages.createFailed",{err:m.message})}}finally{x.value=""}}const t=u([]),C=u(!1),y=Y({name:"",category:"general",content:""});function H(){try{const n=localStorage.getItem(q);t.value=n?JSON.parse(n):[]}catch{t.value=[]}}function D(){localStorage.setItem(q,JSON.stringify(t.value))}function ne(){!y.name||!y.content||(t.value.push({name:y.name,category:y.category,content:y.content}),D(),W(),g.success(i("templates.messages.promptSaved")))}function W(){C.value=!1,y.name="",y.category="general",y.content=""}async function le(){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 re(){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 m;try{m=JSON.parse(n.content||"")}catch(_){g.error(i("templates.messages.jsonParseFailed",{err:_.message}));return}const z=Array.isArray(m)?m:Array.isArray(m?.prompts)?m.prompts:null;if(!z){g.error(i("templates.messages.fileShapeUnknown",{expected:"prompts: [...]"}));return}let T=0;for(const _ of z)!_||typeof _!="object"||typeof _.name!="string"||typeof _.content!="string"||(t.value.push({name:_.name,category:typeof _.category=="string"?_.category:"general",content:_.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 ie(n){navigator.clipboard.writeText(n.content).then(()=>{g.success(i("templates.messages.copiedClipboard"))}).catch(()=>{g.error(i("templates.messages.copyFailed"))})}function ce(n){J.push({path:"/chat",query:{prompt:n.content}})}function me(n){return{general:"blue",code:"green",writing:"orange",analysis:"purple"}[n]||"default"}Q(()=>{H(),N()});const Z={t:i,ws:e,router:J,fs:A,exportingPrompts:f,importingPrompts:h,activeTab:R,initLoading:w,initResult:k,showInitConfirm:P,pendingTemplate:S,PROJECT_TEMPLATE_NAMES:F,projectTemplates:E,confirmInit:M,doInit:L,biLoading:B,biTemplates:O,biCreating:x,biResult:j,loadBiTemplates:N,createBiDashboard:U,STORAGE_KEY:q,promptTemplates:t,showPromptModal:C,newPrompt:y,loadPromptTemplates:H,persistPrompts:D,savePrompt:ne,resetPromptForm:W,exportPrompts:le,importPrompts:re,deletePrompt:se,copyPrompt:ie,usePrompt:ce,categoryColor:me,ref:u,computed:X,reactive:Y,onMounted:Q,get useI18n(){return $},get useRouter(){return G},get AppstoreOutlined(){return he},get BarChartOutlined(){return be},get FileTextOutlined(){return xe},get PlusOutlined(){return ve},get CopyOutlined(){return _e},get DeleteOutlined(){return ye},get RocketOutlined(){return fe},get PlayCircleOutlined(){return ge},get ExportOutlined(){return ue},get ImportOutlined(){return de},get message(){return g},get useWsStore(){return ee},get useFs(){return oe},get tryParseJson(){return te}};return Object.defineProperty(Z,"__isScriptSetup",{enumerable:!1,value:!0}),Z}},ke={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Pe={class:"page-title"},Oe={class:"page-sub"},Ce={style:{display:"flex","align-items":"flex-start",gap:"10px"}},Te={style:{flex:"1","min-width":"0"}},je={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px","font-family":"monospace","margin-bottom":"4px"}},ze={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5"}},Ie={style:{"margin-top":"12px","text-align":"right"}},Re={style:{margin:"0","font-size":"12px","white-space":"pre-wrap","max-height":"200px","overflow-y":"auto"}},Se={key:0,style:{"text-align":"center",padding:"40px"}},Fe={style:{color:"var(--text-muted)","margin-top":"8px"}},Be={style:{display:"flex","align-items":"flex-start",gap:"10px"}},Ae={style:{flex:"1","min-width":"0"}},Ee={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"}},Je={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"}},Ue={style:{display:"flex","align-items":"center",gap:"8px","margin-bottom":"8px"}},Ke={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px",flex:"1",overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},Ve={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5","max-height":"60px",overflow:"hidden","text-overflow":"ellipsis","white-space":"pre-wrap"}},qe={style:{"margin-top":"12px",display:"flex",gap:"8px","justify-content":"flex-end"}},He={style:{color:"var(--text-muted)","font-size":"12px"}};function We(ae,l,i,e,J,A){const f=p("a-button"),h=p("a-card"),R=p("a-col"),w=p("a-row"),k=p("a-alert"),P=p("a-tab-pane"),S=p("a-spin"),F=p("a-empty"),E=p("a-tag"),M=p("a-tabs"),L=p("a-modal"),B=p("a-input"),O=p("a-form-item"),x=p("a-select-option"),j=p("a-select"),N=p("a-textarea"),U=p("a-form");return d(),I("div",null,[s("div",ke,[s("div",null,[s("h2",Pe,r(e.t("templates.title")),1),s("p",Oe,r(e.t("templates.subtitle")),1)])]),a(M,{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(" "+r(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(()=>[s("div",Ce,[a(e.RocketOutlined,{style:{"font-size":"24px",color:"#1677ff","flex-shrink":"0","margin-top":"2px"}}),s("div",Te,[s("div",je,r(t.name),1),s("div",ze,r(t.description),1)])]),s("div",Ie,[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(" "+r(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(()=>[s("pre",Re,r(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(" "+r(e.t("templates.tabs.bi")),1)]),default:o(()=>[e.biLoading?(d(),I("div",Se,[a(S),s("div",Fe,r(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(()=>[s("div",Be,[a(e.BarChartOutlined,{style:{"font-size":"24px",color:"#722ed1","flex-shrink":"0","margin-top":"2px"}}),s("div",Ae,[s("div",Ee,r(t.name),1),s("div",Le,r(t.description||e.t("templates.bi.noDescription")),1),t.id?(d(),I("div",Ne,[a(E,{size:"small",color:"purple"},{default:o(()=>[c(r(t.id),1)]),_:2},1024)])):b("v-if",!0)])]),s("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(" "+r(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(()=>[s("pre",Je,r(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(" "+r(e.t("templates.tabs.prompts")),1)]),default:o(()=>[s("div",Me,[a(f,{type:"primary",onClick:l[2]||(l[2]=t=>e.showPromptModal=!0)},{icon:o(()=>[a(e.PlusOutlined)]),default:o(()=>[c(" "+r(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(" "+r(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(" "+r(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(()=>[s("div",Ue,[a(e.FileTextOutlined,{style:{"font-size":"18px",color:"#52c41a"}}),s("span",Ke,r(t.name),1),a(E,{color:e.categoryColor(t.category),size:"small"},{default:o(()=>[c(r(t.category),1)]),_:2},1032,["color"])]),s("div",Ve,r(t.content.length>120?t.content.slice(0,120)+"...":t.content),1),s("div",qe,[a(f,{size:"small",onClick:y=>e.usePrompt(t)},{icon:o(()=>[a(e.RocketOutlined)]),default:o(()=>[c(" "+r(e.t("templates.prompts.useButton")),1)]),_:1},8,["onClick"]),a(f,{size:"small",onClick:y=>e.copyPrompt(t)},{icon:o(()=>[a(e.CopyOutlined)]),default:o(()=>[c(" "+r(e.t("templates.prompts.copyButton")),1)]),_:1},8,["onClick"]),a(f,{size:"small",danger:"",onClick:y=>e.deletePrompt(C)},{icon:o(()=>[a(e.DeleteOutlined)]),default:o(()=>[c(" "+r(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(L,{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(()=>[s("p",null,[c(r(e.t("templates.project.confirmIntro"))+" ",1),s("strong",null,r(e.pendingTemplate),1),c(" "+r(e.t("templates.project.confirmIntroSuffix")),1)]),s("p",He,r(e.t("templates.project.confirmHint")),1)]),_:1},8,["open","title","ok-text","cancel-text"]),b(" New Prompt Modal "),a(L,{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(N,{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 $e=pe(we,[["render",We],["__scopeId","data-v-82f40809"],["__file","/tmp/cc-web-panel-EZK4no/repo/packages/web-panel/src/views/Templates.vue"]]);export{$e 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 Y,r as S,P as u,Q as m,F as C,Z as w}from"./vendor-Bn1JzzAn.js";import{t as J,_ as Nt,u as ut,b as dt,d as b}from"./index-Dyngbd29.js";import{a9 as Ut,aZ as jt,ad as Mt,b5 as Et,o as Bt,at as Dt,R as Qt}from"./icons-DG5UD-6K.js";const Kt=Object.freeze(["free","starter","pro","enterprise"]),Vt=Object.freeze(["active","suspended","deleted"]),Wt=Object.freeze(["api_calls","storage_bytes","ai_requests"]);function z(e,l=0){return typeof e=="number"&&Number.isFinite(e)?e:l}function Jt(e,l=0){if(!e||typeof e!="object")return null;const d=e.id||"";if(!d)return null;const t=e.quotas&&typeof e.quotas=="object"?{...e.quotas}:{};return{key:d,id:d,name:String(e.name||d),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(Jt).filter(Boolean):[]}function Zt(e,l=0){if(!e||typeof e!="object")return null;const d=e.id||"";return d?{key:d,id:d,name:String(e.name||d),unit:String(e.unit||""),_idx:l}:null}function mt(e){const l=J(e);return Array.isArray(l)?l.map(Zt).filter(Boolean):[]}function Gt(e,l=0){if(!e||typeof e!="object")return null;const d=e.id||"";return d?{key:d,id:d,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(Gt).filter(Boolean):[]}function Ht(e,l=0){if(!e||typeof e!="object")return null;const d=e.id||"";return d?{key:d,id:d,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)),d=J(e);if(!d||typeof d!="object"||Array.isArray(d))return l;if(l.tenantCount=z(d.tenantCount,0),l.subscriptionCount=z(d.subscriptionCount,0),l.activeSubscriptions=z(d.activeSubscriptions,0),l.usageRecordCount=z(d.usageRecordCount,0),d.byStatus&&typeof d.byStatus=="object")for(const t of Object.keys(l.byStatus))l.byStatus[t]=z(d.byStatus[t],0);if(d.byPlan&&typeof d.byPlan=="object")for(const t of Object.keys(l.byPlan))l.byPlan[t]=z(d.byPlan[t],0);if(d.totalUsage&&typeof d.totalUsage=="object")for(const t of Object.keys(l.totalUsage))l.totalUsage[t]=z(d.totalUsage[t],0);return l}function Yt(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(),d=String(e.getMonth()+1).padStart(2,"0");return`${l}-${d}`}const $t={__name:"Tenant",setup(e,{expose:l}){l();const d=ut(),{t}=dt(),D=S(!1),$=S(!1),x=S(!1),j=S(!1),Q=S(!1),M=S([]),K=S([]),P=S([]),R=S([]),O=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}}),Z=S("tenants"),A=S(""),I=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=Y(()=>[{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=Y(()=>[{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=Y(()=>{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=Y(()=>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,Ot]=await Promise.all([d.execute("tenant list --json",1e4).catch(()=>({output:""})),d.execute("tenant subscriptions --json",1e4).catch(()=>({output:""})),d.execute("tenant plans --json",8e3).catch(()=>({output:""})),d.execute("tenant metrics --json",8e3).catch(()=>({output:""})),d.execute("tenant stats --json",8e3).catch(()=>({output:""}))]);M.value=ft(r.output),K.value=pt(i.output),P.value=ct(f.output),R.value=mt(H.output),O.value=yt(Ot.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 d.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 d.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(),Z.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 d.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 d.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 d.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 d.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 d.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 Pt(){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 d.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:d,t,loading:D,creating:$,subscribing:x,checking:j,recording:Q,tenants:M,subscriptions:K,plans:P,metrics:R,stats:O,activeTab:Z,planFilter:A,statusFilter:I,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:It,recordUsage:Pt,resetCreateForm:lt,resetSubscribeForm:ot,resetRecordForm:rt,ensurePeriodDefault:at,ref:S,computed:Y,onMounted:it,reactive:X,get ReloadOutlined(){return Qt},get PlusOutlined(){return Dt},get BankOutlined(){return Bt},get CreditCardOutlined(){return Et},get DashboardOutlined(){return Mt},get LineChartOutlined(){return jt},get ApiOutlined(){return Ut},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 Yt},get formatBytes(){return nt},get currentPeriod(){return gt},get PLAN_IDS(){return Kt},get TENANT_STATUSES(){return Vt},get KNOWN_METRICS(){return Wt}};return Object.defineProperty(st,"__isScriptSetup",{enumerable:!1,value:!0}),st}},te={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},ee={class:"page-title"},ae={class:"page-sub"},ne={style:{color:"var(--text-secondary)","font-size":"12px","margin-left":"8px"}},le={class:"filter-bar"},oe={style:{color:"var(--text-primary)","font-weight":"500"}},re={style:{color:"var(--text-secondary)","font-size":"11px","margin-top":"2px","font-family":"monospace"}},se={key:0,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"11px"}},ie={key:1,style:{color:"var(--text-muted)"}},ue={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},de={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},ce={style:{color:"var(--text-primary)","font-weight":"500"}},me={style:{color:"var(--text-secondary)","font-size":"11px","font-family":"monospace"}},fe={key:0,style:{color:"#722ed1","font-weight":"500"}},pe={key:1,style:{color:"var(--text-muted)"}},be={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},ye={key:5,style:{color:"var(--text-secondary)","font-size":"11px"}},ge={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},ve={class:"plan-fee"},_e={key:0},ke={class:"plan-fee-unit"},he={key:1,style:{color:"#722ed1"}},Se={class:"plan-section"},Ce={class:"plan-section-title"},Fe={class:"plan-quota-label"},qe={class:"plan-quota-value"},we={class:"plan-section"},xe={class:"plan-section-title"},Ae={style:{"margin-top":"12px","font-size":"12px",color:"var(--text-secondary)"}},Te={style:{"font-family":"monospace",color:"var(--text-primary)"}},Le={key:0},ze={style:{"font-family":"monospace"}},Re={key:1,style:{"margin-top":"8px"}};function Ie(e,l,d,t,D,$){const x=v("a-button"),j=v("a-menu-item"),Q=v("a-menu"),M=v("a-dropdown"),K=v("a-space"),P=v("a-statistic"),R=v("a-card"),O=v("a-col"),Z=v("a-row"),A=v("a-tag"),I=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 u(),p("div",null,[g("div",te,[g("div",null,[g("h2",ee,s(e.$t("tenant.title")),1),g("p",ae,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(Z,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:n(()=>[o(O,{xs:12,sm:8,lg:5},{default:n(()=>[o(R,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(P,{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(O,{xs:12,sm:8,lg:5},{default:n(()=>[o(R,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(P,{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(O,{xs:12,sm:8,lg:5},{default:n(()=>[o(R,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(P,{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(O,{xs:12,sm:8,lg:5},{default:n(()=>[o(R,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(P,{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(O,{xs:24,sm:8,lg:4},{default:n(()=>[o(R,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(P,{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?(u(),_(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(()=>[(u(!0),p(C,null,w(t.PLAN_IDS,a=>(u(),_(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",ne,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",le,[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}),(u(!0),p(C,null,w(t.PLAN_IDS,a=>(u(),_(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}),(u(!0),p(C,null,w(t.TENANT_STATUSES,a=>(u(),_(I,{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"?(u(),p(C,{key:0},[g("span",oe,s(c.name),1),g("div",re,s(c.slug),1)],64)):y("v-if",!0),a.key==="plan"?(u(),_(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"?(u(),_(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"?(u(),p(C,{key:3},[c.ownerId?(u(),p("span",se,s(c.ownerId),1)):(u(),p("span",ie,"—"))],64)):y("v-if",!0),a.key==="createdAt"?(u(),p("span",ue,s(t.formatTenantTime(c.createdAt)),1)):y("v-if",!0),a.key==="action"?(u(),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(()=>[(u(!0),p(C,null,w(t.PLAN_IDS,L=>(u(),_(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"?(u(),_(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"?(u(),_(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"?(u(),_(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",de,[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"?(u(),p(C,{key:0},[g("span",ce,s(t.tenantName(c.tenantId)),1),g("div",me,s(c.tenantId.slice(0,8)),1)],64)):y("v-if",!0),a.key==="plan"?(u(),_(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"?(u(),p(C,{key:2},[c.amount!=null?(u(),p("span",fe,"¥"+s(c.amount),1)):(u(),p("span",pe,"—"))],64)):y("v-if",!0),a.key==="status"?(u(),_(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"?(u(),p("span",be,s(t.formatTenantTime(c.startedAt)),1)):y("v-if",!0),a.key==="expiresAt"?(u(),p("span",ye,s(t.formatTenantTime(c.expiresAt)),1)):y("v-if",!0),a.key==="action"?(u(),p(C,{key:6},[c.status==="active"?(u(),_(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",ge,[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(Z,{gutter:[16,16]},{default:n(()=>[(u(!0),p(C,null,w(t.plans,a=>(u(),_(O,{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",ve,[a.monthlyFee!=null?(u(),p("span",_e,[m("¥"+s(a.monthlyFee)+" ",1),g("span",ke,s(e.$t("tenant.planCard.monthlySuffix")),1)])):(u(),p("span",he,s(e.$t("tenant.planCard.contactSales")),1))]),g("div",Se,[g("div",Ce,s(e.$t("tenant.planCard.quotas")),1),(u(!0),p(C,null,w(t.metrics,c=>(u(),p("div",{key:c.id,class:"plan-quota-row"},[g("span",Fe,s(c.name),1),g("span",qe,s(t.formatQuota(a.quotas?.[c.id],c.id)),1)]))),128))]),g("div",we,[g("div",xe,s(e.$t("tenant.planCard.features")),1),(u(!0),p(C,null,w(a.features,c=>(u(),_(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(()=>[(u(!0),p(C,null,w(t.PLAN_IDS,a=>(u(),_(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(()=>[(u(!0),p(C,null,w(t.PLAN_IDS,a=>(u(),_(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(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(()=>[(u(!0),p(C,null,w(t.tenants,a=>(u(),_(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(()=>[(u(!0),p(C,null,w(t.KNOWN_METRICS,a=>(u(),_(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?(u(),_(R,{key:0,size:"small",style:{background:"var(--bg-base)","margin-top":"8px"}},{default:n(()=>[o(P,{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",Ae,[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",Te,s(t.formatMetricValue(t.quotaResult.used,t.quotaResult.metric)),1)]),t.quotaResult.unlimited?y("v-if",!0):(u(),p("div",Le,[m(s(e.$t("tenant.quota_modal.limitLine"))+" ",1),g("span",ze,s(t.formatMetricValue(t.quotaResult.limit,t.quotaResult.metric)),1)])),!t.quotaResult.unlimited&&t.quotaResult.limit>0?(u(),p("div",Re,[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(()=>[(u(!0),p(C,null,w(t.tenants,a=>(u(),_(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(()=>[(u(!0),p(C,null,w(t.KNOWN_METRICS,a=>(u(),_(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 Ue=Nt($t,[["render",Ie],["__scopeId","data-v-c93a3192"],["__file","/tmp/cc-web-panel-UAH1Xi/repo/packages/web-panel/src/views/Tenant.vue"]]);export{Ue 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 S,P as u,Q as m,F as C,Z as w}from"./vendor-Bn1JzzAn.js";import{t as J,_ as Nt,u as ut,b as dt,d as b}from"./index-Ci3y1ZAv.js";import{a9 as Ut,aZ as jt,ad as Mt,b5 as Et,o as Bt,at as Dt,R as Qt}from"./icons-DG5UD-6K.js";const Kt=Object.freeze(["free","starter","pro","enterprise"]),Vt=Object.freeze(["active","suspended","deleted"]),Wt=Object.freeze(["api_calls","storage_bytes","ai_requests"]);function z(e,l=0){return typeof e=="number"&&Number.isFinite(e)?e:l}function Jt(e,l=0){if(!e||typeof e!="object")return null;const d=e.id||"";if(!d)return null;const t=e.quotas&&typeof e.quotas=="object"?{...e.quotas}:{};return{key:d,id:d,name:String(e.name||d),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(Jt).filter(Boolean):[]}function Zt(e,l=0){if(!e||typeof e!="object")return null;const d=e.id||"";return d?{key:d,id:d,name:String(e.name||d),unit:String(e.unit||""),_idx:l}:null}function mt(e){const l=J(e);return Array.isArray(l)?l.map(Zt).filter(Boolean):[]}function Gt(e,l=0){if(!e||typeof e!="object")return null;const d=e.id||"";return d?{key:d,id:d,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(Gt).filter(Boolean):[]}function Yt(e,l=0){if(!e||typeof e!="object")return null;const d=e.id||"";return d?{key:d,id:d,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(Yt).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 Ht={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(Ht)),d=J(e);if(!d||typeof d!="object"||Array.isArray(d))return l;if(l.tenantCount=z(d.tenantCount,0),l.subscriptionCount=z(d.subscriptionCount,0),l.activeSubscriptions=z(d.activeSubscriptions,0),l.usageRecordCount=z(d.usageRecordCount,0),d.byStatus&&typeof d.byStatus=="object")for(const t of Object.keys(l.byStatus))l.byStatus[t]=z(d.byStatus[t],0);if(d.byPlan&&typeof d.byPlan=="object")for(const t of Object.keys(l.byPlan))l.byPlan[t]=z(d.byPlan[t],0);if(d.totalUsage&&typeof d.totalUsage=="object")for(const t of Object.keys(l.totalUsage))l.totalUsage[t]=z(d.totalUsage[t],0);return l}function Xt(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(),d=String(e.getMonth()+1).padStart(2,"0");return`${l}-${d}`}const $t={__name:"Tenant",setup(e,{expose:l}){l();const d=ut(),{t}=dt(),D=S(!1),$=S(!1),x=S(!1),j=S(!1),Q=S(!1),M=S([]),K=S([]),P=S([]),R=S([]),O=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}}),Z=S("tenants"),A=S(""),I=S(""),E=S(!1),V=S(!1),G=S(!1),B=S(!1),T=H({name:"",slug:"",plan:"free",owner:""}),k=H({tenantId:"",plan:"pro",amount:null,duration:720*60*60*1e3}),F=S(""),q=H({tenantId:null,metric:"api_calls",period:""}),h=H({tenantId:null,metric:"api_calls",value:1,period:""}),N=S(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 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,Y,Ot]=await Promise.all([d.execute("tenant list --json",1e4).catch(()=>({output:""})),d.execute("tenant subscriptions --json",1e4).catch(()=>({output:""})),d.execute("tenant plans --json",8e3).catch(()=>({output:""})),d.execute("tenant metrics --json",8e3).catch(()=>({output:""})),d.execute("tenant stats --json",8e3).catch(()=>({output:""}))]);M.value=ft(r.output),K.value=pt(i.output),P.value=ct(f.output),R.value=mt(Y.output),O.value=yt(Ot.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:Y}=await d.execute(f.join(" "),1e4);if(/error|Error|失败/i.test(Y)&&!/"id"/.test(Y)){b.error(t("tenant.msg.createFailed")+": "+Y.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 d.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(),Z.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 d.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 d.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 d.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 d.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 d.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 Pt(){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 d.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:d,t,loading:D,creating:$,subscribing:x,checking:j,recording:Q,tenants:M,subscriptions:K,plans:P,metrics:R,stats:O,activeTab:Z,planFilter:A,statusFilter:I,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:It,recordUsage:Pt,resetCreateForm:lt,resetSubscribeForm:ot,resetRecordForm:rt,ensurePeriodDefault:at,ref:S,computed:X,onMounted:it,reactive:H,get ReloadOutlined(){return Qt},get PlusOutlined(){return Dt},get BankOutlined(){return Bt},get CreditCardOutlined(){return Et},get DashboardOutlined(){return Mt},get LineChartOutlined(){return jt},get ApiOutlined(){return Ut},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 Xt},get formatBytes(){return nt},get currentPeriod(){return gt},get PLAN_IDS(){return Kt},get TENANT_STATUSES(){return Vt},get KNOWN_METRICS(){return Wt}};return Object.defineProperty(st,"__isScriptSetup",{enumerable:!1,value:!0}),st}},te={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},ee={class:"page-title"},ae={class:"page-sub"},ne={style:{color:"var(--text-secondary)","font-size":"12px","margin-left":"8px"}},le={class:"filter-bar"},oe={style:{color:"var(--text-primary)","font-weight":"500"}},re={style:{color:"var(--text-secondary)","font-size":"11px","margin-top":"2px","font-family":"monospace"}},se={key:0,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"11px"}},ie={key:1,style:{color:"var(--text-muted)"}},ue={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},de={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},ce={style:{color:"var(--text-primary)","font-weight":"500"}},me={style:{color:"var(--text-secondary)","font-size":"11px","font-family":"monospace"}},fe={key:0,style:{color:"#722ed1","font-weight":"500"}},pe={key:1,style:{color:"var(--text-muted)"}},be={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},ye={key:5,style:{color:"var(--text-secondary)","font-size":"11px"}},ge={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},ve={class:"plan-fee"},_e={key:0},ke={class:"plan-fee-unit"},he={key:1,style:{color:"#722ed1"}},Se={class:"plan-section"},Ce={class:"plan-section-title"},Fe={class:"plan-quota-label"},qe={class:"plan-quota-value"},we={class:"plan-section"},xe={class:"plan-section-title"},Ae={style:{"margin-top":"12px","font-size":"12px",color:"var(--text-secondary)"}},Te={style:{"font-family":"monospace",color:"var(--text-primary)"}},Le={key:0},ze={style:{"font-family":"monospace"}},Re={key:1,style:{"margin-top":"8px"}};function Ie(e,l,d,t,D,$){const x=v("a-button"),j=v("a-menu-item"),Q=v("a-menu"),M=v("a-dropdown"),K=v("a-space"),P=v("a-statistic"),R=v("a-card"),O=v("a-col"),Z=v("a-row"),A=v("a-tag"),I=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 u(),p("div",null,[g("div",te,[g("div",null,[g("h2",ee,s(e.$t("tenant.title")),1),g("p",ae,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(Z,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:n(()=>[o(O,{xs:12,sm:8,lg:5},{default:n(()=>[o(R,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(P,{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(O,{xs:12,sm:8,lg:5},{default:n(()=>[o(R,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(P,{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(O,{xs:12,sm:8,lg:5},{default:n(()=>[o(R,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(P,{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(O,{xs:12,sm:8,lg:5},{default:n(()=>[o(R,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(P,{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(O,{xs:24,sm:8,lg:4},{default:n(()=>[o(R,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(P,{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?(u(),_(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(()=>[(u(!0),p(C,null,w(t.PLAN_IDS,a=>(u(),_(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",ne,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",le,[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}),(u(!0),p(C,null,w(t.PLAN_IDS,a=>(u(),_(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}),(u(!0),p(C,null,w(t.TENANT_STATUSES,a=>(u(),_(I,{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"?(u(),p(C,{key:0},[g("span",oe,s(c.name),1),g("div",re,s(c.slug),1)],64)):y("v-if",!0),a.key==="plan"?(u(),_(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"?(u(),_(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"?(u(),p(C,{key:3},[c.ownerId?(u(),p("span",se,s(c.ownerId),1)):(u(),p("span",ie,"—"))],64)):y("v-if",!0),a.key==="createdAt"?(u(),p("span",ue,s(t.formatTenantTime(c.createdAt)),1)):y("v-if",!0),a.key==="action"?(u(),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(()=>[(u(!0),p(C,null,w(t.PLAN_IDS,L=>(u(),_(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"?(u(),_(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"?(u(),_(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"?(u(),_(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",de,[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"?(u(),p(C,{key:0},[g("span",ce,s(t.tenantName(c.tenantId)),1),g("div",me,s(c.tenantId.slice(0,8)),1)],64)):y("v-if",!0),a.key==="plan"?(u(),_(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"?(u(),p(C,{key:2},[c.amount!=null?(u(),p("span",fe,"¥"+s(c.amount),1)):(u(),p("span",pe,"—"))],64)):y("v-if",!0),a.key==="status"?(u(),_(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"?(u(),p("span",be,s(t.formatTenantTime(c.startedAt)),1)):y("v-if",!0),a.key==="expiresAt"?(u(),p("span",ye,s(t.formatTenantTime(c.expiresAt)),1)):y("v-if",!0),a.key==="action"?(u(),p(C,{key:6},[c.status==="active"?(u(),_(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",ge,[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(Z,{gutter:[16,16]},{default:n(()=>[(u(!0),p(C,null,w(t.plans,a=>(u(),_(O,{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",ve,[a.monthlyFee!=null?(u(),p("span",_e,[m("¥"+s(a.monthlyFee)+" ",1),g("span",ke,s(e.$t("tenant.planCard.monthlySuffix")),1)])):(u(),p("span",he,s(e.$t("tenant.planCard.contactSales")),1))]),g("div",Se,[g("div",Ce,s(e.$t("tenant.planCard.quotas")),1),(u(!0),p(C,null,w(t.metrics,c=>(u(),p("div",{key:c.id,class:"plan-quota-row"},[g("span",Fe,s(c.name),1),g("span",qe,s(t.formatQuota(a.quotas?.[c.id],c.id)),1)]))),128))]),g("div",we,[g("div",xe,s(e.$t("tenant.planCard.features")),1),(u(!0),p(C,null,w(a.features,c=>(u(),_(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(()=>[(u(!0),p(C,null,w(t.PLAN_IDS,a=>(u(),_(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(()=>[(u(!0),p(C,null,w(t.PLAN_IDS,a=>(u(),_(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(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(()=>[(u(!0),p(C,null,w(t.tenants,a=>(u(),_(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(()=>[(u(!0),p(C,null,w(t.KNOWN_METRICS,a=>(u(),_(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?(u(),_(R,{key:0,size:"small",style:{background:"var(--bg-base)","margin-top":"8px"}},{default:n(()=>[o(P,{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",Ae,[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",Te,s(t.formatMetricValue(t.quotaResult.used,t.quotaResult.metric)),1)]),t.quotaResult.unlimited?y("v-if",!0):(u(),p("div",Le,[m(s(e.$t("tenant.quota_modal.limitLine"))+" ",1),g("span",ze,s(t.formatMetricValue(t.quotaResult.limit,t.quotaResult.metric)),1)])),!t.quotaResult.unlimited&&t.quotaResult.limit>0?(u(),p("div",Re,[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(()=>[(u(!0),p(C,null,w(t.tenants,a=>(u(),_(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(()=>[(u(!0),p(C,null,w(t.KNOWN_METRICS,a=>(u(),_(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 Ue=Nt($t,[["render",Ie],["__scopeId","data-v-c93a3192"],["__file","/tmp/cc-web-panel-EZK4no/repo/packages/web-panel/src/views/Tenant.vue"]]);export{Ue as default};
@@ -0,0 +1,3 @@
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 K,_ as ge,d as V,e as N}from"./index-Ci3y1ZAv.js";import{I as M,J as k,U as g,Q as D,S as te,K as P,V as O,c as C,F as ae,Z as ne,R as A,o as oe,f as re,w as F,n as L,b as W,r as _,P as x,_ as xe,a2 as Se,a3 as be,a4 as ke}from"./vendor-Bn1JzzAn.js";import{R as Ce,b as Ae,at as je}from"./icons-DG5UD-6K.js";const j=new Map,E=new Map,X=new Set,Z=new Set;let le=!1;function Ee(w){le||(le=!0,w.onMessage(o=>{if(!(!o||typeof o.type!="string")){if(o.type==="terminal.stdout"){const{sessionId:s,projectId:t,data:c,seq:u}=o.payload||{};if(!s)return;let f;try{const v=atob(c||""),a=new Uint8Array(v.length);for(let n=0;n<v.length;n++)a[n]=v.charCodeAt(n);f=new TextDecoder("utf-8").decode(a)}catch{f=""}const i={sessionId:s,projectId:t,data:f,seq:u};j.get(s)?.forEach(v=>v(i)),X.forEach(v=>v(i))}else if(o.type==="terminal.exit"){const{sessionId:s,projectId:t,exitCode:c,signal:u}=o.payload||{};if(!s)return;const f={sessionId:s,projectId:t,exitCode:c,signal:u};E.get(s)?.forEach(i=>i(f)),Z.forEach(i=>i(f))}}}))}function se(w){const o=new TextEncoder().encode(w);let s="";for(let t=0;t<o.length;t++)s+=String.fromCharCode(o[t]);return btoa(s)}function ie(w){const o=atob(w||""),s=new Uint8Array(o.length);for(let t=0;t<o.length;t++)s[t]=o.charCodeAt(t);return new TextDecoder("utf-8").decode(s)}function ce(){const w=K();Ee(w);async function o(a={}){const n=await w.sendRaw({type:"terminal.create",payload:{projectId:a.projectId,shell:a.shell,cwd:a.cwd,env:a.env,cols:a.cols,rows:a.rows}});if(n.ok===!1)throw new Error(n.error||"terminal_create_failed");return n.result??n}async function s(a){const n=await w.sendRaw({type:"terminal.list",payload:{projectId:a}});if(n.ok===!1)throw new Error(n.error||"terminal_list_failed");const r=n.result??n;return Array.isArray(r.sessions)?r.sessions:[]}async function t(a,n,r){const d=await w.sendRaw({type:"terminal.stdin",payload:{projectId:a,sessionId:n,data:se(String(r))}});if(d.ok===!1)throw new Error(d.error||"terminal_stdin_failed");return d.result??d}async function c(a,n,r,d){const S=await w.sendRaw({type:"terminal.resize",payload:{projectId:a,sessionId:n,cols:r,rows:d}});if(S.ok===!1)throw new Error(S.error||"terminal_resize_failed");return S.result??S}async function u(a,n){const r=await w.sendRaw({type:"terminal.close",payload:{projectId:a,sessionId:n}});if(r.ok===!1)throw new Error(r.error||"terminal_close_failed");return r.result??r}async function f(a,n,r=0){const d=await w.sendRaw({type:"terminal.history",payload:{projectId:a,sessionId:n,fromSeq:r}});if(d.ok===!1)throw new Error(d.error||"terminal_history_failed");const S=d.result??d;return{truncated:!!S.truncated,chunks:(S.chunks||[]).map(R=>({seq:R.seq,data:ie(R.data)}))}}function i(a,n){return a?(j.has(a)||j.set(a,new Set),j.get(a).add(n),()=>{j.get(a)?.delete(n),j.get(a)?.size===0&&j.delete(a)}):(X.add(n),()=>X.delete(n))}function v(a,n){return a?(E.has(a)||E.set(a,new Set),E.get(a).add(n),()=>{E.get(a)?.delete(n),E.get(a)?.size===0&&E.delete(a)}):(Z.add(n),()=>Z.delete(n))}return{create:o,list:s,stdin:t,resize:c,close:u,history:f,onStdout:i,onExit:v,_internal:{stdoutSubs:j,exitSubs:E,toBase64Utf8:se,fromBase64Utf8:ie}}}const Ie={__name:"Terminal",setup(w,{expose:o}){o();const s=ce(),t=K(),c=_([]),u=_(null),f=_([]),i=_(null),v=_(!1),a=_("pwsh"),n=_(!1),r=_(!1),d=_(""),S=_(""),R=_([]),de=[{value:"pwsh",label:"PowerShell"},{value:"cmd",label:"CMD"},{value:"bash",label:"Bash"},{value:"wsl",label:"WSL"}],J=W(()=>c.value.find(e=>e.id===u.value)),ue=W(()=>f.value.map(e=>({value:e.id,label:`${e.name||e.id} (${e.id.slice(0,8)})`})));async function Q(){v.value=!0;try{const e=await t.sendRaw({type:"project.list",limit:500});if(e?.ok===!1)throw new Error(e.error||"project_list_failed");const l=e?.result??e,h=Array.isArray(l?.projects)?l.projects:Array.isArray(l)?l:[];f.value=h.filter(m=>m?.id&&typeof(m.root_path??m.rootPath)=="string"&&String(m.root_path??m.rootPath).trim()!==""),f.value.some(m=>m.id===i.value)||(i.value=null)}catch(e){f.value=[],i.value=null,d.value=e?.message||String(e)}finally{v.value=!1}}function fe(e){return e?e.slice(0,8):""}let I=null,T=null;async function Y(){if(I)return{xtermMod:I,fitAddonMod:T};try{I=await N(()=>import("./xterm-BZcWGsqw.js").then(e=>e.x),__vite__mapDeps([0,1,2]),import.meta.url),T=await N(()=>import("./addon-fit-CK6X9sAG.js").then(e=>e.a),__vite__mapDeps([3,1,2]),import.meta.url),await N(()=>Promise.resolve({}),__vite__mapDeps([4]),import.meta.url)}catch(e){throw S.value="xterm 资源加载失败:"+(e?.message||"未知错误"),e}return{xtermMod:I,fitAddonMod:T}}async function B(e){await L();const{xtermMod:l,fitAddonMod:h}=await Y(),m=R.value.find(p=>p?.dataset?.sessionId===e.id);if(!m)return;const y=new l.Terminal({cursorBlink:!0,fontFamily:'Consolas, "Courier New", monospace',fontSize:13,theme:{background:"#1e1e1e",foreground:"#d4d4d4"},convertEol:!1}),z=new h.FitAddon;y.loadAddon(z),y.open(m);try{z.fit()}catch{}e.xterm=y,e.fitAddon=z;const he=y.onData(p=>{s.stdin(e.projectId,e.id,p).catch(b=>{String(b?.message||"").includes("dangerous_keyword_blocked")?V.warning("该命令被桌面端拦截(高危关键字)"):V.error("stdin 失败: "+(b?.message||b))})}),ye=s.onStdout(e.id,({data:p,seq:b})=>{e.lastSeq=b,y.write(p)}),pe=s.onExit(e.id,({exitCode:p,signal:b})=>{e.alive=!1,e.exitCode=p,e.signal=b,y.writeln(`\r
3
+ \x1B[33m[session exited, code=${p}, signal=${b??"-"}]\x1B[0m`)});e.offs=()=>{try{he.dispose?.()}catch{}ye(),pe()};try{const{chunks:p,truncated:b}=await s.history(e.projectId,e.id,0);b&&y.writeln("\x1B[2m[history truncated — earlier output was evicted]\x1B[0m");for(const ee of p)y.write(ee.data),e.lastSeq=ee.seq}catch(p){y.writeln(`\x1B[31m[history fetch failed: ${p?.message||p}]\x1B[0m`)}const $=new ResizeObserver(()=>{try{z.fit(),s.resize(e.projectId,e.id,y.cols,y.rows).catch(()=>{})}catch{}});$.observe(m);const _e=e.offs;e.offs=()=>{try{$.disconnect()}catch{}_e()}}async function ve(){if(!i.value){d.value="请先选择一个数据库项目";return}n.value=!0,d.value="";try{const e=await s.create({projectId:i.value,shell:a.value,cols:80,rows:24}),l={id:e.sessionId,projectId:e.projectId,shell:e.shell,cwd:e.cwd,alive:!0,lastSeq:0,exitCode:null,xterm:null,fitAddon:null,offs:()=>{}};c.value.push(l),u.value=l.id,await B(l)}catch(e){d.value=e?.message||String(e)}finally{n.value=!1}}async function me(e){try{const l=c.value.find(h=>h.id===e);await s.close(l?.projectId,e)}catch(l){d.value=l?.message||String(l)}setTimeout(()=>q(e),500)}function q(e){const l=c.value.findIndex(m=>m.id===e);if(l===-1)return;const h=c.value[l];try{h.offs?.()}catch{}try{h.xterm?.dispose?.()}catch{}c.value.splice(l,1),u.value===e&&(u.value=c.value[0]?.id||null)}function we(e){u.value=e,L(()=>{const l=c.value.find(h=>h.id===e);try{l?.fitAddon?.fit()}catch{}})}async function U(){if(i.value){r.value=!0,d.value="";try{const e=await s.list(i.value);for(const l of e){if(l.projectId!==i.value)continue;const h=c.value.find(y=>y.id===l.id);if(h){h.alive=l.alive,h.lastSeq=l.lastSeq;continue}const m={id:l.id,projectId:l.projectId,shell:l.shell,cwd:l.cwd,alive:l.alive,lastSeq:l.lastSeq,exitCode:null,xterm:null,fitAddon:null,offs:()=>{}};c.value.push(m),await B(m)}!u.value&&c.value.length>0&&(u.value=c.value[0].id)}catch(e){d.value=e?.message||String(e)}finally{r.value=!1}}}async function G(){await Q(),i.value&&await U()}oe(async()=>{await G()}),re(()=>{for(const e of c.value){try{e.offs?.()}catch{}try{e.xterm?.dispose?.()}catch{}}}),F(u,()=>{L(()=>{const e=J.value;try{e?.fitAddon?.fit()}catch{}})}),F(i,async()=>{for(const e of[...c.value])q(e.id);u.value=null,i.value&&await U()});const H={term:s,ws:t,sessions:c,activeId:u,projects:f,selectedProjectId:i,loadingProjects:v,newShell:a,creating:n,loadingList:r,error:d,warning:S,xtermContainers:R,shellOptions:de,active:J,projectOptions:ue,loadProjects:Q,shortId:fe,get xtermMod(){return I},set xtermMod(e){I=e},get fitAddonMod(){return T},set fitAddonMod(e){T=e},loadXterm:Y,mountXterm:B,onCreate:ve,onClose:me,removeSession:q,activate:we,refreshList:U,refreshAll:G,ref:_,computed:W,onMounted:oe,onBeforeUnmount:re,nextTick:L,watch:F,get message(){return V},get PlusOutlined(){return je},get CloseOutlined(){return Ae},get ReloadOutlined(){return Ce},get useTerminal(){return ce},get useWsStore(){return K}};return Object.defineProperty(H,"__isScriptSetup",{enumerable:!1,value:!0}),H}},Pe={class:"terminal-page"},Oe={class:"terminal-header"},Re={class:"page-sub"},Te={class:"terminal-body"},Me={class:"session-tabs"},ze=["onClick"],De={class:"session-shell"},Le={class:"session-id"},Be={key:0,class:"session-empty"},qe={class:"xterm-host"},Ue=["data-session-id"],Ve={key:0,class:"xterm-placeholder"},Ne={key:1,class:"terminal-footer"},Fe={key:0,class:"footer-exit"};function We(w,o,s,t,c,u){const f=M("a-tag"),i=M("a-select"),v=M("a-button"),a=M("a-space"),n=M("a-alert");return x(),k("div",Pe,[g("div",Oe,[g("div",null,[o[4]||(o[4]=g("h2",{class:"page-title"},"远程终端",-1)),g("p",Re,[o[3]||(o[3]=D(" 桌面端托管的 PTY 会话;Android 端可远程操控同一通道 ",-1)),t.warning?(x(),te(f,{key:0,color:"orange",style:{"margin-left":"8px"}},{default:P(()=>[D(A(t.warning),1)]),_:1})):O("v-if",!0)])]),C(a,null,{default:P(()=>[C(i,{value:t.selectedProjectId,"onUpdate:value":o[0]||(o[0]=r=>t.selectedProjectId=r),style:{width:"220px"},size:"small","show-search":"",loading:t.loadingProjects,options:t.projectOptions,placeholder:"选择数据库项目","option-filter-prop":"label"},null,8,["value","loading","options"]),C(i,{value:t.newShell,"onUpdate:value":o[1]||(o[1]=r=>t.newShell=r),style:{width:"130px"},size:"small",options:t.shellOptions},null,8,["value"]),C(v,{type:"primary",size:"small",loading:t.creating,disabled:!t.selectedProjectId,onClick:t.onCreate},{icon:P(()=>[C(t.PlusOutlined)]),default:P(()=>[o[5]||(o[5]=D(" 新会话 ",-1))]),_:1},8,["loading","disabled"]),C(v,{size:"small",loading:t.loadingList||t.loadingProjects,onClick:t.refreshAll},{icon:P(()=>[C(t.ReloadOutlined)]),default:P(()=>[o[6]||(o[6]=D(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),t.error?(x(),te(n,{key:0,message:t.error,type:"error","show-icon":"",closable:"",style:{"margin-bottom":"12px"},onClose:o[2]||(o[2]=r=>t.error="")},null,8,["message"])):O("v-if",!0),g("div",Te,[g("div",Me,[(x(!0),k(ae,null,ne(t.sessions,r=>(x(),k("div",{key:r.id,class:xe(["session-tab",{active:r.id===t.activeId,dead:!r.alive}]),onClick:d=>t.activate(r.id)},[g("span",De,A(r.shell),1),g("span",Le,A(t.shortId(r.id)),1),C(t.CloseOutlined,{class:"session-close",onClick:Se(d=>t.onClose(r.id),["stop"])},null,8,["onClick"])],10,ze))),128)),t.sessions.length===0?(x(),k("div",Be,' 点击 "新会话" 创建第一个终端 ')):O("v-if",!0)]),g("div",qe,[(x(!0),k(ae,null,ne(t.sessions,r=>be((x(),k("div",{key:r.id,ref_for:!0,ref:"xtermContainers","data-session-id":r.id,class:"xterm-container"},null,8,Ue)),[[ke,r.id===t.activeId]])),128)),t.sessions.length===0?(x(),k("div",Ve,[...o[7]||(o[7]=[g("span",null,"无活跃会话",-1)])])):O("v-if",!0)])]),t.active?(x(),k("div",Ne,[g("span",null,A(t.active.shell)+" · "+A(t.active.cwd||"(默认 cwd)")+" · "+A(t.active.projectId)+" · seq "+A(t.active.lastSeq),1),t.active.alive?O("v-if",!0):(x(),k("span",Fe,"已退出 (code="+A(t.active.exitCode??"-")+")",1))])):O("v-if",!0)])}const Je=ge(Ie,[["render",We],["__scopeId","data-v-65366a29"],["__file","/tmp/cc-web-panel-EZK4no/repo/packages/web-panel/src/views/Terminal.vue"]]);export{Je 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-Bn1JzzAn.js";import{_ as b}from"./index-Dyngbd29.js";import{aE as O,aI as C}from"./icons-DG5UD-6K.js";const D={__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 C},get EnvironmentOutlined(){return O}};return Object.defineProperty(f,"__isScriptSetup",{enumerable:!1,value:!0}),f}},E={class:"timeline-event"},V={class:"dot"},w={class:"card"},B={class:"head"},R={class:"time"},j={class:"primary"},A={key:0},I={key:1},H={key:2},M={key:0,class:"trip-no"},P={key:1,class:"extra"};function U(v,_,r,e,p,m){const s=S("a-tag");return n(),i("div",E,[l("div",V,[e.isTravel?(n(),h(e.CarOutlined,{key:0})):(n(),h(e.EnvironmentOutlined,{key:1}))]),l("div",w,[l("div",B,[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",I,"📍 "+o(e.placeName),1)):(n(),i("span",H,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(D,[["render",U],["__scopeId","data-v-18400280"],["__file","/tmp/cc-web-panel-UAH1Xi/repo/packages/web-panel/src/components/pdh/renderers/TimelineRenderer.vue"]]);export{J 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-Bn1JzzAn.js";import{_ as b}from"./index-Ci3y1ZAv.js";import{aE as O,aI as C}from"./icons-DG5UD-6K.js";const D={__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 C},get EnvironmentOutlined(){return O}};return Object.defineProperty(f,"__isScriptSetup",{enumerable:!1,value:!0}),f}},E={class:"timeline-event"},V={class:"dot"},w={class:"card"},B={class:"head"},R={class:"time"},j={class:"primary"},I={key:0},A={key:1},K={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",E,[l("div",V,[e.isTravel?(n(),h(e.CarOutlined,{key:0})):(n(),h(e.EnvironmentOutlined,{key:1}))]),l("div",w,[l("div",B,[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",I,o(e.route),1)):e.placeName?(n(),i("span",A,"📍 "+o(e.placeName),1)):(n(),i("span",K,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(D,[["render",W],["__scopeId","data-v-18400280"],["__file","/tmp/cc-web-panel-EZK4no/repo/packages/web-panel/src/components/pdh/renderers/TimelineRenderer.vue"]]);export{J as default};
@@ -1 +1 @@
1
- import{I as y,J as p,U as m,R as c,c as a,K as r,V as k,S as U,o as X,b as H,r as T,P as f,Q as h,F as B,Z as K}from"./vendor-Bn1JzzAn.js";import{Y as _t,t as N,_ as yt,b as q,u as $,d as C}from"./index-Dyngbd29.js";import{aR as gt,D as vt,a1 as xt,N as ht,a9 as Tt,R as St}from"./icons-DG5UD-6K.js";const Ct=Object.freeze(["today","week","month","all"]),st=Object.freeze(["planning","active","suspended","archived"]),rt=Object.freeze(["pending","recorded","billed","rejected","refunded"]);function d(e,n=0){return typeof e=="number"&&Number.isFinite(e)?e:n}function D(e){if(!e)return{noDb:!1,error:""};const n=_t(e),o=/Database not available/i.test(n);return{noDb:o,error:o?"Database not available":""}}const W={totalCalls:0,totalInputTokens:0,totalOutputTokens:0,totalTokens:0,totalCostUsd:0,avgResponseTimeMs:0};function tt(e){const n={...W};return!e||typeof e!="object"||Array.isArray(e)||(n.totalCalls=d(e.total_calls??e.totalCalls,0),n.totalInputTokens=d(e.total_input_tokens??e.totalInputTokens,0),n.totalOutputTokens=d(e.total_output_tokens??e.totalOutputTokens,0),n.totalTokens=d(e.total_tokens??e.totalTokens,0),n.totalCostUsd=d(e.total_cost_usd??e.totalCostUsd,0),n.avgResponseTimeMs=d(e.avg_response_time_ms??e.avgResponseTimeMs,0)),n}function Y(e){const n=N(e);return!n||typeof n!="object"||Array.isArray(n)?{stats:{...W},today:{...W}}:{stats:tt(n.stats),today:tt(n.today)}}function Ot(e,n=0){if(!e||typeof e!="object")return null;const o=e.provider||"",t=e.model||"";return!o&&!t?null:{key:`${o}/${t}/${n}`,provider:String(o),model:String(t),calls:d(e.calls,0),inputTokens:d(e.input_tokens??e.inputTokens,0),outputTokens:d(e.output_tokens??e.outputTokens,0),totalTokens:d(e.total_tokens??e.totalTokens,0),costUsd:d(e.cost_usd??e.costUsd,0),_idx:n}}function et(e){const n=N(e);return Array.isArray(n)?n.map(Ot).filter(Boolean):[]}function Bt(e,n=0){if(!e||typeof e!="object")return null;const o=e.id||"";return o?{key:o,id:o,provider:String(e.provider||""),model:String(e.model||""),inputTokens:d(e.input_tokens??e.inputTokens,0),outputTokens:d(e.output_tokens??e.outputTokens,0),totalTokens:d(e.total_tokens??e.totalTokens,0),costUsd:d(e.cost_usd??e.costUsd,0),responseTimeMs:d(e.response_time_ms??e.responseTimeMs,0),endpoint:String(e.endpoint||""),createdAt:e.created_at??e.createdAt??"",_idx:n}:null}function ot(e){const n=N(e);return Array.isArray(n)?n.map(Bt).filter(Boolean):[]}const Rt={totalEntries:0,totalHits:0,totalTokensSaved:0,expiredEntries:0};function at(e){const n={...Rt},o=N(e);return!o||typeof o!="object"||Array.isArray(o)||(n.totalEntries=d(o.total_entries??o.totalEntries,0),n.totalHits=d(o.total_hits??o.totalHits,0),n.totalTokensSaved=d(o.total_tokens_saved??o.totalTokensSaved,0),n.expiredEntries=d(o.expired_entries??o.expiredEntries,0)),n}const Et={totalBudgetsV2:0,totalRecordsV2:0,maxActiveBudgetsPerOwner:0,maxPendingRecordsPerBudget:0,budgetIdleMs:0,recordStuckMs:0,budgetsByStatus:{},recordsByStatus:{}};function nt(e){const n=JSON.parse(JSON.stringify(Et));for(const t of st)n.budgetsByStatus[t]=0;for(const t of rt)n.recordsByStatus[t]=0;const o=N(e);if(!o||typeof o!="object"||Array.isArray(o))return n;if(n.totalBudgetsV2=d(o.totalBudgetsV2,0),n.totalRecordsV2=d(o.totalRecordsV2,0),n.maxActiveBudgetsPerOwner=d(o.maxActiveBudgetsPerOwner,0),n.maxPendingRecordsPerBudget=d(o.maxPendingRecordsPerBudget,0),n.budgetIdleMs=d(o.budgetIdleMs,0),n.recordStuckMs=d(o.recordStuckMs,0),o.budgetsByStatus&&typeof o.budgetsByStatus=="object")for(const[t,v]of Object.entries(o.budgetsByStatus))typeof v=="number"&&Number.isFinite(v)&&(n.budgetsByStatus[t]=v);if(o.recordsByStatus&&typeof o.recordsByStatus=="object")for(const[t,v]of Object.entries(o.recordsByStatus))typeof v=="number"&&Number.isFinite(v)&&(n.recordsByStatus[t]=v);return n}function zt(e){if(e==null||e==="")return"—";const n=String(e),o=n.includes(" ")&&!n.includes("T")?n.replace(" ","T")+"Z":n,t=typeof e=="number"?new Date(e):new Date(o);return isNaN(t.getTime())?n:t.toLocaleString("zh-CN",{hour12:!1})}function wt(e){return typeof e!="number"||!Number.isFinite(e)?"$0":"$"+(Math.abs(e)<1?e.toFixed(4):e.toFixed(2))}const At={__name:"Tokens",setup(e,{expose:n}){n();const{t:o}=q(),t=$(),v=T(!1),I=T("all"),O=T({stats:{totalCalls:0,totalInputTokens:0,totalOutputTokens:0,totalTokens:0,totalCostUsd:0,avgResponseTimeMs:0},today:{totalCalls:0,totalInputTokens:0,totalOutputTokens:0,totalTokens:0,totalCostUsd:0,avgResponseTimeMs:0}}),R=T([]),V=T([]),M=T({totalEntries:0,totalHits:0,totalTokensSaved:0,expiredEntries:0}),P=T({totalBudgetsV2:0,totalRecordsV2:0,maxActiveBudgetsPerOwner:0,maxPendingRecordsPerBudget:0,budgetIdleMs:0,recordStuckMs:0,budgetsByStatus:{},recordsByStatus:{}}),b=T({noDb:!1,error:""}),x=T("breakdown"),g=H(()=>[{title:o("tokens.breakdownColumns.provider"),key:"provider",width:"130px"},{title:o("tokens.breakdownColumns.model"),key:"model"},{title:o("tokens.breakdownColumns.calls"),key:"calls",width:"90px"},{title:o("tokens.breakdownColumns.totalTokens"),key:"totalTokens",width:"180px"},{title:o("tokens.breakdownColumns.costUsd"),key:"costUsd",width:"180px"},{title:o("tokens.breakdownColumns.avgCost"),key:"avgCost",width:"110px"}]),z=H(()=>[{title:o("tokens.recentColumns.createdAt"),key:"createdAt",width:"160px"},{title:o("tokens.recentColumns.provider"),key:"provider",width:"130px"},{title:o("tokens.recentColumns.model"),key:"model",width:"180px"},{title:o("tokens.recentColumns.tokens"),key:"tokens",width:"160px"},{title:o("tokens.recentColumns.costUsd"),key:"costUsd",width:"110px"},{title:o("tokens.recentColumns.responseTimeMs"),key:"responseTimeMs",width:"100px"},{title:o("tokens.recentColumns.endpoint"),key:"endpoint"}]),S=H(()=>R.value.reduce((s,u)=>s+u.costUsd,0));function w(s){const u=`tokens.period.${s}`,_=o(u);return _===u?s:_}function j(s){const u=["blue","green","purple","orange","cyan","magenta","gold","volcano"];let _=0;for(let E=0;E<(s||"").length;E++)_=_*31+s.charCodeAt(E)>>>0;return u[_%u.length]}function A(s){return s<=500?"#52c41a":s<=1500?"#1677ff":s<=3e3?"#faad14":"#ff4d4f"}function F(s){return s<=500?"green":s<=1500?"blue":s<=3e3?"gold":"red"}function G(s){return typeof s!="number"||!Number.isFinite(s)?"0":s.toLocaleString("en-US")}function l(s){return!S.value||s<=0?0:Math.min(100,Math.round(s/S.value*100))}function i(s,u){return u?Math.round(s/u*100):0}function lt(s){const u=`tokens.budgetStatus.${s}`,_=o(u);return _===u?s:_}function ct(s){return{planning:"default",active:"green",suspended:"orange",archived:"default"}[s]||"default"}function it(s){return{planning:"#888",active:"#52c41a",suspended:"#faad14",archived:"#666"}[s]||"#888"}function dt(s){const u=`tokens.recordStatus.${s}`,_=o(u);return _===u?s:_}function ut(s){return{pending:"default",recorded:"blue",billed:"green",rejected:"red",refunded:"orange"}[s]||"default"}function ft(s){return{pending:"#888",recorded:"#1677ff",billed:"#52c41a",rejected:"#ff4d4f",refunded:"#faad14"}[s]||"#888"}async function L(){v.value=!0,b.value={noDb:!1,error:""};try{const[s,u,_,E,bt]=await Promise.all([t.execute(`tokens show --period ${I.value} --json`,8e3).catch(()=>({output:""})),t.execute("tokens breakdown --json",8e3).catch(()=>({output:""})),t.execute("tokens recent -n 100 --json",1e4).catch(()=>({output:""})),t.execute("tokens cache --json",6e3).catch(()=>({output:""})),t.execute("tokens stats-v2",6e3).catch(()=>({output:""}))]),Q=[s,u,_,E].map(J=>D(J.output)).find(J=>J.noDb);Q&&(b.value=Q),O.value=Y(s.output),R.value=et(u.output),V.value=ot(_.output),M.value=at(E.output),P.value=nt(bt.output)}catch(s){C.error(o("tokens.messages.loadFailed",{err:s?.message||s}))}finally{v.value=!1}}async function kt(){try{const{output:s}=await t.execute(`tokens show --period ${I.value} --json`,8e3),u=D(s);if(u.noDb){b.value=u;return}O.value=Y(s)}catch(s){C.error(o("tokens.messages.loadShowFailed",{err:s?.message||s}))}}async function mt(){try{const{output:s}=await t.execute("tokens cache --cleanup",8e3);if(D(s).noDb){C.error(o("tokens.messages.needInit"));return}C.success(o("tokens.messages.cleanupOk")),await L()}catch(s){C.error(o("tokens.messages.cleanupFailed",{err:s?.message||s}))}}async function pt(){try{const{output:s}=await t.execute("tokens cache --clear",8e3);if(D(s).noDb){C.error(o("tokens.messages.needInit"));return}C.success(o("tokens.messages.clearOk")),await L()}catch(s){C.error(o("tokens.messages.clearFailed",{err:s?.message||s}))}}X(L);const Z={t:o,ws:t,loading:v,period:I,show:O,breakdown:R,recent:V,cache:M,statsV2:P,errorState:b,activeTab:x,breakdownColumns:g,recentColumns:z,totalCost:S,periodLabel:w,providerColor:j,respColor:A,respTagColor:F,formatNumber:G,costPct:l,pctOfTotal:i,budgetStatusLabel:lt,budgetStatusColor:ct,budgetBarColor:it,recordStatusLabel:dt,recordStatusColor:ut,recordBarColor:ft,loadAll:L,loadShow:kt,cleanupExpired:mt,clearAllCache:pt,ref:T,computed:H,onMounted:X,get useI18n(){return q},get ReloadOutlined(){return St},get ApiOutlined(){return Tt},get NumberOutlined(){return ht},get ClockCircleOutlined(){return xt},get DatabaseOutlined(){return vt},get DeleteOutlined(){return gt},get message(){return C},get useWsStore(){return $},get parseShowResult(){return Y},get parseBreakdown(){return et},get parseRecent(){return ot},get parseCacheStats(){return at},get parseStatsV2(){return nt},get detectTokensError(){return D},get formatTokensTime(){return zt},get formatCost(){return wt},get PERIOD_OPTIONS(){return Ct},get BUDGET_MATURITIES_V2(){return st},get USAGE_RECORD_LIFECYCLES_V2(){return rt}};return Object.defineProperty(Z,"__isScriptSetup",{enumerable:!1,value:!0}),Z}},Ut={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Dt={class:"page-title"},Nt={class:"page-sub"},It={style:{display:"flex","align-items":"center",gap:"12px","flex-wrap":"wrap"}},Vt={style:{color:"var(--text-secondary)","font-size":"12px"}},Mt={class:"stat-sub"},Pt={class:"stat-sub"},jt={class:"stat-sub"},Ft={class:"stat-sub"},Lt={key:1,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px"}},Ht={key:2,style:{color:"var(--text-secondary)"}},Gt={style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},Jt={style:{color:"var(--text-muted)","font-size":"11px","font-family":"monospace"}},Kt={style:{color:"#faad14","font-weight":"500","font-family":"monospace"}},Yt={key:5,style:{color:"var(--text-muted)","font-family":"monospace","font-size":"12px"}},Wt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},Zt={key:0,style:{color:"var(--text-secondary)","font-size":"11px","font-family":"monospace"}},Qt={key:2,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px"}},Xt={style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},qt={style:{color:"var(--text-muted)","font-size":"11px","font-family":"monospace"}},$t={key:4,style:{color:"#faad14","font-weight":"500","font-family":"monospace"}},te={key:0,style:{color:"var(--text-muted)","font-family":"monospace","font-size":"11px"}},ee={key:1,style:{color:"var(--text-muted)"}},oe={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},ae={style:{"font-size":"12px",color:"var(--text-secondary)",margin:"0 0 8px"}},ne={style:{"font-size":"12px",color:"var(--text-secondary)",margin:"0 0 8px"}};function se(e,n,o,t,v,I){const O=y("a-button"),R=y("a-space"),V=y("a-alert"),M=y("a-radio-button"),P=y("a-radio-group"),b=y("a-card"),x=y("a-statistic"),g=y("a-col"),z=y("a-row"),S=y("a-tag"),w=y("a-progress"),j=y("a-table"),A=y("a-tab-pane"),F=y("a-popconfirm"),G=y("a-tabs");return f(),p("div",null,[m("div",Ut,[m("div",null,[m("h2",Dt,c(t.t("tokens.title")),1),m("p",Nt,c(t.t("tokens.subtitle")),1)]),a(R,null,{default:r(()=>[a(O,{loading:t.loading,onClick:t.loadAll},{icon:r(()=>[a(t.ReloadOutlined)]),default:r(()=>[h(" "+c(t.t("tokens.refresh")),1)]),_:1},8,["loading"])]),_:1})]),k(" noDb banner "),t.errorState.noDb?(f(),U(V,{key:0,type:"info","show-icon":"",message:t.t("tokens.noDb.message"),description:t.t("tokens.noDb.description"),style:{"margin-bottom":"16px"}},null,8,["message","description"])):k("v-if",!0),k(" Period selector "),a(b,{size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"},"body-style":{padding:"10px 16px"}},{default:r(()=>[m("div",It,[m("span",Vt,c(t.t("tokens.periodLabel")),1),a(P,{value:t.period,"onUpdate:value":n[0]||(n[0]=l=>t.period=l),size:"small","button-style":"solid",onChange:t.loadShow},{default:r(()=>[(f(!0),p(B,null,K(t.PERIOD_OPTIONS,l=>(f(),U(M,{key:l,value:l},{default:r(()=>[h(c(t.periodLabel(l)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])])]),_:1}),k(" Stat cards "),a(z,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:r(()=>[a(g,{xs:12,sm:8,lg:5},{default:r(()=>[a(b,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:r(()=>[a(x,{title:t.t("tokens.stats.calls"),value:t.show.stats.totalCalls,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:r(()=>[a(t.ApiOutlined)]),_:1},8,["title","value"]),m("div",Mt,c(t.t("tokens.stats.callsToday",{count:t.show.today.totalCalls})),1)]),_:1})]),_:1}),a(g,{xs:12,sm:8,lg:5},{default:r(()=>[a(b,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:r(()=>[a(x,{title:t.t("tokens.stats.totalTokens"),value:t.show.stats.totalTokens,"value-style":{color:"#722ed1",fontSize:"20px"}},{prefix:r(()=>[a(t.NumberOutlined)]),_:1},8,["title","value"]),m("div",Pt,c(t.t("tokens.stats.tokensInOut",{inputs:t.formatNumber(t.show.stats.totalInputTokens),outputs:t.formatNumber(t.show.stats.totalOutputTokens)})),1)]),_:1})]),_:1}),a(g,{xs:12,sm:8,lg:5},{default:r(()=>[a(b,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:r(()=>[a(x,{title:t.t("tokens.stats.totalCost"),value:t.show.stats.totalCostUsd,precision:t.show.stats.totalCostUsd<1?4:2,prefix:"$","value-style":{color:"#faad14",fontSize:"20px"}},null,8,["title","value","precision"]),m("div",jt,c(t.t("tokens.stats.costToday",{amount:t.formatCost(t.show.today.totalCostUsd)})),1)]),_:1})]),_:1}),a(g,{xs:12,sm:8,lg:5},{default:r(()=>[a(b,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:r(()=>[a(x,{title:t.t("tokens.stats.avgResponse"),value:t.show.stats.avgResponseTimeMs,suffix:"ms",precision:0,"value-style":{color:t.respColor(t.show.stats.avgResponseTimeMs),fontSize:"20px"}},{prefix:r(()=>[a(t.ClockCircleOutlined)]),_:1},8,["title","value","value-style"])]),_:1})]),_:1}),a(g,{xs:24,sm:8,lg:4},{default:r(()=>[a(b,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:r(()=>[a(x,{title:t.t("tokens.stats.cacheHits"),value:t.cache.totalHits,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:r(()=>[a(t.DatabaseOutlined)]),_:1},8,["title","value"]),m("div",Ft,c(t.t("tokens.stats.cacheTokensSaved",{count:t.formatNumber(t.cache.totalTokensSaved)})),1)]),_:1})]),_:1})]),_:1}),k(" Tabs "),a(G,{activeKey:t.activeTab,"onUpdate:activeKey":n[1]||(n[1]=l=>t.activeTab=l),class:"tokens-tabs"},{default:r(()=>[k(" ── Breakdown tab ────────────────────────────────────── "),a(A,{key:"breakdown",tab:t.t("tokens.tabs.breakdown")},{default:r(()=>[a(j,{columns:t.breakdownColumns,"data-source":t.breakdown,pagination:{pageSize:20,showTotal:l=>t.t("tokens.totals.models",{count:l})},size:"small",loading:t.loading,style:{background:"var(--bg-card)"}},{bodyCell:r(({column:l,record:i})=>[l.key==="provider"?(f(),U(S,{key:0,color:t.providerColor(i.provider),style:{"font-family":"monospace"}},{default:r(()=>[h(c(i.provider),1)]),_:2},1032,["color"])):k("v-if",!0),l.key==="model"?(f(),p("span",Lt,c(i.model),1)):k("v-if",!0),l.key==="calls"?(f(),p("span",Ht,c(t.formatNumber(i.calls)),1)):k("v-if",!0),l.key==="totalTokens"?(f(),p(B,{key:3},[m("span",Gt,c(t.formatNumber(i.totalTokens)),1),m("div",Jt,c(t.t("tokens.breakdownDetails.tokensInOut",{inputs:t.formatNumber(i.inputTokens),outputs:t.formatNumber(i.outputTokens)})),1)],64)):k("v-if",!0),l.key==="costUsd"?(f(),p(B,{key:4},[m("span",Kt,c(t.formatCost(i.costUsd)),1),a(w,{percent:t.costPct(i.costUsd),"show-info":!1,"stroke-color":"#faad14",size:"small",style:{"margin-top":"2px"}},null,8,["percent"])],64)):k("v-if",!0),l.key==="avgCost"?(f(),p("span",Yt,c(i.calls>0?t.formatCost(i.costUsd/i.calls):"—"),1)):k("v-if",!0)]),emptyText:r(()=>[m("div",Wt,[a(t.NumberOutlined,{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),h(" "+c(t.t("tokens.empty.breakdown")),1)])]),_:1},8,["columns","data-source","pagination","loading"])]),_:1},8,["tab"]),k(" ── Recent tab ───────────────────────────────────────── "),a(A,{key:"recent",tab:t.t("tokens.tabs.recent")},{default:r(()=>[a(j,{columns:t.recentColumns,"data-source":t.recent,pagination:{pageSize:20,showTotal:l=>t.t("tokens.totals.rows",{count:l})},size:"small",loading:t.loading,style:{background:"var(--bg-card)"}},{bodyCell:r(({column:l,record:i})=>[l.key==="createdAt"?(f(),p("span",Zt,c(t.formatTokensTime(i.createdAt)),1)):k("v-if",!0),l.key==="provider"?(f(),U(S,{key:1,color:t.providerColor(i.provider),style:{"font-family":"monospace"}},{default:r(()=>[h(c(i.provider),1)]),_:2},1032,["color"])):k("v-if",!0),l.key==="model"?(f(),p("span",Qt,c(i.model),1)):k("v-if",!0),l.key==="tokens"?(f(),p(B,{key:3},[m("span",Xt,c(t.formatNumber(i.totalTokens)),1),m("div",qt,c(t.formatNumber(i.inputTokens))+" / "+c(t.formatNumber(i.outputTokens)),1)],64)):k("v-if",!0),l.key==="costUsd"?(f(),p("span",$t,c(t.formatCost(i.costUsd)),1)):k("v-if",!0),l.key==="responseTimeMs"?(f(),U(S,{key:5,color:t.respTagColor(i.responseTimeMs)},{default:r(()=>[h(c(i.responseTimeMs)+"ms",1)]),_:2},1032,["color"])):k("v-if",!0),l.key==="endpoint"?(f(),p(B,{key:6},[i.endpoint?(f(),p("span",te,c(i.endpoint),1)):(f(),p("span",ee,"—"))],64)):k("v-if",!0)]),emptyText:r(()=>[m("div",oe,[a(t.ClockCircleOutlined,{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),h(" "+c(t.t("tokens.empty.recent")),1)])]),_:1},8,["columns","data-source","pagination","loading"])]),_:1},8,["tab"]),k(" ── Cache tab ────────────────────────────────────────── "),a(A,{key:"cache",tab:t.t("tokens.tabs.cache")},{default:r(()=>[a(z,{gutter:[16,16],style:{"margin-bottom":"16px"}},{default:r(()=>[a(g,{xs:12,sm:6},{default:r(()=>[a(b,{size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:r(()=>[a(x,{title:t.t("tokens.cache.totalEntries"),value:t.cache.totalEntries,"value-style":{color:"#1677ff",fontSize:"18px"}},null,8,["title","value"])]),_:1})]),_:1}),a(g,{xs:12,sm:6},{default:r(()=>[a(b,{size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:r(()=>[a(x,{title:t.t("tokens.cache.totalHits"),value:t.cache.totalHits,"value-style":{color:"#52c41a",fontSize:"18px"}},null,8,["title","value"])]),_:1})]),_:1}),a(g,{xs:12,sm:6},{default:r(()=>[a(b,{size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:r(()=>[a(x,{title:t.t("tokens.cache.totalTokensSaved"),value:t.cache.totalTokensSaved,"value-style":{color:"#13c2c2",fontSize:"18px"}},null,8,["title","value"])]),_:1})]),_:1}),a(g,{xs:12,sm:6},{default:r(()=>[a(b,{size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:r(()=>[a(x,{title:t.t("tokens.cache.expiredEntries"),value:t.cache.expiredEntries,"value-style":{color:t.cache.expiredEntries>0?"#faad14":"#888",fontSize:"18px"}},null,8,["title","value","value-style"])]),_:1})]),_:1})]),_:1}),a(b,{title:t.t("tokens.cache.maintenanceTitle"),size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:r(()=>[a(R,null,{default:r(()=>[a(F,{title:t.t("tokens.cache.cleanupConfirm"),"ok-text":t.t("tokens.cache.cleanupOk"),"cancel-text":t.t("common.cancel"),onConfirm:t.cleanupExpired},{default:r(()=>[a(O,{disabled:t.cache.expiredEntries===0},{icon:r(()=>[a(t.DeleteOutlined)]),default:r(()=>[h(" "+c(t.t("tokens.cache.cleanupButton",{count:t.cache.expiredEntries})),1)]),_:1},8,["disabled"])]),_:1},8,["title","ok-text","cancel-text"]),a(F,{title:t.t("tokens.cache.clearConfirm"),"ok-text":t.t("tokens.cache.clearOk"),"ok-type":"danger","cancel-text":t.t("common.cancel"),onConfirm:t.clearAllCache},{default:r(()=>[a(O,{danger:"",disabled:t.cache.totalEntries===0},{icon:r(()=>[a(t.DeleteOutlined)]),default:r(()=>[h(" "+c(t.t("tokens.cache.clearButton")),1)]),_:1},8,["disabled"])]),_:1},8,["title","ok-text","cancel-text"])]),_:1})]),_:1},8,["title"]),a(b,{title:t.t("tokens.v2.cardTitle"),size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-top":"16px"}},{default:r(()=>[a(z,{gutter:[16,16]},{default:r(()=>[a(g,{xs:24,lg:12},{default:r(()=>[m("h5",ae,c(t.t("tokens.v2.budgetsTitle")),1),(f(!0),p(B,null,K(t.BUDGET_MATURITIES_V2,l=>(f(),p("div",{key:l,class:"bd-row"},[a(S,{color:t.budgetStatusColor(l),style:{"min-width":"80px","text-align":"center"}},{default:r(()=>[h(c(t.budgetStatusLabel(l)),1)]),_:2},1032,["color"]),a(w,{percent:t.pctOfTotal(t.statsV2.budgetsByStatus[l]||0,t.statsV2.totalBudgetsV2),"stroke-color":t.budgetBarColor(l),format:()=>`${t.statsV2.budgetsByStatus[l]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))]),_:1}),a(g,{xs:24,lg:12},{default:r(()=>[m("h5",ne,c(t.t("tokens.v2.recordsTitle")),1),(f(!0),p(B,null,K(t.USAGE_RECORD_LIFECYCLES_V2,l=>(f(),p("div",{key:l,class:"bd-row"},[a(S,{color:t.recordStatusColor(l),style:{"min-width":"80px","text-align":"center"}},{default:r(()=>[h(c(t.recordStatusLabel(l)),1)]),_:2},1032,["color"]),a(w,{percent:t.pctOfTotal(t.statsV2.recordsByStatus[l]||0,t.statsV2.totalRecordsV2),"stroke-color":t.recordBarColor(l),format:()=>`${t.statsV2.recordsByStatus[l]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))]),_:1})]),_:1})]),_:1},8,["title"])]),_:1},8,["tab"])]),_:1},8,["activeKey"])])}const ie=yt(At,[["render",se],["__scopeId","data-v-175683a8"],["__file","/tmp/cc-web-panel-UAH1Xi/repo/packages/web-panel/src/views/Tokens.vue"]]);export{ie as default};
1
+ import{I as y,J as p,U as m,R as c,c as a,K as r,V as k,S as U,o as q,b as H,r as T,P as f,Q as h,F as B,Z as J}from"./vendor-Bn1JzzAn.js";import{Y as _t,t as N,_ as yt,b as X,u as $,d as C}from"./index-Ci3y1ZAv.js";import{aR as gt,D as vt,a1 as xt,N as ht,a9 as Tt,R as St}from"./icons-DG5UD-6K.js";const Ct=Object.freeze(["today","week","month","all"]),st=Object.freeze(["planning","active","suspended","archived"]),rt=Object.freeze(["pending","recorded","billed","rejected","refunded"]);function d(e,n=0){return typeof e=="number"&&Number.isFinite(e)?e:n}function D(e){if(!e)return{noDb:!1,error:""};const n=_t(e),o=/Database not available/i.test(n);return{noDb:o,error:o?"Database not available":""}}const Z={totalCalls:0,totalInputTokens:0,totalOutputTokens:0,totalTokens:0,totalCostUsd:0,avgResponseTimeMs:0};function tt(e){const n={...Z};return!e||typeof e!="object"||Array.isArray(e)||(n.totalCalls=d(e.total_calls??e.totalCalls,0),n.totalInputTokens=d(e.total_input_tokens??e.totalInputTokens,0),n.totalOutputTokens=d(e.total_output_tokens??e.totalOutputTokens,0),n.totalTokens=d(e.total_tokens??e.totalTokens,0),n.totalCostUsd=d(e.total_cost_usd??e.totalCostUsd,0),n.avgResponseTimeMs=d(e.avg_response_time_ms??e.avgResponseTimeMs,0)),n}function Y(e){const n=N(e);return!n||typeof n!="object"||Array.isArray(n)?{stats:{...Z},today:{...Z}}:{stats:tt(n.stats),today:tt(n.today)}}function Ot(e,n=0){if(!e||typeof e!="object")return null;const o=e.provider||"",t=e.model||"";return!o&&!t?null:{key:`${o}/${t}/${n}`,provider:String(o),model:String(t),calls:d(e.calls,0),inputTokens:d(e.input_tokens??e.inputTokens,0),outputTokens:d(e.output_tokens??e.outputTokens,0),totalTokens:d(e.total_tokens??e.totalTokens,0),costUsd:d(e.cost_usd??e.costUsd,0),_idx:n}}function et(e){const n=N(e);return Array.isArray(n)?n.map(Ot).filter(Boolean):[]}function Bt(e,n=0){if(!e||typeof e!="object")return null;const o=e.id||"";return o?{key:o,id:o,provider:String(e.provider||""),model:String(e.model||""),inputTokens:d(e.input_tokens??e.inputTokens,0),outputTokens:d(e.output_tokens??e.outputTokens,0),totalTokens:d(e.total_tokens??e.totalTokens,0),costUsd:d(e.cost_usd??e.costUsd,0),responseTimeMs:d(e.response_time_ms??e.responseTimeMs,0),endpoint:String(e.endpoint||""),createdAt:e.created_at??e.createdAt??"",_idx:n}:null}function ot(e){const n=N(e);return Array.isArray(n)?n.map(Bt).filter(Boolean):[]}const Rt={totalEntries:0,totalHits:0,totalTokensSaved:0,expiredEntries:0};function at(e){const n={...Rt},o=N(e);return!o||typeof o!="object"||Array.isArray(o)||(n.totalEntries=d(o.total_entries??o.totalEntries,0),n.totalHits=d(o.total_hits??o.totalHits,0),n.totalTokensSaved=d(o.total_tokens_saved??o.totalTokensSaved,0),n.expiredEntries=d(o.expired_entries??o.expiredEntries,0)),n}const Et={totalBudgetsV2:0,totalRecordsV2:0,maxActiveBudgetsPerOwner:0,maxPendingRecordsPerBudget:0,budgetIdleMs:0,recordStuckMs:0,budgetsByStatus:{},recordsByStatus:{}};function nt(e){const n=JSON.parse(JSON.stringify(Et));for(const t of st)n.budgetsByStatus[t]=0;for(const t of rt)n.recordsByStatus[t]=0;const o=N(e);if(!o||typeof o!="object"||Array.isArray(o))return n;if(n.totalBudgetsV2=d(o.totalBudgetsV2,0),n.totalRecordsV2=d(o.totalRecordsV2,0),n.maxActiveBudgetsPerOwner=d(o.maxActiveBudgetsPerOwner,0),n.maxPendingRecordsPerBudget=d(o.maxPendingRecordsPerBudget,0),n.budgetIdleMs=d(o.budgetIdleMs,0),n.recordStuckMs=d(o.recordStuckMs,0),o.budgetsByStatus&&typeof o.budgetsByStatus=="object")for(const[t,v]of Object.entries(o.budgetsByStatus))typeof v=="number"&&Number.isFinite(v)&&(n.budgetsByStatus[t]=v);if(o.recordsByStatus&&typeof o.recordsByStatus=="object")for(const[t,v]of Object.entries(o.recordsByStatus))typeof v=="number"&&Number.isFinite(v)&&(n.recordsByStatus[t]=v);return n}function zt(e){if(e==null||e==="")return"—";const n=String(e),o=n.includes(" ")&&!n.includes("T")?n.replace(" ","T")+"Z":n,t=typeof e=="number"?new Date(e):new Date(o);return isNaN(t.getTime())?n:t.toLocaleString("zh-CN",{hour12:!1})}function wt(e){return typeof e!="number"||!Number.isFinite(e)?"$0":"$"+(Math.abs(e)<1?e.toFixed(4):e.toFixed(2))}const At={__name:"Tokens",setup(e,{expose:n}){n();const{t:o}=X(),t=$(),v=T(!1),I=T("all"),O=T({stats:{totalCalls:0,totalInputTokens:0,totalOutputTokens:0,totalTokens:0,totalCostUsd:0,avgResponseTimeMs:0},today:{totalCalls:0,totalInputTokens:0,totalOutputTokens:0,totalTokens:0,totalCostUsd:0,avgResponseTimeMs:0}}),R=T([]),V=T([]),M=T({totalEntries:0,totalHits:0,totalTokensSaved:0,expiredEntries:0}),P=T({totalBudgetsV2:0,totalRecordsV2:0,maxActiveBudgetsPerOwner:0,maxPendingRecordsPerBudget:0,budgetIdleMs:0,recordStuckMs:0,budgetsByStatus:{},recordsByStatus:{}}),b=T({noDb:!1,error:""}),x=T("breakdown"),g=H(()=>[{title:o("tokens.breakdownColumns.provider"),key:"provider",width:"130px"},{title:o("tokens.breakdownColumns.model"),key:"model"},{title:o("tokens.breakdownColumns.calls"),key:"calls",width:"90px"},{title:o("tokens.breakdownColumns.totalTokens"),key:"totalTokens",width:"180px"},{title:o("tokens.breakdownColumns.costUsd"),key:"costUsd",width:"180px"},{title:o("tokens.breakdownColumns.avgCost"),key:"avgCost",width:"110px"}]),z=H(()=>[{title:o("tokens.recentColumns.createdAt"),key:"createdAt",width:"160px"},{title:o("tokens.recentColumns.provider"),key:"provider",width:"130px"},{title:o("tokens.recentColumns.model"),key:"model",width:"180px"},{title:o("tokens.recentColumns.tokens"),key:"tokens",width:"160px"},{title:o("tokens.recentColumns.costUsd"),key:"costUsd",width:"110px"},{title:o("tokens.recentColumns.responseTimeMs"),key:"responseTimeMs",width:"100px"},{title:o("tokens.recentColumns.endpoint"),key:"endpoint"}]),S=H(()=>R.value.reduce((s,u)=>s+u.costUsd,0));function w(s){const u=`tokens.period.${s}`,_=o(u);return _===u?s:_}function j(s){const u=["blue","green","purple","orange","cyan","magenta","gold","volcano"];let _=0;for(let E=0;E<(s||"").length;E++)_=_*31+s.charCodeAt(E)>>>0;return u[_%u.length]}function A(s){return s<=500?"#52c41a":s<=1500?"#1677ff":s<=3e3?"#faad14":"#ff4d4f"}function F(s){return s<=500?"green":s<=1500?"blue":s<=3e3?"gold":"red"}function G(s){return typeof s!="number"||!Number.isFinite(s)?"0":s.toLocaleString("en-US")}function l(s){return!S.value||s<=0?0:Math.min(100,Math.round(s/S.value*100))}function i(s,u){return u?Math.round(s/u*100):0}function lt(s){const u=`tokens.budgetStatus.${s}`,_=o(u);return _===u?s:_}function ct(s){return{planning:"default",active:"green",suspended:"orange",archived:"default"}[s]||"default"}function it(s){return{planning:"#888",active:"#52c41a",suspended:"#faad14",archived:"#666"}[s]||"#888"}function dt(s){const u=`tokens.recordStatus.${s}`,_=o(u);return _===u?s:_}function ut(s){return{pending:"default",recorded:"blue",billed:"green",rejected:"red",refunded:"orange"}[s]||"default"}function ft(s){return{pending:"#888",recorded:"#1677ff",billed:"#52c41a",rejected:"#ff4d4f",refunded:"#faad14"}[s]||"#888"}async function L(){v.value=!0,b.value={noDb:!1,error:""};try{const[s,u,_,E,bt]=await Promise.all([t.execute(`tokens show --period ${I.value} --json`,8e3).catch(()=>({output:""})),t.execute("tokens breakdown --json",8e3).catch(()=>({output:""})),t.execute("tokens recent -n 100 --json",1e4).catch(()=>({output:""})),t.execute("tokens cache --json",6e3).catch(()=>({output:""})),t.execute("tokens stats-v2",6e3).catch(()=>({output:""}))]),Q=[s,u,_,E].map(K=>D(K.output)).find(K=>K.noDb);Q&&(b.value=Q),O.value=Y(s.output),R.value=et(u.output),V.value=ot(_.output),M.value=at(E.output),P.value=nt(bt.output)}catch(s){C.error(o("tokens.messages.loadFailed",{err:s?.message||s}))}finally{v.value=!1}}async function kt(){try{const{output:s}=await t.execute(`tokens show --period ${I.value} --json`,8e3),u=D(s);if(u.noDb){b.value=u;return}O.value=Y(s)}catch(s){C.error(o("tokens.messages.loadShowFailed",{err:s?.message||s}))}}async function mt(){try{const{output:s}=await t.execute("tokens cache --cleanup",8e3);if(D(s).noDb){C.error(o("tokens.messages.needInit"));return}C.success(o("tokens.messages.cleanupOk")),await L()}catch(s){C.error(o("tokens.messages.cleanupFailed",{err:s?.message||s}))}}async function pt(){try{const{output:s}=await t.execute("tokens cache --clear",8e3);if(D(s).noDb){C.error(o("tokens.messages.needInit"));return}C.success(o("tokens.messages.clearOk")),await L()}catch(s){C.error(o("tokens.messages.clearFailed",{err:s?.message||s}))}}q(L);const W={t:o,ws:t,loading:v,period:I,show:O,breakdown:R,recent:V,cache:M,statsV2:P,errorState:b,activeTab:x,breakdownColumns:g,recentColumns:z,totalCost:S,periodLabel:w,providerColor:j,respColor:A,respTagColor:F,formatNumber:G,costPct:l,pctOfTotal:i,budgetStatusLabel:lt,budgetStatusColor:ct,budgetBarColor:it,recordStatusLabel:dt,recordStatusColor:ut,recordBarColor:ft,loadAll:L,loadShow:kt,cleanupExpired:mt,clearAllCache:pt,ref:T,computed:H,onMounted:q,get useI18n(){return X},get ReloadOutlined(){return St},get ApiOutlined(){return Tt},get NumberOutlined(){return ht},get ClockCircleOutlined(){return xt},get DatabaseOutlined(){return vt},get DeleteOutlined(){return gt},get message(){return C},get useWsStore(){return $},get parseShowResult(){return Y},get parseBreakdown(){return et},get parseRecent(){return ot},get parseCacheStats(){return at},get parseStatsV2(){return nt},get detectTokensError(){return D},get formatTokensTime(){return zt},get formatCost(){return wt},get PERIOD_OPTIONS(){return Ct},get BUDGET_MATURITIES_V2(){return st},get USAGE_RECORD_LIFECYCLES_V2(){return rt}};return Object.defineProperty(W,"__isScriptSetup",{enumerable:!1,value:!0}),W}},Ut={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Dt={class:"page-title"},Nt={class:"page-sub"},It={style:{display:"flex","align-items":"center",gap:"12px","flex-wrap":"wrap"}},Vt={style:{color:"var(--text-secondary)","font-size":"12px"}},Mt={class:"stat-sub"},Pt={class:"stat-sub"},jt={class:"stat-sub"},Ft={class:"stat-sub"},Lt={key:1,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px"}},Ht={key:2,style:{color:"var(--text-secondary)"}},Gt={style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},Kt={style:{color:"var(--text-muted)","font-size":"11px","font-family":"monospace"}},Jt={style:{color:"#faad14","font-weight":"500","font-family":"monospace"}},Yt={key:5,style:{color:"var(--text-muted)","font-family":"monospace","font-size":"12px"}},Zt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},Wt={key:0,style:{color:"var(--text-secondary)","font-size":"11px","font-family":"monospace"}},Qt={key:2,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px"}},qt={style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},Xt={style:{color:"var(--text-muted)","font-size":"11px","font-family":"monospace"}},$t={key:4,style:{color:"#faad14","font-weight":"500","font-family":"monospace"}},te={key:0,style:{color:"var(--text-muted)","font-family":"monospace","font-size":"11px"}},ee={key:1,style:{color:"var(--text-muted)"}},oe={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},ae={style:{"font-size":"12px",color:"var(--text-secondary)",margin:"0 0 8px"}},ne={style:{"font-size":"12px",color:"var(--text-secondary)",margin:"0 0 8px"}};function se(e,n,o,t,v,I){const O=y("a-button"),R=y("a-space"),V=y("a-alert"),M=y("a-radio-button"),P=y("a-radio-group"),b=y("a-card"),x=y("a-statistic"),g=y("a-col"),z=y("a-row"),S=y("a-tag"),w=y("a-progress"),j=y("a-table"),A=y("a-tab-pane"),F=y("a-popconfirm"),G=y("a-tabs");return f(),p("div",null,[m("div",Ut,[m("div",null,[m("h2",Dt,c(t.t("tokens.title")),1),m("p",Nt,c(t.t("tokens.subtitle")),1)]),a(R,null,{default:r(()=>[a(O,{loading:t.loading,onClick:t.loadAll},{icon:r(()=>[a(t.ReloadOutlined)]),default:r(()=>[h(" "+c(t.t("tokens.refresh")),1)]),_:1},8,["loading"])]),_:1})]),k(" noDb banner "),t.errorState.noDb?(f(),U(V,{key:0,type:"info","show-icon":"",message:t.t("tokens.noDb.message"),description:t.t("tokens.noDb.description"),style:{"margin-bottom":"16px"}},null,8,["message","description"])):k("v-if",!0),k(" Period selector "),a(b,{size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"},"body-style":{padding:"10px 16px"}},{default:r(()=>[m("div",It,[m("span",Vt,c(t.t("tokens.periodLabel")),1),a(P,{value:t.period,"onUpdate:value":n[0]||(n[0]=l=>t.period=l),size:"small","button-style":"solid",onChange:t.loadShow},{default:r(()=>[(f(!0),p(B,null,J(t.PERIOD_OPTIONS,l=>(f(),U(M,{key:l,value:l},{default:r(()=>[h(c(t.periodLabel(l)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])])]),_:1}),k(" Stat cards "),a(z,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:r(()=>[a(g,{xs:12,sm:8,lg:5},{default:r(()=>[a(b,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:r(()=>[a(x,{title:t.t("tokens.stats.calls"),value:t.show.stats.totalCalls,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:r(()=>[a(t.ApiOutlined)]),_:1},8,["title","value"]),m("div",Mt,c(t.t("tokens.stats.callsToday",{count:t.show.today.totalCalls})),1)]),_:1})]),_:1}),a(g,{xs:12,sm:8,lg:5},{default:r(()=>[a(b,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:r(()=>[a(x,{title:t.t("tokens.stats.totalTokens"),value:t.show.stats.totalTokens,"value-style":{color:"#722ed1",fontSize:"20px"}},{prefix:r(()=>[a(t.NumberOutlined)]),_:1},8,["title","value"]),m("div",Pt,c(t.t("tokens.stats.tokensInOut",{inputs:t.formatNumber(t.show.stats.totalInputTokens),outputs:t.formatNumber(t.show.stats.totalOutputTokens)})),1)]),_:1})]),_:1}),a(g,{xs:12,sm:8,lg:5},{default:r(()=>[a(b,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:r(()=>[a(x,{title:t.t("tokens.stats.totalCost"),value:t.show.stats.totalCostUsd,precision:t.show.stats.totalCostUsd<1?4:2,prefix:"$","value-style":{color:"#faad14",fontSize:"20px"}},null,8,["title","value","precision"]),m("div",jt,c(t.t("tokens.stats.costToday",{amount:t.formatCost(t.show.today.totalCostUsd)})),1)]),_:1})]),_:1}),a(g,{xs:12,sm:8,lg:5},{default:r(()=>[a(b,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:r(()=>[a(x,{title:t.t("tokens.stats.avgResponse"),value:t.show.stats.avgResponseTimeMs,suffix:"ms",precision:0,"value-style":{color:t.respColor(t.show.stats.avgResponseTimeMs),fontSize:"20px"}},{prefix:r(()=>[a(t.ClockCircleOutlined)]),_:1},8,["title","value","value-style"])]),_:1})]),_:1}),a(g,{xs:24,sm:8,lg:4},{default:r(()=>[a(b,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:r(()=>[a(x,{title:t.t("tokens.stats.cacheHits"),value:t.cache.totalHits,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:r(()=>[a(t.DatabaseOutlined)]),_:1},8,["title","value"]),m("div",Ft,c(t.t("tokens.stats.cacheTokensSaved",{count:t.formatNumber(t.cache.totalTokensSaved)})),1)]),_:1})]),_:1})]),_:1}),k(" Tabs "),a(G,{activeKey:t.activeTab,"onUpdate:activeKey":n[1]||(n[1]=l=>t.activeTab=l),class:"tokens-tabs"},{default:r(()=>[k(" ── Breakdown tab ────────────────────────────────────── "),a(A,{key:"breakdown",tab:t.t("tokens.tabs.breakdown")},{default:r(()=>[a(j,{columns:t.breakdownColumns,"data-source":t.breakdown,pagination:{pageSize:20,showTotal:l=>t.t("tokens.totals.models",{count:l})},size:"small",loading:t.loading,style:{background:"var(--bg-card)"}},{bodyCell:r(({column:l,record:i})=>[l.key==="provider"?(f(),U(S,{key:0,color:t.providerColor(i.provider),style:{"font-family":"monospace"}},{default:r(()=>[h(c(i.provider),1)]),_:2},1032,["color"])):k("v-if",!0),l.key==="model"?(f(),p("span",Lt,c(i.model),1)):k("v-if",!0),l.key==="calls"?(f(),p("span",Ht,c(t.formatNumber(i.calls)),1)):k("v-if",!0),l.key==="totalTokens"?(f(),p(B,{key:3},[m("span",Gt,c(t.formatNumber(i.totalTokens)),1),m("div",Kt,c(t.t("tokens.breakdownDetails.tokensInOut",{inputs:t.formatNumber(i.inputTokens),outputs:t.formatNumber(i.outputTokens)})),1)],64)):k("v-if",!0),l.key==="costUsd"?(f(),p(B,{key:4},[m("span",Jt,c(t.formatCost(i.costUsd)),1),a(w,{percent:t.costPct(i.costUsd),"show-info":!1,"stroke-color":"#faad14",size:"small",style:{"margin-top":"2px"}},null,8,["percent"])],64)):k("v-if",!0),l.key==="avgCost"?(f(),p("span",Yt,c(i.calls>0?t.formatCost(i.costUsd/i.calls):"—"),1)):k("v-if",!0)]),emptyText:r(()=>[m("div",Zt,[a(t.NumberOutlined,{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),h(" "+c(t.t("tokens.empty.breakdown")),1)])]),_:1},8,["columns","data-source","pagination","loading"])]),_:1},8,["tab"]),k(" ── Recent tab ───────────────────────────────────────── "),a(A,{key:"recent",tab:t.t("tokens.tabs.recent")},{default:r(()=>[a(j,{columns:t.recentColumns,"data-source":t.recent,pagination:{pageSize:20,showTotal:l=>t.t("tokens.totals.rows",{count:l})},size:"small",loading:t.loading,style:{background:"var(--bg-card)"}},{bodyCell:r(({column:l,record:i})=>[l.key==="createdAt"?(f(),p("span",Wt,c(t.formatTokensTime(i.createdAt)),1)):k("v-if",!0),l.key==="provider"?(f(),U(S,{key:1,color:t.providerColor(i.provider),style:{"font-family":"monospace"}},{default:r(()=>[h(c(i.provider),1)]),_:2},1032,["color"])):k("v-if",!0),l.key==="model"?(f(),p("span",Qt,c(i.model),1)):k("v-if",!0),l.key==="tokens"?(f(),p(B,{key:3},[m("span",qt,c(t.formatNumber(i.totalTokens)),1),m("div",Xt,c(t.formatNumber(i.inputTokens))+" / "+c(t.formatNumber(i.outputTokens)),1)],64)):k("v-if",!0),l.key==="costUsd"?(f(),p("span",$t,c(t.formatCost(i.costUsd)),1)):k("v-if",!0),l.key==="responseTimeMs"?(f(),U(S,{key:5,color:t.respTagColor(i.responseTimeMs)},{default:r(()=>[h(c(i.responseTimeMs)+"ms",1)]),_:2},1032,["color"])):k("v-if",!0),l.key==="endpoint"?(f(),p(B,{key:6},[i.endpoint?(f(),p("span",te,c(i.endpoint),1)):(f(),p("span",ee,"—"))],64)):k("v-if",!0)]),emptyText:r(()=>[m("div",oe,[a(t.ClockCircleOutlined,{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),h(" "+c(t.t("tokens.empty.recent")),1)])]),_:1},8,["columns","data-source","pagination","loading"])]),_:1},8,["tab"]),k(" ── Cache tab ────────────────────────────────────────── "),a(A,{key:"cache",tab:t.t("tokens.tabs.cache")},{default:r(()=>[a(z,{gutter:[16,16],style:{"margin-bottom":"16px"}},{default:r(()=>[a(g,{xs:12,sm:6},{default:r(()=>[a(b,{size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:r(()=>[a(x,{title:t.t("tokens.cache.totalEntries"),value:t.cache.totalEntries,"value-style":{color:"#1677ff",fontSize:"18px"}},null,8,["title","value"])]),_:1})]),_:1}),a(g,{xs:12,sm:6},{default:r(()=>[a(b,{size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:r(()=>[a(x,{title:t.t("tokens.cache.totalHits"),value:t.cache.totalHits,"value-style":{color:"#52c41a",fontSize:"18px"}},null,8,["title","value"])]),_:1})]),_:1}),a(g,{xs:12,sm:6},{default:r(()=>[a(b,{size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:r(()=>[a(x,{title:t.t("tokens.cache.totalTokensSaved"),value:t.cache.totalTokensSaved,"value-style":{color:"#13c2c2",fontSize:"18px"}},null,8,["title","value"])]),_:1})]),_:1}),a(g,{xs:12,sm:6},{default:r(()=>[a(b,{size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:r(()=>[a(x,{title:t.t("tokens.cache.expiredEntries"),value:t.cache.expiredEntries,"value-style":{color:t.cache.expiredEntries>0?"#faad14":"#888",fontSize:"18px"}},null,8,["title","value","value-style"])]),_:1})]),_:1})]),_:1}),a(b,{title:t.t("tokens.cache.maintenanceTitle"),size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:r(()=>[a(R,null,{default:r(()=>[a(F,{title:t.t("tokens.cache.cleanupConfirm"),"ok-text":t.t("tokens.cache.cleanupOk"),"cancel-text":t.t("common.cancel"),onConfirm:t.cleanupExpired},{default:r(()=>[a(O,{disabled:t.cache.expiredEntries===0},{icon:r(()=>[a(t.DeleteOutlined)]),default:r(()=>[h(" "+c(t.t("tokens.cache.cleanupButton",{count:t.cache.expiredEntries})),1)]),_:1},8,["disabled"])]),_:1},8,["title","ok-text","cancel-text"]),a(F,{title:t.t("tokens.cache.clearConfirm"),"ok-text":t.t("tokens.cache.clearOk"),"ok-type":"danger","cancel-text":t.t("common.cancel"),onConfirm:t.clearAllCache},{default:r(()=>[a(O,{danger:"",disabled:t.cache.totalEntries===0},{icon:r(()=>[a(t.DeleteOutlined)]),default:r(()=>[h(" "+c(t.t("tokens.cache.clearButton")),1)]),_:1},8,["disabled"])]),_:1},8,["title","ok-text","cancel-text"])]),_:1})]),_:1},8,["title"]),a(b,{title:t.t("tokens.v2.cardTitle"),size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-top":"16px"}},{default:r(()=>[a(z,{gutter:[16,16]},{default:r(()=>[a(g,{xs:24,lg:12},{default:r(()=>[m("h5",ae,c(t.t("tokens.v2.budgetsTitle")),1),(f(!0),p(B,null,J(t.BUDGET_MATURITIES_V2,l=>(f(),p("div",{key:l,class:"bd-row"},[a(S,{color:t.budgetStatusColor(l),style:{"min-width":"80px","text-align":"center"}},{default:r(()=>[h(c(t.budgetStatusLabel(l)),1)]),_:2},1032,["color"]),a(w,{percent:t.pctOfTotal(t.statsV2.budgetsByStatus[l]||0,t.statsV2.totalBudgetsV2),"stroke-color":t.budgetBarColor(l),format:()=>`${t.statsV2.budgetsByStatus[l]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))]),_:1}),a(g,{xs:24,lg:12},{default:r(()=>[m("h5",ne,c(t.t("tokens.v2.recordsTitle")),1),(f(!0),p(B,null,J(t.USAGE_RECORD_LIFECYCLES_V2,l=>(f(),p("div",{key:l,class:"bd-row"},[a(S,{color:t.recordStatusColor(l),style:{"min-width":"80px","text-align":"center"}},{default:r(()=>[h(c(t.recordStatusLabel(l)),1)]),_:2},1032,["color"]),a(w,{percent:t.pctOfTotal(t.statsV2.recordsByStatus[l]||0,t.statsV2.totalRecordsV2),"stroke-color":t.recordBarColor(l),format:()=>`${t.statsV2.recordsByStatus[l]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))]),_:1})]),_:1})]),_:1},8,["title"])]),_:1},8,["tab"])]),_:1},8,["activeKey"])])}const ie=yt(At,[["render",se],["__scopeId","data-v-175683a8"],["__file","/tmp/cc-web-panel-EZK4no/repo/packages/web-panel/src/views/Tokens.vue"]]);export{ie as default};