chainlesschain 0.162.124 → 0.162.125

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 (237) 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-DcqNhZhA.js +1 -0
  4. package/src/assets/web-panel/assets/{ActionButton-COjZZKWG.js → ActionButton-BigtmPoq.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-4ZDZE7lc.js → Analytics-1J_X_HF4.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-CYH5k2Rp.js → AppLayout-DlcDG_a_.js} +5 -5
  7. package/src/assets/web-panel/assets/Audit-Do-y8_3w.js +1 -0
  8. package/src/assets/web-panel/assets/{Backup-CiX61Qc2.js → Backup-S2Df-50Y.js} +1 -1
  9. package/src/assets/web-panel/assets/{BaseInput-CDxIQokd.js → BaseInput-D5kgWJfk.js} +1 -1
  10. package/src/assets/web-panel/assets/{Chat-CaKgdRab.js → Chat-aUcp3kN1.js} +5 -5
  11. package/src/assets/web-panel/assets/ChatBubbleRenderer-Pg7dIsiE.js +1 -0
  12. package/src/assets/web-panel/assets/{Checkbox-CjiWfu4s.js → Checkbox-DTg1U7Xs.js} +1 -1
  13. package/src/assets/web-panel/assets/Codegen-YO9ZZ4Ky.js +1 -0
  14. package/src/assets/web-panel/assets/{Col-ZKWREyNs.js → Col-BHonE9fU.js} +1 -1
  15. package/src/assets/web-panel/assets/Community-DA2AlEFh.js +1 -0
  16. package/src/assets/web-panel/assets/{Compact-DqknM98n.js → Compact-DULxLRNg.js} +1 -1
  17. package/src/assets/web-panel/assets/Compliance-BZqfuuZL.js +1 -0
  18. package/src/assets/web-panel/assets/{Cowork-Dp29kHsC.js → Cowork-CJe3vyMS.js} +2 -2
  19. package/src/assets/web-panel/assets/{Cron-zmEJAetz.js → Cron-CeV8AtRu.js} +2 -2
  20. package/src/assets/web-panel/assets/Crosschain-CAg66zS5.js +1 -0
  21. package/src/assets/web-panel/assets/{DID-D_UFNzJ5.js → DID-Dtup5JZm.js} +2 -2
  22. package/src/assets/web-panel/assets/Dashboard-DAR_8PNy.js +3 -0
  23. package/src/assets/web-panel/assets/{Dropdown-CH7l3KCs.js → Dropdown-K5bTaCYN.js} +1 -1
  24. package/src/assets/web-panel/assets/{EmailListRenderer-Bud2M3XX.js → EmailListRenderer-C890uErx.js} +1 -1
  25. package/src/assets/web-panel/assets/{FamilyGuardDashboard-Bd2_8uME.js → FamilyGuardDashboard-B-Tj_8yM.js} +1 -1
  26. package/src/assets/web-panel/assets/Federation-C6WZ98ni.js +1 -0
  27. package/src/assets/web-panel/assets/{FormItemContext-CpSH464Y.js → FormItemContext-D-LTfGWd.js} +1 -1
  28. package/src/assets/web-panel/assets/{GenericCardRenderer-CANo8O-y.js → GenericCardRenderer-C80DK4W7.js} +1 -1
  29. package/src/assets/web-panel/assets/{Git-hvuZVoD3.js → Git-Cjvvv3zW.js} +2 -2
  30. package/src/assets/web-panel/assets/Governance-C0BND77H.js +1 -0
  31. package/src/assets/web-panel/assets/Inference-BL9kTtSu.js +1 -0
  32. package/src/assets/web-panel/assets/KnowledgeGraph-CnVTBmJf.js +1 -0
  33. package/src/assets/web-panel/assets/{Logs-DDkTnedu.js → Logs-CbCbg7K6.js} +2 -2
  34. package/src/assets/web-panel/assets/Marketplace-CG5On-fH.js +1 -0
  35. package/src/assets/web-panel/assets/{McpTools-Qx78XyOT.js → McpTools-AYYDZZK7.js} +5 -5
  36. package/src/assets/web-panel/assets/{Memory-CXYDO1oT.js → Memory-tMWbMDQq.js} +2 -2
  37. package/src/assets/web-panel/assets/MobileBridge-BAOsf4wB.js +1 -0
  38. package/src/assets/web-panel/assets/{MobileProjects-DEDbWNIk.js → MobileProjects-BT-2komQ.js} +1 -1
  39. package/src/assets/web-panel/assets/{Mtc-Dwa_vlR8.js → Mtc-BFwfC63n.js} +5 -5
  40. package/src/assets/web-panel/assets/{MtcAudit-DAVkxhJv.js → MtcAudit-DYG3CWdH.js} +4 -4
  41. package/src/assets/web-panel/assets/{Multisig-C3upmgPN.js → Multisig-KJwd0yWT.js} +3 -3
  42. package/src/assets/web-panel/assets/NLProgramming-BmL5dNWm.js +1 -0
  43. package/src/assets/web-panel/assets/{Notes-B1Oy3FbC.js → Notes-DmkaVaMc.js} +4 -4
  44. package/src/assets/web-panel/assets/{NotificationSettings-Bs4-Fc6b.js → NotificationSettings-tmVQszDZ.js} +1 -1
  45. package/src/assets/web-panel/assets/{OrderTableRenderer-CEy1pIeq.js → OrderTableRenderer-BtrR7anf.js} +1 -1
  46. package/src/assets/web-panel/assets/{Organization-D4cJ1UNo.js → Organization-pppktQyW.js} +4 -4
  47. package/src/assets/web-panel/assets/{Overflow-fdzvlF7x.js → Overflow-D3lBoQDA.js} +1 -1
  48. package/src/assets/web-panel/assets/{P2P-Y13PwXBA.js → P2P-BgE2qGlZ.js} +2 -2
  49. package/src/assets/web-panel/assets/PdhVaultBrowser-D26Bz5gS.js +7 -0
  50. package/src/assets/web-panel/assets/{Permissions-CvEXP6LC.js → Permissions-BR8no2Xe.js} +3 -3
  51. package/src/assets/web-panel/assets/{PersonalDataHub-JeP7IWMW.js → PersonalDataHub-DabbyQEF.js} +3 -3
  52. package/src/assets/web-panel/assets/Pipeline-n4sNpEz8.js +1 -0
  53. package/src/assets/web-panel/assets/Privacy-CGNp4n8M.js +1 -0
  54. package/src/assets/web-panel/assets/{ProjectInit-DeWd9UcS.js → ProjectInit-CAVA5VsX.js} +2 -2
  55. package/src/assets/web-panel/assets/{ProjectSettings-DUpVuU9F.js → ProjectSettings-GCgkfM7A.js} +2 -2
  56. package/src/assets/web-panel/assets/Projects-BYK17p52.js +1 -0
  57. package/src/assets/web-panel/assets/{Providers-DECW00ek.js → Providers-DpUT5W-d.js} +1 -1
  58. package/src/assets/web-panel/assets/{QuickAsk-Dl-pK9Io.js → QuickAsk-ZJxTb7vi.js} +1 -1
  59. package/src/assets/web-panel/assets/Recommend-CIzFRDk1.js +1 -0
  60. package/src/assets/web-panel/assets/Reputation-lQ_WDNZn.js +1 -0
  61. package/src/assets/web-panel/assets/Row-1MEtrgtF.js +1 -0
  62. package/src/assets/web-panel/assets/{RssFeed-iyQT5q9l.js → RssFeed-SSgcPPl4.js} +3 -3
  63. package/src/assets/web-panel/assets/Search-CcTMOGNY.js +1 -0
  64. package/src/assets/web-panel/assets/{Security-c4Jxf5Ih.js → Security-BA1KMaDx.js} +4 -4
  65. package/src/assets/web-panel/assets/{Services-CRuisolj.js → Services-_aj7czZn.js} +2 -2
  66. package/src/assets/web-panel/assets/{Skeleton-CCnzJkb-.js → Skeleton-BWgg_0Zr.js} +1 -1
  67. package/src/assets/web-panel/assets/{Skills-CZURCwZg.js → Skills-C2ZIziYM.js} +1 -1
  68. package/src/assets/web-panel/assets/Sla-CYxp4axY.js +1 -0
  69. package/src/assets/web-panel/assets/SpeechSettings-C7Csp1jV.js +1 -0
  70. package/src/assets/web-panel/assets/{SyncSettings-CJWVtd87.js → SyncSettings-svGeswiw.js} +2 -2
  71. package/src/assets/web-panel/assets/{Tasks-61lrQ_lS.js → Tasks-ClISj6oK.js} +1 -1
  72. package/src/assets/web-panel/assets/Templates-CmO-Fp7r.js +1 -0
  73. package/src/assets/web-panel/assets/Tenant-a3Ac3lxz.js +1 -0
  74. package/src/assets/web-panel/assets/{Terminal-CP15hcNS.js → Terminal-DyJIRh81.js} +2 -2
  75. package/src/assets/web-panel/assets/TimelineRenderer-acXS5N5h.js +1 -0
  76. package/src/assets/web-panel/assets/Tokens-DJW0KqV4.js +1 -0
  77. package/src/assets/web-panel/assets/{Trigger-BLCQEOF2.js → Trigger-0HeTi4r6.js} +1 -1
  78. package/src/assets/web-panel/assets/Trust-aFym34eo.js +1 -0
  79. package/src/assets/web-panel/assets/{UkeySign-Dwp0zXQ6.js → UkeySign-CYhszHJv.js} +1 -1
  80. package/src/assets/web-panel/assets/{VideoEditing-CIHA55Sx.js → VideoEditing-BbJxPF9X.js} +1 -1
  81. package/src/assets/web-panel/assets/{Wallet-Hjajvnto.js → Wallet-DDthEwiu.js} +3 -3
  82. package/src/assets/web-panel/assets/{WebAuthn-DqSURUvI.js → WebAuthn-DQ6McYPg.js} +4 -4
  83. package/src/assets/web-panel/assets/{WorkflowEditor-B5bHRwUG.js → WorkflowEditor-CnF8zRsi.js} +1 -1
  84. package/src/assets/web-panel/assets/{chat-DsheLKkG.js → chat-Dzkx2gTP.js} +1 -1
  85. package/src/assets/web-panel/assets/{colors-CST2UkgL.js → colors-35T51Oo5.js} +1 -1
  86. package/src/assets/web-panel/assets/{compact-item-yqEoy1L7.js → compact-item-TtzNrlu1.js} +1 -1
  87. package/src/assets/web-panel/assets/{createContext-Jwp78HFY.js → createContext-Y1LkWrYb.js} +1 -1
  88. package/src/assets/web-panel/assets/devWarning-D_lwLZ6O.js +1 -0
  89. package/src/assets/web-panel/assets/{hasIn-CVS5mFEP.js → hasIn-BOYw1BgS.js} +1 -1
  90. package/src/assets/web-panel/assets/{index-Crk4KWLW.js → index-8jffdb6b.js} +1 -1
  91. package/src/assets/web-panel/assets/{index-CDAPnZUs.js → index-B7aKAZzS.js} +1 -1
  92. package/src/assets/web-panel/assets/index-BGPEaeB1.js +1 -0
  93. package/src/assets/web-panel/assets/index-BKRlWHUp.js +1 -0
  94. package/src/assets/web-panel/assets/{index-BCHAUdel.js → index-BSpFe6j5.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-Cjig5i3a.js → index-BWgNn9As.js} +28 -26
  96. package/src/assets/web-panel/assets/{index-Dxljh9Fu.js → index-Bs69SI96.js} +2 -2
  97. package/src/assets/web-panel/assets/{index-BLTUVd0V.js → index-BtlJWaSP.js} +2 -2
  98. package/src/assets/web-panel/assets/index-Bw1iOGhM.js +1 -0
  99. package/src/assets/web-panel/assets/{index-CjfN2CpJ.js → index-BxWUEFKy.js} +1 -1
  100. package/src/assets/web-panel/assets/index-C7Wt5feN.js +1 -0
  101. package/src/assets/web-panel/assets/index-CEwuCM44.js +1 -0
  102. package/src/assets/web-panel/assets/index-CLqC2sRT.js +3 -0
  103. package/src/assets/web-panel/assets/{index-Dgyn8-wN.js → index-CPGNc2tF.js} +2 -2
  104. package/src/assets/web-panel/assets/{index-AnW25bEq.js → index-CVrUs6rf.js} +1 -1
  105. package/src/assets/web-panel/assets/index-CZ16GlOs.js +1 -0
  106. package/src/assets/web-panel/assets/{index-Cy0dNzkp.js → index-CdyFg4FI.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-C0FZScMe.js → index-CqhwG1ox.js} +4 -4
  108. package/src/assets/web-panel/assets/index-Cs82BHAj.js +1 -0
  109. package/src/assets/web-panel/assets/{index-CRBbVS43.js → index-D2od7Bgx.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-DxaU_lza.js → index-D47robkX.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CSBPc-sI.js → index-D4BgCBa3.js} +2 -2
  112. package/src/assets/web-panel/assets/index-D6tG4B25.js +55 -0
  113. package/src/assets/web-panel/assets/index-D7dCBw_M.js +1 -0
  114. package/src/assets/web-panel/assets/index-DAizH273.js +21 -0
  115. package/src/assets/web-panel/assets/{index-CzsKK0tQ.js → index-DFhlelzN.js} +2 -2
  116. package/src/assets/web-panel/assets/index-DhMSOd_2.js +1 -0
  117. package/src/assets/web-panel/assets/index-Dhfw-BXs.js +12 -0
  118. package/src/assets/web-panel/assets/index-DjeUZxE5.js +1 -0
  119. package/src/assets/web-panel/assets/{index-DDAigsel.js → index-DmkG479D.js} +2 -2
  120. package/src/assets/web-panel/assets/index-Dof7lWA_.js +13 -0
  121. package/src/assets/web-panel/assets/{index-De600Jjm.js → index-Dx0hIfC-.js} +1 -1
  122. package/src/assets/web-panel/assets/index-DzzgU4IU.js +1 -0
  123. package/src/assets/web-panel/assets/index-G4ClSmJc.js +1 -0
  124. package/src/assets/web-panel/assets/{index-CtyEOGuj.js → index-KgXrlfNF.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-SjxCCf5h.js → index-NM9Oke2k.js} +2 -2
  126. package/src/assets/web-panel/assets/{index-R-VGFpi6.js → index-XIuZV9by.js} +3 -3
  127. package/src/assets/web-panel/assets/{index-BzetOasL.js → index-hyqEKkBT.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BuI27WSx.js → index-zF77jnI2.js} +2 -2
  129. package/src/assets/web-panel/assets/{initDefaultProps-ClAjrsQ-.js → initDefaultProps-DD5y5msp.js} +1 -1
  130. package/src/assets/web-panel/assets/motion-BuoutMia.js +11 -0
  131. package/src/assets/web-panel/assets/{move-DMelzIW-.js → move-DkpjqOXg.js} +1 -1
  132. package/src/assets/web-panel/assets/mtc-parser-BmGJD-v-.js +1 -0
  133. package/src/assets/web-panel/assets/{omit-oxecfU3b.js → omit-DftUE0Sz.js} +1 -1
  134. package/src/assets/web-panel/assets/{pickAttrs-DJ5F5M6x.js → pickAttrs-DDRb9FIu.js} +1 -1
  135. package/src/assets/web-panel/assets/{placementArrow-DdbKsant.js → placementArrow-DPgtxOOD.js} +1 -1
  136. package/src/assets/web-panel/assets/{responsiveObserve-BUuM5cmS.js → responsiveObserve-BQFRzFeZ.js} +1 -1
  137. package/src/assets/web-panel/assets/{slide-DSV0ccvR.js → slide-DQ4lmUSz.js} +1 -1
  138. package/src/assets/web-panel/assets/{statusUtils-B-6oLAXf.js → statusUtils-C1TR4ZiQ.js} +1 -1
  139. package/src/assets/web-panel/assets/{styleChecker-DdCAHtsZ.js → styleChecker-B-Suj978.js} +1 -1
  140. package/src/assets/web-panel/assets/{useFlexGapSupport-ZORkcoZd.js → useFlexGapSupport-Q7bDZ3EI.js} +1 -1
  141. package/src/assets/web-panel/assets/{useFs-BFp46LoP.js → useFs-DHjRLyQH.js} +1 -1
  142. package/src/assets/web-panel/assets/{usePersonalDataHub-H7rxgbdW.js → usePersonalDataHub-lQOvCvCr.js} +1 -1
  143. package/src/assets/web-panel/assets/{vnode-eIq4Tk0J.js → vnode-Ie0g4-p3.js} +1 -1
  144. package/src/assets/web-panel/assets/{zoom-CTNrv8-H.js → zoom-CHP0YEoH.js} +1 -1
  145. package/src/assets/web-panel/index.html +1 -1
  146. package/src/commands/agent.js +10 -0
  147. package/src/commands/ide.js +60 -5
  148. package/src/commands/incentive.js +22 -22
  149. package/src/commands/mtc.js +5 -1
  150. package/src/gateways/ws/message-dispatcher.js +4 -1
  151. package/src/gateways/ws/ws-session-gateway.js +56 -4
  152. package/src/harness/background-task-manager.js +5 -1
  153. package/src/harness/jsonl-session-store.js +51 -0
  154. package/src/harness/mcp-client.js +62 -21
  155. package/src/harness/prompt-compressor.js +24 -5
  156. package/src/harness/worktree-isolator.js +5 -1
  157. package/src/lib/agent-core.js +1 -0
  158. package/src/lib/autonomous-agent.js +29 -0
  159. package/src/lib/chat-intent-service.js +14 -2
  160. package/src/lib/checkpoint-store.js +31 -4
  161. package/src/lib/claude-code-bridge.js +48 -3
  162. package/src/lib/cost-budget.js +13 -2
  163. package/src/lib/credential-guard.js +38 -0
  164. package/src/lib/git-integration.js +11 -2
  165. package/src/lib/goal-store.js +11 -0
  166. package/src/lib/hook-manager.js +4 -0
  167. package/src/lib/jetbrains-bridge.js +147 -0
  168. package/src/lib/jsonl-session-store.js +1 -0
  169. package/src/lib/llm-pricing.js +11 -4
  170. package/src/lib/llm-providers.js +11 -1
  171. package/src/lib/mcp-oauth.js +12 -0
  172. package/src/lib/mcp-serve.js +29 -0
  173. package/src/lib/orchestrator.js +38 -2
  174. package/src/lib/repl-bang-memorize.js +9 -1
  175. package/src/lib/runnable-provider.js +7 -1
  176. package/src/lib/session-insights.js +13 -6
  177. package/src/lib/session-usage.js +21 -3
  178. package/src/lib/status-line.cjs +4 -1
  179. package/src/lib/sub-agent-context.js +9 -0
  180. package/src/repl/agent-repl.js +29 -0
  181. package/src/runtime/agent-core.js +4 -2
  182. package/src/runtime/headless-runner.js +13 -0
  183. package/src/runtime/headless-stream.js +9 -0
  184. package/src/runtime/mcp-config.js +72 -3
  185. package/src/runtime/pipe-safety.js +51 -0
  186. package/src/runtime/policies/agent-policy.js +3 -0
  187. package/src/assets/web-panel/assets/AIOps-BsDJlD_l.js +0 -1
  188. package/src/assets/web-panel/assets/Audit-BKlFbLdl.js +0 -1
  189. package/src/assets/web-panel/assets/ChatBubbleRenderer-DgvpwU5o.js +0 -1
  190. package/src/assets/web-panel/assets/Codegen-tKWGzajw.js +0 -1
  191. package/src/assets/web-panel/assets/Community-CmLuPBUU.js +0 -1
  192. package/src/assets/web-panel/assets/Compliance-PZw0aBLI.js +0 -1
  193. package/src/assets/web-panel/assets/Crosschain-Sb-uM7Ty.js +0 -1
  194. package/src/assets/web-panel/assets/Dashboard-Btag698v.js +0 -3
  195. package/src/assets/web-panel/assets/Federation-1jhstF5P.js +0 -1
  196. package/src/assets/web-panel/assets/Governance-BQrWksKt.js +0 -1
  197. package/src/assets/web-panel/assets/Inference-jEBTp12v.js +0 -1
  198. package/src/assets/web-panel/assets/KnowledgeGraph-tDiV2taf.js +0 -1
  199. package/src/assets/web-panel/assets/Marketplace-9Yi32avt.js +0 -1
  200. package/src/assets/web-panel/assets/MobileBridge-MfUfkHA0.js +0 -1
  201. package/src/assets/web-panel/assets/NLProgramming-DO3CZ0_z.js +0 -1
  202. package/src/assets/web-panel/assets/PdhVaultBrowser-Ck1zCLe6.js +0 -7
  203. package/src/assets/web-panel/assets/Pipeline-BZ7wRzG1.js +0 -1
  204. package/src/assets/web-panel/assets/Privacy-BJ6qj9Hv.js +0 -1
  205. package/src/assets/web-panel/assets/Projects-y1WbI337.js +0 -1
  206. package/src/assets/web-panel/assets/Recommend-Bju04wTd.js +0 -1
  207. package/src/assets/web-panel/assets/Reputation-BUPa3nEk.js +0 -1
  208. package/src/assets/web-panel/assets/Row-WYqqaq_5.js +0 -1
  209. package/src/assets/web-panel/assets/Search-CrfwJF0R.js +0 -1
  210. package/src/assets/web-panel/assets/Sla-CrMzaEi2.js +0 -1
  211. package/src/assets/web-panel/assets/SpeechSettings-jTDOM5eY.js +0 -1
  212. package/src/assets/web-panel/assets/Templates-Cg-iF2g1.js +0 -1
  213. package/src/assets/web-panel/assets/Tenant-DrDv1FFc.js +0 -1
  214. package/src/assets/web-panel/assets/TimelineRenderer-Sl5uXrkN.js +0 -1
  215. package/src/assets/web-panel/assets/Tokens-yRIZTVsR.js +0 -1
  216. package/src/assets/web-panel/assets/Trust-D5xq8z6s.js +0 -1
  217. package/src/assets/web-panel/assets/community-parser-Cuyslaku.js +0 -3
  218. package/src/assets/web-panel/assets/devWarning-C8to6gQk.js +0 -1
  219. package/src/assets/web-panel/assets/index-BeblNJDH.js +0 -1
  220. package/src/assets/web-panel/assets/index-C130LLPq.js +0 -1
  221. package/src/assets/web-panel/assets/index-C8rq85gu.js +0 -1
  222. package/src/assets/web-panel/assets/index-CIE2n8k_.js +0 -1
  223. package/src/assets/web-panel/assets/index-CTd3lDxp.js +0 -13
  224. package/src/assets/web-panel/assets/index-CUWj5L2s.js +0 -1
  225. package/src/assets/web-panel/assets/index-ChRL6rgA.js +0 -3
  226. package/src/assets/web-panel/assets/index-CrlRa054.js +0 -1
  227. package/src/assets/web-panel/assets/index-Cu6Ql64n.js +0 -1
  228. package/src/assets/web-panel/assets/index-Cx_t5rWw.js +0 -12
  229. package/src/assets/web-panel/assets/index-DZfnYE6e.js +0 -1
  230. package/src/assets/web-panel/assets/index-D_1b7uh6.js +0 -55
  231. package/src/assets/web-panel/assets/index-D_e9gwfn.js +0 -1
  232. package/src/assets/web-panel/assets/index-DbxAlpPC.js +0 -21
  233. package/src/assets/web-panel/assets/index-DiK4vSZa.js +0 -1
  234. package/src/assets/web-panel/assets/index-DpYn5v2k.js +0 -1
  235. package/src/assets/web-panel/assets/index-diWkx2Wq.js +0 -1
  236. package/src/assets/web-panel/assets/motion-BalXv_60.js +0 -11
  237. package/src/assets/web-panel/assets/mtc-parser-CEQffxds.js +0 -1
@@ -25,6 +25,11 @@ import { findProjectRoot } from "./project-instructions.js";
25
25
  export const BANG_TIMEOUT_MS = 120_000;
26
26
  export const BANG_MAX_BUFFER = 10 * 1024 * 1024;
27
27
  export const BANG_OUTPUT_CAP = 30_000;
28
+ // A `#` note is a terse one-liner, but readline accepts a long pasted line and
29
+ // the note lands verbatim in cc.md — which is auto-loaded into EVERY future
30
+ // session's system prompt. Without a cap, an accidental fat paste silently
31
+ // bloats every later session's context. Truncate to a sane single-note size.
32
+ export const MEMO_NOTE_MAX = 4_000;
28
33
 
29
34
  export const _deps = {
30
35
  spawnSync: spawnSyncDefault,
@@ -138,7 +143,10 @@ export function appendMemoryNote(rawLine, opts = {}) {
138
143
  const fs = opts.deps?.fs || _deps.fs;
139
144
  const path = opts.deps?.path || _deps.path;
140
145
  const cwd = opts.cwd || process.cwd();
141
- const note = String(rawLine).replace(/^#/, "").trim();
146
+ let note = String(rawLine).replace(/^#/, "").trim();
147
+ if (note.length > MEMO_NOTE_MAX) {
148
+ note = `${note.slice(0, MEMO_NOTE_MAX)} …[truncated]`;
149
+ }
142
150
  const stamp = opts.date || new Date().toISOString().slice(0, 10);
143
151
 
144
152
  const root =
@@ -31,7 +31,13 @@ export function isAuthError(err) {
31
31
  : null;
32
32
  if (status === 401 || status === 403) return true;
33
33
  const msg = String(err.message || err).toLowerCase();
34
- return /\b401\b|\b403\b|unauthorized|forbidden|authentication failed|api[\s_-]*key required|invalid api[\s_-]*key|incorrect api[\s_-]*key|expired/.test(
34
+ // `expired` must be AUTH-scoped (key/token/credential/secret), not bare:
35
+ // a TLS "certificate has expired" or "cache expired" is an infra error, and
36
+ // misclassifying it as auth would trigger an env-key VENDOR hijack on a
37
+ // keyless provider — masking the real problem (the same anti-hijack spirit
38
+ // as the rest of this module). A genuine 401/403 is still caught by status
39
+ // and the explicit auth phrases below.
40
+ return /\b401\b|\b403\b|unauthorized|forbidden|authentication failed|api[\s_-]*key required|invalid api[\s_-]*key|incorrect api[\s_-]*key|(?:api[\s_-]*key|token|credentials?|secret)[\s_-]*(?:has\s+|is\s+|was\s+)?expired|expired[\s_-]+(?:api[\s_-]*key|token|credentials?|secret)/.test(
35
41
  msg,
36
42
  );
37
43
  }
@@ -31,7 +31,7 @@ function isToolError(event) {
31
31
  const r = event?.data?.result;
32
32
  return Boolean(
33
33
  event?.data?.error ||
34
- (r && typeof r === "object" && (r.error || r.is_error || r.isError)),
34
+ (r && typeof r === "object" && (r.error || r.is_error || r.isError)),
35
35
  );
36
36
  }
37
37
 
@@ -46,11 +46,18 @@ export function analyzeSession(events, sessionId) {
46
46
  const evs = Array.isArray(events) ? events : [];
47
47
  const start = evs.find((e) => e && e.type === "session_start");
48
48
 
49
- const stamps = evs
50
- .map((e) => Number(e?.timestamp))
51
- .filter((t) => Number.isFinite(t) && t > 0);
52
- const startedAt = stamps.length ? Math.min(...stamps) : null;
53
- const endedAt = stamps.length ? Math.max(...stamps) : null;
49
+ // Single-pass min/max (NOT Math.min(...stamps)): spreading a per-event array
50
+ // throws RangeError "Maximum call stack size exceeded" past ~130k elements, so
51
+ // a long session would crash `cc insights`. A reduce-style scan is O(n) and
52
+ // size-independent.
53
+ let startedAt = null;
54
+ let endedAt = null;
55
+ for (const e of evs) {
56
+ const t = Number(e?.timestamp);
57
+ if (!Number.isFinite(t) || t <= 0) continue;
58
+ if (startedAt == null || t < startedAt) startedAt = t;
59
+ if (endedAt == null || t > endedAt) endedAt = t;
60
+ }
54
61
  const durationMs =
55
62
  startedAt != null && endedAt != null ? endedAt - startedAt : 0;
56
63
 
@@ -13,6 +13,12 @@ import {
13
13
  listJsonlSessions,
14
14
  } from "../harness/jsonl-session-store.js";
15
15
 
16
+ // Injectable disk seams (tests override). readEvents skips malformed JSON lines
17
+ // but does NOT guard readFileSync, so an unreadable session file (EACCES /
18
+ // EISDIR / a Windows lock / an ENOENT race after existsSync) throws — which
19
+ // allSessionsUsage tolerates per-session below.
20
+ export const _deps = { readEvents, listJsonlSessions };
21
+
16
22
  const USAGE_EVENT_TYPES = new Set([
17
23
  "token_usage",
18
24
  "assistant_message",
@@ -138,7 +144,7 @@ export function aggregateUsage(events) {
138
144
  * Roll up usage for a single JSONL session.
139
145
  */
140
146
  export function sessionUsage(sessionId) {
141
- const events = readEvents(sessionId);
147
+ const events = _deps.readEvents(sessionId);
142
148
  const agg = aggregateUsage(events);
143
149
  return { sessionId, ...agg };
144
150
  }
@@ -147,8 +153,19 @@ export function sessionUsage(sessionId) {
147
153
  * Roll up usage across every JSONL session on disk.
148
154
  */
149
155
  export function allSessionsUsage({ limit = 1000 } = {}) {
150
- const sessions = listJsonlSessions({ limit });
151
- const perSession = sessions.map((s) => sessionUsage(s.id));
156
+ const sessions = _deps.listJsonlSessions({ limit });
157
+ // One unreadable / corrupt session file (sessionUsage readEvents →
158
+ // readFileSync can throw on EACCES/EISDIR/lock) must NOT abort the whole
159
+ // roll-up. Skip the failed session and report how many were skipped.
160
+ const perSession = [];
161
+ let skipped = 0;
162
+ for (const s of sessions || []) {
163
+ try {
164
+ perSession.push(sessionUsage(s.id));
165
+ } catch {
166
+ skipped++;
167
+ }
168
+ }
152
169
 
153
170
  const total = {
154
171
  inputTokens: 0,
@@ -191,6 +208,7 @@ export function allSessionsUsage({ limit = 1000 } = {}) {
191
208
 
192
209
  return {
193
210
  sessions: perSession,
211
+ skipped,
194
212
  total,
195
213
  byModel: Array.from(byKey.values()).sort(
196
214
  (a, b) => b.totalTokens - a.totalTokens,
@@ -48,7 +48,10 @@ function loadStatusLineConfig({ cwd = process.cwd(), settingsFile } = {}) {
48
48
  cfg = {
49
49
  type: sl.type || "command",
50
50
  command: sl.command,
51
- padding: Number(sl.padding) || 0,
51
+ // Clamp to [0,80]: a non-finite/huge padding (e.g. "1e999" → Infinity,
52
+ // or 999999999) would make " ".repeat(padding) at render time throw
53
+ // RangeError on every REPL prompt, bricking the status line.
54
+ padding: Math.max(0, Math.min(80, Math.floor(Number(sl.padding)) || 0)),
52
55
  };
53
56
  } else if (sl === false || sl === null) {
54
57
  cfg = null; // an explicit disable in a higher layer wins
@@ -365,6 +365,15 @@ export class SubAgentContext {
365
365
  return this.result;
366
366
  }
367
367
 
368
+ // If the loop already force-completed (abort signal or token budget),
369
+ // preserve that result. The normal completion below would otherwise
370
+ // overwrite the cancellation / budget marker with a plain summary of
371
+ // whatever was streamed so far — the parent agent would then mistake a
372
+ // truncated/cancelled run for a clean one.
373
+ if (this.status !== "active") {
374
+ return this.result;
375
+ }
376
+
368
377
  // Summarize the result
369
378
  const summary = this.summarize(lastContent);
370
379
 
@@ -84,6 +84,7 @@ import { formatBackgroundTasks } from "./tasks-status.js";
84
84
  import { expandFileRefsAsync } from "../runtime/file-ref-expander.js";
85
85
  import { prepareVisionTurn } from "../lib/image-input.js";
86
86
  import { composeSystemPrompt } from "../runtime/system-prompt.js";
87
+ import { installPipeSafety } from "../runtime/pipe-safety.js";
87
88
  import {
88
89
  makeFallbackChatFn,
89
90
  normalizeFallbackModels,
@@ -297,6 +298,27 @@ async function agentLoop(messages, options) {
297
298
  * Start the agentic REPL
298
299
  */
299
300
  export async function startAgentRepl(options = {}) {
301
+ // EPIPE guard: if the REPL's stdout is piped and the consumer closes (e.g.
302
+ // `cc agent | head`), the async stream `error` would otherwise crash the
303
+ // process. Route a broken pipe into the REPL's own graceful shutdown (the
304
+ // rl "close" handler — MCP disconnect, kill background tasks) when the
305
+ // interface exists, else exit cleanly. `_replClosing` makes it fire once so a
306
+ // cleanup write that also EPIPEs can't loop. `_replRl` is set when rl is built.
307
+ let _replRl = null;
308
+ let _replClosing = false;
309
+ installPipeSafety(undefined, () => {
310
+ if (_replClosing) return;
311
+ _replClosing = true;
312
+ if (_replRl) {
313
+ try {
314
+ _replRl.close(); // triggers the graceful "close" cleanup → process.exit
315
+ return;
316
+ } catch {
317
+ /* fall through to a bare exit */
318
+ }
319
+ }
320
+ process.exit(0);
321
+ });
300
322
  let model = options.model || "qwen2.5:7b";
301
323
  let provider = options.provider || "ollama";
302
324
  // Extended thinking (Anthropic; opt-in via --think/--ultrathink). Carried from
@@ -779,6 +801,10 @@ export async function startAgentRepl(options = {}) {
779
801
  // (parity with headless; auto-detect already works via process.env).
780
802
  ide: options.ide,
781
803
  pdh: options.pdh,
804
+ // IDEA built-in MCP (server `idea`): auto-connect when the JetBrains
805
+ // plugin injected CHAINLESSCHAIN_JETBRAINS_MCP_URL. --jetbrains forces,
806
+ // --no-jetbrains disables.
807
+ jetbrains: options.jetbrains,
782
808
  cwd: process.cwd(),
783
809
  // advertise the session id to spawned stdio MCP servers
784
810
  sessionId,
@@ -1030,6 +1056,9 @@ export async function startAgentRepl(options = {}) {
1030
1056
  terminal: true,
1031
1057
  completer: atCompleter,
1032
1058
  });
1059
+ // Let the EPIPE guard route a broken pipe through this interface's graceful
1060
+ // "close" cleanup instead of a bare exit.
1061
+ _replRl = rl;
1033
1062
 
1034
1063
  // Vim-mode plumbing: capture readline's OWN keypress listeners now so we can
1035
1064
  // suspend them while in NORMAL mode (the engine drives editing then) and
@@ -1127,14 +1127,16 @@ export async function executeTool(name, args, context = {}) {
1127
1127
  // customizations), this safety surface stays on under --safe-mode by design.
1128
1128
  if (!ruleAllowed && (name === "read_file" || name === "run_shell")) {
1129
1129
  const {
1130
- credentialFileReason,
1130
+ credentialFileReasonResolved,
1131
1131
  commandReadsCredentials,
1132
1132
  credentialGuardDisabled,
1133
1133
  } = await import("../lib/credential-guard.js");
1134
1134
  if (!credentialGuardDisabled(process.env)) {
1135
1135
  let credReason = null;
1136
1136
  if (name === "read_file" && args?.path) {
1137
- credReason = credentialFileReason(args.path);
1137
+ // Resolve symlinks: an innocent-named link to a credential file must not
1138
+ // skip the prompt (fs.readFileSync follows the link).
1139
+ credReason = credentialFileReasonResolved(args.path, { cwd });
1138
1140
  } else if (name === "run_shell" && args?.command) {
1139
1141
  const hit = commandReadsCredentials(args.command);
1140
1142
  credReason = hit ? hit.reason : null;
@@ -69,6 +69,11 @@ const VALID_PERMISSION_MODES = Object.freeze([
69
69
 
70
70
  const VALID_OUTPUT_FORMATS = Object.freeze(["text", "json", "stream-json"]);
71
71
 
72
+ // EPIPE guard for `cc agent -p … | head`. Lives in pipe-safety.js (shared with
73
+ // the stream-json driver + REPL); re-exported here for existing importers.
74
+ export { installPipeSafety } from "./pipe-safety.js";
75
+ import { installPipeSafety } from "./pipe-safety.js";
76
+
72
77
  /**
73
78
  * Resolve a --permission-mode string into the session-policy tier + a
74
79
  * non-interactive confirmer + whether to clamp tools to the read-only set.
@@ -312,6 +317,12 @@ export async function runAgentHeadless(options = {}, deps = {}) {
312
317
  // trace so `cc agent -p ... > out.txt` keeps `out.txt` clean.
313
318
  const writeOut = deps.writeOut || ((s) => process.stdout.write(s));
314
319
  const writeErr = deps.writeErr || ((s) => process.stderr.write(s));
320
+ // Only when we own the real stdout/stderr (no injected seams = production,
321
+ // not tests): guard against a downstream `| head` closing the pipe, which
322
+ // would otherwise crash with an unhandled EPIPE. Idempotent across calls.
323
+ if (!deps.writeOut && !deps.writeErr) {
324
+ installPipeSafety();
325
+ }
315
326
  // Session persistence seam (file-based JSONL; DB-free, like the rest of
316
327
  // headless). Defaults to the real store; tests inject fakes.
317
328
  const store = {
@@ -667,6 +678,7 @@ export async function runAgentHeadless(options = {}, deps = {}) {
667
678
  strict: options.strictMcpConfig === true,
668
679
  ide: options.ide,
669
680
  pdh: options.pdh,
681
+ jetbrains: options.jetbrains,
670
682
  cwd: options.cwd || process.cwd(),
671
683
  // advertise the session id to spawned stdio MCP servers
672
684
  sessionId,
@@ -676,6 +688,7 @@ export async function runAgentHeadless(options = {}, deps = {}) {
676
688
  loadMcpConfig: deps.loadMcpConfig,
677
689
  loadRegisteredMcp: deps.loadRegisteredMcp,
678
690
  loadIdeMcp: deps.loadIdeMcp,
691
+ loadJetbrainsMcp: deps.loadJetbrainsMcp,
679
692
  },
680
693
  );
681
694
  if (mcp && isText) {
@@ -35,6 +35,7 @@ import {
35
35
  resolvePermissionMode,
36
36
  resolveEnabledTools,
37
37
  parseToolList,
38
+ installPipeSafety,
38
39
  } from "./headless-runner.js";
39
40
  import {
40
41
  startSession as jsonlStartSession,
@@ -513,6 +514,12 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
513
514
  const doExpand = deps.expandFileRefs || expandFileRefsAsync;
514
515
  const writeOut = deps.writeOut || ((s) => process.stdout.write(s));
515
516
  const writeErr = deps.writeErr || ((s) => process.stderr.write(s));
517
+ // Guard the real stdout/stderr against a downstream `| head` closing the pipe
518
+ // (unhandled async EPIPE → crash). Only when we own the streams (no injected
519
+ // seams = production, not tests). Idempotent; shared with the -p runner.
520
+ if (!deps.writeOut && !deps.writeErr) {
521
+ installPipeSafety();
522
+ }
516
523
  // Batch consecutive partial-message text/thinking deltas into one stream_event
517
524
  // line (Claude-Code 2.1.191 streaming-CPU optimization). `emit` flushes any
518
525
  // pending deltas before writing a non-delta line, so ordering is preserved;
@@ -832,6 +839,7 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
832
839
  strict: options.strictMcpConfig === true,
833
840
  ide: options.ide,
834
841
  pdh: options.pdh,
842
+ jetbrains: options.jetbrains,
835
843
  cwd: options.cwd || process.cwd(),
836
844
  // advertise the session id to spawned stdio MCP servers
837
845
  sessionId,
@@ -841,6 +849,7 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
841
849
  loadMcpConfig: deps.loadMcpConfig,
842
850
  loadRegisteredMcp: deps.loadRegisteredMcp,
843
851
  loadIdeMcp: deps.loadIdeMcp,
852
+ loadJetbrainsMcp: deps.loadJetbrainsMcp,
844
853
  },
845
854
  );
846
855
  } catch (err) {
@@ -28,6 +28,11 @@ import {
28
28
  pdhServerToMcpConfig,
29
29
  isInPdhTerminal,
30
30
  } from "../lib/pdh-bridge.js";
31
+ import {
32
+ discoverJetbrainsServer,
33
+ jetbrainsServerToMcpConfig,
34
+ isInJetbrainsContext,
35
+ } from "../lib/jetbrains-bridge.js";
31
36
 
32
37
  /**
33
38
  * Normalize a parsed config object into a `{ name: serverConfig }` map.
@@ -463,6 +468,47 @@ export async function loadPdhMcp(opts = {}, deps = {}) {
463
468
  return out;
464
469
  }
465
470
 
471
+ /**
472
+ * Connect IntelliJ IDEA's built-in MCP server (IDEA >= 2025.2) as the reserved
473
+ * server `idea` -> tools `mcp__idea__*`. The ChainlessChain JetBrains plugin
474
+ * injects the exact endpoint (CHAINLESSCHAIN_JETBRAINS_MCP_URL + optional
475
+ * _TOKEN) into the cc it spawns ONLY when the IDE actually supports + enables
476
+ * MCP; absent that, this is a no-op (we never scan/guess/spawn a proxy — if
477
+ * the IDE's MCP is unsupported, we don't connect). Best-effort: returns
478
+ * `deps.into` (or null) on nothing found / bad config, never throws. An explicit
479
+ * user registration of a server named `idea` wins (yield + one-line warning).
480
+ *
481
+ * @param {object} opts { env? }
482
+ * @param {object} [deps] { writeErr, into, discoverJetbrainsServer, jetbrainsServerToMcpConfig }
483
+ */
484
+ export async function loadJetbrainsMcp(opts = {}, deps = {}) {
485
+ const discover = deps.discoverJetbrainsServer || discoverJetbrainsServer;
486
+ const toCfg = deps.jetbrainsServerToMcpConfig || jetbrainsServerToMcpConfig;
487
+ const found = discover({ env: opts.env });
488
+ if (!found) return deps.into || null;
489
+ if (deps.into?.mcpClient?.servers?.has?.("idea")) {
490
+ (deps.writeErr || (() => {}))(
491
+ ` idea: server "idea" already registered explicitly — ` +
492
+ `skipping IDEA built-in MCP auto-connect\n`,
493
+ );
494
+ return deps.into;
495
+ }
496
+ const cfg = toCfg(found);
497
+ if (!cfg) return deps.into || null;
498
+ const out = await setupMcpFromConfig({ idea: cfg }, deps);
499
+ // Hot reconnect: re-read the injected env on a failed mcp__idea__* call (the
500
+ // IDE may have restarted its MCP server on a new port/token, and the plugin
501
+ // re-injects a fresh CHAINLESSCHAIN_JETBRAINS_MCP_URL into the next spawn —
502
+ // though within one run the env is fixed, so this just re-validates it).
503
+ if (out?.mcpClient?.setReconnector) {
504
+ out.mcpClient.setReconnector("idea", () => {
505
+ const fresh = discover({ env: opts.env });
506
+ return fresh ? toCfg(fresh) : null;
507
+ });
508
+ }
509
+ return out;
510
+ }
511
+
466
512
  /**
467
513
  * Discover + connect a project-scoped `.mcp.json` (Claude-Code parity). Reads a
468
514
  * `.mcp.json` from the git project root (walked up from cwd, same as the
@@ -534,10 +580,13 @@ export async function loadProjectMcp(opts = {}, deps = {}) {
534
580
  * there's nothing. Throws only on a bad `--mcp-config` file (explicit request).
535
581
  *
536
582
  * IDE discovery: default ON only inside an IDE integrated terminal; `ide:true`
537
- * (`--ide`) forces it; `ide:false` (`--no-ide`) disables it.
583
+ * (`--ide`) forces it; `ide:false` (`--no-ide`) disables it. IDEA built-in MCP
584
+ * (reserved `idea`): default ON only when the JetBrains plugin injected
585
+ * `CHAINLESSCHAIN_JETBRAINS_MCP_URL`; `jetbrains:true` (`--jetbrains`) forces;
586
+ * `jetbrains:false` (`--no-jetbrains`) disables.
538
587
  *
539
- * @param {object} args { mcpConfigPath?, db?, includeRegistered=true, allRegistered=false, ide?, pdh?, cwd?, env? }
540
- * @param {object} [deps] { writeErr, loadMcpConfig, loadRegisteredMcp, loadIdeMcp, loadPdhMcp, isInIdeTerminal, isInPdhTerminal }
588
+ * @param {object} args { mcpConfigPath?, db?, includeRegistered=true, allRegistered=false, ide?, pdh?, jetbrains?, cwd?, env? }
589
+ * @param {object} [deps] { writeErr, loadMcpConfig, loadRegisteredMcp, loadIdeMcp, loadPdhMcp, loadJetbrainsMcp, isInIdeTerminal, isInPdhTerminal, isInJetbrainsContext }
541
590
  */
542
591
  export async function resolveAgentMcp(args = {}, deps = {}) {
543
592
  const doFile = deps.loadMcpConfig || loadMcpConfig;
@@ -545,6 +594,7 @@ export async function resolveAgentMcp(args = {}, deps = {}) {
545
594
  const doProject = deps.loadProjectMcp || loadProjectMcp;
546
595
  const doIde = deps.loadIdeMcp || loadIdeMcp;
547
596
  const doPdh = deps.loadPdhMcp || loadPdhMcp;
597
+ const doJetbrains = deps.loadJetbrainsMcp || loadJetbrainsMcp;
548
598
  // Thread the agent session id down to setupMcpFromConfig so spawned stdio MCP
549
599
  // servers get CC_SESSION_ID / CLAUDE_CODE_SESSION_ID (Claude-Code parity).
550
600
  const fwd =
@@ -601,6 +651,25 @@ export async function resolveAgentMcp(args = {}, deps = {}) {
601
651
  );
602
652
  }
603
653
  }
654
+ // IntelliJ IDEA built-in MCP (IDEA >= 2025.2), reserved name `idea` ->
655
+ // mcp__idea__*. Scoped to the JetBrains plugin context: the plugin injects
656
+ // CHAINLESSCHAIN_JETBRAINS_MCP_URL only when the IDE supports + enables MCP,
657
+ // so default-ON is gated on that env being present (isInJetbrainsContext).
658
+ // `jetbrains:true` (--jetbrains) forces the attempt; `jetbrains:false`
659
+ // (--no-jetbrains) disables it. No URL = no connect (unsupported IDE).
660
+ // Skipped under --strict-mcp-config (returned above).
661
+ if (args.jetbrains !== false) {
662
+ const env = args.env || process.env;
663
+ const inJetbrains = (deps.isInJetbrainsContext || isInJetbrainsContext)(
664
+ env,
665
+ );
666
+ if (args.jetbrains === true || inJetbrains) {
667
+ result = await doJetbrains(
668
+ { env },
669
+ { ...fwd, into: result || undefined },
670
+ );
671
+ }
672
+ }
604
673
  return result;
605
674
  }
606
675
 
@@ -0,0 +1,51 @@
1
+ /**
2
+ * pipe-safety — shared EPIPE guard for cc's stdout/stderr writers.
3
+ *
4
+ * A downstream consumer that closes the pipe (e.g. `cc agent -p … | head`)
5
+ * makes the next write fail ASYNCHRONOUSLY via the stream's `error` event,
6
+ * which the try/catch around a write call cannot catch. With no `error`
7
+ * listener that is an unhandled EPIPE → the process crashes with a stack trace
8
+ * instead of stopping cleanly. `installPipeSafety` adds an idempotent listener
9
+ * that treats EPIPE as "consumer done" (the Unix pipeline convention) and
10
+ * surfaces other stream errors best-effort.
11
+ *
12
+ * Used by the headless `-p` runner, the stream-json driver, and the REPL.
13
+ */
14
+
15
+ // Global-registry symbol so the guard is installed at most once per stream even
16
+ // across the modules that share it.
17
+ const _PIPE_SAFE = Symbol.for("cc.headless.pipeSafe");
18
+
19
+ /**
20
+ * Install an EPIPE-safe `error` listener on the given write streams (default:
21
+ * process.stdout + process.stderr). Idempotent. `onEpipe` defaults to a clean
22
+ * `process.exit(0)`; the REPL passes a graceful-shutdown callback instead.
23
+ *
24
+ * @param {Array<NodeJS.WriteStream>} [streams]
25
+ * @param {() => void} [onEpipe]
26
+ */
27
+ export function installPipeSafety(streams, onEpipe) {
28
+ const targets = streams || [process.stdout, process.stderr];
29
+ const handleEpipe = onEpipe || (() => process.exit(0));
30
+ for (const stream of targets) {
31
+ if (!stream || typeof stream.on !== "function" || stream[_PIPE_SAFE]) {
32
+ continue;
33
+ }
34
+ stream[_PIPE_SAFE] = true;
35
+ stream.on("error", (err) => {
36
+ if (err && err.code === "EPIPE") {
37
+ handleEpipe();
38
+ return;
39
+ }
40
+ // Non-EPIPE stream error: surface best-effort (never onto the stream that
41
+ // just errored, to avoid a loop) and otherwise swallow.
42
+ try {
43
+ if (stream !== process.stderr) {
44
+ process.stderr.write(`stream error: ${err?.message || err}\n`);
45
+ }
46
+ } catch {
47
+ /* nothing more we can do */
48
+ }
49
+ });
50
+ }
51
+ }
@@ -38,6 +38,9 @@ export function resolveAgentPolicy({
38
38
  // IDE bridge tri-state (undefined=auto / true=--ide / false=--no-ide); the
39
39
  // REPL forwards it to resolveAgentMcp so --ide/--no-ide work interactively.
40
40
  ide: overrides.ide,
41
+ // IDEA built-in MCP tri-state (undefined=auto when the JetBrains plugin
42
+ // injected the endpoint / true=--jetbrains / false=--no-jetbrains).
43
+ jetbrains: overrides.jetbrains,
41
44
  };
42
45
  }
43
46
 
@@ -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-Cjig5i3a.js";import{t as H}from"./community-parser-Cuyslaku.js";import ue from"./index-R-VGFpi6.js";import{f as Ie,c as Oe,b2 as Pe,aY as Te,aa as Ee,s as Le,as as je,R as Ne}from"./icons-DP3uiYxy.js";import"./KeyCode-D63Tfrq7.js";import"./omit-oxecfU3b.js";import"./pickAttrs-DJ5F5M6x.js";import"./initDefaultProps-ClAjrsQ-.js";import"./motion-BalXv_60.js";import"./raf-Deuc0E8-.js";import"./index-CRBbVS43.js";import"./index-DxaU_lza.js";import"./isVisible-C7tPsqfj.js";import"./useState-BK4hy8Ma.js";import"./devWarning-C8to6gQk.js";import"./compact-item-yqEoy1L7.js";import"./createContext-Jwp78HFY.js";import"./Compact-DqknM98n.js";import"./_getTag-DnrRH4E6.js";import"./styleChecker-DdCAHtsZ.js";import"./zoom-CTNrv8-H.js";import"./ActionButton-COjZZKWG.js";import"./vnode-eIq4Tk0J.js";const Ue=Object.freeze(["P0","P1","P2","P3"]),De=Object.freeze(["open","acknowledged","resolved","closed"]);function g(t,a=0){return typeof t=="number"&&Number.isFinite(t)?t:a}function Me(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(Me).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 Je={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(Je)),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 Ve(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 Ke={__name:"AIOps",setup(t,{expose:a}){a();const s=de(),{t:e}=ce(),P=C(!1),j=C(!1),w=C(!1),N=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(""),W=C(!1),R=C(!1),O=C(!1),B=C(!1),x=Y({severity:"P3",metric:"",description:""}),_=Y({name:"",triggerJson:"",stepsJson:""}),M=Y({metric:"",values:""}),U=Y({metric:"",value:null,algorithm:"z_score"}),q=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"}]),Z=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"}]),J=Q(()=>D.value.incidents.byStatus.open+D.value.incidents.byStatus.acknowledged),V=Q(()=>{let n=N.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"?W.value=!0:n==="playbook"?R.value=!0:n==="baseline"?O.value=!0:n==="detect"&&(q.value=null,B.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:""}))]);N.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}j.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")),W.value=!1,oe(),await L()}catch(n){f.error(e("aiops.msg.createFailed")+": "+(n?.message||n))}finally{j.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}j.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{j.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}j.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{j.value=!1}}async function Ce(){if(!U.metric||U.value==null){f.warning(e("aiops.msg.detectFieldsEmpty"));return}w.value=!0,q.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}q.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:j,detecting:w,incidents:N,playbooks:X,baselines:$,stats:D,activeTab:I,incidentSeverityFilter:A,incidentStatusFilter:T,showIncidentModal:W,showPlaybookModal:R,showBaselineModal:O,showDetectModal:B,incidentForm:x,playbookForm:_,baselineForm:M,detectForm:U,detectResult:q,incidentColumns:ee,playbookColumns:F,baselineColumns:Z,openCount:J,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 Ne},get PlusOutlined(){return je},get AlertOutlined(){return Le},get RocketOutlined(){return Ee},get LineChartOutlined(){return Te},get FundOutlined(){return Pe},get ExclamationCircleOutlined(){return Oe},get CheckCircleOutlined(){return Ie},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 Ve},get SEVERITIES(){return Ue},get INCIDENT_STATUSES(){return De}};return Object.defineProperty(ne,"__isScriptSetup",{enumerable:!1,value:!0}),ne}},Qe={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},We={class:"page-title"},Ze={class:"page-sub"},Ye={style:{color:"var(--text-secondary)","font-size":"12px","margin-left":"8px"}},Ge={class:"filter-bar"},He={key:0,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px"}},Xe={key:1,style:{color:"var(--text-muted)"}},$e={key:2,style:{color:"var(--text-secondary)","font-size":"12px"}},et={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},tt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},at={style:{color:"var(--text-primary)","font-weight":"500"}},ot={key:0,style:{color:"var(--text-secondary)","font-size":"11px","margin-top":"2px","font-family":"monospace"}},lt={key:3,style:{color:"var(--text-secondary)","font-size":"11px"}},it={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},nt={key:0,style:{color:"var(--text-primary)","font-family":"monospace","font-weight":"500"}},st={style:{color:"#1677ff"}},rt={style:{color:"var(--text-secondary)","margin-left":"4px","font-size":"11px"}},dt={key:2,style:{color:"var(--text-secondary)","font-size":"12px"}},ct={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},ut={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},pt={key:0,style:{color:"var(--text-secondary)","font-size":"12px","margin-top":"8px"}},mt={key:1,style:{"margin-top":"12px","font-size":"12px",color:"var(--text-secondary)"}},yt={key:2,style:{"margin-top":"8px"}};function ft(t,a,s,e,P,j){const w=b("a-button"),N=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"),W=b("a-row"),R=b("a-tag"),O=b("a-radio-button"),B=b("a-radio-group"),x=b("a-table"),_=b("a-tab-pane"),M=b("a-switch"),U=b("a-tabs"),q=b("a-select-option"),ee=b("a-select"),F=b("a-form-item"),Z=b("a-input"),J=b("a-textarea"),V=b("a-form"),K=b("a-modal"),ae=b("a-input-number");return u(),v("div",null,[S("div",Qe,[S("div",null,[S("h2",We,r(t.$t("aiops.title")),1),S("p",Ze,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(N,{key:"incident"},{default:l(()=>[o(e.AlertOutlined),y(" "+r(t.$t("aiops.actions.incident")),1)]),_:1}),o(N,{key:"playbook"},{default:l(()=>[o(e.RocketOutlined),y(" "+r(t.$t("aiops.actions.playbook")),1)]),_:1}),o(N,{key:"baseline"},{default:l(()=>[o(e.LineChartOutlined),y(" "+r(t.$t("aiops.actions.baseline")),1)]),_:1}),o(N,{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(W,{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",Ye,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",Ge,[o(B,{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(B,{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",He,r(c.anomalyMetric),1)):(u(),v("span",Xe,"—"))],64)):p("v-if",!0),i.key==="description"?(u(),v("span",$e,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",et,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",tt,[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",at,r(c.name),1),c.triggerCondition?(u(),v("div",ot,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",lt,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",it,[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",nt,r(c.metricName),1)):p("v-if",!0),i.key==="mean"?(u(),v(z,{key:1},[S("span",st,r(c.mean),1),S("span",rt,"σ "+r(c.stdDev),1)],64)):p("v-if",!0),i.key==="iqr"?(u(),v("span",dt," 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",ct,r(e.formatOpsTime(c.updatedAt)),1)):p("v-if",!0)]),emptyText:l(()=>[S("div",ut,[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(q,{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(Z,{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(J,{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(Z,{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(J,{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(J,{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(Z,{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(J,{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(q,{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(B,{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",pt,r(t.$t("aiops.detect_modal.reasonLine",{reason:e.reasonLabel(e.detectResult.reason)})),1)):p("v-if",!0),e.detectResult.baseline?(u(),v("div",mt,[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",yt,[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 Mt=ze(Ke,[["render",ft],["__scopeId","data-v-b804918b"],["__file","/tmp/cc-web-panel-UUgUnt/repo/packages/web-panel/src/views/AIOps.vue"]]);export{Mt as default};