chainlesschain 0.166.126 → 0.166.128
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 +31 -3
- package/package.json +1 -1
- package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
- package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-C6HzxpS_.js → AIOps-BmGA5zXX.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-Ba2WP_mo.js → ActionButton-B7WXwoF0.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-MEZ-eSYO.js → Analytics-IvJG43B5.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-B1F4dMJl.js → AppLayout-DWY017_e.js} +5 -5
- package/src/assets/web-panel/assets/Artifacts-BOyohM_-.js +1 -0
- package/src/assets/web-panel/assets/{Audit-GzrP6OYx.js → Audit-CD9sTnBN.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-PJ3RWIS5.js → BackgroundAgents-J6gg5z0U.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DV0wK73Y.js → Backup-D7ik3lse.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BqWPlsK1.js → BaseInput-MrDd5zcz.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-D0yNPOid.js → Chat-DbxRqGiK.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-D0De01yM.js → ChatBubbleRenderer-DbeJAwMg.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-GOdS6Fpz.js → Checkbox-CditB77B.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CcvPMAwP.js → Codegen-Ds0UZWZG.js} +1 -1
- package/src/assets/web-panel/assets/{Col-07yH3vgP.js → Col-CZlj1XI2.js} +1 -1
- package/src/assets/web-panel/assets/{Community-cZI0W7u_.js → Community-j4B2SoT6.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BP6fwhXB.js → Compact-BuKQutaO.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-BvwQCjXA.js → Compliance-DAgDyS-p.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-yhhvyKZU.js → Cowork-DX2-I6V3.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-Bpji2uez.js → Cron-dJpc-FxX.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BZ7XwkuS.js → Crosschain-7m8euM3v.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BJ-Fw-Uk.js → DID-CLoYoCe1.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-3FbsaKoR.js → Dashboard-DR1rRMb7.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DP8yuWyM.js → Dropdown-BsKhCfvH.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-Co3i-4ca.js → EmailListRenderer-BAGexzJu.js} +1 -1
- package/src/assets/web-panel/assets/EvolutionSettings-BqYYmC01.js +1 -0
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-CPjecSCb.js → FamilyGuardDashboard-BIpueefy.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-CJkZPulM.js → Federation-BluNep6d.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CU0YWiAZ.js → FormItemContext-CerdM3am.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-kTxvvpiU.js → GenericCardRenderer-DXh4tOjU.js} +1 -1
- package/src/assets/web-panel/assets/{Git-Cs6SFvMq.js → Git-CEE0cGmf.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CSs_8thn.js → Governance-Bc-XNDhM.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-D7yCromD.js → Inference-CiBzXyZ-.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-C6BcMDRm.js → KnowledgeGraph-CV2IiyuN.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-Cz20G07I.js → Logs-fbQYKuSz.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-B73ZyMRI.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-BZIopTsG.js → Marketplace-C5utdpxZ.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-OHaHium7.js → McpTools-CPE4SaF3.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-DBNBmoM9.js → Memory-DTFDszzk.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BH-ajP-j.js → MobileBridge-DxqPmTzP.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DwiFGqpp.js → MobileProjects-CwcK8l2y.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BmT_VyZL.js → Mtc-DrjECLGO.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-D24wmjmR.js → MtcAudit-4IURCa-3.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-DwWj1F8f.js → Multisig-CggLV1Cp.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DXBRBwhU.js → NLProgramming-DkOQJT73.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-C1QG3x5c.js → Notes-Dodcva6s.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-BnlSMFBJ.js → NotificationSettings-CQ3HeTs6.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-uuW0wQc0.js → OrderTableRenderer-pT2nzmIO.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-CXGC9RYr.js → Organization-B6HFsIfU.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-C3RxcBqQ.js → Overflow-G9dju55N.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-DTh-AqFm.js → P2P-C1BCE155.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-IX0sEKne.js → PdhVaultBrowser-BFAxXn5D.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-CpcyEP_G.js → Permissions-DWg7cw9Q.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-I5zN_SIn.js → PersonalDataHub-BQxuOQOO.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-CVg3gNFN.js → Pipeline-C3Gse9Ne.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-Dffk2pq9.js → Privacy-Dcsjx6Oi.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-B8Y3VsbN.js → ProjectInit-DeYlnXJQ.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-Ds_4fCFG.js → ProjectSettings-D7kbZ_K7.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-BlyQuiCs.js → Projects-C5m3NGzM.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-CI9tKh8S.js → Providers-oT6jy83z.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-DOrmL6X3.js → QrScannerModal-NZ11GEBa.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CSSlopeF.js → QuickAsk-CtQU4Tx0.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-fKDWVJgw.js → Recommend-3CoXYu3O.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BKlbq1C0.js → RemoteSession-C2d4LzBM.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-DhOFTKRG.js → Reputation-WZQHrGwl.js} +1 -1
- package/src/assets/web-panel/assets/{Row-ckVQk62z.js → Row-ChiqY7Hg.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CShivptZ.js → RssFeed-Cjwl2Kum.js} +2 -2
- package/src/assets/web-panel/assets/{Search-PJpI8T9h.js → Search-DRDMZxTF.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CVQPej3p.js → Security-D0y4LlQ4.js} +3 -3
- package/src/assets/web-panel/assets/{Services-CWJj07ru.js → Services-ChpkqWm0.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CNxdd41V.js → Skeleton-D3WGZ8yO.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-AD-xWT2V.js → Skills-Bv_7HaUW.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-BuDuN1ak.js → Sla-crZMKyX0.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-WYryugQK.js → SpeechSettings-ByWn5XDZ.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-Dxz8z_yO.js → SyncSettings--R55vxvj.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-BCQFGo6S.js → Tasks-BZA_Via_.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CNU1xhuV.js → Templates-9eJ9yY8Q.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CFsqv744.js → Tenant-CfWX2jqj.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal--7FxkXMc.js → Terminal-CUXUF4kL.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-Cqtg4CN-.js → TimelineRenderer-77y9bkYN.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DQD8oVJ3.js → Tokens-CvyrdLH6.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BujLIIRO.js → Trigger-MNRl_YNr.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-_3yRNM57.js → Trust-BHOXK-Mp.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-C_QKp9Ig.js → UkeySign-Bz1oZNyQ.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BkgP1c6L.js → VideoEditing-DlqmXyZv.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CTHaNBha.js → Wallet-Dg1rnqEG.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-CbXcDn_T.js → WebAuthn-DJtGeaOk.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-BUOyHiTN.js → WorkflowEditor-DJPubjX5.js} +1 -1
- package/src/assets/web-panel/assets/{chat-DTG5Geyv.js → chat-BWweDuIV.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BAdqWSlv.js → colors-BX5ViADF.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DYh7YdLa.js → compact-item-Df8MLbXp.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-mPOA80GV.js → createContext-C0FDTwdV.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BgM5vq1s.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-Gzp3HIXP.js → hasIn-PpL6GdNk.js} +1 -1
- package/src/assets/web-panel/assets/{index-CLuIQO9d.js → index-7VyVOEf7.js} +1 -1
- package/src/assets/web-panel/assets/{index-BL46pkYn.js → index-B3K1uZ7R.js} +1 -1
- package/src/assets/web-panel/assets/{index-CFXlLyEF.js → index-B4UxFB2N.js} +1 -1
- package/src/assets/web-panel/assets/{index-Diwevwx7.js → index-B8-pSyP7.js} +1 -1
- package/src/assets/web-panel/assets/{index-Brr8ALy2.js → index-B982oUKN.js} +1 -1
- package/src/assets/web-panel/assets/{index-CsgxUKpZ.js → index-BF0ERucU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BjRl7Jhc.js → index-BMIEWinN.js} +1 -1
- package/src/assets/web-panel/assets/{index-X1iyU-gh.js → index-BWSCphaT.js} +1 -1
- package/src/assets/web-panel/assets/{index-CYbMpkmP.js → index-BeFhy4BX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CGQfiMVc.js → index-Beh1kLwx.js} +1 -1
- package/src/assets/web-panel/assets/index-Bl-HTXWn.js +1 -0
- package/src/assets/web-panel/assets/{index-CR3ZvuY6.js → index-C0PqPK-8.js} +1 -1
- package/src/assets/web-panel/assets/{index-CzkgWUAt.js → index-C2JU-gdS.js} +1 -1
- package/src/assets/web-panel/assets/{index-z3FnuAKK.js → index-C8wl7Ica.js} +1 -1
- package/src/assets/web-panel/assets/{index-og41WNLX.js → index-C9FOwTgX.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQZVcznI.js → index-C9N1u8jV.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqSb5LAk.js → index-Cf86RSQk.js} +1 -1
- package/src/assets/web-panel/assets/{index-DxpX3q8j.js → index-ChV82mzs.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdleQSUU.js → index-Cj00JSqq.js} +1 -1
- package/src/assets/web-panel/assets/{index-ByUjSWIg.js → index-Cm7vZvA3.js} +1 -1
- package/src/assets/web-panel/assets/{index-DbdMPF9D.js → index-CmMzB4C-.js} +3 -3
- package/src/assets/web-panel/assets/{index-Ch0qsp2p.js → index-CxY_U5RT.js} +1 -1
- package/src/assets/web-panel/assets/index-Cxf0YfM5.js +1 -0
- package/src/assets/web-panel/assets/{index-BYE61P6D.js → index-D5Ei75Wt.js} +1 -1
- package/src/assets/web-panel/assets/{index-OkiNUps8.js → index-DBzaRg4E.js} +1 -1
- package/src/assets/web-panel/assets/{index-BKYYncej.js → index-DFtzEEYe.js} +1 -1
- package/src/assets/web-panel/assets/{index-C52u0SKj.js → index-DGLbojjx.js} +1 -1
- package/src/assets/web-panel/assets/{index-D_65ERlZ.js → index-D_6XIMVV.js} +1 -1
- package/src/assets/web-panel/assets/{index-Byln7kVS.js → index-DddQd0_V.js} +1 -1
- package/src/assets/web-panel/assets/{index-CcZz24sL.js → index-DwZkBGXd.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5MHbkbK.js → index-DxJqyIP8.js} +1 -1
- package/src/assets/web-panel/assets/{index-CMScSzoi.js → index-Dy8K2laU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BH067bfd.js → index-FAZH69my.js} +1 -1
- package/src/assets/web-panel/assets/{index-y-TWtPEX.js → index-NdEUFm32.js} +1 -1
- package/src/assets/web-panel/assets/{index-DfsFQ-DX.js → index-P1ERNJla.js} +1 -1
- package/src/assets/web-panel/assets/{index-CchNIYmQ.js → index-R0LQ3fgq.js} +1 -1
- package/src/assets/web-panel/assets/{index-DCw8rGv8.js → index-UXM5vpt4.js} +1 -1
- package/src/assets/web-panel/assets/{index-B1UsX4Hx.js → index-iif2A1eL.js} +1 -1
- package/src/assets/web-panel/assets/{index-C9uyUX6z.js → index-itNn6pW1.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DmksOjaL.js → initDefaultProps-DeMthvi4.js} +1 -1
- package/src/assets/web-panel/assets/{motion-Cb3y_Vsi.js → motion-_7kbkzE0.js} +1 -1
- package/src/assets/web-panel/assets/{move-DP-3qcfq.js → move-gCI04pLw.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BCDUfUEO.js → mtc-parser-D5UWHv2U.js} +1 -1
- package/src/assets/web-panel/assets/{omit-MH-O2PY6.js → omit-CDCZcqeS.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BaZORqPr.js → pickAttrs-DGMDLi3S.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-Dkp_5tvw.js → placementArrow-C-3vC1Vh.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DBJSmMkS.js → responsiveObserve-vdoYucvi.js} +1 -1
- package/src/assets/web-panel/assets/{slide-Cc6qGIgj.js → slide-B62FhgyZ.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-FundADw-.js → statusUtils-DCLlfnym.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-qOO9jMdb.js → styleChecker-CGvQ4LRR.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-BYbRYwok.js → useFlexGapSupport-BqkGoKwe.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-D6PqFBtt.js → useFs-Bkr_nU3q.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-mJpur_zt.js → usePersonalDataHub-CYxMIUEq.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-ZFVHKenK.js → vnode-sAbcY1FX.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-Ca_KBv2o.js → zoom-Dm2pLrXi.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/agent.js +29 -0
- package/src/commands/ask.js +23 -23
- package/src/commands/chat.js +1 -5
- package/src/commands/session.js +92 -61
- package/src/commands/setup.js +35 -10
- package/src/commands/ui.js +18 -5
- package/src/constants.js +18 -89
- package/src/data/changelog.json +26 -0
- package/src/gateways/ws/action-protocol.js +22 -14
- package/src/gateways/ws/chat-intent-protocol.js +7 -3
- package/src/gateways/ws/llm-chat-protocol.js +9 -2
- package/src/gateways/ws/ws-server.js +24 -12
- package/src/lib/bm25-search.js +6 -3
- package/src/lib/chat-intent-service.js +28 -4
- package/src/lib/coding-task-guidance.js +6 -1
- package/src/lib/config-manager.js +49 -16
- package/src/lib/config-schema.js +5 -0
- package/src/lib/context-memory-kernel/memory-query-index.js +35 -17
- package/src/lib/evolution/evolution-deployment-config.js +48 -5
- package/src/lib/evolution/evolution-deployment-loader.js +26 -11
- package/src/lib/evolution/evolution-enabled.js +27 -0
- package/src/lib/evolution/governed-model-turn.js +4 -1
- package/src/lib/evolution/optional-ui-model-turn.js +26 -0
- package/src/lib/goal-check-evidence.js +159 -0
- package/src/lib/goal-condition-engine.js +24 -2
- package/src/lib/llm-connection-probe.js +48 -4
- package/src/lib/llm-onboarding-catalog.json +131 -0
- package/src/lib/paths.js +2 -2
- package/src/lib/skill-retrieval-router.js +2 -1
- package/src/lib/skill-search-tokenizer.js +143 -0
- package/src/repl/agent-repl.js +8 -4
- package/src/repl/chat-repl.js +15 -9
- package/src/runtime/agent-core.js +87 -7
- package/src/runtime/agent-runtime.js +18 -6
- package/src/runtime/headless-runner.js +138 -66
- package/src/runtime/headless-stream.js +1 -0
- package/src/runtime/mcp-tool-search-ranking.js +142 -0
- package/src/runtime/mcp-tool-search.js +198 -60
- package/src/assets/web-panel/assets/Artifacts-D50kNasl.js +0 -1
- package/src/assets/web-panel/assets/EvolutionSettings-BKWKDok5.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-vialawkx.js +0 -1
- package/src/assets/web-panel/assets/devWarning-ChcomtaV.js +0 -1
- package/src/assets/web-panel/assets/index-CXxCC-4V.js +0 -1
- package/src/assets/web-panel/assets/index-CZYLUp6g.js +0 -1
|
@@ -30,15 +30,18 @@
|
|
|
30
30
|
* "enabled": "auto" | true | false, // default "auto" (threshold)
|
|
31
31
|
* "thresholdRatio": 0.1, // auto: defer when schemas > 10% window
|
|
32
32
|
* "maxResults": 5, // tool_search default result cap
|
|
33
|
+
* "catalogMode": "stubs" | "compact", // compact provider projection (opt-in)
|
|
33
34
|
* "alwaysLoad": ["serverName", "mcp__srv__tool", "mcp__srv__*"]
|
|
34
35
|
* } } }
|
|
35
36
|
* env CC_TOOL_SEARCH=1|0|auto // overrides settings.enabled
|
|
37
|
+
* env CC_TOOL_SEARCH_CATALOG=compact|stubs // provider projection only
|
|
36
38
|
*
|
|
37
39
|
* OFF / below-threshold path is byte-identical: `maybeApplyToolSearch` returns
|
|
38
40
|
* null without touching the mcp wiring object.
|
|
39
41
|
*/
|
|
40
42
|
|
|
41
43
|
import settingsLoader from "../lib/settings-loader.cjs";
|
|
44
|
+
import { rankMcpToolSearchEntries } from "./mcp-tool-search-ranking.js";
|
|
42
45
|
import {
|
|
43
46
|
estimateTokens as defaultEstimateTokens,
|
|
44
47
|
getContextWindow,
|
|
@@ -52,6 +55,7 @@ export const TOOL_SEARCH_DEFAULTS = Object.freeze({
|
|
|
52
55
|
enabled: "auto",
|
|
53
56
|
thresholdRatio: 0.1,
|
|
54
57
|
maxResults: 5,
|
|
58
|
+
catalogMode: "stubs",
|
|
55
59
|
alwaysLoad: Object.freeze([]),
|
|
56
60
|
});
|
|
57
61
|
|
|
@@ -102,6 +106,9 @@ function sanitizeToolSearchSettings(raw, into) {
|
|
|
102
106
|
(p) => typeof p === "string" && p.length > 0,
|
|
103
107
|
);
|
|
104
108
|
}
|
|
109
|
+
if (raw.catalogMode === "stubs" || raw.catalogMode === "compact") {
|
|
110
|
+
out.catalogMode = raw.catalogMode;
|
|
111
|
+
}
|
|
105
112
|
return out;
|
|
106
113
|
}
|
|
107
114
|
|
|
@@ -110,7 +117,7 @@ function sanitizeToolSearchSettings(raw, into) {
|
|
|
110
117
|
* + managed settings + the CC_TOOL_SEARCH env override. Never throws.
|
|
111
118
|
*
|
|
112
119
|
* @param {object} [opts] { env, cwd, settingsFile, onWarn }
|
|
113
|
-
* @returns {{enabled:(boolean|"auto"), thresholdRatio:number, maxResults:number, alwaysLoad:string[]}}
|
|
120
|
+
* @returns {{enabled:(boolean|"auto"), thresholdRatio:number, maxResults:number, catalogMode:string, alwaysLoad:string[]}}
|
|
114
121
|
*/
|
|
115
122
|
export function resolveToolSearchConfig(opts = {}) {
|
|
116
123
|
const env = opts.env || process.env;
|
|
@@ -119,6 +126,7 @@ export function resolveToolSearchConfig(opts = {}) {
|
|
|
119
126
|
enabled: TOOL_SEARCH_DEFAULTS.enabled,
|
|
120
127
|
thresholdRatio: TOOL_SEARCH_DEFAULTS.thresholdRatio,
|
|
121
128
|
maxResults: TOOL_SEARCH_DEFAULTS.maxResults,
|
|
129
|
+
catalogMode: TOOL_SEARCH_DEFAULTS.catalogMode,
|
|
122
130
|
alwaysLoad: [...TOOL_SEARCH_DEFAULTS.alwaysLoad],
|
|
123
131
|
};
|
|
124
132
|
try {
|
|
@@ -142,6 +150,11 @@ export function resolveToolSearchConfig(opts = {}) {
|
|
|
142
150
|
if (flag === "1" || flag === "true") effective.enabled = true;
|
|
143
151
|
else if (flag === "0" || flag === "false") effective.enabled = false;
|
|
144
152
|
else if (flag === "auto") effective.enabled = "auto";
|
|
153
|
+
const catalogMode = String(env.CC_TOOL_SEARCH_CATALOG || "")
|
|
154
|
+
.trim()
|
|
155
|
+
.toLowerCase();
|
|
156
|
+
if (catalogMode === "stubs" || catalogMode === "compact")
|
|
157
|
+
effective.catalogMode = catalogMode;
|
|
145
158
|
return effective;
|
|
146
159
|
}
|
|
147
160
|
|
|
@@ -232,8 +245,8 @@ function buildStubDefinition(fullDef) {
|
|
|
232
245
|
};
|
|
233
246
|
}
|
|
234
247
|
|
|
235
|
-
export function buildToolSearchDefinition() {
|
|
236
|
-
|
|
248
|
+
export function buildToolSearchDefinition({ catalogMode = "stubs" } = {}) {
|
|
249
|
+
const definition = {
|
|
237
250
|
type: "function",
|
|
238
251
|
function: {
|
|
239
252
|
name: TOOL_SEARCH_TOOL_NAME,
|
|
@@ -262,6 +275,60 @@ export function buildToolSearchDefinition() {
|
|
|
262
275
|
},
|
|
263
276
|
},
|
|
264
277
|
};
|
|
278
|
+
if (catalogMode === "compact") {
|
|
279
|
+
definition.function.description =
|
|
280
|
+
"Discover connected MCP tools that are omitted from the initial tool list. " +
|
|
281
|
+
'Search tool names and descriptions with keywords, or use "select:<exact_name>". ' +
|
|
282
|
+
'Use "servers:" with offset/max_results for a paged server directory. ' +
|
|
283
|
+
"Search returns full schemas and makes the selected tools available in the next model request. " +
|
|
284
|
+
"Search first, then call the selected tool by its returned name in a later request. " +
|
|
285
|
+
"Discovery does not grant execution permission.";
|
|
286
|
+
definition.function.parameters.properties.offset = {
|
|
287
|
+
type: "integer",
|
|
288
|
+
minimum: 0,
|
|
289
|
+
description: 'Server directory offset, used only with query "servers:".',
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
return definition;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/** Provider-only projection. The host's complete capability ceiling stays intact. */
|
|
296
|
+
export function projectMcpToolDefinitions(definitions, executors) {
|
|
297
|
+
const search = executors?.[TOOL_SEARCH_TOOL_NAME];
|
|
298
|
+
const registry = search?.kind === "tool-search" ? search.registry : null;
|
|
299
|
+
if (
|
|
300
|
+
registry?.catalogMode !== "compact" ||
|
|
301
|
+
!definitions.some((def) => def?.function?.name === TOOL_SEARCH_TOOL_NAME)
|
|
302
|
+
)
|
|
303
|
+
return definitions;
|
|
304
|
+
const allowed = new Set(definitions.map((def) => def?.function?.name));
|
|
305
|
+
const projected = definitions
|
|
306
|
+
.filter((def) => {
|
|
307
|
+
const name = def?.function?.name;
|
|
308
|
+
const exec = executors[name];
|
|
309
|
+
return (
|
|
310
|
+
!registry.deferred.has(name) &&
|
|
311
|
+
!(exec?.deferred === true && exec.registry === registry) &&
|
|
312
|
+
!(name?.startsWith("mcp__") && !exec)
|
|
313
|
+
);
|
|
314
|
+
})
|
|
315
|
+
.map((def) =>
|
|
316
|
+
def?.function?.name === TOOL_SEARCH_TOOL_NAME
|
|
317
|
+
? registry.compactSearchDefinition
|
|
318
|
+
: def,
|
|
319
|
+
);
|
|
320
|
+
// Insertion order keeps already-discovered schemas ahead of later additions.
|
|
321
|
+
for (const name of registry.loaded) {
|
|
322
|
+
const entry = registry.deferred.get(name);
|
|
323
|
+
if (
|
|
324
|
+
allowed.has(name) &&
|
|
325
|
+
entry &&
|
|
326
|
+
entry.stale !== true &&
|
|
327
|
+
entry.executor === executors[name]
|
|
328
|
+
)
|
|
329
|
+
projected.push(entry.definition);
|
|
330
|
+
}
|
|
331
|
+
return projected;
|
|
265
332
|
}
|
|
266
333
|
|
|
267
334
|
// ─── deferral transform ────────────────────────────────────────────────────
|
|
@@ -296,6 +363,13 @@ export function applyToolSearchDeferral(mcp, opts = {}) {
|
|
|
296
363
|
: {},
|
|
297
364
|
};
|
|
298
365
|
const firstApplication = !mcp.toolSearchRegistry;
|
|
366
|
+
registry.catalogMode =
|
|
367
|
+
opts.catalogMode === "compact" || opts.catalogMode === "stubs"
|
|
368
|
+
? opts.catalogMode
|
|
369
|
+
: registry.catalogMode || "stubs";
|
|
370
|
+
registry.compactSearchDefinition ||= buildToolSearchDefinition({
|
|
371
|
+
catalogMode: "compact",
|
|
372
|
+
});
|
|
299
373
|
|
|
300
374
|
const activeNames = new Set(
|
|
301
375
|
mcp.extraToolDefinitions.map((def) => def?.function?.name),
|
|
@@ -397,6 +471,11 @@ export function applyToolSearchDeferral(mcp, opts = {}) {
|
|
|
397
471
|
mcp.extraToolDefinitions.push(...remaining, ...newStubs);
|
|
398
472
|
}
|
|
399
473
|
|
|
474
|
+
if (registry.catalogMode === "compact") {
|
|
475
|
+
savedTokens =
|
|
476
|
+
describeMcpToolContext(mcp, { estimate, config: TOOL_SEARCH_DEFAULTS })
|
|
477
|
+
?.savedTokens || 0;
|
|
478
|
+
}
|
|
400
479
|
return { registry, deferredCount: newStubs.length, savedTokens };
|
|
401
480
|
}
|
|
402
481
|
|
|
@@ -436,6 +515,7 @@ export function maybeApplyToolSearch(mcp, opts = {}) {
|
|
|
436
515
|
const summary = applyToolSearchDeferral(mcp, {
|
|
437
516
|
estimate,
|
|
438
517
|
alwaysLoad: config.alwaysLoad,
|
|
518
|
+
catalogMode: config.catalogMode,
|
|
439
519
|
});
|
|
440
520
|
if (summary) {
|
|
441
521
|
summary.maxResults = config.maxResults;
|
|
@@ -455,38 +535,36 @@ export function maybeApplyToolSearch(mcp, opts = {}) {
|
|
|
455
535
|
|
|
456
536
|
// ─── search ────────────────────────────────────────────────────────────────
|
|
457
537
|
|
|
458
|
-
function
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
.
|
|
462
|
-
.
|
|
463
|
-
|
|
538
|
+
function searchResultLimit(registry, requested) {
|
|
539
|
+
const configuredMaxResults = registry?.maxResults;
|
|
540
|
+
return Number.isInteger(requested) && requested > 0
|
|
541
|
+
? Math.min(requested, 50)
|
|
542
|
+
: Number.isInteger(configuredMaxResults) && configuredMaxResults > 0
|
|
543
|
+
? Math.min(configuredMaxResults, 50)
|
|
544
|
+
: TOOL_SEARCH_DEFAULTS.maxResults;
|
|
464
545
|
}
|
|
465
546
|
|
|
466
547
|
/**
|
|
467
|
-
* Search
|
|
468
|
-
*
|
|
469
|
-
* accepted when it matches exactly one deferred tool.
|
|
470
|
-
* - keyword — scores name hits (×3) over description hits (×1); a `+term`
|
|
471
|
-
* must appear in the tool name.
|
|
472
|
-
* Does NOT mutate the loaded set — callers (executeToolSearch) mark results.
|
|
473
|
-
*
|
|
474
|
-
* @returns {{mode:string, results:Array<{name:string,entry:object}>, notFound:string[]}}
|
|
548
|
+
* Search exact `select:` names or ranked keywords without marking schemas
|
|
549
|
+
* loaded. Optional allowedToolNames restricts discovery to the host ceiling.
|
|
475
550
|
*/
|
|
476
551
|
export function searchDeferredTools(registry, query, opts = {}) {
|
|
477
552
|
const q = String(query || "").trim();
|
|
478
|
-
const
|
|
479
|
-
const
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
553
|
+
const maxResults = searchResultLimit(registry, opts.maxResults);
|
|
554
|
+
const selectMode = /^select:/i.test(q);
|
|
555
|
+
const allowed =
|
|
556
|
+
opts.allowedToolNames == null ? null : new Set(opts.allowedToolNames);
|
|
557
|
+
const eligible = function* () {
|
|
558
|
+
for (const [name, entry] of registry?.deferred || []) {
|
|
559
|
+
if (entry.stale !== true && (!allowed || allowed.has(name)))
|
|
560
|
+
yield [name, entry];
|
|
561
|
+
}
|
|
562
|
+
};
|
|
563
|
+
// Keyword ranking already checks liveness while scanning. Avoid cloning the
|
|
564
|
+
// whole directory on every query; only exact selection needs keyed lookup.
|
|
565
|
+
const entries = selectMode ? new Map(eligible()) : eligible();
|
|
488
566
|
|
|
489
|
-
if (
|
|
567
|
+
if (selectMode) {
|
|
490
568
|
const wanted = q
|
|
491
569
|
.slice(q.indexOf(":") + 1)
|
|
492
570
|
.split(",")
|
|
@@ -521,31 +599,9 @@ export function searchDeferredTools(registry, query, opts = {}) {
|
|
|
521
599
|
return { mode: "select", results, notFound, omittedCount };
|
|
522
600
|
}
|
|
523
601
|
|
|
524
|
-
const terms = normalizeTerms(q);
|
|
525
|
-
if (terms.length === 0) return { mode: "keyword", results: [], notFound: [] };
|
|
526
|
-
const required = terms
|
|
527
|
-
.filter((t) => t.startsWith("+") && t.length > 1)
|
|
528
|
-
.map((t) => t.slice(1));
|
|
529
|
-
const scoring = terms.map((t) => (t.startsWith("+") ? t.slice(1) : t));
|
|
530
|
-
|
|
531
|
-
const scored = [];
|
|
532
|
-
for (const [name, entry] of entries) {
|
|
533
|
-
const lowerName = name.toLowerCase();
|
|
534
|
-
const lowerDesc = String(
|
|
535
|
-
entry.definition?.function?.description || "",
|
|
536
|
-
).toLowerCase();
|
|
537
|
-
if (required.some((t) => !lowerName.includes(t))) continue;
|
|
538
|
-
let score = 0;
|
|
539
|
-
for (const t of scoring) {
|
|
540
|
-
if (lowerName.includes(t)) score += 3;
|
|
541
|
-
if (lowerDesc.includes(t)) score += 1;
|
|
542
|
-
}
|
|
543
|
-
if (score > 0) scored.push({ name, entry, score });
|
|
544
|
-
}
|
|
545
|
-
scored.sort((a, b) => b.score - a.score || a.name.localeCompare(b.name));
|
|
546
602
|
return {
|
|
547
603
|
mode: "keyword",
|
|
548
|
-
results:
|
|
604
|
+
results: rankMcpToolSearchEntries(entries, q, maxResults),
|
|
549
605
|
notFound: [],
|
|
550
606
|
};
|
|
551
607
|
}
|
|
@@ -556,7 +612,7 @@ export function searchDeferredTools(registry, query, opts = {}) {
|
|
|
556
612
|
* prompt-cache-friendly delivery channel — conversation content, not the
|
|
557
613
|
* tools array).
|
|
558
614
|
*/
|
|
559
|
-
export function executeToolSearch(registry, args = {}) {
|
|
615
|
+
export function executeToolSearch(registry, args = {}, options = {}) {
|
|
560
616
|
const query = typeof args.query === "string" ? args.query : "";
|
|
561
617
|
if (!query.trim()) {
|
|
562
618
|
return {
|
|
@@ -570,12 +626,62 @@ export function executeToolSearch(registry, args = {}) {
|
|
|
570
626
|
"tool_search query is too long; select fewer tool names or use shorter keywords.",
|
|
571
627
|
};
|
|
572
628
|
}
|
|
629
|
+
if (registry.catalogMode === "compact" && /^servers:$/i.test(query.trim())) {
|
|
630
|
+
const offset = args.offset === undefined ? 0 : args.offset;
|
|
631
|
+
if (!Number.isSafeInteger(offset) || offset < 0)
|
|
632
|
+
return {
|
|
633
|
+
error: "Server directory offset must be a non-negative integer.",
|
|
634
|
+
};
|
|
635
|
+
const allowed =
|
|
636
|
+
options.allowedToolNames == null
|
|
637
|
+
? null
|
|
638
|
+
: new Set(options.allowedToolNames);
|
|
639
|
+
const servers = new Map();
|
|
640
|
+
for (const [name, entry] of registry.deferred) {
|
|
641
|
+
if (entry.stale === true || (allowed && !allowed.has(name))) continue;
|
|
642
|
+
if (typeof entry.serverName !== "string" || !entry.serverName) continue;
|
|
643
|
+
const previous = servers.get(entry.serverName);
|
|
644
|
+
if (previous) previous.toolCount++;
|
|
645
|
+
else
|
|
646
|
+
servers.set(entry.serverName, { toolCount: 1, exampleToolName: name });
|
|
647
|
+
}
|
|
648
|
+
const names = [...servers.keys()].sort();
|
|
649
|
+
const limit = searchResultLimit(
|
|
650
|
+
registry,
|
|
651
|
+
typeof args.max_results === "number"
|
|
652
|
+
? Math.floor(args.max_results)
|
|
653
|
+
: undefined,
|
|
654
|
+
);
|
|
655
|
+
const page = names.slice(offset, offset + limit).map((name) => {
|
|
656
|
+
const entry = servers.get(name);
|
|
657
|
+
if (name.length <= 192) return { name, toolCount: entry.toolCount };
|
|
658
|
+
let label = name.slice(0, 191);
|
|
659
|
+
if (/[\uD800-\uDBFF]$/.test(label)) label = label.slice(0, -1);
|
|
660
|
+
return {
|
|
661
|
+
name: label + "…",
|
|
662
|
+
nameTruncated: true,
|
|
663
|
+
toolCount: entry.toolCount,
|
|
664
|
+
...(entry.exampleToolName.length <= 128
|
|
665
|
+
? { exampleToolName: entry.exampleToolName }
|
|
666
|
+
: {}),
|
|
667
|
+
};
|
|
668
|
+
});
|
|
669
|
+
return {
|
|
670
|
+
servers: page,
|
|
671
|
+
totalServers: names.length,
|
|
672
|
+
offset,
|
|
673
|
+
nextOffset:
|
|
674
|
+
offset + page.length < names.length ? offset + page.length : null,
|
|
675
|
+
note: "Directory only; no schemas loaded. Search keywords across all permitted servers or select an exact tool name. Offsets address the current live directory.",
|
|
676
|
+
};
|
|
677
|
+
}
|
|
573
678
|
const {
|
|
574
679
|
mode,
|
|
575
680
|
results,
|
|
576
681
|
notFound,
|
|
577
682
|
omittedCount = 0,
|
|
578
683
|
} = searchDeferredTools(registry, query, {
|
|
684
|
+
allowedToolNames: options.allowedToolNames,
|
|
579
685
|
maxResults:
|
|
580
686
|
typeof args.max_results === "number"
|
|
581
687
|
? Math.floor(args.max_results)
|
|
@@ -611,13 +717,27 @@ export function executeToolSearch(registry, args = {}) {
|
|
|
611
717
|
mode === "select"
|
|
612
718
|
? "No deferred tool matched those names. Names must be the full mcp__<server>__<tool> form (or a unique bare tool name)."
|
|
613
719
|
: "No deferred tool matched. Try different keywords, or select by exact name.";
|
|
614
|
-
|
|
615
|
-
.
|
|
616
|
-
|
|
617
|
-
|
|
720
|
+
if (registry.catalogMode === "compact") {
|
|
721
|
+
payload.note +=
|
|
722
|
+
' Use query "servers:" to inspect the permitted server directory.';
|
|
723
|
+
} else {
|
|
724
|
+
const allowed =
|
|
725
|
+
options.allowedToolNames == null
|
|
726
|
+
? null
|
|
727
|
+
: new Set(options.allowedToolNames);
|
|
728
|
+
payload.available = [...(registry?.deferred || [])]
|
|
729
|
+
.filter(
|
|
730
|
+
([name, entry]) =>
|
|
731
|
+
entry.stale !== true && (!allowed || allowed.has(name)),
|
|
732
|
+
)
|
|
733
|
+
.map(([name]) => name)
|
|
734
|
+
.slice(0, 100);
|
|
735
|
+
}
|
|
618
736
|
} else {
|
|
619
737
|
payload.note =
|
|
620
|
-
|
|
738
|
+
(registry.catalogMode === "compact"
|
|
739
|
+
? "Schemas loaded — these tools are available by their returned names in the next model request. Call them with arguments matching `parameters`."
|
|
740
|
+
: "Schemas loaded — call these tools directly with arguments matching `parameters`.") +
|
|
621
741
|
(omittedCount > 0
|
|
622
742
|
? " Some selected tools were omitted by max_results; select those tools in a separate search before calling them."
|
|
623
743
|
: "");
|
|
@@ -683,6 +803,11 @@ export function describeMcpToolContext(mcp, opts = {}) {
|
|
|
683
803
|
const window = getContextWindow(opts.model, opts.provider);
|
|
684
804
|
|
|
685
805
|
const servers = new Map(); // server → {tools, sentTokens, fullTokens, deferred}
|
|
806
|
+
const projected = projectMcpToolDefinitions(
|
|
807
|
+
mcp.extraToolDefinitions,
|
|
808
|
+
mcp.externalToolExecutors,
|
|
809
|
+
);
|
|
810
|
+
const visible = new Map(projected.map((def) => [def?.function?.name, def]));
|
|
686
811
|
let sentTokens = 0;
|
|
687
812
|
let fullTokens = 0;
|
|
688
813
|
for (const def of mcp.extraToolDefinitions) {
|
|
@@ -698,10 +823,11 @@ export function describeMcpToolContext(mcp, opts = {}) {
|
|
|
698
823
|
: isSearchTool
|
|
699
824
|
? "(tool_search)"
|
|
700
825
|
: "(resources)";
|
|
701
|
-
const
|
|
826
|
+
const sentDef = visible.get(name);
|
|
827
|
+
const sent = sentDef ? estimateToolDefTokens(sentDef, estimate) : 0;
|
|
702
828
|
const fullDef = registry?.deferred?.get(name)?.definition || def;
|
|
703
829
|
const full =
|
|
704
|
-
fullDef ===
|
|
830
|
+
fullDef === sentDef ? sent : estimateToolDefTokens(fullDef, estimate);
|
|
705
831
|
const row = servers.get(server) || {
|
|
706
832
|
server,
|
|
707
833
|
tools: 0,
|
|
@@ -762,7 +888,19 @@ export function describeMcpToolContext(mcp, opts = {}) {
|
|
|
762
888
|
savedTokens: Math.max(0, fullTokens - sentTokens),
|
|
763
889
|
window,
|
|
764
890
|
servers: rows,
|
|
765
|
-
toolSearch: {
|
|
891
|
+
toolSearch: {
|
|
892
|
+
active,
|
|
893
|
+
deferredCount,
|
|
894
|
+
loadedCount,
|
|
895
|
+
...(registry?.catalogMode === "compact"
|
|
896
|
+
? {
|
|
897
|
+
catalogMode: "compact",
|
|
898
|
+
visibleDeferredCount: projected.filter((def) =>
|
|
899
|
+
registry.deferred.has(def?.function?.name),
|
|
900
|
+
).length,
|
|
901
|
+
}
|
|
902
|
+
: {}),
|
|
903
|
+
},
|
|
766
904
|
advice,
|
|
767
905
|
};
|
|
768
906
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{E as G,b as z,r as C,I as k,J as y,U as _,c as r,K as o,S as R,V as B,o as V,f as D,P as d,Q as f,R as p,F as j}from"./vendor-Bn1JzzAn.js";import{M as J}from"./MarkdownRenderer-vialawkx.js";import{u as F,_ as W,d as S}from"./index-DbdMPF9D.js";import{R as Z}from"./icons-DG5UD-6K.js";import"./markdown-Bq2x0XsR.js";import"./markdown-DUKxbhE4.js";const K=G("artifacts",()=>{const h=C([]),t=C(!1),u=C(""),e=C(""),v=C(null),b=C(!1),A=z(()=>[...new Set(h.value.map(a=>a.kind).filter(Boolean))].sort());async function l(){const n=F();t.value=!0;try{const a={type:"artifact-list"};u.value&&(a.kind=u.value),e.value&&(a.session=e.value);const s=await n.sendRaw(a);s&&Array.isArray(s.artifacts)&&(h.value=[...s.artifacts].reverse())}catch{}finally{t.value=!1}}async function g(n){const a=F();b.value=!0,v.value={entry:n,previewable:!1};try{const s=await a.sendRaw({type:"artifact-content",artifactId:n.id});v.value={entry:n,previewable:s?.previewable===!0,encoding:s?.encoding||null,content:s?.content||"",truncated:s?.truncated===!0,reason:s?.reason||null}}catch(s){v.value={entry:n,previewable:!1,reason:s?.message||"preview failed"}}finally{b.value=!1}}function i(){v.value=null}const m=z(()=>{const n=v.value;return!n?.previewable||n.encoding!=="base64"?null:`data:${n.entry?.mime||"image/png"};base64,${n.content}`}),O=z(()=>{const n=v.value;return n?.previewable===!0&&n.encoding==="utf8"&&String(n.entry?.mime||"").toLowerCase()==="text/markdown"});async function M(n,a={}){if(!n?.id)return!1;const s=a.fetch||globalThis.fetch,T=a.document||globalThis.document,L=a.URL||globalThis.URL,N=(a.config||globalThis.window?.__CC_CONFIG__)??{};try{const U=await s(`/api/artifacts/${n.id}/download`,{headers:N.wsToken?{Authorization:`Bearer ${N.wsToken}`}:{}});if(!U.ok)return!1;const Q=await U.blob(),E=L.createObjectURL(Q),I=T.createElement("a");return I.href=E,I.download=n.title||n.id,T.body.appendChild(I),I.click(),I.remove(),L.revokeObjectURL(E),!0}catch{return!1}}async function P(n){const a=F();if(!n)return!1;try{const s=await a.sendRaw({type:"artifact-remove",artifactId:n});return v.value?.entry?.id===n&&(v.value=null),await l(),s?.found===!0}catch{return!1}}async function c(){const n=F();try{const a=await n.sendRaw({type:"artifact-clean"});return await l(),Number(a?.removed)||0}catch{return 0}}function w(n){const a=Number(n)||0;return a<1024?`${a} B`:a<1024*1024?`${(a/1024).toFixed(1)} KB`:`${(a/(1024*1024)).toFixed(1)} MB`}function x(n){switch(n){case"report":return"blue";case"patch":return"purple";case"screenshot":return"cyan";case"log":return"default";case"data":return"green";default:return"default"}}return{artifacts:h,loading:t,kindFilter:u,sessionFilter:e,kinds:A,preview:v,previewLoading:b,previewImageSrc:m,previewIsMarkdown:O,fetchArtifacts:l,openPreview:g,closePreview:i,removeArtifact:P,cleanExpired:c,downloadArtifact:M,formatSize:w,kindColor:x}}),q={__name:"Artifacts",setup(h,{expose:t}){t();const u=K(),e=[{title:"标题",key:"title",dataIndex:"title",ellipsis:!0},{title:"类型",key:"kind",dataIndex:"kind",width:110},{title:"MIME",dataIndex:"mime",width:160,ellipsis:!0},{title:"大小",key:"size",dataIndex:"size",width:90},{title:"发布时间",key:"createdAt",dataIndex:"createdAt",width:170},{title:"会话",dataIndex:"sessionId",width:160,ellipsis:!0},{title:"操作",key:"actions",width:150}],v=z(()=>u.kinds.map(i=>({label:i,value:i})));async function b(i){await u.removeArtifact(i)?S.success("已删除"):S.error("删除失败")}async function A(){const i=await u.cleanExpired();S.info(i>0?`清理了 ${i} 个过期交付物`:"没有过期交付物")}async function l(i){await u.downloadArtifact(i)||S.error("下载失败")}V(()=>{u.fetchArtifacts()}),D(()=>{u.closePreview()});const g={store:u,columns:e,kindOptions:v,onRemove:b,onClean:A,onDownload:l,computed:z,onBeforeUnmount:D,onMounted:V,get ReloadOutlined(){return Z},get message(){return S},MarkdownRenderer:J,get useArtifactsStore(){return K}};return Object.defineProperty(g,"__isScriptSetup",{enumerable:!1,value:!0}),g}},H={class:"page-header"},X=["onClick"],Y=["src"],$={key:1,class:"preview-markdown"},ee={key:2,class:"preview-text"},te={class:"preview-meta"},ne={key:0};function ae(h,t,u,e,v,b){const A=k("a-select"),l=k("a-button"),g=k("a-popconfirm"),i=k("a-space"),m=k("a-tag"),O=k("a-table"),M=k("a-empty"),P=k("a-card");return d(),y("div",null,[_("div",H,[t[7]||(t[7]=_("div",null,[_("h2",{class:"page-title"},"交付物"),_("p",{class:"page-sub"}," agent 用 publish_artifact 发布的交付物(报告 / patch / 截图 / 日志),在这里预览与管理(cc artifacts 同源)。 ")],-1)),r(i,null,{default:o(()=>[r(A,{value:e.store.kindFilter,"onUpdate:value":t[0]||(t[0]=c=>e.store.kindFilter=c),style:{"min-width":"120px"},placeholder:"全部类型","allow-clear":"",options:e.kindOptions,onChange:t[1]||(t[1]=c=>e.store.fetchArtifacts())},null,8,["value","options"]),r(g,{title:"删除所有过期交付物?",onConfirm:e.onClean},{default:o(()=>[r(l,null,{default:o(()=>[...t[5]||(t[5]=[f("清理过期",-1)])]),_:1})]),_:1}),r(l,{ghost:"",loading:e.store.loading,onClick:t[2]||(t[2]=c=>e.store.fetchArtifacts())},{icon:o(()=>[r(e.ReloadOutlined)]),default:o(()=>[t[6]||(t[6]=f(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),r(O,{"data-source":e.store.artifacts,columns:e.columns,"row-key":"id",size:"small",pagination:{pageSize:10,hideOnSinglePage:!0}},{bodyCell:o(({column:c,record:w})=>[c.key==="title"?(d(),y("a",{key:0,onClick:x=>e.store.openPreview(w)},p(w.title),9,X)):c.key==="kind"?(d(),R(m,{key:1,color:e.store.kindColor(w.kind)},{default:o(()=>[f(p(w.kind),1)]),_:2},1032,["color"])):c.key==="size"?(d(),y(j,{key:2},[f(p(e.store.formatSize(w.size)),1)],64)):c.key==="createdAt"?(d(),y(j,{key:3},[f(p((w.createdAt||"").replace("T"," ").slice(0,19)),1)],64)):c.key==="actions"?(d(),R(i,{key:4},{default:o(()=>[r(l,{size:"small",onClick:x=>e.store.openPreview(w)},{default:o(()=>[...t[8]||(t[8]=[f("预览",-1)])]),_:1},8,["onClick"]),r(l,{size:"small",onClick:x=>e.onDownload(w)},{default:o(()=>[...t[9]||(t[9]=[f("下载",-1)])]),_:1},8,["onClick"]),r(g,{title:"删除该交付物?",onConfirm:x=>e.onRemove(w.id)},{default:o(()=>[r(l,{size:"small",danger:""},{default:o(()=>[...t[10]||(t[10]=[f("删除",-1)])]),_:1})]),_:1},8,["onConfirm"])]),_:2},1024)):B("v-if",!0)]),_:1},8,["data-source"]),e.store.preview?(d(),R(P,{key:0,size:"small",class:"preview-card",loading:e.store.previewLoading},{title:o(()=>[r(i,null,{default:o(()=>[_("span",null,p(e.store.preview.entry?.title),1),r(m,{color:e.store.kindColor(e.store.preview.entry?.kind)},{default:o(()=>[f(p(e.store.preview.entry?.kind),1)]),_:1},8,["color"]),r(m,{color:"default"},{default:o(()=>[f(p(e.store.preview.entry?.mime),1)]),_:1}),e.store.preview.truncated?(d(),R(m,{key:0,color:"warning"},{default:o(()=>[...t[11]||(t[11]=[f("已截断预览",-1)])]),_:1})):B("v-if",!0)]),_:1})]),extra:o(()=>[r(i,null,{default:o(()=>[r(l,{size:"small",onClick:t[3]||(t[3]=c=>e.onDownload(e.store.preview.entry))},{default:o(()=>[...t[12]||(t[12]=[f("下载",-1)])]),_:1}),r(l,{size:"small",onClick:t[4]||(t[4]=c=>e.store.closePreview())},{default:o(()=>[...t[13]||(t[13]=[f("关闭",-1)])]),_:1})]),_:1})]),default:o(()=>[e.store.previewImageSrc?(d(),y("img",{key:0,src:e.store.previewImageSrc,class:"preview-image",alt:"artifact preview"},null,8,Y)):e.store.previewIsMarkdown?(d(),y("div",$,[r(e.MarkdownRenderer,{content:e.store.preview.content||""},null,8,["content"])])):e.store.preview.previewable?(d(),y("pre",ee,p(e.store.preview.content||"(空文件)"),1)):(d(),R(M,{key:3,description:e.store.preview.reason||"该类型不支持在线预览,可在本机用 cc artifacts open <id> 打开"},null,8,["description"])),_("div",te,[_("span",null,p(e.store.preview.entry?.id),1),e.store.preview.entry?.sessionId?(d(),y("span",ne," · session "+p(e.store.preview.entry.sessionId),1)):B("v-if",!0),_("span",null," · sha256 "+p((e.store.preview.entry?.sha256||"").slice(0,12))+"…",1)])]),_:1},8,["loading"])):B("v-if",!0)])}const de=W(q,[["render",ae],["__scopeId","data-v-c8b48f8c"],["__file","/tmp/cc-web-panel-ZQdeec/repo/packages/web-panel/src/views/Artifacts.vue"]]);export{de as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as r,J as T,U as c,c as a,K as o,S as I,V as C,o as M,r as k,a as V,b as L,P as R,Q as d,R as m,F as H,Z as W}from"./vendor-Bn1JzzAn.js";import{_ as A,u as N,d as i}from"./index-DbdMPF9D.js";import{R as F}from"./icons-DG5UD-6K.js";function B(P){return["ask","agent"].map(t=>{const n=P?.readiness?.[t],e=n?.state==="admitted",f=n?.scope==="deployment-admission"&&n.runtimeVerification==="not_checked"&&Array.isArray(n.requiredCommands)&&n.requiredCommands.includes(t)&&(e?n.ready===!0&&n.taskReady===null:["not_configured","disabled","invalid","command_not_allowed"].includes(n.state)&&n.ready===!1&&n.taskReady===!1);return{command:t,state:f?n.state:"unknown",summary:f?e?"部署准入通过":"部署准入被阻断":"未提供准入诊断",detail:f&&typeof n.detail=="string"?n.detail:"当前 CLI 未提供可识别的部署准入诊断,请更新 CLI。",remediation:f&&typeof n.remediation=="string"?n.remediation:""}})}function U(P,t){for(const n of Object.keys(P))delete P[n];Object.assign(P,{source:"none",effectiveEnabled:!1,profileEnabled:!1,verified:!1,commands:[],readiness:null},t||{})}const J={__name:"EvolutionSettings",setup(P,{expose:t}){t();const n=N(),e=k(!1),f=k(!1),S=k(!1),p=k(!1),w=k(!1),g=k(""),_=k(""),E=k(""),v=V({source:"none",effectiveEnabled:!1,profileEnabled:!1,verified:!1,commands:[]}),x=L(()=>e.value||f.value||S.value||p.value||w.value),h=L(()=>B(v));function b(s){U(v,s),_.value=v.descriptorPath||"",E.value=v.trustRootPath||"",g.value=v.modulePath||g.value||""}async function u(s,z=3e4){return await n.waitConnected(8e3),(await n.sendRaw(s,z)).result}async function y(){e.value=!0;try{b(await u({type:"evolution.deployment.status"}))}catch(s){i.error("读取配置失败:"+s.message)}finally{e.value=!1}}async function O(){if(!_.value.trim()||!E.value.trim()){i.warning("请填写描述符和信任根公钥的绝对路径");return}f.value=!0;try{b(await u({type:"evolution.deployment.configure",descriptorPath:_.value.trim(),trustRootPath:E.value.trim()},6e4)),i.success("签名校验通过,配置已保存并启用;自动发布仍为 HOLD")}catch(s){i.error("配置失败:"+s.message)}finally{f.value=!1}}async function D(){if(!g.value.trim()){i.warning("请填写测试部署宿主模块的服务器绝对路径");return}p.value=!0;try{b(await u({type:"evolution.deployment.init-test",modulePath:g.value.trim()},6e4)),i.success("TEST 测试开发环境已生成并启用;禁止用于生产")}catch(s){i.error("生成测试环境失败:"+s.message)}finally{p.value=!1}}async function l(){if(!_.value.trim()||!E.value.trim()){i.warning("请填写正式描述符和正式信任根公钥的绝对路径");return}w.value=!0;try{b(await u({type:"evolution.deployment.replace-test",descriptorPath:_.value.trim(),trustRootPath:E.value.trim()},6e4)),i.success("测试根已安全轮换为正式受管证书;请重启 cc ui、IDE 或 Desktop 长驻进程后做正式验证")}catch(s){i.error("替换失败:"+s.message)}finally{w.value=!1}}async function q(){S.value=!0;try{b(await u({type:"evolution.deployment.set-enabled",enabled:!v.profileEnabled})),i.success(v.profileEnabled?"已启用":"已停用")}catch(s){i.error("更新失败:"+s.message)}finally{S.value=!1}}M(y);const j={ws:n,loading:e,saving:f,toggling:S,initializingTest:p,replacingTest:w,modulePath:g,descriptorPath:_,trustRootPath:E,status:v,busy:x,readinessRows:h,apply:b,request:u,loadStatus:y,save:O,initTest:D,replaceTest:l,toggle:q,computed:L,onMounted:M,reactive:V,ref:k,get ReloadOutlined(){return F},get message(){return i},get useWsStore(){return N},get deploymentReadinessRows(){return B},get replaceDeploymentStatus(){return U}};return Object.defineProperty(j,"__isScriptSetup",{enumerable:!1,value:!0}),j}},Q={class:"page-head"},Z={class:"mono"},K={class:"mono"},G={class:"admission-status","aria-live":"polite"},X=["data-admission-command"],Y={class:"mono"},$={key:0,class:"mono"};function ee(P,t,n,e,f,S){const p=r("a-button"),w=r("a-alert"),g=r("a-input"),_=r("a-form-item"),E=r("a-divider"),v=r("a-space"),x=r("a-form"),h=r("a-card"),b=r("a-col"),u=r("a-tag"),y=r("a-descriptions-item"),O=r("a-descriptions"),D=r("a-row");return R(),T("div",null,[c("div",Q,[t[4]||(t[4]=c("div",null,[c("h2",{class:"page-title"},"Skill 自进化配置"),c("p",{class:"page-sub"},"统一配置受治理部署;CLI、IDE 插件与 cc ui 共享。")],-1)),a(p,{loading:e.loading,onClick:e.loadStatus},{icon:o(()=>[a(e.ReloadOutlined)]),default:o(()=>[t[3]||(t[3]=d("刷新 ",-1))]),_:1},8,["loading"])]),a(w,{message:"不会开启自动发布",description:"此开关只启用经过签名的 Skill 自进化运行时。候选项进入 active 前仍需人工审核,自动发布始终保持 HOLD。",type:"warning","show-icon":"",class:"notice"}),e.status.deploymentMode==="test"?(R(),I(w,{key:0,message:"当前为 TEST 测试开发环境",description:"本机自动生成的测试密钥不能用于生产。正式 descriptor 和 trust root 到位后,请使用下方“一键替换测试证书并转正式”。",type:"error","show-icon":"",class:"notice"})):C("v-if",!0),a(D,{gutter:16},{default:o(()=>[a(b,{xs:24,xl:15},{default:o(()=>[a(h,{title:"上线前测试与正式部署",class:"panel-card"},{default:o(()=>[a(x,{layout:"vertical"},{default:o(()=>[a(_,{label:"测试部署宿主模块"},{extra:o(()=>[...t[5]||(t[5]=[d("首次填写后点击一次即可生成 Ed25519 测试密钥、签名描述符并启用;宿主模块修改后再次点击可刷新。",-1)])]),default:o(()=>[a(g,{value:e.modulePath,"onUpdate:value":t[0]||(t[0]=l=>e.modulePath=l),disabled:e.busy,placeholder:"运行 cc ui 的机器上 deployment host .mjs/.js 的绝对路径"},null,8,["value","disabled"])]),_:1}),a(p,{type:"primary",loading:e.initializingTest,onClick:e.initTest},{default:o(()=>[...t[6]||(t[6]=[d("一键生成/刷新测试环境",-1)])]),_:1},8,["loading"]),a(E),a(_,{label:"签名部署描述符"},{extra:o(()=>[...t[7]||(t[7]=[d("Web 页面不能读取本机文件选择器,请填写运行 cc ui 的机器上的绝对路径。",-1)])]),default:o(()=>[a(g,{value:e.descriptorPath,"onUpdate:value":t[1]||(t[1]=l=>e.descriptorPath=l),disabled:e.busy,placeholder:"deployment descriptor JSON 的服务器绝对路径"},null,8,["value","disabled"])]),_:1}),a(_,{label:"Ed25519 信任根公钥"},{default:o(()=>[a(g,{value:e.trustRootPath,"onUpdate:value":t[2]||(t[2]=l=>e.trustRootPath=l),disabled:e.busy,placeholder:"信任根 public key 的服务器绝对路径"},null,8,["value","disabled"])]),_:1}),a(v,null,{default:o(()=>[a(p,{type:"primary",loading:e.saving,onClick:e.save},{default:o(()=>[...t[8]||(t[8]=[d("校验、保存并启用",-1)])]),_:1},8,["loading"]),a(p,{danger:e.status.profileEnabled,disabled:!e.status.descriptorPath,loading:e.toggling,onClick:e.toggle},{default:o(()=>[d(m(e.status.profileEnabled?"停用":"启用"),1)]),_:1},8,["danger","disabled","loading"]),e.status.deploymentMode==="test"?(R(),I(p,{key:0,loading:e.replacingTest,onClick:e.replaceTest},{default:o(()=>[...t[9]||(t[9]=[d("一键替换测试证书并转正式",-1)])]),_:1},8,["loading"])):C("v-if",!0)]),_:1})]),_:1})]),_:1})]),_:1}),a(b,{xs:24,xl:9},{default:o(()=>[a(h,{title:"治理状态",class:"panel-card status-card"},{default:o(()=>[a(O,{column:1,size:"small"},{default:o(()=>[a(y,{label:"部署模式"},{default:o(()=>[a(u,{color:e.status.deploymentMode==="test"?"red":"blue"},{default:o(()=>[d(m(e.status.deploymentMode==="test"?"TEST(仅限上线前联调)":e.status.deploymentMode||"none"),1)]),_:1},8,["color"])]),_:1}),a(y,{label:"生效状态"},{default:o(()=>[a(u,{color:e.status.effectiveEnabled?"green":"default"},{default:o(()=>[d(m(e.status.effectiveEnabled?"已启用":"未启用"),1)]),_:1},8,["color"])]),_:1}),a(y,{label:"生效来源"},{default:o(()=>[d(m(e.status.source||"none"),1)]),_:1}),a(y,{label:"签名校验"},{default:o(()=>[a(u,{color:e.status.verified?"green":"red"},{default:o(()=>[d(m(e.status.verified?"已通过":"未通过"),1)]),_:1},8,["color"])]),_:1}),a(y,{label:"自动发布"},{default:o(()=>[a(u,{color:"orange"},{default:o(()=>[...t[10]||(t[10]=[d("HOLD",-1)])]),_:1})]),_:1}),a(y,{label:"配置文件"},{default:o(()=>[c("span",Z,m(e.status.profilePath||"—"),1)]),_:1}),a(y,{label:"允许命令"},{default:o(()=>[c("span",K,m((e.status.commands||[]).join(", ")||"—"),1)]),_:1})]),_:1}),c("section",G,[t[11]||(t[11]=c("h3",null,"模型命令部署准入",-1)),t[12]||(t[12]=c("p",null,"这里只检查部署准入,实际任务运行尚未验证。",-1)),(R(!0),T(H,null,W(e.readinessRows,l=>(R(),T("div",{key:l.command,"data-admission-command":l.command},[c("strong",null,m(l.command)+":"+m(l.summary),1),c("p",Y,m(l.detail),1),l.remediation?(R(),T("p",$,m(l.remediation),1)):C("v-if",!0)],8,X))),128))]),e.status.error?(R(),I(w,{key:0,message:e.status.error,type:"error","show-icon":"",class:"error"},null,8,["message"])):C("v-if",!0)]),_:1})]),_:1})]),_:1})])}const le=A(J,[["render",ee],["__scopeId","data-v-5a42105e"],["__file","/tmp/cc-web-panel-ZQdeec/repo/packages/web-panel/src/views/EvolutionSettings.vue"]]);export{le as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{P as a,J as d,b as c}from"./vendor-Bn1JzzAn.js";import{r as s}from"./markdown-Bq2x0XsR.js";import{_ as p}from"./index-DbdMPF9D.js";const _={__name:"MarkdownRenderer",props:{content:{type:String,default:""}},setup(t,{expose:o}){o();const e=t,r=c(()=>s(e.content||"")),n={props:e,rendered:r,computed:c,get renderMarkdown(){return s}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}},i=["innerHTML"];function m(t,o,e,r,n,u){return a(),d("div",{class:"markdown-content",innerHTML:r.rendered},null,8,i)}const w=p(_,[["render",m],["__scopeId","data-v-0b0b9f63"],["__file","/tmp/cc-web-panel-ZQdeec/repo/packages/web-panel/src/components/MarkdownRenderer.vue"]]);export{w as M};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Q as r}from"./index-DbdMPF9D.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as o}from"./Row-ckVQk62z.js";import{a0 as t}from"./index-DbdMPF9D.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-DBJSmMkS.js";import"./useFlexGapSupport-BYbRYwok.js";import"./styleChecker-qOO9jMdb.js";import"./index-og41WNLX.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-07yH3vgP.js";import{a0 as t}from"./index-DbdMPF9D.js";import"./vendor-Bn1JzzAn.js";import"./index-og41WNLX.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
|