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.
- package/package.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/AIOps-DcqNhZhA.js +1 -0
- package/src/assets/web-panel/assets/{ActionButton-COjZZKWG.js → ActionButton-BigtmPoq.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-4ZDZE7lc.js → Analytics-1J_X_HF4.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-CYH5k2Rp.js → AppLayout-DlcDG_a_.js} +5 -5
- package/src/assets/web-panel/assets/Audit-Do-y8_3w.js +1 -0
- package/src/assets/web-panel/assets/{Backup-CiX61Qc2.js → Backup-S2Df-50Y.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CDxIQokd.js → BaseInput-D5kgWJfk.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CaKgdRab.js → Chat-aUcp3kN1.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-Pg7dIsiE.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-CjiWfu4s.js → Checkbox-DTg1U7Xs.js} +1 -1
- package/src/assets/web-panel/assets/Codegen-YO9ZZ4Ky.js +1 -0
- package/src/assets/web-panel/assets/{Col-ZKWREyNs.js → Col-BHonE9fU.js} +1 -1
- package/src/assets/web-panel/assets/Community-DA2AlEFh.js +1 -0
- package/src/assets/web-panel/assets/{Compact-DqknM98n.js → Compact-DULxLRNg.js} +1 -1
- package/src/assets/web-panel/assets/Compliance-BZqfuuZL.js +1 -0
- package/src/assets/web-panel/assets/{Cowork-Dp29kHsC.js → Cowork-CJe3vyMS.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-zmEJAetz.js → Cron-CeV8AtRu.js} +2 -2
- package/src/assets/web-panel/assets/Crosschain-CAg66zS5.js +1 -0
- package/src/assets/web-panel/assets/{DID-D_UFNzJ5.js → DID-Dtup5JZm.js} +2 -2
- package/src/assets/web-panel/assets/Dashboard-DAR_8PNy.js +3 -0
- package/src/assets/web-panel/assets/{Dropdown-CH7l3KCs.js → Dropdown-K5bTaCYN.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-Bud2M3XX.js → EmailListRenderer-C890uErx.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-Bd2_8uME.js → FamilyGuardDashboard-B-Tj_8yM.js} +1 -1
- package/src/assets/web-panel/assets/Federation-C6WZ98ni.js +1 -0
- package/src/assets/web-panel/assets/{FormItemContext-CpSH464Y.js → FormItemContext-D-LTfGWd.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-CANo8O-y.js → GenericCardRenderer-C80DK4W7.js} +1 -1
- package/src/assets/web-panel/assets/{Git-hvuZVoD3.js → Git-Cjvvv3zW.js} +2 -2
- package/src/assets/web-panel/assets/Governance-C0BND77H.js +1 -0
- package/src/assets/web-panel/assets/Inference-BL9kTtSu.js +1 -0
- package/src/assets/web-panel/assets/KnowledgeGraph-CnVTBmJf.js +1 -0
- package/src/assets/web-panel/assets/{Logs-DDkTnedu.js → Logs-CbCbg7K6.js} +2 -2
- package/src/assets/web-panel/assets/Marketplace-CG5On-fH.js +1 -0
- package/src/assets/web-panel/assets/{McpTools-Qx78XyOT.js → McpTools-AYYDZZK7.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-CXYDO1oT.js → Memory-tMWbMDQq.js} +2 -2
- package/src/assets/web-panel/assets/MobileBridge-BAOsf4wB.js +1 -0
- package/src/assets/web-panel/assets/{MobileProjects-DEDbWNIk.js → MobileProjects-BT-2komQ.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-Dwa_vlR8.js → Mtc-BFwfC63n.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-DAVkxhJv.js → MtcAudit-DYG3CWdH.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-C3upmgPN.js → Multisig-KJwd0yWT.js} +3 -3
- package/src/assets/web-panel/assets/NLProgramming-BmL5dNWm.js +1 -0
- package/src/assets/web-panel/assets/{Notes-B1Oy3FbC.js → Notes-DmkaVaMc.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-Bs4-Fc6b.js → NotificationSettings-tmVQszDZ.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-CEy1pIeq.js → OrderTableRenderer-BtrR7anf.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-D4cJ1UNo.js → Organization-pppktQyW.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-fdzvlF7x.js → Overflow-D3lBoQDA.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-Y13PwXBA.js → P2P-BgE2qGlZ.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-D26Bz5gS.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-CvEXP6LC.js → Permissions-BR8no2Xe.js} +3 -3
- package/src/assets/web-panel/assets/{PersonalDataHub-JeP7IWMW.js → PersonalDataHub-DabbyQEF.js} +3 -3
- package/src/assets/web-panel/assets/Pipeline-n4sNpEz8.js +1 -0
- package/src/assets/web-panel/assets/Privacy-CGNp4n8M.js +1 -0
- package/src/assets/web-panel/assets/{ProjectInit-DeWd9UcS.js → ProjectInit-CAVA5VsX.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-DUpVuU9F.js → ProjectSettings-GCgkfM7A.js} +2 -2
- package/src/assets/web-panel/assets/Projects-BYK17p52.js +1 -0
- package/src/assets/web-panel/assets/{Providers-DECW00ek.js → Providers-DpUT5W-d.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-Dl-pK9Io.js → QuickAsk-ZJxTb7vi.js} +1 -1
- package/src/assets/web-panel/assets/Recommend-CIzFRDk1.js +1 -0
- package/src/assets/web-panel/assets/Reputation-lQ_WDNZn.js +1 -0
- package/src/assets/web-panel/assets/Row-1MEtrgtF.js +1 -0
- package/src/assets/web-panel/assets/{RssFeed-iyQT5q9l.js → RssFeed-SSgcPPl4.js} +3 -3
- package/src/assets/web-panel/assets/Search-CcTMOGNY.js +1 -0
- package/src/assets/web-panel/assets/{Security-c4Jxf5Ih.js → Security-BA1KMaDx.js} +4 -4
- package/src/assets/web-panel/assets/{Services-CRuisolj.js → Services-_aj7czZn.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CCnzJkb-.js → Skeleton-BWgg_0Zr.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CZURCwZg.js → Skills-C2ZIziYM.js} +1 -1
- package/src/assets/web-panel/assets/Sla-CYxp4axY.js +1 -0
- package/src/assets/web-panel/assets/SpeechSettings-C7Csp1jV.js +1 -0
- package/src/assets/web-panel/assets/{SyncSettings-CJWVtd87.js → SyncSettings-svGeswiw.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-61lrQ_lS.js → Tasks-ClISj6oK.js} +1 -1
- package/src/assets/web-panel/assets/Templates-CmO-Fp7r.js +1 -0
- package/src/assets/web-panel/assets/Tenant-a3Ac3lxz.js +1 -0
- package/src/assets/web-panel/assets/{Terminal-CP15hcNS.js → Terminal-DyJIRh81.js} +2 -2
- package/src/assets/web-panel/assets/TimelineRenderer-acXS5N5h.js +1 -0
- package/src/assets/web-panel/assets/Tokens-DJW0KqV4.js +1 -0
- package/src/assets/web-panel/assets/{Trigger-BLCQEOF2.js → Trigger-0HeTi4r6.js} +1 -1
- package/src/assets/web-panel/assets/Trust-aFym34eo.js +1 -0
- package/src/assets/web-panel/assets/{UkeySign-Dwp0zXQ6.js → UkeySign-CYhszHJv.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CIHA55Sx.js → VideoEditing-BbJxPF9X.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-Hjajvnto.js → Wallet-DDthEwiu.js} +3 -3
- package/src/assets/web-panel/assets/{WebAuthn-DqSURUvI.js → WebAuthn-DQ6McYPg.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-B5bHRwUG.js → WorkflowEditor-CnF8zRsi.js} +1 -1
- package/src/assets/web-panel/assets/{chat-DsheLKkG.js → chat-Dzkx2gTP.js} +1 -1
- package/src/assets/web-panel/assets/{colors-CST2UkgL.js → colors-35T51Oo5.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-yqEoy1L7.js → compact-item-TtzNrlu1.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-Jwp78HFY.js → createContext-Y1LkWrYb.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-D_lwLZ6O.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CVS5mFEP.js → hasIn-BOYw1BgS.js} +1 -1
- package/src/assets/web-panel/assets/{index-Crk4KWLW.js → index-8jffdb6b.js} +1 -1
- package/src/assets/web-panel/assets/{index-CDAPnZUs.js → index-B7aKAZzS.js} +1 -1
- package/src/assets/web-panel/assets/index-BGPEaeB1.js +1 -0
- package/src/assets/web-panel/assets/index-BKRlWHUp.js +1 -0
- package/src/assets/web-panel/assets/{index-BCHAUdel.js → index-BSpFe6j5.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cjig5i3a.js → index-BWgNn9As.js} +28 -26
- package/src/assets/web-panel/assets/{index-Dxljh9Fu.js → index-Bs69SI96.js} +2 -2
- package/src/assets/web-panel/assets/{index-BLTUVd0V.js → index-BtlJWaSP.js} +2 -2
- package/src/assets/web-panel/assets/index-Bw1iOGhM.js +1 -0
- package/src/assets/web-panel/assets/{index-CjfN2CpJ.js → index-BxWUEFKy.js} +1 -1
- package/src/assets/web-panel/assets/index-C7Wt5feN.js +1 -0
- package/src/assets/web-panel/assets/index-CEwuCM44.js +1 -0
- package/src/assets/web-panel/assets/index-CLqC2sRT.js +3 -0
- package/src/assets/web-panel/assets/{index-Dgyn8-wN.js → index-CPGNc2tF.js} +2 -2
- package/src/assets/web-panel/assets/{index-AnW25bEq.js → index-CVrUs6rf.js} +1 -1
- package/src/assets/web-panel/assets/index-CZ16GlOs.js +1 -0
- package/src/assets/web-panel/assets/{index-Cy0dNzkp.js → index-CdyFg4FI.js} +1 -1
- package/src/assets/web-panel/assets/{index-C0FZScMe.js → index-CqhwG1ox.js} +4 -4
- package/src/assets/web-panel/assets/index-Cs82BHAj.js +1 -0
- package/src/assets/web-panel/assets/{index-CRBbVS43.js → index-D2od7Bgx.js} +1 -1
- package/src/assets/web-panel/assets/{index-DxaU_lza.js → index-D47robkX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CSBPc-sI.js → index-D4BgCBa3.js} +2 -2
- package/src/assets/web-panel/assets/index-D6tG4B25.js +55 -0
- package/src/assets/web-panel/assets/index-D7dCBw_M.js +1 -0
- package/src/assets/web-panel/assets/index-DAizH273.js +21 -0
- package/src/assets/web-panel/assets/{index-CzsKK0tQ.js → index-DFhlelzN.js} +2 -2
- package/src/assets/web-panel/assets/index-DhMSOd_2.js +1 -0
- package/src/assets/web-panel/assets/index-Dhfw-BXs.js +12 -0
- package/src/assets/web-panel/assets/index-DjeUZxE5.js +1 -0
- package/src/assets/web-panel/assets/{index-DDAigsel.js → index-DmkG479D.js} +2 -2
- package/src/assets/web-panel/assets/index-Dof7lWA_.js +13 -0
- package/src/assets/web-panel/assets/{index-De600Jjm.js → index-Dx0hIfC-.js} +1 -1
- package/src/assets/web-panel/assets/index-DzzgU4IU.js +1 -0
- package/src/assets/web-panel/assets/index-G4ClSmJc.js +1 -0
- package/src/assets/web-panel/assets/{index-CtyEOGuj.js → index-KgXrlfNF.js} +1 -1
- package/src/assets/web-panel/assets/{index-SjxCCf5h.js → index-NM9Oke2k.js} +2 -2
- package/src/assets/web-panel/assets/{index-R-VGFpi6.js → index-XIuZV9by.js} +3 -3
- package/src/assets/web-panel/assets/{index-BzetOasL.js → index-hyqEKkBT.js} +1 -1
- package/src/assets/web-panel/assets/{index-BuI27WSx.js → index-zF77jnI2.js} +2 -2
- package/src/assets/web-panel/assets/{initDefaultProps-ClAjrsQ-.js → initDefaultProps-DD5y5msp.js} +1 -1
- package/src/assets/web-panel/assets/motion-BuoutMia.js +11 -0
- package/src/assets/web-panel/assets/{move-DMelzIW-.js → move-DkpjqOXg.js} +1 -1
- package/src/assets/web-panel/assets/mtc-parser-BmGJD-v-.js +1 -0
- package/src/assets/web-panel/assets/{omit-oxecfU3b.js → omit-DftUE0Sz.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DJ5F5M6x.js → pickAttrs-DDRb9FIu.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DdbKsant.js → placementArrow-DPgtxOOD.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BUuM5cmS.js → responsiveObserve-BQFRzFeZ.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DSV0ccvR.js → slide-DQ4lmUSz.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-B-6oLAXf.js → statusUtils-C1TR4ZiQ.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DdCAHtsZ.js → styleChecker-B-Suj978.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-ZORkcoZd.js → useFlexGapSupport-Q7bDZ3EI.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BFp46LoP.js → useFs-DHjRLyQH.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-H7rxgbdW.js → usePersonalDataHub-lQOvCvCr.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-eIq4Tk0J.js → vnode-Ie0g4-p3.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-CTNrv8-H.js → zoom-CHP0YEoH.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agent.js +10 -0
- package/src/commands/ide.js +60 -5
- package/src/commands/incentive.js +22 -22
- package/src/commands/mtc.js +5 -1
- package/src/gateways/ws/message-dispatcher.js +4 -1
- package/src/gateways/ws/ws-session-gateway.js +56 -4
- package/src/harness/background-task-manager.js +5 -1
- package/src/harness/jsonl-session-store.js +51 -0
- package/src/harness/mcp-client.js +62 -21
- package/src/harness/prompt-compressor.js +24 -5
- package/src/harness/worktree-isolator.js +5 -1
- package/src/lib/agent-core.js +1 -0
- package/src/lib/autonomous-agent.js +29 -0
- package/src/lib/chat-intent-service.js +14 -2
- package/src/lib/checkpoint-store.js +31 -4
- package/src/lib/claude-code-bridge.js +48 -3
- package/src/lib/cost-budget.js +13 -2
- package/src/lib/credential-guard.js +38 -0
- package/src/lib/git-integration.js +11 -2
- package/src/lib/goal-store.js +11 -0
- package/src/lib/hook-manager.js +4 -0
- package/src/lib/jetbrains-bridge.js +147 -0
- package/src/lib/jsonl-session-store.js +1 -0
- package/src/lib/llm-pricing.js +11 -4
- package/src/lib/llm-providers.js +11 -1
- package/src/lib/mcp-oauth.js +12 -0
- package/src/lib/mcp-serve.js +29 -0
- package/src/lib/orchestrator.js +38 -2
- package/src/lib/repl-bang-memorize.js +9 -1
- package/src/lib/runnable-provider.js +7 -1
- package/src/lib/session-insights.js +13 -6
- package/src/lib/session-usage.js +21 -3
- package/src/lib/status-line.cjs +4 -1
- package/src/lib/sub-agent-context.js +9 -0
- package/src/repl/agent-repl.js +29 -0
- package/src/runtime/agent-core.js +4 -2
- package/src/runtime/headless-runner.js +13 -0
- package/src/runtime/headless-stream.js +9 -0
- package/src/runtime/mcp-config.js +72 -3
- package/src/runtime/pipe-safety.js +51 -0
- package/src/runtime/policies/agent-policy.js +3 -0
- package/src/assets/web-panel/assets/AIOps-BsDJlD_l.js +0 -1
- package/src/assets/web-panel/assets/Audit-BKlFbLdl.js +0 -1
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DgvpwU5o.js +0 -1
- package/src/assets/web-panel/assets/Codegen-tKWGzajw.js +0 -1
- package/src/assets/web-panel/assets/Community-CmLuPBUU.js +0 -1
- package/src/assets/web-panel/assets/Compliance-PZw0aBLI.js +0 -1
- package/src/assets/web-panel/assets/Crosschain-Sb-uM7Ty.js +0 -1
- package/src/assets/web-panel/assets/Dashboard-Btag698v.js +0 -3
- package/src/assets/web-panel/assets/Federation-1jhstF5P.js +0 -1
- package/src/assets/web-panel/assets/Governance-BQrWksKt.js +0 -1
- package/src/assets/web-panel/assets/Inference-jEBTp12v.js +0 -1
- package/src/assets/web-panel/assets/KnowledgeGraph-tDiV2taf.js +0 -1
- package/src/assets/web-panel/assets/Marketplace-9Yi32avt.js +0 -1
- package/src/assets/web-panel/assets/MobileBridge-MfUfkHA0.js +0 -1
- package/src/assets/web-panel/assets/NLProgramming-DO3CZ0_z.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-Ck1zCLe6.js +0 -7
- package/src/assets/web-panel/assets/Pipeline-BZ7wRzG1.js +0 -1
- package/src/assets/web-panel/assets/Privacy-BJ6qj9Hv.js +0 -1
- package/src/assets/web-panel/assets/Projects-y1WbI337.js +0 -1
- package/src/assets/web-panel/assets/Recommend-Bju04wTd.js +0 -1
- package/src/assets/web-panel/assets/Reputation-BUPa3nEk.js +0 -1
- package/src/assets/web-panel/assets/Row-WYqqaq_5.js +0 -1
- package/src/assets/web-panel/assets/Search-CrfwJF0R.js +0 -1
- package/src/assets/web-panel/assets/Sla-CrMzaEi2.js +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-jTDOM5eY.js +0 -1
- package/src/assets/web-panel/assets/Templates-Cg-iF2g1.js +0 -1
- package/src/assets/web-panel/assets/Tenant-DrDv1FFc.js +0 -1
- package/src/assets/web-panel/assets/TimelineRenderer-Sl5uXrkN.js +0 -1
- package/src/assets/web-panel/assets/Tokens-yRIZTVsR.js +0 -1
- package/src/assets/web-panel/assets/Trust-D5xq8z6s.js +0 -1
- package/src/assets/web-panel/assets/community-parser-Cuyslaku.js +0 -3
- package/src/assets/web-panel/assets/devWarning-C8to6gQk.js +0 -1
- package/src/assets/web-panel/assets/index-BeblNJDH.js +0 -1
- package/src/assets/web-panel/assets/index-C130LLPq.js +0 -1
- package/src/assets/web-panel/assets/index-C8rq85gu.js +0 -1
- package/src/assets/web-panel/assets/index-CIE2n8k_.js +0 -1
- package/src/assets/web-panel/assets/index-CTd3lDxp.js +0 -13
- package/src/assets/web-panel/assets/index-CUWj5L2s.js +0 -1
- package/src/assets/web-panel/assets/index-ChRL6rgA.js +0 -3
- package/src/assets/web-panel/assets/index-CrlRa054.js +0 -1
- package/src/assets/web-panel/assets/index-Cu6Ql64n.js +0 -1
- package/src/assets/web-panel/assets/index-Cx_t5rWw.js +0 -12
- package/src/assets/web-panel/assets/index-DZfnYE6e.js +0 -1
- package/src/assets/web-panel/assets/index-D_1b7uh6.js +0 -55
- package/src/assets/web-panel/assets/index-D_e9gwfn.js +0 -1
- package/src/assets/web-panel/assets/index-DbxAlpPC.js +0 -21
- package/src/assets/web-panel/assets/index-DiK4vSZa.js +0 -1
- package/src/assets/web-panel/assets/index-DpYn5v2k.js +0 -1
- package/src/assets/web-panel/assets/index-diWkx2Wq.js +0 -1
- package/src/assets/web-panel/assets/motion-BalXv_60.js +0 -11
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
|
package/src/lib/session-usage.js
CHANGED
|
@@ -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
|
-
|
|
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,
|
package/src/lib/status-line.cjs
CHANGED
|
@@ -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
|
-
|
|
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
|
|
package/src/repl/agent-repl.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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};
|