chainlesschain 0.162.148 → 0.162.149
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/README.md +1 -1
- package/package.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-DwpCCp64.js → AIOps-BJif14yR.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-C9pBYocA.js → ActionButton-CXek6gJY.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BWAkeXxK.js → Analytics-BgQhdAJi.js} +2 -2
- package/src/assets/web-panel/assets/{AppLayout-CivFGH6B.js → AppLayout-DTYl5NtR.js} +3 -3
- package/src/assets/web-panel/assets/{Audit-Cm8hRpZm.js → Audit-BzATQAeR.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DXdFMsE8.js → Backup-BzdPEQhL.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-uAwSTeql.js → BaseInput-BM0KVh8E.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-KU8eeJJE.js → Chat-D7fHXHkz.js} +4 -4
- package/src/assets/web-panel/assets/ChatBubbleRenderer-Wm34RR-b.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-C6AMDkjd.js → Checkbox-CAiSQ9vO.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-t2moDxcO.js → Codegen-Df40CrEe.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DCcsRRhN.js → Col-DIT2fNFU.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DtB-8SAC.js → Community-CSTIbW2k.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-CZm8THYA.js → Compact-DtqXZZUi.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-LiQgC7g1.js → Compliance-CUtzw6o7.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CA8SAxht.js → Cowork-CezmlnmU.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-CtRaF1wD.js → Cron-P4BITarg.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-6-br6Hub.js → Crosschain-BRRiYwvq.js} +1 -1
- package/src/assets/web-panel/assets/{DID-Do2EccrL.js → DID-L5ijB9i4.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-wrXcbzGe.js → Dashboard-CFxro4ob.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-p3FsT245.js → Dropdown-BmAFCQ71.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-D95A2L8q.js → EmailListRenderer-DJBCEuon.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-cLuJW2zo.js → FamilyGuardDashboard-z4oLq6eT.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-Brgq_cbN.js → Federation-DsVCpHMF.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DWLCkNgh.js → FormItemContext-DP3bP5th.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-BBqUfQd6.js → GenericCardRenderer-BAXP2Gc6.js} +1 -1
- package/src/assets/web-panel/assets/{Git-8F090w4I.js → Git-I3g_bAw9.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CCogEbxb.js → Governance-jHS5-ioS.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CfLD7v7C.js → Inference-CPL7sfx9.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DDuHJewd.js → KnowledgeGraph-Jf236h4C.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-CE8KSEVC.js → Logs-Cm2tcSKg.js} +2 -2
- package/src/assets/web-panel/assets/{Marketplace-DmwpZmhT.js → Marketplace-CZK82rhi.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-Bf7AazU8.js → McpTools-CZCeji7a.js} +4 -4
- package/src/assets/web-panel/assets/{Memory-D0QU_00S.js → Memory-3l2KVS9k.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-yXS9xdhx.js → MobileBridge-VYdpoLh6.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-BuDUoGUP.js → MobileProjects-CiB9cmm1.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BYyHy28p.js → Mtc-wCFZbBuL.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-CK0aqpiZ.js → MtcAudit-1a3THIyG.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-mNimKYeb.js → Multisig-DMzLB2hG.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-AioAJ0YA.js → NLProgramming-D9wZbf6l.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CVVNCLHE.js → Notes-hrFe2ZM-.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-C4ABj-TK.js → NotificationSettings-CHGX5Jwm.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-CRIFE2Tj.js +1 -0
- package/src/assets/web-panel/assets/{Organization-uozl_gWK.js → Organization-By7FkhtY.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-BCZOM2hK.js → Overflow--khGSzJn.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CArcaiaj.js → P2P-CAG9dH35.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-Sgq2Srr8.js → PdhVaultBrowser-B3SQZmK9.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-BYrQrXnH.js → Permissions-D35ec6JA.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-BzHStAbz.js → PersonalDataHub-CxBF7hW_.js} +2 -2
- package/src/assets/web-panel/assets/{Pipeline-k7KqxX1M.js → Pipeline-s6EtOO1s.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-IumTUWqx.js → Privacy-BbJYmWmO.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BRyImYTf.js → ProjectInit-VGQq1jMT.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-BFIqTBFk.js → ProjectSettings-B1ew3Teh.js} +2 -2
- package/src/assets/web-panel/assets/Projects-CGcNIs_g.js +1 -0
- package/src/assets/web-panel/assets/{Providers-CyyFnUPs.js → Providers-mrO47FIK.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-C82cRx-X.js → QrScannerModal-IJF2mHyw.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DGxDF521.js → QuickAsk-CU0wN_Z0.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Cns-Am1y.js → Recommend-DhN37R6G.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-R7OqAIlg.js → RemoteSession-D_xOX_hu.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-D7mgPIYV.js → Reputation-D_Ssv7uH.js} +1 -1
- package/src/assets/web-panel/assets/{Row-B3lEURyd.js → Row-Kx5dKxX7.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-9_UVrpBt.js → RssFeed-BlGwqZkY.js} +2 -2
- package/src/assets/web-panel/assets/{Search-ClZeO80q.js → Search-hLFQzxpb.js} +1 -1
- package/src/assets/web-panel/assets/{Security-BNNJczEp.js → Security-DMlvsVt4.js} +3 -3
- package/src/assets/web-panel/assets/{Services-C5SjrWUj.js → Services-Bd0Qsj2m.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-Ci_obQ-g.js → Skeleton-DFclq9X3.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-DdebN15P.js → Skills-BNtln2qY.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-OinZP2vi.js → Sla-Dch5H19G.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CxzbNF51.js → SpeechSettings-2UfQcU1g.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-D06N_66b.js → SyncSettings-CD9YQr4i.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-BdEdW0AZ.js → Tasks-BNu-7MzI.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-F1ctKmPa.js → Templates-D1n9CaIR.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CVz1Urot.js → Tenant-DenL3iBW.js} +1 -1
- package/src/assets/web-panel/assets/Terminal-ZzU0Io1Y.js +3 -0
- package/src/assets/web-panel/assets/{TimelineRenderer-Doitzjmf.js → TimelineRenderer-D87IfukO.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BpyVRpVA.js → Tokens-BkiZc8E3.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-nWhWYTbU.js → Trigger-BNRSytGN.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DK_G-wLx.js → Trust-Bwbd4X2m.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-B5yBUojO.js → UkeySign-B8O2bs0o.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-C5D51qAe.js → VideoEditing-C2fL8zmH.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CLbL9K7v.js → Wallet-BORYDdE1.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DZUelI3V.js → WebAuthn-C0V5S2FM.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-8RPxt4KW.js → WorkflowEditor-2dR0fcHL.js} +1 -1
- package/src/assets/web-panel/assets/{chat-4N4tOA3d.js → chat-BmuAFAn8.js} +1 -1
- package/src/assets/web-panel/assets/{colors-zbbGVrua.js → colors-CN3smMcK.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-D7iMkbnE.js → compact-item-DCnxb4kW.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CBzPJv-w.js → createContext-vlR43pHn.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DxwmsL4j.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-bHdrQSqZ.js → hasIn-D04tHYFd.js} +1 -1
- package/src/assets/web-panel/assets/{index-DbE5D0WL.js → index-0DnaZGkC.js} +1 -1
- package/src/assets/web-panel/assets/{index-308gCGh7.js → index-430S68MN.js} +1 -1
- package/src/assets/web-panel/assets/{index-kmh1TxRa.js → index-B78xL3s2.js} +1 -1
- package/src/assets/web-panel/assets/{index-QFObYeo1.js → index-BTPEZTk1.js} +1 -1
- package/src/assets/web-panel/assets/{index-BZb8F8YG.js → index-BXRg8GFQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DE9j5YgT.js → index-BasvsWDM.js} +1 -1
- package/src/assets/web-panel/assets/{index-CiG1IZao.js → index-BeGDEXFs.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bqmx24kh.js → index-BqhASEL4.js} +1 -1
- package/src/assets/web-panel/assets/{index-BCr0geV9.js → index-BudvKQfG.js} +1 -1
- package/src/assets/web-panel/assets/{index-S74FpAIn.js → index-C-6NO5il.js} +1 -1
- package/src/assets/web-panel/assets/{index-DyoNgbXl.js → index-C5Sxb1sE.js} +1 -1
- package/src/assets/web-panel/assets/{index-BtbbdLnf.js → index-CP9m9Ggr.js} +3 -3
- package/src/assets/web-panel/assets/{index-CkxK86vf.js → index-CTOCnIQ7.js} +1 -1
- package/src/assets/web-panel/assets/index-Cg2ldRfU.js +1 -0
- package/src/assets/web-panel/assets/{index-BTIjjXry.js → index-ClhAHDK3.js} +1 -1
- package/src/assets/web-panel/assets/{index-B7b1hGry.js → index-CnXebZLL.js} +1 -1
- package/src/assets/web-panel/assets/{index-CPxkoKgA.js → index-CngCC8hC.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ci009ijp.js → index-Cr-A0FYJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdmMoYN1.js → index-CsAsCPJ6.js} +1 -1
- package/src/assets/web-panel/assets/{index-BBNr77E1.js → index-D28DeAAB.js} +1 -1
- package/src/assets/web-panel/assets/{index-B1s0Bz9O.js → index-D5LZVZ0L.js} +1 -1
- package/src/assets/web-panel/assets/{index-oDKNgCsP.js → index-D65_XseV.js} +1 -1
- package/src/assets/web-panel/assets/{index-QNAG4JtR.js → index-D8vwp4qp.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQfu1U78.js → index-DDwLgQY9.js} +1 -1
- package/src/assets/web-panel/assets/{index-BnBOpqv3.js → index-DIpY0qM5.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQ6NcfWz.js → index-DTWg-18U.js} +1 -1
- package/src/assets/web-panel/assets/{index-D4XKpj6c.js → index-DTtRscUa.js} +1 -1
- package/src/assets/web-panel/assets/{index-D1YDh7Wr.js → index-DYAtmqiv.js} +1 -1
- package/src/assets/web-panel/assets/{index-CvRMA9uT.js → index-D_n8_vfI.js} +1 -1
- package/src/assets/web-panel/assets/{index-CahryTX0.js → index-DbADHwhr.js} +1 -1
- package/src/assets/web-panel/assets/{index-BJ4ZGyW0.js → index-DbVsQBOH.js} +1 -1
- package/src/assets/web-panel/assets/index-Dwzo-dtJ.js +1 -0
- package/src/assets/web-panel/assets/{index-xYCm6W2h.js → index-HhNjnCfe.js} +1 -1
- package/src/assets/web-panel/assets/{index-BS4_Mwk6.js → index-ToUh2b1-.js} +1 -1
- package/src/assets/web-panel/assets/{index-DISWAYce.js → index-TslMTwNy.js} +1 -1
- package/src/assets/web-panel/assets/{index-DmqlJed-.js → index-_FIkN3jd.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqdPyWm5.js → index-hpvvtAZ3.js} +1 -1
- package/src/assets/web-panel/assets/{index-BsKehmmS.js → index-jzR7Ujuw.js} +1 -1
- package/src/assets/web-panel/assets/{index-DUyjUkY7.js → index-ljuBiQW9.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-BD55yNBt.js → initDefaultProps-C3wUb4je.js} +1 -1
- package/src/assets/web-panel/assets/{motion-B5Bbe77U.js → motion-D-jYFUNA.js} +1 -1
- package/src/assets/web-panel/assets/{move-CTvIqHEH.js → move-tqb8nwJ2.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BkNyPQKB.js → mtc-parser-DSOjMJMz.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BaXJXgHA.js → omit-CJ7VimIW.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-Bw6-YTxH.js → pickAttrs-qXiG1iT3.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BLdbkLqJ.js → placementArrow-CkGBcy1Z.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-IVYkzntU.js → responsiveObserve-D3WvTlLO.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DFMFwwtY.js → slide-BEE2ftge.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-CURYRtZ1.js → statusUtils-CsfBpxiG.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Cfz63s1r.js → styleChecker-xPrIiJPI.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-COJL0KE3.js → useFlexGapSupport-C5Yd-SCR.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-YLLojQQf.js → useFs-D_MDS8HI.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BF_21qUC.js → usePersonalDataHub-BqJh-usA.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-9ZpkA7bb.js → vnode-chm_p-gz.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DhtAfhl8.js → zoom-3-YDNz0Z.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/assets/web-panel/remote-session-sw.js +43 -0
- package/src/command-manifest.json +22 -1
- package/src/commands/agent.js +44 -5
- package/src/commands/codeintel.js +252 -0
- package/src/commands/eval.js +248 -0
- package/src/commands/plugin.js +354 -0
- package/src/commands/team.js +456 -0
- package/src/gateways/ws/message-dispatcher.js +45 -2
- package/src/gateways/ws/remote-session-protocol.js +37 -0
- package/src/gateways/ws/ws-server.js +1 -1
- package/src/harness/prompt-compressor.js +27 -1
- package/src/harness/remote-command-ledger.js +158 -0
- package/src/harness/remote-session-push-apns.js +246 -0
- package/src/harness/remote-session-push-errors.js +15 -0
- package/src/harness/remote-session-push-fcm.js +9 -25
- package/src/harness/remote-session-push-huawei.js +174 -0
- package/src/harness/remote-session-push-oppo.js +171 -0
- package/src/harness/remote-session-push-senders.js +42 -0
- package/src/harness/remote-session-push-vivo.js +179 -0
- package/src/harness/remote-session-push-web.js +299 -0
- package/src/harness/remote-session-push-xiaomi.js +99 -0
- package/src/index.js +6 -0
- package/src/lib/agent-core.js +2 -0
- package/src/lib/agent-sandbox.js +161 -5
- package/src/lib/agent-team/task-lease.js +434 -0
- package/src/lib/agent-team/team-budget.js +165 -0
- package/src/lib/agent-team/team-mailbox.js +106 -0
- package/src/lib/agent-team/team-runner.js +266 -0
- package/src/lib/agent-team/team-worktree.js +204 -0
- package/src/lib/agents.js +18 -0
- package/src/lib/async-hook-supervisor.cjs +305 -0
- package/src/lib/eval/runner.js +163 -0
- package/src/lib/eval/tasks.js +456 -0
- package/src/lib/eval/trend.js +185 -0
- package/src/lib/lsp/__tests__/code-intelligence.integration.test.js +129 -0
- package/src/lib/lsp/__tests__/code-intelligence.test.js +228 -0
- package/src/lib/lsp/__tests__/jsonrpc-stream.test.js +104 -0
- package/src/lib/lsp/__tests__/lsp-client.test.js +258 -0
- package/src/lib/lsp/__tests__/lsp-manager.test.js +264 -0
- package/src/lib/lsp/__tests__/lsp-server-registry.test.js +128 -0
- package/src/lib/lsp/code-intelligence.js +356 -0
- package/src/lib/lsp/jsonrpc-stream.js +139 -0
- package/src/lib/lsp/lsp-client.js +318 -0
- package/src/lib/lsp/lsp-manager.js +323 -0
- package/src/lib/lsp/lsp-server-registry.js +196 -0
- package/src/lib/plugin-monitor-supervisor.js +238 -0
- package/src/lib/plugin-runtime/agents.js +51 -0
- package/src/lib/plugin-runtime/bin.js +100 -0
- package/src/lib/plugin-runtime/hooks.js +100 -0
- package/src/lib/plugin-runtime/install.js +388 -0
- package/src/lib/plugin-runtime/lsp.js +75 -0
- package/src/lib/plugin-runtime/manifest.js +458 -0
- package/src/lib/plugin-runtime/mcp.js +89 -0
- package/src/lib/plugin-runtime/monitors.js +100 -0
- package/src/lib/plugin-runtime/policy.js +144 -0
- package/src/lib/plugin-runtime/reload.js +79 -0
- package/src/lib/plugin-runtime/scopes.js +197 -0
- package/src/lib/plugin-runtime/settings.js +119 -0
- package/src/lib/plugin-runtime/signature.js +107 -0
- package/src/lib/plugin-runtime/skills.js +43 -0
- package/src/lib/plugin-runtime/trust.js +140 -0
- package/src/lib/sandbox-egress-proxy.js +162 -0
- package/src/lib/sandbox-network-policy.js +134 -0
- package/src/lib/sandbox-v2.js +10 -4
- package/src/lib/settings-hook-events.cjs +78 -6
- package/src/lib/settings-hooks.cjs +29 -3
- package/src/lib/settings-loader.cjs +35 -1
- package/src/lib/skill-loader.js +18 -0
- package/src/lib/telemetry/span-recorder.js +237 -0
- package/src/repl/agent-repl.js +400 -4
- package/src/runtime/agent-core.js +546 -52
- package/src/runtime/coding-agent-contract-shared.cjs +82 -8
- package/src/runtime/coding-agent-policy.cjs +32 -7
- package/src/runtime/fallback-model.js +134 -7
- package/src/runtime/headless-runner.js +353 -108
- package/src/runtime/mcp-config.js +46 -0
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DCNfbdlx.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-DIp8Xcbd.js +0 -1
- package/src/assets/web-panel/assets/Projects-Dpid9CDg.js +0 -1
- package/src/assets/web-panel/assets/Terminal-BvAK_Zel.js +0 -3
- package/src/assets/web-panel/assets/devWarning-C2Z5LRgq.js +0 -1
- package/src/assets/web-panel/assets/index-BGp6Yr-Y.js +0 -1
- package/src/assets/web-panel/assets/index-BXiw9dQf.js +0 -1
|
@@ -353,6 +353,74 @@ const CODING_AGENT_TOOL_CONTRACTS = Object.freeze([
|
|
|
353
353
|
tags: ["tool:search_files", "contract:coding-agent", "tier:mvp"],
|
|
354
354
|
},
|
|
355
355
|
},
|
|
356
|
+
{
|
|
357
|
+
name: "code_intelligence",
|
|
358
|
+
title: "Code Intelligence",
|
|
359
|
+
kind: "analysis",
|
|
360
|
+
tier: "extension",
|
|
361
|
+
description:
|
|
362
|
+
"Semantic code navigation via a Language Server (LSP): resolve a symbol's " +
|
|
363
|
+
"definition, find its references, get type/hover info, list document or " +
|
|
364
|
+
"workspace symbols, read diagnostics, or preview a rename — WITHOUT text " +
|
|
365
|
+
"guessing. Prefer this over search_files when you need exact symbol " +
|
|
366
|
+
"semantics. Positions are 1-based (line/col). Degrades gracefully to a " +
|
|
367
|
+
"'not available' result when no language server is installed for the file.",
|
|
368
|
+
inputSchema: {
|
|
369
|
+
type: "object",
|
|
370
|
+
properties: {
|
|
371
|
+
action: {
|
|
372
|
+
type: "string",
|
|
373
|
+
enum: [
|
|
374
|
+
"definition",
|
|
375
|
+
"references",
|
|
376
|
+
"hover",
|
|
377
|
+
"document_symbols",
|
|
378
|
+
"workspace_symbols",
|
|
379
|
+
"diagnostics",
|
|
380
|
+
"rename_preview",
|
|
381
|
+
],
|
|
382
|
+
description: "Which semantic query to run",
|
|
383
|
+
},
|
|
384
|
+
file: {
|
|
385
|
+
type: "string",
|
|
386
|
+
description:
|
|
387
|
+
"File path (relative to cwd). Required for every action except workspace_symbols.",
|
|
388
|
+
},
|
|
389
|
+
line: {
|
|
390
|
+
type: "integer",
|
|
391
|
+
description:
|
|
392
|
+
"1-based line number of the symbol (definition/references/hover/rename_preview).",
|
|
393
|
+
},
|
|
394
|
+
col: {
|
|
395
|
+
type: "integer",
|
|
396
|
+
description:
|
|
397
|
+
"1-based column of the symbol (definition/references/hover/rename_preview).",
|
|
398
|
+
},
|
|
399
|
+
query: {
|
|
400
|
+
type: "string",
|
|
401
|
+
description: "Symbol name to search for (workspace_symbols).",
|
|
402
|
+
},
|
|
403
|
+
new_name: {
|
|
404
|
+
type: "string",
|
|
405
|
+
description: "Proposed new identifier (rename_preview).",
|
|
406
|
+
},
|
|
407
|
+
},
|
|
408
|
+
required: ["action"],
|
|
409
|
+
},
|
|
410
|
+
...TOOL_POLICY_METADATA.code_intelligence,
|
|
411
|
+
permissions: {
|
|
412
|
+
level: "readonly",
|
|
413
|
+
scopes: ["filesystem:read", "process:spawn"],
|
|
414
|
+
},
|
|
415
|
+
telemetry: {
|
|
416
|
+
category: "analysis",
|
|
417
|
+
tags: [
|
|
418
|
+
"tool:code_intelligence",
|
|
419
|
+
"contract:coding-agent",
|
|
420
|
+
"tier:extension",
|
|
421
|
+
],
|
|
422
|
+
},
|
|
423
|
+
},
|
|
356
424
|
{
|
|
357
425
|
name: "list_dir",
|
|
358
426
|
title: "List Directory",
|
|
@@ -422,7 +490,8 @@ const CODING_AGENT_TOOL_CONTRACTS = Object.freeze([
|
|
|
422
490
|
properties: {
|
|
423
491
|
category: {
|
|
424
492
|
type: "string",
|
|
425
|
-
description:
|
|
493
|
+
description:
|
|
494
|
+
"Filter by category (e.g. development, automation, data)",
|
|
426
495
|
},
|
|
427
496
|
query: {
|
|
428
497
|
type: "string",
|
|
@@ -491,7 +560,7 @@ const CODING_AGENT_TOOL_CONTRACTS = Object.freeze([
|
|
|
491
560
|
agent: {
|
|
492
561
|
type: "string",
|
|
493
562
|
description:
|
|
494
|
-
|
|
563
|
+
"Optional name of a pre-defined subagent from .chainlesschain/agents/ or .claude/agents/ (e.g. \"review:security\"). Loads that file's system prompt + tool allow-list. Run `cc agents list` to see them. Explicit `role`/`tools` override the agent's values.",
|
|
495
564
|
},
|
|
496
565
|
role: {
|
|
497
566
|
type: "string",
|
|
@@ -588,7 +657,16 @@ const CODING_AGENT_TOOL_CONTRACTS = Object.freeze([
|
|
|
588
657
|
},
|
|
589
658
|
provider: {
|
|
590
659
|
type: "string",
|
|
591
|
-
enum: [
|
|
660
|
+
enum: [
|
|
661
|
+
"auto",
|
|
662
|
+
"tavily",
|
|
663
|
+
"brave",
|
|
664
|
+
"bocha",
|
|
665
|
+
"qianfan",
|
|
666
|
+
"duckduckgo",
|
|
667
|
+
"searxng",
|
|
668
|
+
"baidu",
|
|
669
|
+
],
|
|
592
670
|
description:
|
|
593
671
|
"Override the configured search backend for this call (default: from config / auto)",
|
|
594
672
|
},
|
|
@@ -763,11 +841,7 @@ const CODING_AGENT_TOOL_CONTRACTS = Object.freeze([
|
|
|
763
841
|
},
|
|
764
842
|
telemetry: {
|
|
765
843
|
category: "search",
|
|
766
|
-
tags: [
|
|
767
|
-
"tool:search_sessions",
|
|
768
|
-
"contract:coding-agent",
|
|
769
|
-
"tier:extension",
|
|
770
|
-
],
|
|
844
|
+
tags: ["tool:search_sessions", "contract:coding-agent", "tier:extension"],
|
|
771
845
|
},
|
|
772
846
|
},
|
|
773
847
|
]);
|
|
@@ -23,7 +23,11 @@ const TOOL_DECISIONS = Object.freeze({
|
|
|
23
23
|
REQUIRE_CONFIRMATION: "require_confirmation",
|
|
24
24
|
});
|
|
25
25
|
|
|
26
|
-
const PLAN_APPROVED_STATES = Object.freeze([
|
|
26
|
+
const PLAN_APPROVED_STATES = Object.freeze([
|
|
27
|
+
"approved",
|
|
28
|
+
"executing",
|
|
29
|
+
"completed",
|
|
30
|
+
]);
|
|
27
31
|
|
|
28
32
|
const READ_ONLY_GIT_SUBCOMMANDS = Object.freeze([
|
|
29
33
|
"status",
|
|
@@ -64,6 +68,20 @@ const TOOL_POLICY_METADATA = Object.freeze({
|
|
|
64
68
|
approvalFlow: "auto",
|
|
65
69
|
isReadOnly: true,
|
|
66
70
|
},
|
|
71
|
+
code_intelligence: {
|
|
72
|
+
// Read-only semantic navigation via LSP (definition/references/hover/
|
|
73
|
+
// symbols/diagnostics/rename-preview). It never mutates the workspace — a
|
|
74
|
+
// rename returns a preview, not an applied edit — so it is auto-approved and
|
|
75
|
+
// available in plan mode, like search_files.
|
|
76
|
+
riskLevel: RISK_LEVELS.LOW,
|
|
77
|
+
category: TOOL_CATEGORIES.ANALYZE,
|
|
78
|
+
availableInPlanMode: true,
|
|
79
|
+
planModeBehavior: "allow",
|
|
80
|
+
requiresPlanApproval: false,
|
|
81
|
+
requiresConfirmation: false,
|
|
82
|
+
approvalFlow: "auto",
|
|
83
|
+
isReadOnly: true,
|
|
84
|
+
},
|
|
67
85
|
edit_file: {
|
|
68
86
|
riskLevel: RISK_LEVELS.MEDIUM,
|
|
69
87
|
category: TOOL_CATEGORIES.WRITE,
|
|
@@ -295,7 +313,9 @@ function isDangerousGitCommand(command) {
|
|
|
295
313
|
case "checkout":
|
|
296
314
|
// Discard working-tree changes: `checkout -- <path>`, `checkout .`,
|
|
297
315
|
// or `-f`/`--force` (a plain branch checkout is not flagged).
|
|
298
|
-
return
|
|
316
|
+
return (
|
|
317
|
+
lower.includes("--") || lower.includes(".") || has("-f", "--force")
|
|
318
|
+
);
|
|
299
319
|
case "restore":
|
|
300
320
|
// Worktree restore discards changes; a pure `--staged` restore only
|
|
301
321
|
// unstages and is recoverable.
|
|
@@ -321,9 +341,9 @@ function isDangerousGitCommand(command) {
|
|
|
321
341
|
// or an explicit `--delete --force`.
|
|
322
342
|
return rest.includes("-D") || (has("--delete") && has("-f", "--force"));
|
|
323
343
|
case "stash":
|
|
324
|
-
return ["drop", "clear"].includes(
|
|
344
|
+
return ["drop", "clear"].includes(lower[0] || "");
|
|
325
345
|
case "reflog":
|
|
326
|
-
return ["expire", "delete"].includes(
|
|
346
|
+
return ["expire", "delete"].includes(lower[0] || "");
|
|
327
347
|
case "update-ref":
|
|
328
348
|
return has("-d", "--delete");
|
|
329
349
|
case "filter-branch":
|
|
@@ -333,9 +353,14 @@ function isDangerousGitCommand(command) {
|
|
|
333
353
|
return lower.some((t) => t.startsWith("--prune"));
|
|
334
354
|
case "rebase":
|
|
335
355
|
// History rewrite; control sub-actions (--abort/--continue/etc.) are safe.
|
|
336
|
-
return ![
|
|
337
|
-
|
|
338
|
-
|
|
356
|
+
return ![
|
|
357
|
+
"--abort",
|
|
358
|
+
"--continue",
|
|
359
|
+
"--skip",
|
|
360
|
+
"--quit",
|
|
361
|
+
"--edit-todo",
|
|
362
|
+
"--show-current-patch",
|
|
363
|
+
].includes(lower[0] || "");
|
|
339
364
|
default:
|
|
340
365
|
return false;
|
|
341
366
|
}
|
|
@@ -13,11 +13,20 @@
|
|
|
13
13
|
* 3 models) and 2.1.152 switches to the configured fallback when the primary
|
|
14
14
|
* model is "not found".
|
|
15
15
|
*
|
|
16
|
-
*
|
|
17
|
-
* provider
|
|
16
|
+
* Cross-provider fallback (v2): a fallback entry may name a DIFFERENT provider
|
|
17
|
+
* as `provider:model` (e.g. `openai:gpt-4o`, `ollama:qwen2.5:7b`). A cross-
|
|
18
|
+
* provider hop swaps provider + baseUrl + apiKey too, resolving the target
|
|
19
|
+
* provider's connection from BUILT_IN_PROVIDERS + its `apiKeyEnv`. SECURITY: a
|
|
20
|
+
* cross-provider hop is used ONLY when the user EXPLICITLY named that provider in
|
|
21
|
+
* the fallback chain AND the target provider's API key is present in the env —
|
|
22
|
+
* we never reuse the primary provider's key against a different vendor (that
|
|
23
|
+
* would be the silent auth-substitution this project forbids). A cross-provider
|
|
24
|
+
* entry whose key is missing is SKIPPED with a clear reason, not attempted with
|
|
25
|
+
* the wrong credential.
|
|
18
26
|
*/
|
|
19
27
|
|
|
20
28
|
import { chatWithTools } from "./agent-core.js";
|
|
29
|
+
import { BUILT_IN_PROVIDERS } from "../lib/llm-providers.js";
|
|
21
30
|
|
|
22
31
|
// Claude Code caps the fallback chain at 3 backups; mirror that here so a
|
|
23
32
|
// mis-configured comma list can't fan out into an unbounded retry storm.
|
|
@@ -142,6 +151,85 @@ export function normalizeFallbackModels(input) {
|
|
|
142
151
|
return out;
|
|
143
152
|
}
|
|
144
153
|
|
|
154
|
+
/**
|
|
155
|
+
* Parse a fallback entry into `{ provider, model }`. A `provider:model` prefix
|
|
156
|
+
* is recognized ONLY when the prefix is a KNOWN provider name — so an
|
|
157
|
+
* ollama-style model id that itself contains a colon (`qwen2.5:7b`) is NOT
|
|
158
|
+
* mis-split, while `ollama:qwen2.5:7b` correctly yields provider `ollama` +
|
|
159
|
+
* model `qwen2.5:7b`. A plain `model` (no known-provider prefix) means
|
|
160
|
+
* "same provider" (provider: null).
|
|
161
|
+
*
|
|
162
|
+
* @param {string} entry
|
|
163
|
+
* @param {Set<string>} [knownProviders] provider names to recognize as prefixes
|
|
164
|
+
* @returns {{ provider: string|null, model: string }}
|
|
165
|
+
*/
|
|
166
|
+
export function parseFallbackEntry(entry, knownProviders) {
|
|
167
|
+
const known =
|
|
168
|
+
knownProviders || new Set(Object.keys(BUILT_IN_PROVIDERS || {}));
|
|
169
|
+
const s = String(entry || "").trim();
|
|
170
|
+
const idx = s.indexOf(":");
|
|
171
|
+
if (idx > 0) {
|
|
172
|
+
const head = s.slice(0, idx);
|
|
173
|
+
const rest = s.slice(idx + 1);
|
|
174
|
+
if (rest && known.has(head)) {
|
|
175
|
+
return { provider: head, model: rest };
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return { provider: null, model: s };
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Resolve a fallback entry into a concrete call target. For a SAME-provider hop
|
|
183
|
+
* (no known provider prefix), only the model changes. For a CROSS-provider hop,
|
|
184
|
+
* resolve the target provider's baseUrl + apiKey (from its `apiKeyEnv` in the
|
|
185
|
+
* environment); if the target needs a key and none is set, the hop is
|
|
186
|
+
* `unavailable` (skipped) — we never fall back onto a different vendor with the
|
|
187
|
+
* wrong/absent credential.
|
|
188
|
+
*
|
|
189
|
+
* @param {string} entry
|
|
190
|
+
* @param {object} [opts] { env, providers, knownProviders }
|
|
191
|
+
* @returns {{ model, provider?, baseUrl?, apiKey?, crossProvider:boolean } | { unavailable:true, reason:string, model:string, provider:string }}
|
|
192
|
+
*/
|
|
193
|
+
export function resolveFallbackTarget(entry, opts = {}) {
|
|
194
|
+
const env = opts.env || process.env;
|
|
195
|
+
const providers = opts.providers || BUILT_IN_PROVIDERS || {};
|
|
196
|
+
const { provider, model } = parseFallbackEntry(
|
|
197
|
+
entry,
|
|
198
|
+
opts.knownProviders || new Set(Object.keys(providers)),
|
|
199
|
+
);
|
|
200
|
+
if (!provider) {
|
|
201
|
+
return { model, crossProvider: false };
|
|
202
|
+
}
|
|
203
|
+
const def = providers[provider];
|
|
204
|
+
if (!def) {
|
|
205
|
+
return {
|
|
206
|
+
unavailable: true,
|
|
207
|
+
reason: `unknown provider "${provider}"`,
|
|
208
|
+
provider,
|
|
209
|
+
model,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
let apiKey = null;
|
|
213
|
+
if (def.apiKeyEnv) {
|
|
214
|
+
apiKey = env[def.apiKeyEnv] || null;
|
|
215
|
+
if (!apiKey) {
|
|
216
|
+
return {
|
|
217
|
+
unavailable: true,
|
|
218
|
+
reason: `${provider} fallback skipped: ${def.apiKeyEnv} not set`,
|
|
219
|
+
provider,
|
|
220
|
+
model,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return {
|
|
225
|
+
model,
|
|
226
|
+
provider,
|
|
227
|
+
baseUrl: def.baseUrl || null,
|
|
228
|
+
apiKey,
|
|
229
|
+
crossProvider: true,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
|
|
145
233
|
/**
|
|
146
234
|
* Build a chatFn that walks an ordered fallback chain when the primary fails.
|
|
147
235
|
*
|
|
@@ -168,6 +256,9 @@ export function makeFallbackChatFn(opts = {}) {
|
|
|
168
256
|
const isModelNotFound = opts.isModelNotFound || isModelNotFoundError;
|
|
169
257
|
const onFallback = opts.onFallback;
|
|
170
258
|
|
|
259
|
+
const env = opts.env || process.env;
|
|
260
|
+
const providers = opts.providers || BUILT_IN_PROVIDERS || {};
|
|
261
|
+
|
|
171
262
|
return async function chatWithFallback(messages, options = {}) {
|
|
172
263
|
try {
|
|
173
264
|
return await baseChatFn(messages, options);
|
|
@@ -175,8 +266,30 @@ export function makeFallbackChatFn(opts = {}) {
|
|
|
175
266
|
let err = firstErr;
|
|
176
267
|
let lastTried = options.model;
|
|
177
268
|
for (const candidate of models) {
|
|
178
|
-
|
|
179
|
-
|
|
269
|
+
const target = resolveFallbackTarget(candidate, { env, providers });
|
|
270
|
+
// A cross-provider hop whose key is absent (or an unknown provider) is
|
|
271
|
+
// skipped — never attempted with the wrong credential. Surface why.
|
|
272
|
+
if (target.unavailable) {
|
|
273
|
+
if (typeof onFallback === "function") {
|
|
274
|
+
try {
|
|
275
|
+
onFallback({
|
|
276
|
+
from: lastTried,
|
|
277
|
+
to: candidate,
|
|
278
|
+
skipped: true,
|
|
279
|
+
reason: target.reason,
|
|
280
|
+
error: err?.message || String(err),
|
|
281
|
+
});
|
|
282
|
+
} catch {
|
|
283
|
+
/* best-effort */
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
continue;
|
|
287
|
+
}
|
|
288
|
+
// Skip a no-op hop (same provider + same model just attempted).
|
|
289
|
+
const sameModel = target.model === lastTried;
|
|
290
|
+
const sameProvider =
|
|
291
|
+
!target.crossProvider || target.provider === options.provider;
|
|
292
|
+
if (!target.model || (sameModel && sameProvider)) continue;
|
|
180
293
|
// Only advance the chain for transient failures or a missing primary;
|
|
181
294
|
// a real bad-request / auth error is surfaced immediately.
|
|
182
295
|
if (!isRetryable(err) && !isModelNotFound(err)) throw err;
|
|
@@ -184,16 +297,30 @@ export function makeFallbackChatFn(opts = {}) {
|
|
|
184
297
|
try {
|
|
185
298
|
onFallback({
|
|
186
299
|
from: lastTried,
|
|
187
|
-
to:
|
|
300
|
+
to: target.crossProvider
|
|
301
|
+
? `${target.provider}:${target.model}`
|
|
302
|
+
: target.model,
|
|
303
|
+
crossProvider: target.crossProvider,
|
|
188
304
|
error: err?.message || String(err),
|
|
189
305
|
});
|
|
190
306
|
} catch {
|
|
191
307
|
// Notification is best-effort — never mask the retry.
|
|
192
308
|
}
|
|
193
309
|
}
|
|
194
|
-
lastTried =
|
|
310
|
+
lastTried = target.model;
|
|
311
|
+
// Build the per-hop options: same-provider swaps only the model; a
|
|
312
|
+
// cross-provider hop also swaps provider/baseUrl/apiKey.
|
|
313
|
+
const hopOptions = target.crossProvider
|
|
314
|
+
? {
|
|
315
|
+
...options,
|
|
316
|
+
model: target.model,
|
|
317
|
+
provider: target.provider,
|
|
318
|
+
baseUrl: target.baseUrl,
|
|
319
|
+
apiKey: target.apiKey,
|
|
320
|
+
}
|
|
321
|
+
: { ...options, model: target.model };
|
|
195
322
|
try {
|
|
196
|
-
return await baseChatFn(messages,
|
|
323
|
+
return await baseChatFn(messages, hopOptions);
|
|
197
324
|
} catch (nextErr) {
|
|
198
325
|
err = nextErr;
|
|
199
326
|
}
|