chainlesschain 0.162.122 → 0.162.123

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 (182) 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-C5CSd8pY.js +1 -0
  4. package/src/assets/web-panel/assets/{ActionButton-Bqvaz1Yj.js → ActionButton-BugJtiJc.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-BhCnMbKz.js → Analytics-CzxpcV9E.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-cs0TRZya.js → AppLayout-Cb0eHetM.js} +3 -3
  7. package/src/assets/web-panel/assets/Audit-qjq04wh8.js +1 -0
  8. package/src/assets/web-panel/assets/{Backup-BOglo5g6.js → Backup-C2Y_XNBA.js} +1 -1
  9. package/src/assets/web-panel/assets/{BaseInput-4qhQiJfI.js → BaseInput-CZ0c7QHk.js} +1 -1
  10. package/src/assets/web-panel/assets/{Chat-DUFX3Mv4.js → Chat-CaKDT3wV.js} +6 -6
  11. package/src/assets/web-panel/assets/{ChatBubbleRenderer-LWgyWUF_.js → ChatBubbleRenderer-TeKnMwPj.js} +1 -1
  12. package/src/assets/web-panel/assets/{Checkbox-C4eyD_nB.js → Checkbox-C6-Iu3bG.js} +1 -1
  13. package/src/assets/web-panel/assets/Codegen-TGLFk6P1.js +1 -0
  14. package/src/assets/web-panel/assets/{Col-3eHStfvJ.js → Col-DVBrO7AN.js} +1 -1
  15. package/src/assets/web-panel/assets/{Community-DFbKjEgh.js → Community-tg6-Rik1.js} +1 -1
  16. package/src/assets/web-panel/assets/{Compact-D5str1h-.js → Compact-DM4ZgFSE.js} +1 -1
  17. package/src/assets/web-panel/assets/Compliance-DFeWryxt.js +1 -0
  18. package/src/assets/web-panel/assets/{Cowork-Cdliboj6.js → Cowork-CJwiWkUY.js} +2 -2
  19. package/src/assets/web-panel/assets/{Cron-Bfmwl6iZ.js → Cron-dsdXHvrO.js} +2 -2
  20. package/src/assets/web-panel/assets/Crosschain-p7_5Gq-7.js +1 -0
  21. package/src/assets/web-panel/assets/{DID-xqi72kjo.js → DID-BB_LBLYT.js} +2 -2
  22. package/src/assets/web-panel/assets/{Dashboard-4l68QdSQ.js → Dashboard-Bh_HkNSD.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dropdown-C2wsZOdn.js → Dropdown-dTFtVnKk.js} +1 -1
  24. package/src/assets/web-panel/assets/{EmailListRenderer-CWh_fKmI.js → EmailListRenderer-yqdttzXV.js} +1 -1
  25. package/src/assets/web-panel/assets/{FamilyGuardDashboard-CHK5rapA.js → FamilyGuardDashboard-DfX3YpUU.js} +1 -1
  26. package/src/assets/web-panel/assets/Federation-BJApfPV4.js +1 -0
  27. package/src/assets/web-panel/assets/{FormItemContext-lLOEHvAb.js → FormItemContext-DNMwIh7X.js} +1 -1
  28. package/src/assets/web-panel/assets/{GenericCardRenderer-CaDh2XiY.js → GenericCardRenderer-C-T8UQf0.js} +1 -1
  29. package/src/assets/web-panel/assets/{Git-B9SmGPMU.js → Git-SURFhkLi.js} +2 -2
  30. package/src/assets/web-panel/assets/Governance-B4u_KsfE.js +1 -0
  31. package/src/assets/web-panel/assets/Inference-2kr_rKQd.js +1 -0
  32. package/src/assets/web-panel/assets/{KnowledgeGraph-zYwypnwu.js → KnowledgeGraph-h-nL7J6x.js} +1 -1
  33. package/src/assets/web-panel/assets/{Logs-D6owai5o.js → Logs-DjuWREBJ.js} +2 -2
  34. package/src/assets/web-panel/assets/Marketplace-W9Iz8b2m.js +1 -0
  35. package/src/assets/web-panel/assets/{McpTools-Dxlypa0R.js → McpTools-D0waMomb.js} +4 -4
  36. package/src/assets/web-panel/assets/{Memory-BxBHR7eW.js → Memory-Ci768GQ3.js} +2 -2
  37. package/src/assets/web-panel/assets/{MobileBridge-Car9kLtE.js → MobileBridge-4jAehfcz.js} +2 -2
  38. package/src/assets/web-panel/assets/{MobileProjects-59gyfK6T.js → MobileProjects-RpFuAiNz.js} +1 -1
  39. package/src/assets/web-panel/assets/{Mtc-2YBBawFi.js → Mtc-DJdw8btT.js} +2 -2
  40. package/src/assets/web-panel/assets/{MtcAudit-DczAeHfM.js → MtcAudit-Dc596XgH.js} +2 -2
  41. package/src/assets/web-panel/assets/{Multisig-CPxyt7a-.js → Multisig--Qs7eGsH.js} +3 -3
  42. package/src/assets/web-panel/assets/NLProgramming-D3y71FDX.js +1 -0
  43. package/src/assets/web-panel/assets/{Notes-tHRMLOQ3.js → Notes-uMxjj66_.js} +3 -3
  44. package/src/assets/web-panel/assets/{NotificationSettings-DxIYUWPW.js → NotificationSettings-C4ikBOsm.js} +1 -1
  45. package/src/assets/web-panel/assets/{OrderTableRenderer-BMpVfQkg.js → OrderTableRenderer-BpmdunAz.js} +1 -1
  46. package/src/assets/web-panel/assets/{Organization-BBsie-kN.js → Organization-BBEmFNGM.js} +4 -4
  47. package/src/assets/web-panel/assets/{Overflow-DrdVw_fC.js → Overflow-B-4_IpbB.js} +1 -1
  48. package/src/assets/web-panel/assets/{P2P-CMBYxejX.js → P2P-DdOf9BZs.js} +2 -2
  49. package/src/assets/web-panel/assets/PdhVaultBrowser-DDU2Zc9Q.js +7 -0
  50. package/src/assets/web-panel/assets/{Permissions-W4kD06Cj.js → Permissions-B1ebgevF.js} +4 -4
  51. package/src/assets/web-panel/assets/{PersonalDataHub-nuqNTK2w.js → PersonalDataHub-B3WcvKni.js} +2 -2
  52. package/src/assets/web-panel/assets/Pipeline-DASuPDc3.js +1 -0
  53. package/src/assets/web-panel/assets/Privacy-DnixwmhJ.js +1 -0
  54. package/src/assets/web-panel/assets/{ProjectInit-hCWXNnGJ.js → ProjectInit-BQjMDkML.js} +2 -2
  55. package/src/assets/web-panel/assets/{ProjectSettings--BzvEaxE.js → ProjectSettings-dHyZ3SxW.js} +2 -2
  56. package/src/assets/web-panel/assets/{Projects-C6l6z4Mo.js → Projects-BGWEJIVT.js} +1 -1
  57. package/src/assets/web-panel/assets/{Providers-kEifEWLb.js → Providers-Bl0dw6cI.js} +1 -1
  58. package/src/assets/web-panel/assets/{QuickAsk-B6oLUYKR.js → QuickAsk-BDrk7l3t.js} +1 -1
  59. package/src/assets/web-panel/assets/Recommend-BPKof_CA.js +1 -0
  60. package/src/assets/web-panel/assets/Reputation-6MNJLklK.js +1 -0
  61. package/src/assets/web-panel/assets/{Row-W6LSmdzh.js → Row-DmGJwpfd.js} +1 -1
  62. package/src/assets/web-panel/assets/{RssFeed-DJi97lWh.js → RssFeed-9-Fxh3_w.js} +2 -2
  63. package/src/assets/web-panel/assets/Search-CCHjey_D.js +1 -0
  64. package/src/assets/web-panel/assets/{Security-BtawKhmm.js → Security-D6CySV7r.js} +3 -3
  65. package/src/assets/web-panel/assets/{Services-BdCe11of.js → Services-Co8Mk8qE.js} +2 -2
  66. package/src/assets/web-panel/assets/{Skeleton-C_wcDxpN.js → Skeleton-BdON8M-1.js} +1 -1
  67. package/src/assets/web-panel/assets/{Skills-n2GgEfQ1.js → Skills-CEJE1Go1.js} +1 -1
  68. package/src/assets/web-panel/assets/Sla-BSxFvFX9.js +1 -0
  69. package/src/assets/web-panel/assets/{SpeechSettings-D6qCWpan.js → SpeechSettings-C3rShYlV.js} +1 -1
  70. package/src/assets/web-panel/assets/{SyncSettings-BBbldyeR.js → SyncSettings-52NXsfyj.js} +2 -2
  71. package/src/assets/web-panel/assets/{Tasks-DMkBOCW-.js → Tasks-He7CweW6.js} +1 -1
  72. package/src/assets/web-panel/assets/{Templates-DbLImR1I.js → Templates-UtjBlJIO.js} +1 -1
  73. package/src/assets/web-panel/assets/Tenant-Dd5XNbYF.js +1 -0
  74. package/src/assets/web-panel/assets/{Terminal-BjKUkiR1.js → Terminal-pFyh42cu.js} +2 -2
  75. package/src/assets/web-panel/assets/{TimelineRenderer-Drf_B0al.js → TimelineRenderer-BdfqBQmM.js} +1 -1
  76. package/src/assets/web-panel/assets/Tokens-CsgNsrdQ.js +1 -0
  77. package/src/assets/web-panel/assets/{Trigger-CNUB_qRQ.js → Trigger-Dt_N_rvo.js} +1 -1
  78. package/src/assets/web-panel/assets/Trust-B1lJzsPn.js +1 -0
  79. package/src/assets/web-panel/assets/{UkeySign-7o1O51qV.js → UkeySign-CW8YdFxg.js} +1 -1
  80. package/src/assets/web-panel/assets/{VideoEditing-Ccb1cTxo.js → VideoEditing-CU6o7qvp.js} +1 -1
  81. package/src/assets/web-panel/assets/{Wallet-EMf9MlLK.js → Wallet-DPxjEhbN.js} +4 -4
  82. package/src/assets/web-panel/assets/{WebAuthn-DOYoaCmi.js → WebAuthn-CuJ29YAF.js} +3 -3
  83. package/src/assets/web-panel/assets/{WorkflowEditor-BcFvWc2d.js → WorkflowEditor-BcCA2U8H.js} +1 -1
  84. package/src/assets/web-panel/assets/{chat-CPvCSHY4.js → chat-Cxl5DGsc.js} +1 -1
  85. package/src/assets/web-panel/assets/{colors-Ca7MoLtb.js → colors-FS_7Xggs.js} +1 -1
  86. package/src/assets/web-panel/assets/community-parser-Cuyslaku.js +3 -0
  87. package/src/assets/web-panel/assets/{compact-item-B9AUAVCQ.js → compact-item-BzXjd3wJ.js} +1 -1
  88. package/src/assets/web-panel/assets/{createContext-CnMJHqHw.js → createContext-DhF9bi_u.js} +1 -1
  89. package/src/assets/web-panel/assets/devWarning-B1j78JeH.js +1 -0
  90. package/src/assets/web-panel/assets/{hasIn-Bevd8pXd.js → hasIn-Y1a0aV9N.js} +1 -1
  91. package/src/assets/web-panel/assets/{index-D9VR1tES.js → index--fcP34eT.js} +1 -1
  92. package/src/assets/web-panel/assets/{index-BcRDjaEi.js → index-1iacQgo5.js} +3 -3
  93. package/src/assets/web-panel/assets/{index-BV1U7tR6.js → index-1khPb4ZS.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-BzmhHe0m.js → index-B48PZ-xM.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-BUlsrbu2.js → index-BBtULjKY.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-CVxhWXMd.js → index-BNmWkPqm.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-PidVLx0u.js → index-BTltEtoG.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BFkrnvs_.js → index-B_Z0PHC0.js} +1 -1
  99. package/src/assets/web-panel/assets/index-BaN6wKWx.js +1 -0
  100. package/src/assets/web-panel/assets/{index-HdGuA1pS.js → index-BepInmSi.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-p1rI3d66.js → index-BllceSdr.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-CGEc6vlv.js → index-BnvaUocg.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-aB7GLimB.js → index-Bt_0ygjA.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CQKVKyjf.js → index-BzQkdgQW.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-C3biz3RB.js → index-C2S8McM1.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-ienIjr7_.js → index-CELVZPNt.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-Dnk8TOm3.js → index-CETvk0NN.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BM1tI3g5.js → index-CRSkKj9M.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-0DtNS6oi.js → index-Cgo1J_Kf.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-DW3rTBy_.js → index-Ci7PSoQn.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DPk2HXTA.js → index-Cn9lbqaS.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-CtIv89mI.js → index-CuTKOay7.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-C5i4gKvN.js → index-CxYHV8nb.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-B619_m_T.js → index-CzlCP4jP.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-ecThTNhE.js → index-D3IVAG9l.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-kUeSjyHt.js → index-DLyIxnjc.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BwDJvHfR.js → index-DUcVF8e6.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-tUD_CWx-.js → index-DVTex5M8.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-CvhLkwFR.js → index-DZJMsVI1.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-gR1xGRvy.js → index-DfaSKEVD.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BGBbFzIJ.js → index-DgHWZVjv.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-B3zlqc60.js → index-Dmjxpu0L.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-2KMpdEzs.js → index-DxGVbuqr.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DAjYLhik.js → index-GCd5hs58.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-Ct3wP67S.js → index-JUukFpxi.js} +1 -1
  126. package/src/assets/web-panel/assets/index-N7JKRLCC.js +1 -0
  127. package/src/assets/web-panel/assets/{index-Cd62bwRd.js → index-Na733kBa.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DTxmgfz2.js → index-Sl-sLj3T.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-CAKYScOz.js → index-uLoKviUT.js} +1 -1
  130. package/src/assets/web-panel/assets/{initDefaultProps-dsKHYCPH.js → initDefaultProps-D6QmlnQ-.js} +1 -1
  131. package/src/assets/web-panel/assets/{motion-DdPCK2zh.js → motion-BHrTGY1_.js} +1 -1
  132. package/src/assets/web-panel/assets/{move-Bi0bmOjg.js → move-Bpph6B_N.js} +1 -1
  133. package/src/assets/web-panel/assets/mtc-parser-CEQffxds.js +1 -0
  134. package/src/assets/web-panel/assets/{omit-DCrBiySU.js → omit-Dx0YMbWn.js} +1 -1
  135. package/src/assets/web-panel/assets/{pickAttrs-CcJuqfya.js → pickAttrs-D-a8Fm6C.js} +1 -1
  136. package/src/assets/web-panel/assets/{placementArrow-DFGuzth-.js → placementArrow-DXFSVgxv.js} +1 -1
  137. package/src/assets/web-panel/assets/{responsiveObserve-B_WDlgvI.js → responsiveObserve-CxhQ1EaK.js} +1 -1
  138. package/src/assets/web-panel/assets/{slide-BSFabVgO.js → slide-IlBI0XU8.js} +1 -1
  139. package/src/assets/web-panel/assets/{statusUtils-CebvsGH8.js → statusUtils-COoXVzje.js} +1 -1
  140. package/src/assets/web-panel/assets/{styleChecker-CMuE7NWy.js → styleChecker-DCuq89M_.js} +1 -1
  141. package/src/assets/web-panel/assets/{useFlexGapSupport-RWGVgZNu.js → useFlexGapSupport-tfNE1ALO.js} +1 -1
  142. package/src/assets/web-panel/assets/{useFs-srxzzfG_.js → useFs-DD4bzBkU.js} +1 -1
  143. package/src/assets/web-panel/assets/{usePersonalDataHub-B5OwxZuK.js → usePersonalDataHub-DVkH1hbT.js} +1 -1
  144. package/src/assets/web-panel/assets/{vnode-CXOEebAH.js → vnode-D1ZmXyxM.js} +1 -1
  145. package/src/assets/web-panel/assets/{zoom-DKNwqG2v.js → zoom-DblBUHfi.js} +1 -1
  146. package/src/assets/web-panel/index.html +1 -1
  147. package/src/harness/mcp-client.js +67 -6
  148. package/src/lib/credential-guard.js +284 -0
  149. package/src/lib/ensure-utf8.js +6 -1
  150. package/src/lib/hook-manager.js +15 -6
  151. package/src/lib/mcp-client.js +1 -0
  152. package/src/lib/mcp-oauth.js +35 -4
  153. package/src/lib/repl-rewind.js +58 -0
  154. package/src/lib/repl-vim.js +13 -1
  155. package/src/lib/settings-hooks.cjs +12 -3
  156. package/src/repl/agent-repl.js +52 -2
  157. package/src/runtime/agent-core.js +76 -0
  158. package/src/assets/web-panel/assets/AIOps-BmS46GrQ.js +0 -1
  159. package/src/assets/web-panel/assets/Audit-AwLNQzvX.js +0 -1
  160. package/src/assets/web-panel/assets/Codegen-B9SRqAqh.js +0 -1
  161. package/src/assets/web-panel/assets/Compliance-DDYPQDiG.js +0 -1
  162. package/src/assets/web-panel/assets/Crosschain-Bfo6RvSg.js +0 -1
  163. package/src/assets/web-panel/assets/Federation-JpiE2iKR.js +0 -1
  164. package/src/assets/web-panel/assets/Governance-B3ODoSO2.js +0 -1
  165. package/src/assets/web-panel/assets/Inference-C_jP_nlz.js +0 -1
  166. package/src/assets/web-panel/assets/Marketplace-umRB80w4.js +0 -1
  167. package/src/assets/web-panel/assets/NLProgramming-DvKJ8imu.js +0 -1
  168. package/src/assets/web-panel/assets/PdhVaultBrowser-BBHzSaeq.js +0 -7
  169. package/src/assets/web-panel/assets/Pipeline-DzCX3yHy.js +0 -1
  170. package/src/assets/web-panel/assets/Privacy-9ENAJQOC.js +0 -1
  171. package/src/assets/web-panel/assets/Recommend-BIEMGN0q.js +0 -1
  172. package/src/assets/web-panel/assets/Reputation-D-9AEaRr.js +0 -1
  173. package/src/assets/web-panel/assets/Search-DOEB2utf.js +0 -1
  174. package/src/assets/web-panel/assets/Sla-D5WfrvLP.js +0 -1
  175. package/src/assets/web-panel/assets/Tenant-B0qM4w6Z.js +0 -1
  176. package/src/assets/web-panel/assets/Tokens-DgCx2Bfa.js +0 -1
  177. package/src/assets/web-panel/assets/Trust-JQUTjXXI.js +0 -1
  178. package/src/assets/web-panel/assets/community-parser-CO25nZFt.js +0 -3
  179. package/src/assets/web-panel/assets/devWarning-vFgm_Ssk.js +0 -1
  180. package/src/assets/web-panel/assets/index-BGUjPh7h.js +0 -1
  181. package/src/assets/web-panel/assets/index-Cx-wP5XE.js +0 -1
  182. package/src/assets/web-panel/assets/mtc-parser-BbAbUB-9.js +0 -1
@@ -36,8 +36,13 @@ export const _deps = {
36
36
  createServer: (h) => http.createServer(h),
37
37
  openBrowser: defaultOpenBrowser,
38
38
  now: () => Date.now(),
39
+ // Backoff sleep seam (tests override with a no-op so the retry doesn't wait).
40
+ sleep: (ms) => new Promise((resolve) => setTimeout(resolve, ms)),
39
41
  };
40
42
 
43
+ /** Discovery/token requests retry ONCE after a transient error (CC 2.1.191). */
44
+ const MCP_OAUTH_RETRY_BACKOFF_MS = 300;
45
+
41
46
  const base64url = (buf) =>
42
47
  Buffer.from(buf)
43
48
  .toString("base64")
@@ -103,10 +108,29 @@ export function renderCallbackPage(error) {
103
108
  );
104
109
  }
105
110
 
106
- async function fetchJson(url, opts) {
107
- const res = await _deps.fetch(url, opts);
111
+ async function fetchJson(url, opts, attempt = 0) {
112
+ let res;
113
+ try {
114
+ res = await _deps.fetch(url, opts);
115
+ } catch (netErr) {
116
+ // fetch rejected = transient network error → retry once after a short wait
117
+ // (CC 2.1.191: "discovery and token requests now retry once after transient
118
+ // network errors").
119
+ if (attempt < 1) {
120
+ await _deps.sleep(MCP_OAUTH_RETRY_BACKOFF_MS);
121
+ return fetchJson(url, opts, attempt + 1);
122
+ }
123
+ throw netErr;
124
+ }
108
125
  if (!res || !res.ok) {
109
126
  const status = res ? res.status : "no-response";
127
+ // 5xx is transient → retry once. 4xx is permanent — and discovery probes
128
+ // 404s on purpose (it falls through to the next metadata URL), so retrying
129
+ // those would only slow the expected fall-through.
130
+ if (attempt < 1 && typeof status === "number" && status >= 500) {
131
+ await _deps.sleep(MCP_OAUTH_RETRY_BACKOFF_MS);
132
+ return fetchJson(url, opts, attempt + 1);
133
+ }
110
134
  let body = "";
111
135
  try {
112
136
  body = res ? await res.text() : "";
@@ -310,7 +334,10 @@ export function getStoredToken(serverUrl) {
310
334
  // readable. writeFileSync's `mode` only applies when the file is created, so
311
335
  // also chmod (best-effort) to tighten a file an older version left at 0644.
312
336
  function _writeStoreSecure(file, store) {
313
- _deps.fs.mkdirSync(pathDefault.dirname(file), { recursive: true, mode: 0o700 });
337
+ _deps.fs.mkdirSync(pathDefault.dirname(file), {
338
+ recursive: true,
339
+ mode: 0o700,
340
+ });
314
341
  const data = JSON.stringify(store, null, 2) + "\n";
315
342
  // Atomic temp+rename: the store holds live OAuth tokens, so a crash (or a
316
343
  // concurrent `cc mcp login`) mid-write must not truncate it and lose auth for
@@ -326,7 +353,11 @@ function _writeStoreSecure(file, store) {
326
353
  _deps.fs.renameSync(tmp, file);
327
354
  } catch (err) {
328
355
  try {
329
- if (_deps.fs.existsSync && _deps.fs.existsSync(tmp) && _deps.fs.unlinkSync)
356
+ if (
357
+ _deps.fs.existsSync &&
358
+ _deps.fs.existsSync(tmp) &&
359
+ _deps.fs.unlinkSync
360
+ )
330
361
  _deps.fs.unlinkSync(tmp);
331
362
  } catch {
332
363
  /* best-effort temp cleanup */
@@ -161,6 +161,64 @@ export function buildResumeRecap(messages, { previewChars = 160 } = {}) {
161
161
  return lines;
162
162
  }
163
163
 
164
+ /**
165
+ * Snapshot the live conversation so a later `/rewind clear` can restore it
166
+ * (Claude-Code 2.1.191: "/rewind support for resuming a conversation from
167
+ * before /clear was run"). Drops the system prompt (index 0, re-added on
168
+ * restore) and copies the checkpoint marks. Returns null when there is nothing
169
+ * worth stashing (empty conversation) so a no-op /clear can't clobber an
170
+ * existing restorable snapshot.
171
+ *
172
+ * @param {Array} messages
173
+ * @param {Array} [marks]
174
+ * @returns {{messages:Array, marks:Array}|null}
175
+ */
176
+ export function snapshotClearedConversation(messages, marks) {
177
+ const body = (messages || []).slice(1);
178
+ if (body.length === 0) return null;
179
+ return {
180
+ messages: body.slice(),
181
+ marks: Array.isArray(marks) ? marks.slice() : [],
182
+ };
183
+ }
184
+
185
+ /**
186
+ * Restore a conversation stashed by /clear, swapping it IN PLACE with the
187
+ * current (post-clear) conversation so the restore is itself undoable. Keeps
188
+ * `messages[0]` (the system prompt). Returns the new stash (the swapped-out
189
+ * current state, or null when it was empty) plus counts, or null when there is
190
+ * nothing to restore.
191
+ *
192
+ * @param {Array} messages live conversation (index 0 = system prompt, kept)
193
+ * @param {Array} marks live checkpoint marks array (mutated in place)
194
+ * @param {{messages:Array, marks:Array}|null} cleared stash from /clear
195
+ * @returns {{restored:number, stashed:number, newCleared:{messages:Array,marks:Array}|null}|null}
196
+ */
197
+ export function restoreClearedConversation(messages, marks, cleared) {
198
+ if (
199
+ !cleared ||
200
+ !Array.isArray(cleared.messages) ||
201
+ cleared.messages.length === 0
202
+ ) {
203
+ return null;
204
+ }
205
+ const curMsgs = (messages || []).slice(1);
206
+ const curMarks = Array.isArray(marks) ? marks.slice() : [];
207
+ // Replace messages[1..] with the stashed conversation (system prompt kept).
208
+ messages.splice(1, messages.length - 1, ...cleared.messages);
209
+ if (Array.isArray(marks)) {
210
+ marks.splice(0, marks.length, ...(cleared.marks || []));
211
+ }
212
+ const newCleared = curMsgs.length
213
+ ? { messages: curMsgs, marks: curMarks }
214
+ : null;
215
+ return {
216
+ restored: cleared.messages.length,
217
+ stashed: curMsgs.length,
218
+ newCleared,
219
+ };
220
+ }
221
+
164
222
  /** Render the picker list (shared by /rewind and double-Esc). */
165
223
  export function renderTurnList(turns) {
166
224
  if (!turns.length) return " (no user turns yet)";
@@ -248,7 +248,7 @@ const bell = (state, patch = {}) => ({
248
248
  * with line/cursor; `submit:true` ⇒ run the line.
249
249
  */
250
250
  export function feedNormalKey(state, ch, key = {}) {
251
- const s = { ...state, message: null };
251
+ const s = { ...state, message: null, notice: null };
252
252
  const line = s.line;
253
253
 
254
254
  // Enter → submit the line (parity with insert-mode Enter).
@@ -420,6 +420,18 @@ export function feedNormalKey(state, ch, key = {}) {
420
420
  case "t":
421
421
  case "T":
422
422
  return { ...s, awaitChar: { kind: ch }, count: String(count) };
423
+ case "/":
424
+ case "?":
425
+ // cc's NORMAL mode has no prompt-history search (readline owns history in
426
+ // INSERT mode). A user pressing `/` here most likely wants a slash
427
+ // command, so hint how to reach one instead of an opaque bell
428
+ // (Claude-Code 2.1.191: "hint how to reach slash commands").
429
+ return {
430
+ ...s,
431
+ count: "",
432
+ notice:
433
+ "NORMAL /: press i, then type /command (slash commands run in insert mode; history = ↑ or Ctrl-R)",
434
+ };
423
435
  default: {
424
436
  // Pure motions (h l 0 ^ $ w b e) and Backspace/arrows mapped to h/l.
425
437
  let motionCh = ch;
@@ -132,9 +132,18 @@ function compileMatcher(pattern) {
132
132
  /* fall through to wildcard */
133
133
  }
134
134
  }
135
- if (pattern.includes("|")) {
136
- const ms = pattern.split("|").map((p) => compileMatcher(p.trim()));
137
- return (v) => ms.some((m) => m(v));
135
+ // OR-separated alternatives: pipe `Edit|Write` AND comma `Bash,PowerShell`
136
+ // (Claude-Code 2.1.191: comma-separated matchers silently never fired). Empty
137
+ // segments (trailing `Bash,` / `Edit|`) are dropped so they can't collapse to
138
+ // a match-everything matcher. Regex `/…/` matchers are handled above, so a
139
+ // comma inside `{1,3}` is never split here.
140
+ if (pattern.includes("|") || pattern.includes(",")) {
141
+ const ms = pattern
142
+ .split(/[|,]/)
143
+ .map((p) => p.trim())
144
+ .filter(Boolean)
145
+ .map((p) => compileMatcher(p));
146
+ return ms.length ? (v) => ms.some((m) => m(v)) : () => false;
138
147
  }
139
148
  const esc = pattern
140
149
  .replace(/[.+^${}()[\]\\]/g, "\\$&")
@@ -628,6 +628,10 @@ export async function startAgentRepl(options = {}) {
628
628
  // emits `checkpoint` events, so `/rewind <n>` can also restore files to the
629
629
  // snapshot taken before that turn (Claude-Code rewind = code + conversation).
630
630
  const _checkpointMarks = [];
631
+ // Most recent conversation stashed by `/clear`, so `/rewind clear` can bring
632
+ // it back (Claude-Code 2.1.191). Nulled on a context swap so a stash from one
633
+ // session can't be restored into another. { messages, marks } | null.
634
+ let _clearedConversation = null;
631
635
  // Apply --output-style or the settings.json `outputStyle` default at startup.
632
636
  try {
633
637
  const { resolveOutputStyle } = await import("../lib/output-styles.js");
@@ -1150,6 +1154,8 @@ export async function startAgentRepl(options = {}) {
1150
1154
  }
1151
1155
  _vim = res;
1152
1156
  if (res.message === "bell") process.stdout.write("\x07");
1157
+ else if (res.notice)
1158
+ process.stdout.write("\n" + chalk.gray(res.notice) + "\n");
1153
1159
  _vimSync(res);
1154
1160
  return;
1155
1161
  }
@@ -1453,7 +1459,7 @@ export async function startAgentRepl(options = {}) {
1453
1459
  ` ${chalk.cyan("/export")} Save this conversation to a Markdown file (/export [path])`,
1454
1460
  );
1455
1461
  logger.log(
1456
- ` ${chalk.cyan("/rewind")} Rewind conversation + files to an earlier turn (double-Esc lists)`,
1462
+ ` ${chalk.cyan("/rewind")} Rewind to an earlier turn (double-Esc lists); ${chalk.cyan("/rewind clear")} restores a /clear`,
1457
1463
  );
1458
1464
  logger.log(
1459
1465
  ` ${chalk.cyan("/cd <dir>")} Change working directory mid-session (completion/memory follow)`,
@@ -1695,9 +1701,20 @@ export async function startAgentRepl(options = {}) {
1695
1701
  }
1696
1702
 
1697
1703
  if (trimmed === "/clear") {
1704
+ // Stash the conversation first so `/rewind clear` can restore it
1705
+ // (Claude-Code 2.1.191). A no-op /clear (nothing to stash) keeps any
1706
+ // existing restorable snapshot.
1707
+ const { snapshotClearedConversation } =
1708
+ await import("../lib/repl-rewind.js");
1709
+ const snap = snapshotClearedConversation(messages, _checkpointMarks);
1710
+ if (snap) _clearedConversation = snap;
1698
1711
  messages.length = 1; // Keep system prompt
1699
1712
  _checkpointMarks.length = 0; // checkpoint marks no longer map to anything
1700
- logger.info("Conversation cleared");
1713
+ logger.info(
1714
+ snap
1715
+ ? "Conversation cleared — run /rewind clear to restore it"
1716
+ : "Conversation cleared",
1717
+ );
1701
1718
  prompt();
1702
1719
  return;
1703
1720
  }
@@ -1868,8 +1885,32 @@ export async function startAgentRepl(options = {}) {
1868
1885
  renderTurnList,
1869
1886
  pickCheckpointForTurn,
1870
1887
  pruneMarksAfter,
1888
+ restoreClearedConversation,
1871
1889
  } = await import("../lib/repl-rewind.js");
1872
1890
  const arg = trimmed.slice("/rewind".length).trim();
1891
+ if (arg === "clear" || arg === "undo-clear") {
1892
+ // Restore the conversation stashed by /clear (Claude-Code 2.1.191).
1893
+ const r = restoreClearedConversation(
1894
+ messages,
1895
+ _checkpointMarks,
1896
+ _clearedConversation,
1897
+ );
1898
+ if (!r) {
1899
+ logger.error("Nothing to restore — no /clear has been run.");
1900
+ } else {
1901
+ _clearedConversation = r.newCleared;
1902
+ logger.log(
1903
+ chalk.green(
1904
+ `↺ restored ${r.restored} message(s) from before /clear` +
1905
+ (r.stashed
1906
+ ? ` (current ${r.stashed} stashed — /rewind clear swaps back)`
1907
+ : ""),
1908
+ ),
1909
+ );
1910
+ }
1911
+ prompt();
1912
+ return;
1913
+ }
1873
1914
  if (!arg) {
1874
1915
  logger.log(chalk.bold("\nRewind — pick a user turn (newest first):"));
1875
1916
  logger.log(renderTurnList(listUserTurns(messages)));
@@ -1877,6 +1918,13 @@ export async function startAgentRepl(options = {}) {
1877
1918
  ? " (restores files to that point too — checkpoints are on)"
1878
1919
  : " (conversation only — start with --checkpoint / git to also rewind files)";
1879
1920
  logger.log(chalk.gray(`Usage: /rewind <n>${fileHint}`));
1921
+ if (_clearedConversation) {
1922
+ logger.log(
1923
+ chalk.gray(
1924
+ ` /rewind clear — restore the ${_clearedConversation.messages.length} message(s) from before the last /clear`,
1925
+ ),
1926
+ );
1927
+ }
1880
1928
  } else {
1881
1929
  const res = rewindToTurn(messages, arg);
1882
1930
  if (!res) {
@@ -2081,6 +2129,7 @@ export async function startAgentRepl(options = {}) {
2081
2129
  // a later /rewind restore files from the WRONG session's snapshot.
2082
2130
  // Same reset /clear does on a context swap.
2083
2131
  _checkpointMarks.length = 0;
2132
+ _clearedConversation = null; // stash belongs to the swapped-out session
2084
2133
  logger.info(
2085
2134
  `Resumed JSONL session ${sessionId} (${rebuilt.length} messages)`,
2086
2135
  );
@@ -2098,6 +2147,7 @@ export async function startAgentRepl(options = {}) {
2098
2147
  sessionId = existing.id;
2099
2148
  // Drop the prior session's checkpoint marks (see JSONL branch).
2100
2149
  _checkpointMarks.length = 0;
2150
+ _clearedConversation = null; // stash belongs to the swapped-out session
2101
2151
  logger.info(
2102
2152
  `Resumed session ${sessionId} (${parsed.length} messages)`,
2103
2153
  );
@@ -1029,6 +1029,53 @@ export async function executeTool(name, args, context = {}) {
1029
1029
  }
1030
1030
  }
1031
1031
 
1032
+ // Credential READ guard (Claude-Code 2.1.189 parity: `sandbox.credentials`
1033
+ // blocks reads of credential files / secret env vars). cc has no OS sandbox,
1034
+ // so the same intent is enforced at the tool layer: pulling the user's secrets
1035
+ // into model context is a confirm-first action. `read_file` aimed at a
1036
+ // credential file, and `run_shell` commands that cat a credential file or echo
1037
+ // a secret env var, are gated. An explicit settings `allow`/confirmed `ask`
1038
+ // (ruleAllowed) pre-authorizes; headless without a confirmer fails closed;
1039
+ // `CC_CREDENTIAL_GUARD=0` disables it. Unlike --safe-mode (which weakens
1040
+ // customizations), this safety surface stays on under --safe-mode by design.
1041
+ if (!ruleAllowed && (name === "read_file" || name === "run_shell")) {
1042
+ const {
1043
+ credentialFileReason,
1044
+ commandReadsCredentials,
1045
+ credentialGuardDisabled,
1046
+ } = await import("../lib/credential-guard.js");
1047
+ if (!credentialGuardDisabled(process.env)) {
1048
+ let credReason = null;
1049
+ if (name === "read_file" && args?.path) {
1050
+ credReason = credentialFileReason(args.path);
1051
+ } else if (name === "run_shell" && args?.command) {
1052
+ const hit = commandReadsCredentials(args.command);
1053
+ credReason = hit ? hit.reason : null;
1054
+ }
1055
+ if (credReason) {
1056
+ const confirm =
1057
+ context.permissionConfirm || context.shellConfirm || null;
1058
+ const ok =
1059
+ typeof confirm === "function"
1060
+ ? await confirm({
1061
+ tool: name,
1062
+ args,
1063
+ rule: null,
1064
+ reason: `credential access: ${credReason}`,
1065
+ })
1066
+ : false;
1067
+ if (!ok) {
1068
+ const what =
1069
+ name === "read_file" ? `Reading "${args.path}"` : "This command";
1070
+ return {
1071
+ error: `[Credential Guard] ${what} accesses secrets (${credReason}) and requires confirmation — denied. Add a settings allow rule, or set CC_CREDENTIAL_GUARD=0 to bypass.`,
1072
+ policy: { decision: "ask", via: "credential-guard" },
1073
+ };
1074
+ }
1075
+ }
1076
+ }
1077
+ }
1078
+
1032
1079
  // Plan mode: check if tool is allowed (a settings `allow` rule pre-authorizes)
1033
1080
  if (
1034
1081
  planManager.isActive() &&
@@ -2144,8 +2191,19 @@ async function executeToolInner(
2144
2191
  ? `dir /s /b *${args.pattern}* 2>NUL`
2145
2192
  : `find . -name "*${args.pattern}*" -type f 2>/dev/null | head -20`;
2146
2193
 
2194
+ // Credential guard (Claude-Code 2.1.189 parity): a CONTENT search must not
2195
+ // become a side channel that exfils secrets the read_file / run_shell
2196
+ // guards already block. Windows `findstr /n` embeds the matching LINE
2197
+ // (e.g. `API_KEY=…` from a .env); POSIX `grep -l` returns only names. Any
2198
+ // hit whose source is a credential file is redacted to an existence-only
2199
+ // marker — the agent must read_file (confirm-gated) to view it.
2200
+ const { credentialFileReason } = isContent
2201
+ ? await import("../lib/credential-guard.js")
2202
+ : { credentialFileReason: () => null };
2203
+
2147
2204
  const hits = [];
2148
2205
  const seen = new Set();
2206
+ const redactedCreds = new Set();
2149
2207
  for (const root of roots) {
2150
2208
  if (hits.length >= 20) break;
2151
2209
  try {
@@ -2158,6 +2216,16 @@ async function executeToolInner(
2158
2216
  for (const line of output.trim().split("\n")) {
2159
2217
  const v = line.trim();
2160
2218
  if (!v || seen.has(v)) continue;
2219
+ if (isContent) {
2220
+ // content hit is `file:line:text` (findstr /n) or a bare filename
2221
+ // (grep -l); pull the source file and redact credential matches.
2222
+ const src = v.match(/^(.+?):\d+:/)?.[1] ?? v;
2223
+ if (credentialFileReason(src)) {
2224
+ redactedCreds.add(src.replace(/\\/g, "/"));
2225
+ seen.add(v);
2226
+ continue;
2227
+ }
2228
+ }
2161
2229
  // Qualify with the root so multi-root results stay unambiguous.
2162
2230
  const labeled = roots.length > 1 ? `${root}: ${v}` : v;
2163
2231
  seen.add(v);
@@ -2169,6 +2237,14 @@ async function executeToolInner(
2169
2237
  }
2170
2238
  }
2171
2239
 
2240
+ // One existence-only marker per credential file (never its contents).
2241
+ for (const f of redactedCreds) {
2242
+ if (hits.length >= 20) break;
2243
+ hits.push(
2244
+ `<credential file ${f}: matches redacted — use read_file (requires confirmation) to view>`,
2245
+ );
2246
+ }
2247
+
2172
2248
  if (hits.length === 0) {
2173
2249
  return attachDescriptor({ files: [], message: "No matches found" });
2174
2250
  }
@@ -1 +0,0 @@
1
- import{I as b,J as v,U as S,R as r,c as o,K as l,V as p,S as h,o as se,h as re,a as Y,b as Q,r as C,P as u,Q as y,F as z,Z as G}from"./vendor-BvqAck49.js";import{_ as ze,u as de,b as ce,d as f}from"./index-BcRDjaEi.js";import{s as Ie}from"./community-parser-CO25nZFt.js";import ue from"./index-kUeSjyHt.js";import{f as Oe,c as Pe,b2 as Te,aY as Ee,aa as Le,s as Ne,as as je,R as Ue}from"./icons-DP3uiYxy.js";import"./KeyCode-D63Tfrq7.js";import"./omit-DCrBiySU.js";import"./pickAttrs-CcJuqfya.js";import"./initDefaultProps-dsKHYCPH.js";import"./motion-DdPCK2zh.js";import"./raf-Deuc0E8-.js";import"./index-ecThTNhE.js";import"./index-DTxmgfz2.js";import"./isVisible-C7tPsqfj.js";import"./useState-BK4hy8Ma.js";import"./devWarning-vFgm_Ssk.js";import"./compact-item-B9AUAVCQ.js";import"./createContext-CnMJHqHw.js";import"./Compact-D5str1h-.js";import"./_getTag-DnrRH4E6.js";import"./styleChecker-CMuE7NWy.js";import"./zoom-DKNwqG2v.js";import"./ActionButton-Bqvaz1Yj.js";import"./vnode-CXOEebAH.js";function H(t){const a=Ie(t);if(!a)return null;try{return JSON.parse(a)}catch{}const s=a.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!s)return null;try{return JSON.parse(s[0])}catch{return null}}const De=Object.freeze(["P0","P1","P2","P3"]),Me=Object.freeze(["open","acknowledged","resolved","closed"]);function g(t,a=0){return typeof t=="number"&&Number.isFinite(t)?t:a}function Je(t,a=0){if(!t||typeof t!="object")return null;const s=t.id||"";return s?{key:s,id:s,anomalyMetric:t.anomalyMetric??t.anomaly_metric??"",severity:String(t.severity||"P3"),status:String(t.status||"open").toLowerCase(),description:String(t.description||""),anomalyData:t.anomalyData??t.anomaly_data??null,remediationId:t.remediationId??t.remediation_id??null,postmortem:t.postmortem||"",acknowledgedAt:t.acknowledgedAt??t.acknowledged_at??null,resolvedAt:t.resolvedAt??t.resolved_at??null,createdAt:t.createdAt??t.created_at??null,_idx:a}:null}function pe(t){const a=H(t);return Array.isArray(a)?a.map(Je).filter(Boolean):[]}function qe(t,a=0){if(!t||typeof t!="object")return null;const s=t.id||"";if(!s)return null;const e=t.enabled;let P=!1;return e===!0||e===1||e==="1"?P=!0:e===!1||e===0||e==="0"?P=!1:P=!!e,{key:s,id:s,name:String(t.name||""),triggerCondition:t.triggerCondition??t.trigger_condition??"",steps:t.steps||"",enabled:P,successCount:g(t.successCount??t.success_count,0),failureCount:g(t.failureCount??t.failure_count,0),createdAt:t.createdAt??t.created_at??null,_idx:a}}function me(t){const a=H(t);return Array.isArray(a)?a.map(qe).filter(Boolean):[]}function Be(t,a=0){if(!t||typeof t!="object")return null;const s=t.metricName??t.metric_name??"";return s?{key:s,metricName:s,mean:g(t.mean,0),stdDev:g(t.stdDev??t.std_dev,0),q1:g(t.q1,0),q3:g(t.q3,0),sampleCount:g(t.sampleCount??t.sample_count,0),updatedAt:t.updatedAt??t.updated_at??null,_idx:a}:null}function ye(t){const a=H(t);return Array.isArray(a)?a.map(Be).filter(Boolean):[]}function fe(t){const a=H(t);return!a||typeof a!="object"||Array.isArray(a)?null:{anomaly:!!a.anomaly,reason:a.reason||null,metricName:a.metricName??a.metric_name??"",value:g(a.value,0),algorithm:String(a.algorithm||""),score:g(a.score,0),threshold:g(a.threshold,0),baseline:a.baseline?{mean:g(a.baseline.mean,0),stdDev:g(a.baseline.stdDev??a.baseline.std_dev,0),q1:g(a.baseline.q1,0),q3:g(a.baseline.q3,0)}:null,incidentId:a.incidentId??a.incident_id??null,severity:a.severity||null}}const Ve={incidents:{total:0,bySeverity:{P0:0,P1:0,P2:0,P3:0},byStatus:{open:0,acknowledged:0,resolved:0,closed:0},avgResolveMs:0},playbooks:{total:0,enabled:0,totalSuccess:0,totalFailure:0},baselines:{total:0,metrics:[]}};function be(t){const a=JSON.parse(JSON.stringify(Ve)),s=H(t);if(!s||typeof s!="object"||Array.isArray(s))return a;if(s.incidents&&typeof s.incidents=="object"){if(a.incidents.total=g(s.incidents.total,0),a.incidents.avgResolveMs=g(s.incidents.avgResolveMs??s.incidents.avg_resolve_ms,0),s.incidents.bySeverity&&typeof s.incidents.bySeverity=="object")for(const e of Object.keys(a.incidents.bySeverity))a.incidents.bySeverity[e]=g(s.incidents.bySeverity[e],0);if(s.incidents.byStatus&&typeof s.incidents.byStatus=="object")for(const e of Object.keys(a.incidents.byStatus))a.incidents.byStatus[e]=g(s.incidents.byStatus[e],0)}return s.playbooks&&typeof s.playbooks=="object"&&(a.playbooks.total=g(s.playbooks.total,0),a.playbooks.enabled=g(s.playbooks.enabled,0),a.playbooks.totalSuccess=g(s.playbooks.totalSuccess??s.playbooks.total_success,0),a.playbooks.totalFailure=g(s.playbooks.totalFailure??s.playbooks.total_failure,0)),s.baselines&&typeof s.baselines=="object"&&(a.baselines.total=g(s.baselines.total,0),Array.isArray(s.baselines.metrics)&&(a.baselines.metrics=[...s.baselines.metrics])),a}function Ke(t){if(t==null||t==="")return"—";const a=typeof t=="number"?new Date(t):new Date(String(t));return isNaN(a.getTime())?String(t):a.toLocaleString("zh-CN",{hour12:!1})}const Qe={__name:"AIOps",setup(t,{expose:a}){a();const s=de(),{t:e}=ce(),P=C(!1),N=C(!1),w=C(!1),j=C([]),X=C([]),$=C([]),D=C({incidents:{total:0,bySeverity:{P0:0,P1:0,P2:0,P3:0},byStatus:{open:0,acknowledged:0,resolved:0,closed:0},avgResolveMs:0},playbooks:{total:0,enabled:0,totalSuccess:0,totalFailure:0},baselines:{total:0,metrics:[]}}),I=C("incidents"),A=C(""),T=C(""),Z=C(!1),R=C(!1),O=C(!1),q=C(!1),x=Y({severity:"P3",metric:"",description:""}),_=Y({name:"",triggerJson:"",stepsJson:""}),M=Y({metric:"",values:""}),U=Y({metric:"",value:null,algorithm:"z_score"}),J=C(null),ee=Q(()=>[{title:e("aiops.incidentCols.severity"),key:"severity",width:"90px"},{title:e("aiops.incidentCols.metric"),key:"metric",width:"160px"},{title:e("aiops.incidentCols.description"),key:"description"},{title:e("aiops.incidentCols.status"),key:"status",width:"100px"},{title:e("aiops.incidentCols.createdAt"),key:"createdAt",width:"160px"},{title:e("aiops.incidentCols.action"),key:"action",width:"220px"}]),F=Q(()=>[{title:e("aiops.playbookCols.name"),key:"name"},{title:e("aiops.playbookCols.enabled"),key:"enabled",width:"80px"},{title:e("aiops.playbookCols.stats"),key:"stats",width:"180px"},{title:e("aiops.playbookCols.createdAt"),key:"createdAt",width:"160px"},{title:e("aiops.playbookCols.action"),key:"action",width:"160px"}]),W=Q(()=>[{title:e("aiops.baselineCols.metric"),key:"metric"},{title:e("aiops.baselineCols.mean"),key:"mean",width:"180px"},{title:e("aiops.baselineCols.iqr"),key:"iqr",width:"180px"},{title:e("aiops.baselineCols.sampleCount"),key:"sampleCount",width:"90px"},{title:e("aiops.baselineCols.updatedAt"),key:"updatedAt",width:"160px"}]),B=Q(()=>D.value.incidents.byStatus.open+D.value.incidents.byStatus.acknowledged),V=Q(()=>{let n=j.value;return A.value&&(n=n.filter(d=>d.severity===A.value)),T.value&&(n=n.filter(d=>d.status===T.value)),n});function K(n){const d=`aiops.statusLabels.${n}`,m=e(d);return m===d?n:m}function ae(n){return{open:"red",acknowledged:"orange",resolved:"cyan",closed:"default"}[n]||"default"}function i(n){return{P0:"red",P1:"volcano",P2:"orange",P3:"gold"}[n]||"default"}function c(n){const d=`aiops.reasonLabels.${n}`,m=e(d);return m===d?n:m}function E(n,d){return n?n.length>d?n.slice(0,d)+"...":n:""}function ve(n){return!n||n<=0?e("aiops.duration.none"):n<1e3?`${n}ms`:n<6e4?`${(n/1e3).toFixed(1)}s`:n<36e5?`${(n/6e4).toFixed(1)}min`:`${(n/36e5).toFixed(1)}h`}function ge({key:n}){n==="incident"?Z.value=!0:n==="playbook"?R.value=!0:n==="baseline"?O.value=!0:n==="detect"&&(J.value=null,q.value=!0)}async function L(){P.value=!0;try{const[n,d,m,k]=await Promise.all([s.execute("ops incidents --limit 200 --json",1e4).catch(()=>({output:""})),s.execute("ops playbooks --limit 200 --json",1e4).catch(()=>({output:""})),s.execute("ops baselines --json",1e4).catch(()=>({output:""})),s.execute("ops stats --json",8e3).catch(()=>({output:""}))]);j.value=pe(n.output),X.value=me(d.output),$.value=ye(m.output),D.value=be(k.output)}catch(n){f.error(e("aiops.msg.loadFailed")+": "+(n?.message||n))}finally{P.value=!1}}async function ke(){if(!x.description.trim()){f.warning(e("aiops.msg.descEmpty"));return}N.value=!0;try{const n=[`ops incident-create --severity ${x.severity}`];x.metric.trim()&&n.push(`--metric "${x.metric.trim().replace(/"/g,'\\"')}"`),n.push(`--description "${x.description.trim().replace(/"/g,'\\"')}"`),n.push("--json");const{output:d}=await s.execute(n.join(" "),1e4);if(/error|失败/i.test(d)&&!/"incidentId"/.test(d)){f.error(e("aiops.msg.createFailed")+": "+d.slice(0,120));return}f.success(e("aiops.msg.incidentCreated")),Z.value=!1,oe(),await L()}catch(n){f.error(e("aiops.msg.createFailed")+": "+(n?.message||n))}finally{N.value=!1}}async function _e(){if(!_.name.trim()){f.warning(e("aiops.msg.playbookNameEmpty"));return}for(const[n,d]of[[_.triggerJson,"triggerLabel"],[_.stepsJson,"stepsLabel"]])if(n.trim())try{JSON.parse(n)}catch{f.warning(e("aiops.msg.jsonInvalid",{label:e(`aiops.msg.${d}`)}));return}N.value=!0;try{const n=[`ops playbook-create --name "${_.name.trim().replace(/"/g,'\\"')}"`];_.triggerJson.trim()&&n.push(`--trigger '${_.triggerJson.trim().replace(/'/g,"'\\''")}'`),_.stepsJson.trim()&&n.push(`--steps '${_.stepsJson.trim().replace(/'/g,"'\\''")}'`),n.push("--json");const{output:d}=await s.execute(n.join(" "),1e4);if(/error|失败/i.test(d)&&!/"playbookId"/.test(d)){f.error(e("aiops.msg.createFailed")+": "+d.slice(0,120));return}f.success(e("aiops.msg.playbookCreated")),R.value=!1,le(),I.value="playbooks",await L()}catch(n){f.error(e("aiops.msg.createFailed")+": "+(n?.message||n))}finally{N.value=!1}}async function he(){const n=M.metric.trim();if(!n){f.warning(e("aiops.msg.metricEmpty"));return}const d=M.values.split(/[\s,]+/).map(m=>m.trim()).filter(Boolean).map(m=>Number(m));if(d.length===0||d.some(m=>!Number.isFinite(m))){f.warning(e("aiops.msg.valuesInvalid"));return}N.value=!0;try{const m=`ops baseline-update "${n.replace(/"/g,'\\"')}" --values ${d.join(",")} --json`,{output:k}=await s.execute(m,1e4);if(/error|失败/i.test(k)&&!/"updated"/.test(k)){f.error(e("aiops.msg.baselineUpdateFailed")+": "+k.slice(0,120));return}f.success(e("aiops.msg.baselineUpdated",{n:d.length})),O.value=!1,ie(),I.value="baselines",await L()}catch(m){f.error(e("aiops.msg.baselineUpdateFailed")+": "+(m?.message||m))}finally{N.value=!1}}async function Ce(){if(!U.metric||U.value==null){f.warning(e("aiops.msg.detectFieldsEmpty"));return}w.value=!0,J.value=null;try{const n=`ops detect "${U.metric.replace(/"/g,'\\"')}" ${U.value} --algorithm ${U.algorithm} --json`,{output:d}=await s.execute(n,8e3),m=fe(d);if(!m){f.error(e("aiops.msg.detectFailed")+": "+d.slice(0,120));return}J.value=m,m.anomaly&&(f.warning(e("aiops.msg.detectAnomaly",{severity:m.severity||"P3"})),L())}catch(n){f.error(e("aiops.msg.detectFailed")+": "+(n?.message||n))}finally{w.value=!1}}async function Se(n){await te(n,"incident-ack",e("aiops.msg.incidentAcked"))}async function xe(n){await te(n,"incident-resolve",e("aiops.msg.incidentResolved"))}async function Fe(n){await te(n,"incident-close",e("aiops.msg.incidentClosed"))}async function te(n,d,m){try{const{output:k}=await s.execute(`ops ${d} ${n.id} --json`,8e3);if(/error|失败|invalid/i.test(k)&&!/"acknowledged"|"resolved"|"closed"/.test(k)){f.error(e("aiops.msg.incidentTransitionFailed")+": "+k.slice(0,120));return}f.success(m),await L()}catch(k){f.error(e("aiops.msg.incidentTransitionFailed")+": "+(k?.message||k))}}async function we(n){try{const{output:d}=await s.execute(`ops postmortem ${n.id}`,12e3);ue.info({title:e("aiops.msg.postmortemTitle",{id:n.id.slice(0,8)}),width:720,content:()=>re("pre",{style:"white-space: pre-wrap; max-height: 60vh; overflow: auto; font-size: 12px; padding: 8px; background: rgba(0,0,0,.04); border-radius: 4px;"},d||e("aiops.msg.postmortemEmpty"))})}catch(d){f.error(e("aiops.msg.postmortemFailed")+": "+(d?.message||d))}}async function Ae(n,d){const m=d?"on":"off";try{const{output:k}=await s.execute(`ops playbook-toggle ${n.id} ${m} --json`,8e3);if(/error|失败/i.test(k)&&!/"enabled"/.test(k)){f.error(e("aiops.msg.playbookToggleFailed")+": "+k.slice(0,120));return}f.success(e(d?"aiops.msg.playbookEnabled":"aiops.msg.playbookDisabled")),await L()}catch(k){f.error(e("aiops.msg.playbookToggleFailed")+": "+(k?.message||k))}}async function Re(n,d){try{const{output:m}=await s.execute(`ops playbook-record ${n.id} ${d} --json`,8e3);if(/error|失败/i.test(m)&&!/"recorded"/.test(m)){f.error(e("aiops.msg.playbookRecordFailed")+": "+m.slice(0,120));return}f.success(e(d==="success"?"aiops.msg.playbookRecordSuccess":"aiops.msg.playbookRecordFailure")),await L()}catch(m){f.error(e("aiops.msg.playbookRecordFailed")+": "+(m?.message||m))}}function oe(){x.severity="P3",x.metric="",x.description=""}function le(){_.name="",_.triggerJson="",_.stepsJson=""}function ie(){M.metric="",M.values=""}se(L);const ne={ws:s,t:e,loading:P,creating:N,detecting:w,incidents:j,playbooks:X,baselines:$,stats:D,activeTab:I,incidentSeverityFilter:A,incidentStatusFilter:T,showIncidentModal:Z,showPlaybookModal:R,showBaselineModal:O,showDetectModal:q,incidentForm:x,playbookForm:_,baselineForm:M,detectForm:U,detectResult:J,incidentColumns:ee,playbookColumns:F,baselineColumns:W,openCount:B,filteredIncidents:V,statusLabel:K,statusColor:ae,severityColor:i,reasonLabel:c,truncate:E,formatDurationMs:ve,handleNewClick:ge,loadAll:L,createIncident:ke,createPlaybook:_e,updateBaseline:he,detectAnomaly:Ce,ackIncident:Se,resolveIncident:xe,closeIncident:Fe,runIncidentTransition:te,generatePostmortem:we,togglePlaybook:Ae,recordRun:Re,resetIncidentForm:oe,resetPlaybookForm:le,resetBaselineForm:ie,ref:C,computed:Q,onMounted:se,reactive:Y,h:re,get ReloadOutlined(){return Ue},get PlusOutlined(){return je},get AlertOutlined(){return Ne},get RocketOutlined(){return Le},get LineChartOutlined(){return Ee},get FundOutlined(){return Te},get ExclamationCircleOutlined(){return Pe},get CheckCircleOutlined(){return Oe},get message(){return f},get Modal(){return ue},get useI18n(){return ce},get useWsStore(){return de},get parseIncidents(){return pe},get parsePlaybooks(){return me},get parseBaselines(){return ye},get parseDetectResult(){return fe},get parseStats(){return be},get formatOpsTime(){return Ke},get SEVERITIES(){return De},get INCIDENT_STATUSES(){return Me}};return Object.defineProperty(ne,"__isScriptSetup",{enumerable:!1,value:!0}),ne}},Ze={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},We={class:"page-title"},Ye={class:"page-sub"},Ge={style:{color:"var(--text-secondary)","font-size":"12px","margin-left":"8px"}},He={class:"filter-bar"},Xe={key:0,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px"}},$e={key:1,style:{color:"var(--text-muted)"}},et={key:2,style:{color:"var(--text-secondary)","font-size":"12px"}},tt={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},at={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},ot={style:{color:"var(--text-primary)","font-weight":"500"}},lt={key:0,style:{color:"var(--text-secondary)","font-size":"11px","margin-top":"2px","font-family":"monospace"}},it={key:3,style:{color:"var(--text-secondary)","font-size":"11px"}},nt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},st={key:0,style:{color:"var(--text-primary)","font-family":"monospace","font-weight":"500"}},rt={style:{color:"#1677ff"}},dt={style:{color:"var(--text-secondary)","margin-left":"4px","font-size":"11px"}},ct={key:2,style:{color:"var(--text-secondary)","font-size":"12px"}},ut={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},pt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},mt={key:0,style:{color:"var(--text-secondary)","font-size":"12px","margin-top":"8px"}},yt={key:1,style:{"margin-top":"12px","font-size":"12px",color:"var(--text-secondary)"}},ft={key:2,style:{"margin-top":"8px"}};function bt(t,a,s,e,P,N){const w=b("a-button"),j=b("a-menu-item"),X=b("a-menu"),$=b("a-dropdown"),D=b("a-space"),I=b("a-statistic"),A=b("a-card"),T=b("a-col"),Z=b("a-row"),R=b("a-tag"),O=b("a-radio-button"),q=b("a-radio-group"),x=b("a-table"),_=b("a-tab-pane"),M=b("a-switch"),U=b("a-tabs"),J=b("a-select-option"),ee=b("a-select"),F=b("a-form-item"),W=b("a-input"),B=b("a-textarea"),V=b("a-form"),K=b("a-modal"),ae=b("a-input-number");return u(),v("div",null,[S("div",Ze,[S("div",null,[S("h2",We,r(t.$t("aiops.title")),1),S("p",Ye,r(t.$t("aiops.subtitle")),1)]),o(D,null,{default:l(()=>[o(w,{loading:e.loading,onClick:e.loadAll},{icon:l(()=>[o(e.ReloadOutlined)]),default:l(()=>[y(" "+r(t.$t("aiops.refresh")),1)]),_:1},8,["loading"]),o($,{trigger:["click"]},{overlay:l(()=>[o(X,{onClick:e.handleNewClick},{default:l(()=>[o(j,{key:"incident"},{default:l(()=>[o(e.AlertOutlined),y(" "+r(t.$t("aiops.actions.incident")),1)]),_:1}),o(j,{key:"playbook"},{default:l(()=>[o(e.RocketOutlined),y(" "+r(t.$t("aiops.actions.playbook")),1)]),_:1}),o(j,{key:"baseline"},{default:l(()=>[o(e.LineChartOutlined),y(" "+r(t.$t("aiops.actions.baseline")),1)]),_:1}),o(j,{key:"detect"},{default:l(()=>[o(e.FundOutlined),y(" "+r(t.$t("aiops.actions.detect")),1)]),_:1})]),_:1})]),default:l(()=>[o(w,{type:"primary"},{icon:l(()=>[o(e.PlusOutlined)]),default:l(()=>[y(" "+r(t.$t("aiops.newDropdown")),1)]),_:1})]),_:1})]),_:1})]),p(" Stats overview "),o(Z,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:l(()=>[o(T,{xs:12,sm:8,lg:5},{default:l(()=>[o(A,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[o(I,{title:t.$t("aiops.stats.incidents"),value:e.stats.incidents.total,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:l(()=>[o(e.AlertOutlined)]),_:1},8,["title","value"])]),_:1})]),_:1}),o(T,{xs:12,sm:8,lg:5},{default:l(()=>[o(A,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[o(I,{title:t.$t("aiops.stats.pending"),value:e.stats.incidents.byStatus.open+e.stats.incidents.byStatus.acknowledged,"value-style":{color:e.openCount>0?"#ff4d4f":"#52c41a",fontSize:"20px"}},{prefix:l(()=>[o(e.ExclamationCircleOutlined)]),_:1},8,["title","value","value-style"])]),_:1})]),_:1}),o(T,{xs:12,sm:8,lg:5},{default:l(()=>[o(A,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[o(I,{title:t.$t("aiops.stats.playbooks"),value:e.stats.playbooks.total,"value-style":{color:"#722ed1",fontSize:"20px"}},{prefix:l(()=>[o(e.RocketOutlined)]),_:1},8,["title","value"])]),_:1})]),_:1}),o(T,{xs:12,sm:8,lg:5},{default:l(()=>[o(A,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[o(I,{title:t.$t("aiops.stats.enabled"),value:e.stats.playbooks.enabled,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:l(()=>[o(e.CheckCircleOutlined)]),_:1},8,["title","value"])]),_:1})]),_:1}),o(T,{xs:24,sm:8,lg:4},{default:l(()=>[o(A,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[o(I,{title:t.$t("aiops.stats.baselines"),value:e.stats.baselines.total,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:l(()=>[o(e.LineChartOutlined)]),_:1},8,["title","value"])]),_:1})]),_:1})]),_:1}),p(" Severity breakdown bar "),e.stats.incidents.total>0?(u(),h(A,{key:0,title:t.$t("aiops.severityCard"),size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"},"body-style":{padding:"12px 16px"}},{default:l(()=>[o(D,{size:[12,8],wrap:""},{default:l(()=>[(u(!0),v(z,null,G(e.SEVERITIES,i=>(u(),h(R,{key:i,color:e.severityColor(i),style:{"font-size":"13px",padding:"2px 10px"}},{default:l(()=>[y(r(i)+": "+r(e.stats.incidents.bySeverity[i]||0),1)]),_:2},1032,["color"]))),128)),S("span",Ge,r(t.$t("aiops.avgResolveLabel",{time:e.formatDurationMs(e.stats.incidents.avgResolveMs)})),1)]),_:1})]),_:1},8,["title"])):p("v-if",!0),p(" Tabs "),o(U,{activeKey:e.activeTab,"onUpdate:activeKey":a[2]||(a[2]=i=>e.activeTab=i),class:"aiops-tabs"},{default:l(()=>[p(" ── Incidents tab ─────────────────────────────────────────── "),o(_,{key:"incidents",tab:t.$t("aiops.tabs.incidents")},{default:l(()=>[S("div",He,[o(q,{value:e.incidentSeverityFilter,"onUpdate:value":a[0]||(a[0]=i=>e.incidentSeverityFilter=i),size:"small","button-style":"solid"},{default:l(()=>[o(O,{value:""},{default:l(()=>[y(r(t.$t("aiops.filter.all")),1)]),_:1}),(u(!0),v(z,null,G(e.SEVERITIES,i=>(u(),h(O,{key:i,value:i},{default:l(()=>[y(r(i),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),o(q,{value:e.incidentStatusFilter,"onUpdate:value":a[1]||(a[1]=i=>e.incidentStatusFilter=i),size:"small"},{default:l(()=>[o(O,{value:""},{default:l(()=>[y(r(t.$t("aiops.filter.allStatuses")),1)]),_:1}),(u(!0),v(z,null,G(e.INCIDENT_STATUSES,i=>(u(),h(O,{key:i,value:i},{default:l(()=>[y(r(e.statusLabel(i)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),o(x,{columns:e.incidentColumns,"data-source":e.filteredIncidents,pagination:{pageSize:20,showTotal:i=>t.$t("aiops.table.totalSuffix",{n:i})},size:"small",loading:e.loading,style:{background:"var(--bg-card)"}},{bodyCell:l(({column:i,record:c})=>[i.key==="severity"?(u(),h(R,{key:0,color:e.severityColor(c.severity),style:{"font-weight":"600"}},{default:l(()=>[y(r(c.severity),1)]),_:2},1032,["color"])):p("v-if",!0),i.key==="metric"?(u(),v(z,{key:1},[c.anomalyMetric?(u(),v("span",Xe,r(c.anomalyMetric),1)):(u(),v("span",$e,"—"))],64)):p("v-if",!0),i.key==="description"?(u(),v("span",et,r(e.truncate(c.description,80)||"—"),1)):p("v-if",!0),i.key==="status"?(u(),h(R,{key:3,color:e.statusColor(c.status)},{default:l(()=>[y(r(e.statusLabel(c.status)),1)]),_:2},1032,["color"])):p("v-if",!0),i.key==="createdAt"?(u(),v("span",tt,r(e.formatOpsTime(c.createdAt)),1)):p("v-if",!0),i.key==="action"?(u(),v(z,{key:5},[c.status==="open"?(u(),h(w,{key:0,size:"small",type:"link",onClick:E=>e.ackIncident(c)},{default:l(()=>[y(r(t.$t("aiops.incidentActions.ack")),1)]),_:1},8,["onClick"])):p("v-if",!0),c.status==="open"||c.status==="acknowledged"?(u(),h(w,{key:1,size:"small",type:"link",onClick:E=>e.resolveIncident(c)},{default:l(()=>[y(r(t.$t("aiops.incidentActions.resolve")),1)]),_:1},8,["onClick"])):p("v-if",!0),c.status==="resolved"?(u(),h(w,{key:2,size:"small",type:"link",onClick:E=>e.closeIncident(c)},{default:l(()=>[y(r(t.$t("aiops.incidentActions.close")),1)]),_:1},8,["onClick"])):p("v-if",!0),c.status==="resolved"||c.status==="closed"?(u(),h(w,{key:3,size:"small",type:"link",onClick:E=>e.generatePostmortem(c)},{default:l(()=>[y(r(t.$t("aiops.incidentActions.postmortem")),1)]),_:1},8,["onClick"])):p("v-if",!0)],64)):p("v-if",!0)]),emptyText:l(()=>[S("div",at,[o(e.AlertOutlined,{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),y(" "+r(e.incidentSeverityFilter||e.incidentStatusFilter?t.$t("aiops.table.incidentEmptyFiltered"):t.$t("aiops.table.incidentEmpty")),1)])]),_:1},8,["columns","data-source","pagination","loading"])]),_:1},8,["tab"]),p(" ── Playbooks tab ─────────────────────────────────────────── "),o(_,{key:"playbooks",tab:t.$t("aiops.tabs.playbooks")},{default:l(()=>[o(x,{columns:e.playbookColumns,"data-source":e.playbooks,pagination:{pageSize:20,showTotal:i=>t.$t("aiops.table.totalSuffix",{n:i})},size:"small",loading:e.loading,style:{background:"var(--bg-card)"}},{bodyCell:l(({column:i,record:c})=>[i.key==="name"?(u(),v(z,{key:0},[S("span",ot,r(c.name),1),c.triggerCondition?(u(),v("div",lt,r(e.truncate(c.triggerCondition,80)),1)):p("v-if",!0)],64)):p("v-if",!0),i.key==="enabled"?(u(),h(M,{key:1,checked:c.enabled,size:"small",onChange:E=>e.togglePlaybook(c,E)},null,8,["checked","onChange"])):p("v-if",!0),i.key==="stats"?(u(),v(z,{key:2},[o(R,{color:"green",style:{"font-size":"11px"}},{default:l(()=>[y(r(t.$t("aiops.table.successCount",{n:c.successCount})),1)]),_:2},1024),c.failureCount>0?(u(),h(R,{key:0,color:"red",style:{"font-size":"11px","margin-left":"4px"}},{default:l(()=>[y(r(t.$t("aiops.table.failureCount",{n:c.failureCount})),1)]),_:2},1024)):p("v-if",!0)],64)):p("v-if",!0),i.key==="createdAt"?(u(),v("span",it,r(e.formatOpsTime(c.createdAt)),1)):p("v-if",!0),i.key==="action"?(u(),v(z,{key:4},[o(w,{size:"small",type:"link",onClick:E=>e.recordRun(c,"success")},{default:l(()=>[y(r(t.$t("aiops.playbookActions.success")),1)]),_:1},8,["onClick"]),o(w,{size:"small",type:"link",danger:"",onClick:E=>e.recordRun(c,"failure")},{default:l(()=>[y(r(t.$t("aiops.playbookActions.failure")),1)]),_:1},8,["onClick"])],64)):p("v-if",!0)]),emptyText:l(()=>[S("div",nt,[o(e.RocketOutlined,{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),y(" "+r(t.$t("aiops.table.playbookEmpty")),1)])]),_:1},8,["columns","data-source","pagination","loading"])]),_:1},8,["tab"]),p(" ── Baselines tab ─────────────────────────────────────────── "),o(_,{key:"baselines",tab:t.$t("aiops.tabs.baselines")},{default:l(()=>[o(x,{columns:e.baselineColumns,"data-source":e.baselines,pagination:{pageSize:20,showTotal:i=>t.$t("aiops.table.totalSuffix",{n:i})},size:"small",loading:e.loading,style:{background:"var(--bg-card)"}},{bodyCell:l(({column:i,record:c})=>[i.key==="metric"?(u(),v("span",st,r(c.metricName),1)):p("v-if",!0),i.key==="mean"?(u(),v(z,{key:1},[S("span",rt,r(c.mean),1),S("span",dt,"σ "+r(c.stdDev),1)],64)):p("v-if",!0),i.key==="iqr"?(u(),v("span",ct," Q1 "+r(c.q1)+" / Q3 "+r(c.q3),1)):p("v-if",!0),i.key==="sampleCount"?(u(),h(R,{key:3,color:"blue",style:{"font-size":"11px"}},{default:l(()=>[y(r(c.sampleCount),1)]),_:2},1024)):p("v-if",!0),i.key==="updatedAt"?(u(),v("span",ut,r(e.formatOpsTime(c.updatedAt)),1)):p("v-if",!0)]),emptyText:l(()=>[S("div",pt,[o(e.LineChartOutlined,{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),y(" "+r(t.$t("aiops.table.baselineEmpty")),1)])]),_:1},8,["columns","data-source","pagination","loading"])]),_:1},8,["tab"])]),_:1},8,["activeKey"]),p(" ── Create incident modal ─────────────────────────────────── "),o(K,{open:e.showIncidentModal,"onUpdate:open":a[6]||(a[6]=i=>e.showIncidentModal=i),title:t.$t("aiops.incident_modal.title"),"confirm-loading":e.creating,width:520,"ok-text":t.$t("aiops.incident_modal.ok"),"cancel-text":t.$t("aiops.incident_modal.cancel"),onOk:e.createIncident,onCancel:e.resetIncidentForm},{default:l(()=>[o(V,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:l(()=>[o(F,{label:t.$t("aiops.incident_modal.severityLabel")},{default:l(()=>[o(ee,{value:e.incidentForm.severity,"onUpdate:value":a[3]||(a[3]=i=>e.incidentForm.severity=i)},{default:l(()=>[(u(!0),v(z,null,G(e.SEVERITIES,i=>(u(),h(J,{key:i,value:i},{default:l(()=>[y(r(i),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1},8,["label"]),o(F,{label:t.$t("aiops.incident_modal.metricLabel")},{default:l(()=>[o(W,{value:e.incidentForm.metric,"onUpdate:value":a[4]||(a[4]=i=>e.incidentForm.metric=i),placeholder:t.$t("aiops.incident_modal.metricPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),o(F,{label:t.$t("aiops.incident_modal.descLabel"),required:""},{default:l(()=>[o(B,{value:e.incidentForm.description,"onUpdate:value":a[5]||(a[5]=i=>e.incidentForm.description=i),"auto-size":{minRows:3,maxRows:6}},null,8,["value"])]),_:1},8,["label"])]),_:1})]),_:1},8,["open","title","confirm-loading","ok-text","cancel-text"]),p(" ── Create playbook modal ─────────────────────────────────── "),o(K,{open:e.showPlaybookModal,"onUpdate:open":a[10]||(a[10]=i=>e.showPlaybookModal=i),title:t.$t("aiops.playbook_modal.title"),"confirm-loading":e.creating,width:540,"ok-text":t.$t("aiops.playbook_modal.ok"),"cancel-text":t.$t("aiops.playbook_modal.cancel"),onOk:e.createPlaybook,onCancel:e.resetPlaybookForm},{default:l(()=>[o(V,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:l(()=>[o(F,{label:t.$t("aiops.playbook_modal.nameLabel"),required:""},{default:l(()=>[o(W,{value:e.playbookForm.name,"onUpdate:value":a[7]||(a[7]=i=>e.playbookForm.name=i),placeholder:t.$t("aiops.playbook_modal.namePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),o(F,{label:t.$t("aiops.playbook_modal.triggerLabel")},{default:l(()=>[o(B,{value:e.playbookForm.triggerJson,"onUpdate:value":a[8]||(a[8]=i=>e.playbookForm.triggerJson=i),placeholder:t.$t("aiops.playbook_modal.triggerPlaceholder"),"auto-size":{minRows:2,maxRows:4}},null,8,["value","placeholder"])]),_:1},8,["label"]),o(F,{label:t.$t("aiops.playbook_modal.stepsLabel")},{default:l(()=>[o(B,{value:e.playbookForm.stepsJson,"onUpdate:value":a[9]||(a[9]=i=>e.playbookForm.stepsJson=i),placeholder:t.$t("aiops.playbook_modal.stepsPlaceholder"),"auto-size":{minRows:3,maxRows:6}},null,8,["value","placeholder"])]),_:1},8,["label"])]),_:1})]),_:1},8,["open","title","confirm-loading","ok-text","cancel-text"]),p(" ── Update baseline modal ─────────────────────────────────── "),o(K,{open:e.showBaselineModal,"onUpdate:open":a[13]||(a[13]=i=>e.showBaselineModal=i),title:t.$t("aiops.baseline_modal.title"),"confirm-loading":e.creating,width:500,"ok-text":t.$t("aiops.baseline_modal.ok"),"cancel-text":t.$t("aiops.baseline_modal.cancel"),onOk:e.updateBaseline,onCancel:e.resetBaselineForm},{default:l(()=>[o(V,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:l(()=>[o(F,{label:t.$t("aiops.baseline_modal.metricLabel"),required:""},{default:l(()=>[o(W,{value:e.baselineForm.metric,"onUpdate:value":a[11]||(a[11]=i=>e.baselineForm.metric=i),placeholder:t.$t("aiops.baseline_modal.metricPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),o(F,{label:t.$t("aiops.baseline_modal.valuesLabel"),required:""},{default:l(()=>[o(B,{value:e.baselineForm.values,"onUpdate:value":a[12]||(a[12]=i=>e.baselineForm.values=i),placeholder:t.$t("aiops.baseline_modal.valuesPlaceholder"),"auto-size":{minRows:3,maxRows:8}},null,8,["value","placeholder"])]),_:1},8,["label"])]),_:1})]),_:1},8,["open","title","confirm-loading","ok-text","cancel-text"]),p(" ── Detect anomaly modal ──────────────────────────────────── "),o(K,{open:e.showDetectModal,"onUpdate:open":a[17]||(a[17]=i=>e.showDetectModal=i),title:t.$t("aiops.detect_modal.title"),"confirm-loading":e.detecting,width:500,"ok-text":t.$t("aiops.detect_modal.ok"),"cancel-text":t.$t("aiops.detect_modal.cancel"),onOk:e.detectAnomaly},{default:l(()=>[o(V,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:l(()=>[o(F,{label:t.$t("aiops.detect_modal.metricLabel"),required:""},{default:l(()=>[o(ee,{value:e.detectForm.metric,"onUpdate:value":a[14]||(a[14]=i=>e.detectForm.metric=i),"show-search":"",placeholder:t.$t("aiops.detect_modal.metricPlaceholder")},{default:l(()=>[(u(!0),v(z,null,G(e.baselines,i=>(u(),h(J,{key:i.metricName,value:i.metricName},{default:l(()=>[y(r(t.$t("aiops.detect_modal.metricOptionLabel",{name:i.metricName,count:i.sampleCount})),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value","placeholder"])]),_:1},8,["label"]),o(F,{label:t.$t("aiops.detect_modal.valueLabel"),required:""},{default:l(()=>[o(ae,{value:e.detectForm.value,"onUpdate:value":a[15]||(a[15]=i=>e.detectForm.value=i),style:{width:"100%"}},null,8,["value"])]),_:1},8,["label"]),o(F,{label:t.$t("aiops.detect_modal.algorithmLabel")},{default:l(()=>[o(q,{value:e.detectForm.algorithm,"onUpdate:value":a[16]||(a[16]=i=>e.detectForm.algorithm=i)},{default:l(()=>[o(O,{value:"z_score"},{default:l(()=>[...a[18]||(a[18]=[y("Z-Score (3σ)",-1)])]),_:1}),o(O,{value:"iqr"},{default:l(()=>[...a[19]||(a[19]=[y("IQR (1.5×)",-1)])]),_:1})]),_:1},8,["value"])]),_:1},8,["label"])]),_:1}),e.detectResult?(u(),h(A,{key:0,size:"small",style:{background:"var(--bg-base)","margin-top":"8px"}},{default:l(()=>[o(I,{title:t.$t("aiops.detect_modal.resultTitle"),value:e.detectResult.anomaly?t.$t("aiops.detect_modal.anomaly"):t.$t("aiops.detect_modal.normal"),"value-style":{color:e.detectResult.anomaly?"#ff4d4f":"#52c41a"}},null,8,["title","value","value-style"]),e.detectResult.reason&&!e.detectResult.anomaly?(u(),v("div",mt,r(t.$t("aiops.detect_modal.reasonLine",{reason:e.reasonLabel(e.detectResult.reason)})),1)):p("v-if",!0),e.detectResult.baseline?(u(),v("div",yt,[S("div",null,r(t.$t("aiops.detect_modal.scoreLine",{score:e.detectResult.score,threshold:e.detectResult.threshold})),1),S("div",null,r(t.$t("aiops.detect_modal.baselineLine",{mean:e.detectResult.baseline.mean,stdDev:e.detectResult.baseline.stdDev})),1)])):p("v-if",!0),e.detectResult.incidentId?(u(),v("div",ft,[o(R,{color:e.severityColor(e.detectResult.severity)},{default:l(()=>[y(r(t.$t("aiops.detect_modal.incidentCreated",{severity:e.detectResult.severity})),1)]),_:1},8,["color"])])):p("v-if",!0)]),_:1})):p("v-if",!0)]),_:1},8,["open","title","confirm-loading","ok-text","cancel-text"])])}const Jt=ze(Qe,[["render",bt],["__scopeId","data-v-b804918b"],["__file","/tmp/cc-web-panel-heolxZ/repo/packages/web-panel/src/views/AIOps.vue"]]);export{Jt as default};
@@ -1 +0,0 @@
1
- import{I as m,J as f,U as b,R as c,c as o,K as e,V as y,S as h,o as tt,b as J,r as x,P as d,Q as _,F as T,Z as V,$ as xt}from"./vendor-BvqAck49.js";import{_ as Lt,b as et,u as at,d as A}from"./index-BcRDjaEi.js";import{u as ot}from"./useFs-srxzzfG_.js";import{s as nt}from"./community-parser-CO25nZFt.js";import{s as St,am as Ct,f as Tt,d as Et,m as Ot,az as At,R as wt}from"./icons-DP3uiYxy.js";import"./useShellMode-CgR0wCYM.js";function it(n){const i=nt(n);if(!i)return null;try{return JSON.parse(i)}catch{}const r=i.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!r)return null;try{return JSON.parse(r[0])}catch{return null}}const st=Object.freeze(["auth","permission","data","system","file","did","crypto","api"]),ct=Object.freeze(["low","medium","high","critical"]);function q(n,i=0){return typeof n=="number"&&Number.isFinite(n)?n:i}function Q(n){if(!n)return{noDb:!1,error:""};const i=nt(n),r=/Database not available/i.test(i);return{noDb:r,error:r?"Database not available":""}}function Rt(n,i=0){if(!n||typeof n!="object")return null;const r=n.id||"";if(!r)return null;let t=n.details;if(typeof t=="string"&&t)try{t=JSON.parse(t)}catch{}const L=typeof n.success=="boolean"?n.success:n.success===1||n.success==="1"||n.success===!0,M=n.audit_mtc_event_id??n.auditMtcEventId??null;return{key:r,id:r,eventType:String(n.event_type??n.eventType??"").toLowerCase(),operation:String(n.operation||""),actor:n.actor??"",target:n.target??"",details:t??null,riskLevel:String(n.risk_level??n.riskLevel??"low").toLowerCase(),ipAddress:n.ip_address??n.ipAddress??"",userAgent:n.user_agent??n.userAgent??"",success:L,errorMessage:n.error_message??n.errorMessage??"",createdAt:n.created_at??n.createdAt??"",auditMtcEventId:M,_idx:i}}function rt(n){const i=it(n);return Array.isArray(i)?i.map(Rt).filter(Boolean):[]}const zt={total:0,failures:0,highRisk:0,byEventType:{},byRiskLevel:{}};function lt(n){const i=JSON.parse(JSON.stringify(zt));for(const t of st)i.byEventType[t]=0;for(const t of ct)i.byRiskLevel[t]=0;const r=it(n);if(!r||typeof r!="object"||Array.isArray(r))return i;if(i.total=q(r.total,0),i.failures=q(r.failures,0),i.highRisk=q(r.highRisk,0),r.byEventType&&typeof r.byEventType=="object")for(const[t,L]of Object.entries(r.byEventType))typeof L=="number"&&Number.isFinite(L)&&(i.byEventType[t]=L);if(r.byRiskLevel&&typeof r.byRiskLevel=="object")for(const[t,L]of Object.entries(r.byRiskLevel))typeof L=="number"&&Number.isFinite(L)&&(i.byRiskLevel[t]=L);return i}function It(n){return!n||!n.auditMtcEventId?"none":"tracked"}function Mt(n){if(n==null||n==="")return"—";const i=String(n),r=i.includes(" ")&&!i.includes("T")?i.replace(" ","T")+"Z":i,t=new Date(r);return isNaN(t.getTime())?i:t.toLocaleString("zh-CN",{hour12:!1})}const Dt={__name:"Audit",setup(n,{expose:i}){i();const{t:r}=et(),t=at(),L=ot(),M=x(!1),w=x([]),E=x({total:0,failures:0,highRisk:0,byEventType:{},byRiskLevel:{}}),N=x({noDb:!1,error:""}),R=x("events"),S=x(""),p=x(""),O=x(""),v=x(""),F=x(!1),z=x(!1),j=x(null),U=J(()=>[{title:r("audit.logColumns.createdAt"),key:"createdAt",width:"160px"},{title:r("audit.logColumns.eventType"),key:"eventType",width:"110px"},{title:r("audit.logColumns.operation"),key:"operation"},{title:r("audit.logColumns.actor"),key:"actor",width:"140px"},{title:r("audit.logColumns.target"),key:"target",width:"180px"},{title:r("audit.logColumns.riskLevel"),key:"riskLevel",width:"90px"},{title:r("audit.logColumns.success"),key:"success",width:"80px"},{title:r("audit.logColumns.mtc"),key:"mtc",width:"110px"},{title:r("audit.logColumns.action"),key:"action",width:"80px"}]),I=x({});function D(a){return a.auditMtcEventId&&I.value[a.id]||null}function B(a){const s=D(a);return s?s.state==="staging"?r("audit.mtc.stagingLabel"):s.state==="batched"?r("audit.mtc.batchedLabel",{batchId:s.batchId||"?"}):r("audit.mtc.unknownLabel"):r("audit.mtc.signedNotChecked")}function P(a){const s=D(a);return s?s.state==="staging"?"orange":s.state==="batched"?"green":"default":"blue"}function W(a){if(!a.auditMtcEventId)return"";const s=D(a),u=r("audit.mtc.tooltipBase",{id:a.auditMtcEventId});return s?s.state==="staging"?r("audit.mtc.tooltipStaging",{base:u}):s.state==="batched"?r("audit.mtc.tooltipBatched",{base:u,batchId:s.batchId,treeHead:s.treeHeadId||""}):u:r("audit.mtc.tooltipNotChecked",{base:u})}async function k(a){if(!a.auditMtcEventId)return;const s=a.auditMtcEventId.replace(/"/g,'\\"');try{const u=await t.execute(`audit mtc reconcile-check "${s}" --json`,8e3);let C;try{C=JSON.parse(u.output.trim())}catch{const $=u.output.match(/\{[\s\S]*\}/);C=$?JSON.parse($[0]):null}if(!C){A.warning(r("audit.mtc.noJson"));return}const ht=C.found?{state:"batched",batchId:C.batchId,treeHeadId:C.treeHeadId}:C.staging?{state:"staging"}:{state:"unknown"};I.value={...I.value,[a.id]:ht}}catch(u){A.error(r("audit.mtc.checkFailed",{err:u?.message||u}))}}const Y=J(()=>E.value.total?(E.value.total-E.value.failures)/E.value.total*100:100),H=J(()=>!!(p.value||O.value||v.value||F.value)),l=J(()=>{let a=w.value;if(O.value&&(a=a.filter(s=>s.eventType===O.value)),v.value&&(a=a.filter(s=>s.riskLevel===v.value)),F.value&&(a=a.filter(s=>!s.success)),p.value){const s=p.value.toLowerCase();a=a.filter(u=>(u.operation||"").toLowerCase().includes(s)||(u.actor||"").toLowerCase().includes(s)||(u.target||"").toLowerCase().includes(s))}return a});function g(a){const s=`audit.type.${a}`,u=r(s);return u===s?a:u}function Z(a){return{auth:"blue",permission:"purple",data:"cyan",system:"default",file:"green",did:"gold",crypto:"magenta",api:"volcano"}[a]||"default"}function dt(a){return{auth:"#1677ff",permission:"#722ed1",data:"#13c2c2",system:"#888",file:"#52c41a",did:"#faad14",crypto:"#eb2f96",api:"#fa541c"}[a]||"#888"}function ut(a){const s=`audit.risk.${a}`,u=r(s);return u===s?a:u}function ft(a){return{low:"default",medium:"gold",high:"orange",critical:"red"}[a]||"default"}function yt(a){return{low:"#888",medium:"#faad14",high:"#fa8c16",critical:"#ff4d4f"}[a]||"#888"}function gt(a,s){return s?Math.round(a/s*100):0}function _t(a,s){return a?a.length<=s?a:a.slice(0,s)+"…":""}function mt(a){if(typeof a=="string")return a;try{return JSON.stringify(a,null,2)}catch{return String(a)}}let K=null;function bt(){clearTimeout(K),K=setTimeout(()=>{p.value=S.value.trim()},300)}function vt(){p.value=S.value.trim()}async function G(){M.value=!0,N.value={noDb:!1,error:""};try{const[a,s]=await Promise.all([t.execute("audit log --json -n 200",12e3).catch(()=>({output:""})),t.execute("audit stats --json",8e3).catch(()=>({output:""}))]),u=[a,s].map(C=>Q(C.output)).find(C=>C.noDb);u&&(N.value=u),w.value=rt(a.output),E.value=lt(s.output)}catch(a){A.error(r("audit.messages.loadFailed",{err:a?.message||a}))}finally{M.value=!1}}function pt(a){j.value=a,z.value=!0}async function kt(){try{const{output:a}=await t.execute("audit export -f json -n 10000",2e4);if(Q(a).noDb){A.error(r("audit.messages.needInit"));return}if(!a.trim().startsWith("[")){A.error(r("audit.messages.exportFailed",{err:a.slice(0,120)}));return}const u=await L.saveText(a.trim(),{defaultPath:`audit-${new Date().toISOString().slice(0,10)}.json`,filters:[{name:"JSON",extensions:["json"]}]});if(u.canceled)return;A.success(u.path?r("audit.messages.exportOk",{path:u.path}):r("audit.messages.exportOkDefault"))}catch(a){A.error(r("audit.messages.exportFailed",{err:a?.message||a}))}}tt(G);const X={t:r,ws:t,fs:L,loading:M,logs:w,stats:E,errorState:N,activeTab:R,searchInput:S,searchTerm:p,typeFilter:O,riskFilter:v,failuresOnly:F,showDetailsModal:z,currentLog:j,logColumns:U,mtcStatusCache:I,getMtcStatusEntry:D,getMtcLabel:B,getMtcColor:P,getMtcTooltip:W,checkMtcStatus:k,successRate:Y,hasFilters:H,filteredLogs:l,typeLabel:g,typeColor:Z,typeBarColor:dt,riskLabel:ut,riskColor:ft,riskBarColor:yt,pctOfTotal:gt,truncate:_t,formatDetails:mt,get searchDebounce(){return K},set searchDebounce(a){K=a},onSearchInput:bt,runSearch:vt,loadAll:G,viewLogDetails:pt,exportJson:kt,ref:x,computed:J,onMounted:tt,get useI18n(){return et},get ReloadOutlined(){return wt},get DownloadOutlined(){return At},get FileSearchOutlined(){return Ot},get CloseCircleOutlined(){return Et},get CheckCircleOutlined(){return Tt},get WarningOutlined(){return Ct},get AlertOutlined(){return St},get message(){return A},get useWsStore(){return at},get useFs(){return ot},get parseLogs(){return rt},get parseStats(){return lt},get detectAuditError(){return Q},get formatAuditTime(){return Mt},get classifyMtcStatus(){return It},get EVENT_TYPES(){return st},get RISK_LEVELS(){return ct}};return Object.defineProperty(X,"__isScriptSetup",{enumerable:!1,value:!0}),X}},Nt={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Ft={class:"page-title"},jt={class:"page-sub"},Jt={class:"type-name"},Vt={class:"type-count"},Bt={class:"filter-bar"},Pt={key:0,style:{color:"var(--text-secondary)","font-size":"11px","font-family":"monospace"}},Kt={style:{color:"var(--text-primary)","font-weight":"500","font-family":"monospace","font-size":"12px"}},Ut={key:0,style:{color:"#ff4d4f","font-size":"11px","margin-top":"2px"}},Wt={key:0,style:{color:"var(--text-secondary)","font-size":"12px"}},Yt={key:1,style:{color:"var(--text-muted)"}},Ht={key:0,style:{color:"var(--text-secondary)","font-size":"12px","font-family":"monospace"}},Zt={key:1,style:{color:"var(--text-muted)"}},qt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},Qt={key:0,style:{"padding-top":"8px"}},Gt={style:{"font-family":"monospace","font-size":"12px"}},Xt={style:{"margin-left":"8px",color:"var(--text-secondary)","font-size":"12px"}},$t={style:{"font-family":"monospace"}},te={key:0,style:{"font-family":"monospace","font-size":"12px"}},ee={key:1,style:{color:"var(--text-muted)"}},ae={key:0,style:{"font-family":"monospace","font-size":"12px"}},oe={key:1,style:{color:"var(--text-muted)"}},re={style:{"font-family":"monospace","font-size":"12px"}},le={style:{"font-family":"monospace","font-size":"11px"}},ne={style:{color:"#ff4d4f"}},ie={class:"details-pre"};function se(n,i,r,t,L,M){const w=m("a-button"),E=m("a-space"),N=m("a-alert"),R=m("a-statistic"),S=m("a-card"),p=m("a-col"),O=m("a-row"),v=m("a-tag"),F=m("a-input-search"),z=m("a-radio-button"),j=m("a-radio-group"),U=m("a-checkbox"),I=m("a-tooltip"),D=m("a-table"),B=m("a-tab-pane"),P=m("a-progress"),W=m("a-tabs"),k=m("a-descriptions-item"),Y=m("a-descriptions"),H=m("a-modal");return d(),f("div",null,[b("div",Nt,[b("div",null,[b("h2",Ft,c(t.t("audit.title")),1),b("p",jt,c(t.t("audit.subtitle")),1)]),o(E,null,{default:e(()=>[o(w,{loading:t.loading,onClick:t.loadAll},{icon:e(()=>[o(t.ReloadOutlined)]),default:e(()=>[_(" "+c(t.t("audit.refresh")),1)]),_:1},8,["loading"]),o(w,{onClick:t.exportJson},{icon:e(()=>[o(t.DownloadOutlined)]),default:e(()=>[_(" "+c(t.t("audit.exportJson")),1)]),_:1})]),_:1})]),y(" noDb banner "),t.errorState.noDb?(d(),h(N,{key:0,type:"info","show-icon":"",message:t.t("audit.noDb.message"),description:t.t("audit.noDb.description"),style:{"margin-bottom":"16px"}},null,8,["message","description"])):y("v-if",!0),y(" Stat cards "),o(O,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:e(()=>[o(p,{xs:12,sm:8,lg:5},{default:e(()=>[o(S,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:e(()=>[o(R,{title:t.t("audit.stats.total"),value:t.stats.total,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:e(()=>[o(t.FileSearchOutlined)]),_:1},8,["title","value"])]),_:1})]),_:1}),o(p,{xs:12,sm:8,lg:5},{default:e(()=>[o(S,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:e(()=>[o(R,{title:t.t("audit.stats.failures"),value:t.stats.failures,"value-style":{color:t.stats.failures>0?"#ff4d4f":"#52c41a",fontSize:"20px"}},{prefix:e(()=>[o(t.CloseCircleOutlined)]),_:1},8,["title","value","value-style"])]),_:1})]),_:1}),o(p,{xs:12,sm:8,lg:5},{default:e(()=>[o(S,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:e(()=>[o(R,{title:t.t("audit.stats.highRisk"),value:t.stats.highRisk,"value-style":{color:t.stats.highRisk>0?"#fa8c16":"#52c41a",fontSize:"20px"}},{prefix:e(()=>[o(t.WarningOutlined)]),_:1},8,["title","value","value-style"])]),_:1})]),_:1}),o(p,{xs:12,sm:8,lg:5},{default:e(()=>[o(S,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:e(()=>[o(R,{title:t.t("audit.stats.critical"),value:t.stats.byRiskLevel.critical||0,"value-style":{color:(t.stats.byRiskLevel.critical||0)>0?"#ff4d4f":"#888",fontSize:"20px"}},{prefix:e(()=>[o(t.AlertOutlined)]),_:1},8,["title","value","value-style"])]),_:1})]),_:1}),o(p,{xs:24,sm:8,lg:4},{default:e(()=>[o(S,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:e(()=>[o(R,{title:t.t("audit.stats.successRate"),value:t.successRate,suffix:"%",precision:1,"value-style":{color:t.successRate>=95?"#52c41a":t.successRate>=80?"#faad14":"#ff4d4f",fontSize:"20px"}},{prefix:e(()=>[o(t.CheckCircleOutlined)]),_:1},8,["title","value","value-style"])]),_:1})]),_:1})]),_:1}),y(" Event type catalogue "),o(S,{title:t.t("audit.typeCatalogueTitle"),size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"},"body-style":{padding:"12px 16px"}},{default:e(()=>[o(O,{gutter:[12,12]},{default:e(()=>[(d(!0),f(T,null,V(t.EVENT_TYPES,l=>(d(),h(p,{key:l,xs:12,sm:8,lg:3},{default:e(()=>[b("div",{class:"type-pill",style:xt({borderLeftColor:t.typeBarColor(l)})},[o(v,{color:t.typeColor(l),style:{"font-family":"monospace","font-size":"11px"}},{default:e(()=>[_(c(l),1)]),_:2},1032,["color"]),b("div",Jt,c(t.typeLabel(l)),1),b("div",Vt,c(t.stats.byEventType[l]||0),1)],4)]),_:2},1024))),128))]),_:1})]),_:1},8,["title"]),y(" Tabs "),o(W,{activeKey:t.activeTab,"onUpdate:activeKey":i[4]||(i[4]=l=>t.activeTab=l),class:"audit-tabs"},{default:e(()=>[y(" ── Events tab ──────────────────────────────────────────── "),o(B,{key:"events",tab:t.t("audit.tabs.events")},{default:e(()=>[b("div",Bt,[o(F,{value:t.searchInput,"onUpdate:value":i[0]||(i[0]=l=>t.searchInput=l),placeholder:t.t("audit.filter.searchPlaceholder"),"allow-clear":"",style:{"max-width":"280px"},onSearch:t.runSearch,onInput:t.onSearchInput},null,8,["value","placeholder"]),o(j,{value:t.typeFilter,"onUpdate:value":i[1]||(i[1]=l=>t.typeFilter=l),size:"small","button-style":"solid"},{default:e(()=>[o(z,{value:""},{default:e(()=>[_(c(t.t("audit.filter.allTypes")),1)]),_:1}),(d(!0),f(T,null,V(t.EVENT_TYPES,l=>(d(),h(z,{key:l,value:l},{default:e(()=>[_(c(t.typeLabel(l)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),o(j,{value:t.riskFilter,"onUpdate:value":i[2]||(i[2]=l=>t.riskFilter=l),size:"small"},{default:e(()=>[o(z,{value:""},{default:e(()=>[_(c(t.t("audit.filter.allRisks")),1)]),_:1}),(d(!0),f(T,null,V(t.RISK_LEVELS,l=>(d(),h(z,{key:l,value:l},{default:e(()=>[_(c(t.riskLabel(l)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),o(U,{checked:t.failuresOnly,"onUpdate:checked":i[3]||(i[3]=l=>t.failuresOnly=l)},{default:e(()=>[_(c(t.t("audit.filter.failuresOnly")),1)]),_:1},8,["checked"])]),o(D,{columns:t.logColumns,"data-source":t.filteredLogs,pagination:{pageSize:20,showTotal:l=>t.t("audit.totals.rows",{count:l})},size:"small",loading:t.loading,style:{background:"var(--bg-card)"}},{bodyCell:e(({column:l,record:g})=>[l.key==="createdAt"?(d(),f("span",Pt,c(t.formatAuditTime(g.createdAt)),1)):y("v-if",!0),l.key==="eventType"?(d(),h(v,{key:1,color:t.typeColor(g.eventType),style:{"font-family":"monospace"}},{default:e(()=>[_(c(g.eventType),1)]),_:2},1032,["color"])):y("v-if",!0),l.key==="operation"?(d(),f(T,{key:2},[b("span",Kt,c(g.operation),1),g.errorMessage?(d(),f("div",Ut,c(g.errorMessage),1)):y("v-if",!0)],64)):y("v-if",!0),l.key==="actor"?(d(),f(T,{key:3},[g.actor?(d(),f("span",Wt,c(g.actor),1)):(d(),f("span",Yt,"—"))],64)):y("v-if",!0),l.key==="target"?(d(),f(T,{key:4},[g.target?(d(),f("span",Ht,c(t.truncate(g.target,32)),1)):(d(),f("span",Zt,"—"))],64)):y("v-if",!0),l.key==="riskLevel"?(d(),h(v,{key:5,color:t.riskColor(g.riskLevel)},{default:e(()=>[_(c(t.riskLabel(g.riskLevel)),1)]),_:2},1032,["color"])):y("v-if",!0),l.key==="success"?(d(),h(v,{key:6,color:g.success?"green":"red"},{default:e(()=>[_(c(g.success?"OK":"FAIL"),1)]),_:2},1032,["color"])):y("v-if",!0),l.key==="mtc"?(d(),f(T,{key:7},[t.classifyMtcStatus(g)==="none"?(d(),h(I,{key:0,title:t.t("audit.mtc.noneTooltip")},{default:e(()=>[o(v,{color:"default"},{default:e(()=>[...i[6]||(i[6]=[_("—",-1)])]),_:1})]),_:1},8,["title"])):(d(),h(I,{key:1,title:t.getMtcTooltip(g)},{default:e(()=>[o(v,{color:t.getMtcColor(g),style:{cursor:"pointer"},onClick:Z=>t.checkMtcStatus(g)},{default:e(()=>[_(c(t.getMtcLabel(g)),1)]),_:2},1032,["color","onClick"])]),_:2},1032,["title"]))],64)):y("v-if",!0),l.key==="action"?(d(),h(w,{key:8,size:"small",type:"link",onClick:Z=>t.viewLogDetails(g)},{default:e(()=>[_(c(t.t("audit.rowAction.details")),1)]),_:1},8,["onClick"])):y("v-if",!0)]),emptyText:e(()=>[b("div",qt,[o(t.FileSearchOutlined,{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),_(" "+c(t.hasFilters?t.t("audit.empty.filtered"):t.t("audit.empty.noEvents")),1)])]),_:1},8,["columns","data-source","pagination","loading"])]),_:1},8,["tab"]),y(" ── Breakdown tab ───────────────────────────────────────── "),o(B,{key:"breakdown",tab:t.t("audit.tabs.breakdown")},{default:e(()=>[o(O,{gutter:[16,16]},{default:e(()=>[o(p,{xs:24,lg:12},{default:e(()=>[o(S,{title:t.t("audit.breakdown.byType"),size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:e(()=>[(d(!0),f(T,null,V(t.EVENT_TYPES,l=>(d(),f("div",{key:l,class:"bd-row"},[o(v,{color:t.typeColor(l),style:{"min-width":"80px","text-align":"center","font-family":"monospace"}},{default:e(()=>[_(c(l),1)]),_:2},1032,["color"]),o(P,{percent:t.pctOfTotal(t.stats.byEventType[l]||0,t.stats.total),"stroke-color":t.typeBarColor(l),format:()=>`${t.stats.byEventType[l]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))]),_:1},8,["title"])]),_:1}),o(p,{xs:24,lg:12},{default:e(()=>[o(S,{title:t.t("audit.breakdown.byRisk"),size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:e(()=>[(d(!0),f(T,null,V(t.RISK_LEVELS,l=>(d(),f("div",{key:l,class:"bd-row"},[o(v,{color:t.riskColor(l),style:{"min-width":"80px","text-align":"center"}},{default:e(()=>[_(c(t.riskLabel(l)),1)]),_:2},1032,["color"]),o(P,{percent:t.pctOfTotal(t.stats.byRiskLevel[l]||0,t.stats.total),"stroke-color":t.riskBarColor(l),format:()=>`${t.stats.byRiskLevel[l]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))]),_:1},8,["title"])]),_:1})]),_:1})]),_:1},8,["tab"])]),_:1},8,["activeKey"]),y(" ── Event details modal ─────────────────────────────────── "),o(H,{open:t.showDetailsModal,"onUpdate:open":i[5]||(i[5]=l=>t.showDetailsModal=l),title:t.t("audit.details.title",{id:t.currentLog?.id?.slice(0,8)||""}),width:720,footer:null},{default:e(()=>[t.currentLog?(d(),f("div",Qt,[o(Y,{column:2,size:"small",bordered:""},{default:e(()=>[o(k,{label:t.t("audit.details.id"),span:2},{default:e(()=>[b("span",Gt,c(t.currentLog.id),1)]),_:1},8,["label"]),o(k,{label:t.t("audit.details.eventType")},{default:e(()=>[o(v,{color:t.typeColor(t.currentLog.eventType),style:{"font-family":"monospace"}},{default:e(()=>[_(c(t.currentLog.eventType),1)]),_:1},8,["color"]),b("span",Xt,c(t.typeLabel(t.currentLog.eventType)),1)]),_:1},8,["label"]),o(k,{label:t.t("audit.details.riskLevel")},{default:e(()=>[o(v,{color:t.riskColor(t.currentLog.riskLevel)},{default:e(()=>[_(c(t.riskLabel(t.currentLog.riskLevel)),1)]),_:1},8,["color"])]),_:1},8,["label"]),o(k,{label:t.t("audit.details.operation"),span:2},{default:e(()=>[b("span",$t,c(t.currentLog.operation),1)]),_:1},8,["label"]),o(k,{label:t.t("audit.details.status")},{default:e(()=>[o(v,{color:t.currentLog.success?"green":"red"},{default:e(()=>[_(c(t.currentLog.success?t.t("audit.details.success"):t.t("audit.details.failure")),1)]),_:1},8,["color"])]),_:1},8,["label"]),o(k,{label:t.t("audit.details.time")},{default:e(()=>[_(c(t.formatAuditTime(t.currentLog.createdAt)),1)]),_:1},8,["label"]),o(k,{label:t.t("audit.details.actor")},{default:e(()=>[t.currentLog.actor?(d(),f("span",te,c(t.currentLog.actor),1)):(d(),f("span",ee,"—"))]),_:1},8,["label"]),o(k,{label:t.t("audit.details.target")},{default:e(()=>[t.currentLog.target?(d(),f("span",ae,c(t.currentLog.target),1)):(d(),f("span",oe,"—"))]),_:1},8,["label"]),t.currentLog.ipAddress?(d(),h(k,{key:0,label:t.t("audit.details.ip")},{default:e(()=>[b("span",re,c(t.currentLog.ipAddress),1)]),_:1},8,["label"])):y("v-if",!0),t.currentLog.userAgent?(d(),h(k,{key:1,label:t.t("audit.details.userAgent")},{default:e(()=>[b("span",le,c(t.currentLog.userAgent),1)]),_:1},8,["label"])):y("v-if",!0),t.currentLog.errorMessage?(d(),h(k,{key:2,label:t.t("audit.details.errorMessage"),span:2},{default:e(()=>[b("span",ne,c(t.currentLog.errorMessage),1)]),_:1},8,["label"])):y("v-if",!0),t.currentLog.details?(d(),h(k,{key:3,label:t.t("audit.details.details"),span:2},{default:e(()=>[b("pre",ie,c(t.formatDetails(t.currentLog.details)),1)]),_:1},8,["label"])):y("v-if",!0)]),_:1})])):y("v-if",!0)]),_:1},8,["open","title"])])}const _e=Lt(Dt,[["render",se],["__scopeId","data-v-be9f4fc3"],["__file","/tmp/cc-web-panel-heolxZ/repo/packages/web-panel/src/views/Audit.vue"]]);export{_e as default};