chainlesschain 0.162.193 → 0.162.198
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 +29 -6
- package/completions/_cc +2 -2
- package/completions/cc.bash +2 -2
- package/completions/cc.fish +2 -2
- package/completions/cc.ps1 +2 -2
- package/package.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-DBLkaTje.js → AIOps-CSN-D2xb.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BAy-Qebo.js → ActionButton-CBSMlGzv.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-Dfb1Mlau.js → Analytics-3yr3Nt2t.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-BbFkN8m0.js → AppLayout-1b-o3lMH.js} +4 -4
- package/src/assets/web-panel/assets/{Artifacts-kM4-cEEH.js → Artifacts-Dr8rJi17.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-BSQfYWf3.js → Audit-2V689HC2.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-CWDbI_fG.js → BackgroundAgents-DIxkNrD_.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BxLPbq_Q.js → Backup-Pg6BcwrE.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-DuIbdrp6.js → BaseInput-CLUpqyfH.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-NEmjGahU.js → Chat-qVS8rD4G.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-DfJEo-5_.js → ChatBubbleRenderer-ti49X12Q.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-CaoeG3Ns.js → Checkbox-Bs9AaEay.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-BFf_g3xY.js → Codegen-Dvc1mq8q.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CNOd8mdQ.js → Col-C4_biO7A.js} +1 -1
- package/src/assets/web-panel/assets/{Community-BhpDqz-i.js → Community-al25XQUV.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-CQ42T7Z6.js → Compact-D-ZDB8M1.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DI5PcLMN.js → Compliance-6lIfDz1W.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-wYYZe0wR.js → Cowork-DdI48XMJ.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-Dlq03DD_.js → Cron-DF5HZd2g.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BzqS8PP3.js → Crosschain-DuxeSvt3.js} +1 -1
- package/src/assets/web-panel/assets/{DID-It55Yem7.js → DID-B9yHkUTd.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-9HkH6oxn.js → Dashboard-Z5EuI3IM.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-00e2YWRB.js → Dropdown-vuRfO3dY.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-By-ugRDL.js → EmailListRenderer-QFLCc1uL.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-C396yu5m.js → FamilyGuardDashboard-BZ7EXkFJ.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BME5sbZY.js → Federation-DycIEg2s.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-B4TEZCr-.js → FormItemContext-Ba0H_7yG.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-_9CX9ieY.js → GenericCardRenderer--JgSTK-C.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BrS6WVSr.js → Git-DEvTbldE.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BMdCWnKF.js → Governance-BJIljy18.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-Bcp3vzcA.js → Inference-CVyW3G3q.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DlLuqGY5.js → KnowledgeGraph-v8-borge.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-D-W_6x09.js → Logs-BCdS7gGo.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-DElGPxCZ.js → MarkdownRenderer-CU-JB2Ns.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-Dzn2guvI.js → Marketplace-AN6tGA2B.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-uPict-KL.js → McpTools-DGViXASN.js} +6 -6
- package/src/assets/web-panel/assets/{Memory-BCw43kOb.js → Memory-Bpvmx9X4.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DmV8Wv7F.js → MobileBridge-CTP-DOTC.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-C-HaCmSM.js → MobileProjects-C8qfktxn.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-C6jxJ34Y.js → Mtc-ndYr0M1s.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-Za8ExwhQ.js → MtcAudit-Ci0-YK7W.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-KKDbuEgb.js → Multisig-BehSTFW7.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Dj97zbCk.js → NLProgramming-B91_YBLv.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DBXvMraU.js → Notes-BQlJ0-gq.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-DOxITLYl.js → NotificationSettings-CDgYMjYK.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-7DVjZwMM.js → OrderTableRenderer-BJkSlKeH.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-D1i73mjb.js → Organization-B-b3cWCp.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-kW6Q3rvg.js → Overflow-CILUL4nL.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-C-v_8p2v.js → P2P-BTCFBkF0.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-tUbbY64W.js → PdhVaultBrowser-BAR6AUx5.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-DkHxEZ58.js → Permissions-RRf6HbWJ.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-DWuMPGrK.js → PersonalDataHub-BGTMiICa.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-30IYXWWm.js → Pipeline-945qY9YF.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DZNQ4RrH.js → Privacy-DPZwI6lJ.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-De2MCElf.js → ProjectInit-BPH2NRKc.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-5uHk9wsC.js → ProjectSettings-BZCRNCvb.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-XjDfrFLb.js → Projects-BTI__tBt.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-Bgwj6gcE.js → Providers-DDCf_nIw.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-gKql9umv.js → QrScannerModal-N6rbqt1r.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BWvmwkh7.js → QuickAsk-DrwjPS7M.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Uok4hZPd.js → Recommend-Cog9Wd99.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DLJzTk9a.js → RemoteSession-DC9pynjM.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-ZVwIPMSO.js → Reputation-D4th4gKS.js} +1 -1
- package/src/assets/web-panel/assets/{Row-CN04HxWR.js → Row-ogiWR6v9.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BdSrEG4g.js → RssFeed-uYlk-2Oj.js} +3 -3
- package/src/assets/web-panel/assets/{Search-5PwVd0IR.js → Search-DYzzwvtM.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DdBo4zjN.js → Security-Da7YOyX6.js} +4 -4
- package/src/assets/web-panel/assets/{Services-D3letU7M.js → Services-CLI1VM1X.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton--Jb83f1v.js → Skeleton-DK77dzDC.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-Bg-CulHX.js → Skills-C_z7Lmhl.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-7QOa7S-X.js → Sla-D6413Q8L.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-DQwppjRw.js → SpeechSettings-C07ydbj2.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-dNPQGL-s.js → SyncSettings-DGOm2W22.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-Ggs-Z48q.js → Tasks-Cr_PVyLM.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-78TYHgRO.js → Templates-BhL2mZ0t.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-xHwwv9vO.js → Tenant-CPk5oyUr.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BJXSJfm4.js → Terminal-ClhqUsqV.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-fLbjRhJw.js → TimelineRenderer-BCC7MV5a.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-oMSBSBmB.js → Tokens-DD1Jt4oO.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-CfnY_wX_.js → Trigger-BCydFvN2.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-AdyTgYKO.js → Trust-DDHT1noa.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-C5K_81dS.js → UkeySign-CWPZC7oI.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-vcGVDqki.js → VideoEditing-9Ea0nJR0.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-hhOc3hlY.js → Wallet-BjxhLxTf.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-CVloC11s.js → WebAuthn-C6uCye67.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-CYeE32R5.js → WorkflowEditor-d2g4reYo.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CNROR5bN.js → chat-frTc6ScX.js} +1 -1
- package/src/assets/web-panel/assets/{colors-Cjx-cnwU.js → colors-B5K6lG3v.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DOIfelvD.js → compact-item-Cdn46r8D.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DfA7UZ8u.js → createContext-DU1jqVQi.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CP-jEUyw.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-BMSCzcfM.js → hasIn-DdNH-aW_.js} +1 -1
- package/src/assets/web-panel/assets/{index-CAnvhwg6.js → index-32ajXmTb.js} +1 -1
- package/src/assets/web-panel/assets/{index-BEMwBBHk.js → index-7ehytj1K.js} +1 -1
- package/src/assets/web-panel/assets/{index-CVL27kXC.js → index-BC4eGkar.js} +1 -1
- package/src/assets/web-panel/assets/{index-FBc_CJBd.js → index-BVLL-mq_.js} +1 -1
- package/src/assets/web-panel/assets/{index-dCd8cSUq.js → index-BXKhhx9V.js} +1 -1
- package/src/assets/web-panel/assets/{index-BemJ2u_E.js → index-BcGwGIaR.js} +1 -1
- package/src/assets/web-panel/assets/{index-CVm1_i3t.js → index-Be4OtL-N.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cs6l7uRu.js → index-BoFak7le.js} +1 -1
- package/src/assets/web-panel/assets/{index-DPAWBrMf.js → index-BwlIxAmX.js} +1 -1
- package/src/assets/web-panel/assets/{index-DLmn0BoK.js → index-CGiwfwB9.js} +1 -1
- package/src/assets/web-panel/assets/{index-B7gf77CJ.js → index-CHmkkdfT.js} +1 -1
- package/src/assets/web-panel/assets/{index-m2vG9gG_.js → index-CQorP1Ng.js} +1 -1
- package/src/assets/web-panel/assets/{index-ClNMrqEY.js → index-CUoNAmE8.js} +1 -1
- package/src/assets/web-panel/assets/{index-DHtpHZAQ.js → index-Cj6P9Nst.js} +1 -1
- package/src/assets/web-panel/assets/{index-C2K9SNVX.js → index-CtRPi4YC.js} +1 -1
- package/src/assets/web-panel/assets/index-CzrCHrFy.js +1 -0
- package/src/assets/web-panel/assets/{index-BolaOQxx.js → index-D1qIC4GR.js} +1 -1
- package/src/assets/web-panel/assets/{index-BM1y_9hM.js → index-D23xGYjM.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cyweh0Hy.js → index-D4l82Me1.js} +1 -1
- package/src/assets/web-panel/assets/{index-By61ojUx.js → index-D4miNkWv.js} +1 -1
- package/src/assets/web-panel/assets/{index-BbQ2eQ8H.js → index-DIVyTmZ3.js} +1 -1
- package/src/assets/web-panel/assets/{index-Icdoqmzt.js → index-DM5FmPZU.js} +1 -1
- package/src/assets/web-panel/assets/{index-DjEsxO5h.js → index-DRzBBdQ0.js} +1 -1
- package/src/assets/web-panel/assets/{index-B4iYzpkL.js → index-Dca_i7H8.js} +1 -1
- package/src/assets/web-panel/assets/{index-C3L5gdiD.js → index-DftZuyA7.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdYBye8B.js → index-DtBCCkC4.js} +1 -1
- package/src/assets/web-panel/assets/{index-AWg-0M1S.js → index-HjCvXHf5.js} +1 -1
- package/src/assets/web-panel/assets/{index-CEKMcOyU.js → index-LaivuXyF.js} +1 -1
- package/src/assets/web-panel/assets/{index-BxOk9vkG.js → index-MM4Zz2OE.js} +1 -1
- package/src/assets/web-panel/assets/{index-CNC5onm4.js → index-NmEXVjzt.js} +1 -1
- package/src/assets/web-panel/assets/index-OJsGskZw.js +1 -0
- package/src/assets/web-panel/assets/{index-BUonmKSE.js → index-PjAS0sIZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-B5Udeb_6.js → index-VDM2KKo9.js} +1 -1
- package/src/assets/web-panel/assets/{index-5-HXgOX5.js → index-cYaWV4Mq.js} +1 -1
- package/src/assets/web-panel/assets/{index-DBpWXFed.js → index-gg3QPC3i.js} +3 -3
- package/src/assets/web-panel/assets/{index-C7xn0Nub.js → index-kVO_MDm-.js} +1 -1
- package/src/assets/web-panel/assets/{index-ti_lnTWl.js → index-mgU3Q-lN.js} +1 -1
- package/src/assets/web-panel/assets/{index-CshQbilz.js → index-t_OBzIP4.js} +1 -1
- package/src/assets/web-panel/assets/{index-mTpHoEzr.js → index-yZRuZpwK.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-Bu8k7H1Y.js → initDefaultProps-DwLTRNdo.js} +1 -1
- package/src/assets/web-panel/assets/{motion-s3iVK41k.js → motion-BchZDXnh.js} +1 -1
- package/src/assets/web-panel/assets/{move-B6B-E5Jz.js → move-e8M-zZFl.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BiYgTidA.js → mtc-parser-Ci40fQb3.js} +1 -1
- package/src/assets/web-panel/assets/{omit-pU1RdUDA.js → omit-C7110_f2.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-Cdoq_SeM.js → pickAttrs-skteMgnM.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DIuvAn2K.js → placementArrow-MGZ-lh2B.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-8w16YR2D.js → responsiveObserve-N4Sd7uy-.js} +1 -1
- package/src/assets/web-panel/assets/{slide-VZ01cZe3.js → slide-C7HDGRaa.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-lh8YMN8Z.js → statusUtils-BhRexlgy.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-CmDyreec.js → styleChecker-ChEoQkN2.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-hiJWMU5y.js → useFlexGapSupport-CDbG1s2Y.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-Thnu-Iaj.js → useFs-CUIx0tcJ.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-LBdOxjwY.js → usePersonalDataHub-bkO7L7ec.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-Cg6lFY_X.js → vnode-B_ZvABIG.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DVfsR1YO.js → zoom-D5shjpS8.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +4 -4
- package/src/command-manifest.json +214 -50
- package/src/command-surface-policy.js +115 -0
- package/src/commands/agent.js +3 -3
- package/src/commands/background-session.js +145 -0
- package/src/commands/mcp.js +125 -7
- package/src/commands/serve.js +1 -1
- package/src/commands/session-show.js +131 -0
- package/src/commands/session.js +50 -106
- package/src/commands/skill.js +87 -50
- package/src/data/changelog.json +18 -5
- package/src/gateways/ws/ws-agent-handler.js +8 -1
- package/src/harness/jsonl-session-store.js +428 -25
- package/src/harness/mcp-client.js +2652 -404
- package/src/harness/session-list-index.js +65 -7
- package/src/lazy-dispatch.js +76 -8
- package/src/lib/abort-utils.js +68 -0
- package/src/lib/agent-core.js +1 -59
- package/src/lib/chat-core.js +24 -6
- package/src/lib/cowork-mcp-tools.js +47 -2
- package/src/lib/cowork-task-runner.js +11 -3
- package/src/lib/doctor-checkup.js +9 -7
- package/src/lib/learning/skill-improver.js +21 -2
- package/src/lib/mcp-call-ledger-store.js +116 -3
- package/src/lib/mcp-call-ledger.js +59 -14
- package/src/lib/mcp-client.js +1 -0
- package/src/lib/mcp-stdio-executable-identity.js +598 -0
- package/src/lib/mcp-stdio-execution-authority.js +363 -0
- package/src/lib/mcp-tool-metadata.js +436 -0
- package/src/lib/mcp-tool-result.js +367 -0
- package/src/lib/observability/index.js +71 -0
- package/src/lib/pr-link-ledger.js +8 -27
- package/src/lib/pr-link-store.js +26 -0
- package/src/lib/process-execution-broker/index.js +14 -0
- package/src/lib/process-tree-termination.js +253 -0
- package/src/lib/public-ide-capability-manifest.js +6 -0
- package/src/lib/session-host-snapshot.js +9 -5
- package/src/lib/session-projection.js +5 -1
- package/src/lib/session-tail.js +31 -1
- package/src/lib/skill-budget.js +222 -0
- package/src/lib/skill-execution-authority.js +381 -0
- package/src/lib/skill-execution-identity.js +39 -2
- package/src/lib/skill-loader.js +322 -86
- package/src/lib/skill-mcp.js +43 -1
- package/src/repl/agent-repl.js +349 -46
- package/src/repl/bg-dashboard.js +81 -28
- package/src/repl/chat-repl.js +77 -12
- package/src/repl/prompt-interactions.js +67 -7
- package/src/repl/slash-command-registry.js +3 -4
- package/src/runtime/agent-core.js +340 -108
- package/src/runtime/agent-runtime.js +26 -3
- package/src/runtime/headless-runner.js +150 -23
- package/src/runtime/headless-stream.js +309 -59
- package/src/runtime/mcp-config.js +157 -10
- package/src/runtime/mcp-tool-search.js +0 -0
- package/src/runtime/output-backpressure.js +366 -0
- package/src/runtime/pipe-safety.js +56 -21
- package/src/assets/web-panel/assets/devWarning-ChcCBGs7.js +0 -1
- package/src/assets/web-panel/assets/index-Q2IajL54.js +0 -1
- package/src/assets/web-panel/assets/index-bRkHgOMc.js +0 -1
- package/src/lib/skill-process-broker.js +0 -85
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
import { isProxy } from "node:util/types";
|
|
2
|
+
|
|
3
|
+
export const MCP_TOOL_METADATA_LIMITS = Object.freeze({
|
|
4
|
+
maxTools: 1000,
|
|
5
|
+
maxNameBytes: 256,
|
|
6
|
+
maxDescriptionBytes: 16 * 1024,
|
|
7
|
+
maxSchemaBytes: 256 * 1024,
|
|
8
|
+
maxSchemaDepth: 32,
|
|
9
|
+
maxSchemaNodes: 25_000,
|
|
10
|
+
maxDefinitionBytes: 512 * 1024,
|
|
11
|
+
maxDefinitionNodes: 50_000,
|
|
12
|
+
maxServerBytes: 8 * 1024 * 1024,
|
|
13
|
+
maxClientBytes: 32 * 1024 * 1024,
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
const MCP_TOOL_METADATA_ERROR_CODES = new Set([
|
|
17
|
+
"CC_MCP_TOOL_METADATA_INVALID",
|
|
18
|
+
"CC_MCP_TOOL_COUNT_EXCEEDED",
|
|
19
|
+
"CC_MCP_TOOL_NAME_TOO_LARGE",
|
|
20
|
+
"CC_MCP_TOOL_DESCRIPTION_TOO_LARGE",
|
|
21
|
+
"CC_MCP_TOOL_SCHEMA_TOO_LARGE",
|
|
22
|
+
"CC_MCP_TOOL_SCHEMA_DEPTH_EXCEEDED",
|
|
23
|
+
"CC_MCP_TOOL_SCHEMA_NODES_EXCEEDED",
|
|
24
|
+
"CC_MCP_TOOL_DEFINITION_TOO_LARGE",
|
|
25
|
+
"CC_MCP_TOOL_METADATA_TOO_LARGE",
|
|
26
|
+
"CC_MCP_TOOL_CLIENT_METADATA_TOO_LARGE",
|
|
27
|
+
]);
|
|
28
|
+
|
|
29
|
+
function tightenedLimit(configured, ceiling) {
|
|
30
|
+
if (Number.isFinite(configured) && configured > 0) {
|
|
31
|
+
return Math.min(ceiling, Math.max(1, Math.floor(configured)));
|
|
32
|
+
}
|
|
33
|
+
return ceiling;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function resolveMcpToolMetadataLimits(config = {}) {
|
|
37
|
+
return Object.freeze({
|
|
38
|
+
maxTools: tightenedLimit(
|
|
39
|
+
config?.maxTools,
|
|
40
|
+
MCP_TOOL_METADATA_LIMITS.maxTools,
|
|
41
|
+
),
|
|
42
|
+
maxNameBytes: MCP_TOOL_METADATA_LIMITS.maxNameBytes,
|
|
43
|
+
maxDescriptionBytes: tightenedLimit(
|
|
44
|
+
config?.maxToolDescriptionBytes,
|
|
45
|
+
MCP_TOOL_METADATA_LIMITS.maxDescriptionBytes,
|
|
46
|
+
),
|
|
47
|
+
maxSchemaBytes: tightenedLimit(
|
|
48
|
+
config?.maxToolSchemaBytes,
|
|
49
|
+
MCP_TOOL_METADATA_LIMITS.maxSchemaBytes,
|
|
50
|
+
),
|
|
51
|
+
maxSchemaDepth: tightenedLimit(
|
|
52
|
+
config?.maxToolSchemaDepth,
|
|
53
|
+
MCP_TOOL_METADATA_LIMITS.maxSchemaDepth,
|
|
54
|
+
),
|
|
55
|
+
maxSchemaNodes: tightenedLimit(
|
|
56
|
+
config?.maxToolSchemaNodes,
|
|
57
|
+
MCP_TOOL_METADATA_LIMITS.maxSchemaNodes,
|
|
58
|
+
),
|
|
59
|
+
maxDefinitionBytes: tightenedLimit(
|
|
60
|
+
config?.maxToolDefinitionBytes,
|
|
61
|
+
MCP_TOOL_METADATA_LIMITS.maxDefinitionBytes,
|
|
62
|
+
),
|
|
63
|
+
maxDefinitionNodes: MCP_TOOL_METADATA_LIMITS.maxDefinitionNodes,
|
|
64
|
+
maxServerBytes: tightenedLimit(
|
|
65
|
+
config?.maxToolMetadataBytes,
|
|
66
|
+
MCP_TOOL_METADATA_LIMITS.maxServerBytes,
|
|
67
|
+
),
|
|
68
|
+
maxClientBytes: MCP_TOOL_METADATA_LIMITS.maxClientBytes,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function metadataError(code, message, details = {}) {
|
|
73
|
+
const error = new Error(message);
|
|
74
|
+
error.name = "McpToolMetadataError";
|
|
75
|
+
error.code = code;
|
|
76
|
+
if (details.limitBytes != null) error.limitBytes = details.limitBytes;
|
|
77
|
+
if (details.limitDepth != null) error.limitDepth = details.limitDepth;
|
|
78
|
+
if (details.limitNodes != null) error.limitNodes = details.limitNodes;
|
|
79
|
+
if (details.limitTools != null) error.limitTools = details.limitTools;
|
|
80
|
+
return error;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function isMcpToolMetadataError(error) {
|
|
84
|
+
if (!error || typeof error !== "object") return false;
|
|
85
|
+
try {
|
|
86
|
+
if (isProxy(error)) return false;
|
|
87
|
+
const descriptor = Object.getOwnPropertyDescriptor(error, "code");
|
|
88
|
+
return Boolean(
|
|
89
|
+
descriptor &&
|
|
90
|
+
Object.hasOwn(descriptor, "value") &&
|
|
91
|
+
MCP_TOOL_METADATA_ERROR_CODES.has(descriptor.value),
|
|
92
|
+
);
|
|
93
|
+
} catch {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function denseArrayValues(value) {
|
|
99
|
+
if (!value || typeof value !== "object") return null;
|
|
100
|
+
try {
|
|
101
|
+
if (isProxy(value) || !Array.isArray(value)) return null;
|
|
102
|
+
const lengthDescriptor = Object.getOwnPropertyDescriptor(value, "length");
|
|
103
|
+
const length = lengthDescriptor?.value;
|
|
104
|
+
if (!Number.isSafeInteger(length) || length < 0) return null;
|
|
105
|
+
const keys = Reflect.ownKeys(value);
|
|
106
|
+
if (
|
|
107
|
+
keys.length !== length + 1 ||
|
|
108
|
+
keys.some((key) => typeof key === "symbol")
|
|
109
|
+
) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
const values = [];
|
|
113
|
+
for (let index = 0; index < length; index += 1) {
|
|
114
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
|
|
115
|
+
if (
|
|
116
|
+
!descriptor ||
|
|
117
|
+
!Object.hasOwn(descriptor, "value") ||
|
|
118
|
+
descriptor.enumerable !== true
|
|
119
|
+
) {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
values.push(descriptor.value);
|
|
123
|
+
}
|
|
124
|
+
return values;
|
|
125
|
+
} catch {
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function plainObjectSnapshot(value) {
|
|
131
|
+
if (!value || typeof value !== "object") return null;
|
|
132
|
+
try {
|
|
133
|
+
if (isProxy(value) || Array.isArray(value)) return null;
|
|
134
|
+
const prototype = Object.getPrototypeOf(value);
|
|
135
|
+
if (prototype !== Object.prototype && prototype !== null) return null;
|
|
136
|
+
const keys = Reflect.ownKeys(value);
|
|
137
|
+
if (keys.some((key) => typeof key === "symbol")) return null;
|
|
138
|
+
const descriptors = Object.create(null);
|
|
139
|
+
for (const key of keys) {
|
|
140
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
141
|
+
if (
|
|
142
|
+
!descriptor ||
|
|
143
|
+
!Object.hasOwn(descriptor, "value") ||
|
|
144
|
+
descriptor.enumerable !== true
|
|
145
|
+
) {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
descriptors[key] = descriptor;
|
|
149
|
+
}
|
|
150
|
+
return { keys, descriptors };
|
|
151
|
+
} catch {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function cloneJsonValue(value, state, depth) {
|
|
157
|
+
state.remaining -= 1;
|
|
158
|
+
if (state.remaining < 0) return { issue: "nodes" };
|
|
159
|
+
if (
|
|
160
|
+
value === null ||
|
|
161
|
+
typeof value === "string" ||
|
|
162
|
+
typeof value === "boolean" ||
|
|
163
|
+
(typeof value === "number" && Number.isFinite(value))
|
|
164
|
+
) {
|
|
165
|
+
return { value };
|
|
166
|
+
}
|
|
167
|
+
if (!value || typeof value !== "object" || depth > state.maxDepth) {
|
|
168
|
+
return { issue: depth > state.maxDepth ? "depth" : "invalid" };
|
|
169
|
+
}
|
|
170
|
+
try {
|
|
171
|
+
if (isProxy(value) || state.seen.has(value)) return { issue: "invalid" };
|
|
172
|
+
state.seen.add(value);
|
|
173
|
+
} catch {
|
|
174
|
+
return { issue: "invalid" };
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
if (Array.isArray(value)) {
|
|
178
|
+
const values = denseArrayValues(value);
|
|
179
|
+
if (!values) return { issue: "invalid" };
|
|
180
|
+
const clean = [];
|
|
181
|
+
for (const item of values) {
|
|
182
|
+
const cloned = cloneJsonValue(item, state, depth + 1);
|
|
183
|
+
if (cloned.issue) return cloned;
|
|
184
|
+
clean.push(cloned.value);
|
|
185
|
+
}
|
|
186
|
+
return { value: clean };
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const snapshot = plainObjectSnapshot(value);
|
|
190
|
+
if (!snapshot) return { issue: "invalid" };
|
|
191
|
+
state.remaining -= snapshot.keys.length;
|
|
192
|
+
if (state.remaining < 0) return { issue: "nodes" };
|
|
193
|
+
const clean = {};
|
|
194
|
+
for (const key of snapshot.keys) {
|
|
195
|
+
const cloned = cloneJsonValue(
|
|
196
|
+
snapshot.descriptors[key].value,
|
|
197
|
+
state,
|
|
198
|
+
depth + 1,
|
|
199
|
+
);
|
|
200
|
+
if (cloned.issue) return cloned;
|
|
201
|
+
Object.defineProperty(clean, key, {
|
|
202
|
+
value: cloned.value,
|
|
203
|
+
enumerable: true,
|
|
204
|
+
configurable: true,
|
|
205
|
+
writable: true,
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
return { value: clean };
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function snapshotJson(value, { maxDepth, maxNodes }) {
|
|
212
|
+
const cloned = cloneJsonValue(
|
|
213
|
+
value,
|
|
214
|
+
{ maxDepth, remaining: maxNodes, seen: new WeakSet() },
|
|
215
|
+
1,
|
|
216
|
+
);
|
|
217
|
+
if (cloned.issue) return cloned;
|
|
218
|
+
const wire = JSON.stringify(cloned.value);
|
|
219
|
+
return {
|
|
220
|
+
value: cloned.value,
|
|
221
|
+
wire,
|
|
222
|
+
bytes: Buffer.byteLength(wire, "utf8"),
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function freezeJsonSnapshot(value) {
|
|
227
|
+
const stack = [value];
|
|
228
|
+
while (stack.length > 0) {
|
|
229
|
+
const current = stack.pop();
|
|
230
|
+
if (!current || typeof current !== "object" || Object.isFrozen(current)) {
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
for (const key of Object.keys(current)) {
|
|
234
|
+
const child = current[key];
|
|
235
|
+
if (child && typeof child === "object") stack.push(child);
|
|
236
|
+
}
|
|
237
|
+
Object.freeze(current);
|
|
238
|
+
}
|
|
239
|
+
return value;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
function ownDataValue(snapshot, key) {
|
|
243
|
+
return snapshot?.descriptors?.[key]?.value;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function hasDisallowedDescriptionControl(value) {
|
|
247
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
248
|
+
const code = value.charCodeAt(index);
|
|
249
|
+
const disallowedC0 =
|
|
250
|
+
code <= 0x1f && code !== 0x09 && code !== 0x0a && code !== 0x0d;
|
|
251
|
+
if (disallowedC0 || (code >= 0x7f && code <= 0x9f)) return true;
|
|
252
|
+
}
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function schemaSnapshot(value, limits) {
|
|
257
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
258
|
+
throw metadataError(
|
|
259
|
+
"CC_MCP_TOOL_METADATA_INVALID",
|
|
260
|
+
"MCP server returned an invalid tool definition",
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
const snapshot = snapshotJson(value, {
|
|
264
|
+
maxDepth: limits.maxSchemaDepth,
|
|
265
|
+
maxNodes: limits.maxSchemaNodes,
|
|
266
|
+
});
|
|
267
|
+
if (snapshot.issue === "depth") {
|
|
268
|
+
throw metadataError(
|
|
269
|
+
"CC_MCP_TOOL_SCHEMA_DEPTH_EXCEEDED",
|
|
270
|
+
`MCP tool schema exceeded the ${limits.maxSchemaDepth}-level host depth budget`,
|
|
271
|
+
{ limitDepth: limits.maxSchemaDepth },
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
if (snapshot.issue === "nodes") {
|
|
275
|
+
throw metadataError(
|
|
276
|
+
"CC_MCP_TOOL_SCHEMA_NODES_EXCEEDED",
|
|
277
|
+
`MCP tool schema exceeded the ${limits.maxSchemaNodes}-node host budget`,
|
|
278
|
+
{ limitNodes: limits.maxSchemaNodes },
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
if (snapshot.issue) {
|
|
282
|
+
throw metadataError(
|
|
283
|
+
"CC_MCP_TOOL_METADATA_INVALID",
|
|
284
|
+
"MCP server returned an invalid tool definition",
|
|
285
|
+
);
|
|
286
|
+
}
|
|
287
|
+
if (snapshot.bytes > limits.maxSchemaBytes) {
|
|
288
|
+
throw metadataError(
|
|
289
|
+
"CC_MCP_TOOL_SCHEMA_TOO_LARGE",
|
|
290
|
+
`MCP tool schema exceeded the ${limits.maxSchemaBytes}-byte host budget`,
|
|
291
|
+
{ limitBytes: limits.maxSchemaBytes },
|
|
292
|
+
);
|
|
293
|
+
}
|
|
294
|
+
return snapshot.value;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
function toolSnapshot(tool, limits) {
|
|
298
|
+
const shallow = plainObjectSnapshot(tool);
|
|
299
|
+
if (!shallow) {
|
|
300
|
+
throw metadataError(
|
|
301
|
+
"CC_MCP_TOOL_METADATA_INVALID",
|
|
302
|
+
"MCP server returned an invalid tool definition",
|
|
303
|
+
);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
const name = ownDataValue(shallow, "name");
|
|
307
|
+
if (typeof name !== "string" || name.length === 0 || /\p{Cc}/u.test(name)) {
|
|
308
|
+
throw metadataError(
|
|
309
|
+
"CC_MCP_TOOL_METADATA_INVALID",
|
|
310
|
+
"MCP server returned an invalid tool definition",
|
|
311
|
+
);
|
|
312
|
+
}
|
|
313
|
+
if (Buffer.byteLength(name, "utf8") > limits.maxNameBytes) {
|
|
314
|
+
throw metadataError(
|
|
315
|
+
"CC_MCP_TOOL_NAME_TOO_LARGE",
|
|
316
|
+
`MCP tool name exceeded the ${limits.maxNameBytes}-byte host budget`,
|
|
317
|
+
{ limitBytes: limits.maxNameBytes },
|
|
318
|
+
);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
const description = ownDataValue(shallow, "description");
|
|
322
|
+
if (description !== undefined && typeof description !== "string") {
|
|
323
|
+
throw metadataError(
|
|
324
|
+
"CC_MCP_TOOL_METADATA_INVALID",
|
|
325
|
+
"MCP server returned an invalid tool definition",
|
|
326
|
+
);
|
|
327
|
+
}
|
|
328
|
+
if (
|
|
329
|
+
typeof description === "string" &&
|
|
330
|
+
Buffer.byteLength(description, "utf8") > limits.maxDescriptionBytes
|
|
331
|
+
) {
|
|
332
|
+
throw metadataError(
|
|
333
|
+
"CC_MCP_TOOL_DESCRIPTION_TOO_LARGE",
|
|
334
|
+
`MCP tool description exceeded the ${limits.maxDescriptionBytes}-byte host budget`,
|
|
335
|
+
{ limitBytes: limits.maxDescriptionBytes },
|
|
336
|
+
);
|
|
337
|
+
}
|
|
338
|
+
if (
|
|
339
|
+
typeof description === "string" &&
|
|
340
|
+
hasDisallowedDescriptionControl(description)
|
|
341
|
+
) {
|
|
342
|
+
throw metadataError(
|
|
343
|
+
"CC_MCP_TOOL_METADATA_INVALID",
|
|
344
|
+
"MCP server returned an invalid tool definition",
|
|
345
|
+
);
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
for (const field of ["inputSchema", "outputSchema"]) {
|
|
349
|
+
if (Object.hasOwn(shallow.descriptors, field)) {
|
|
350
|
+
schemaSnapshot(ownDataValue(shallow, field), limits);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
const snapshot = snapshotJson(tool, {
|
|
355
|
+
maxDepth: limits.maxSchemaDepth + 1,
|
|
356
|
+
maxNodes: limits.maxDefinitionNodes,
|
|
357
|
+
});
|
|
358
|
+
if (snapshot.issue) {
|
|
359
|
+
throw metadataError(
|
|
360
|
+
"CC_MCP_TOOL_METADATA_INVALID",
|
|
361
|
+
"MCP server returned an invalid tool definition",
|
|
362
|
+
);
|
|
363
|
+
}
|
|
364
|
+
if (snapshot.bytes > limits.maxDefinitionBytes) {
|
|
365
|
+
throw metadataError(
|
|
366
|
+
"CC_MCP_TOOL_DEFINITION_TOO_LARGE",
|
|
367
|
+
`MCP tool definition exceeded the ${limits.maxDefinitionBytes}-byte host budget`,
|
|
368
|
+
{ limitBytes: limits.maxDefinitionBytes },
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
return snapshot;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
export function admitMcpToolList(
|
|
375
|
+
_serverName,
|
|
376
|
+
value,
|
|
377
|
+
config = {},
|
|
378
|
+
options = {},
|
|
379
|
+
) {
|
|
380
|
+
const limits = resolveMcpToolMetadataLimits(config);
|
|
381
|
+
const values = denseArrayValues(value);
|
|
382
|
+
if (!values) {
|
|
383
|
+
throw metadataError(
|
|
384
|
+
"CC_MCP_TOOL_METADATA_INVALID",
|
|
385
|
+
"MCP server returned an invalid tool inventory",
|
|
386
|
+
);
|
|
387
|
+
}
|
|
388
|
+
if (values.length > limits.maxTools) {
|
|
389
|
+
throw metadataError(
|
|
390
|
+
"CC_MCP_TOOL_COUNT_EXCEEDED",
|
|
391
|
+
`MCP tool inventory exceeded the ${limits.maxTools}-tool host budget`,
|
|
392
|
+
{ limitTools: limits.maxTools },
|
|
393
|
+
);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
const tools = [];
|
|
397
|
+
const names = new Set();
|
|
398
|
+
let metadataBytes = 0;
|
|
399
|
+
for (const tool of values) {
|
|
400
|
+
const snapshot = toolSnapshot(tool, limits);
|
|
401
|
+
const name = snapshot.value.name;
|
|
402
|
+
if (names.has(name)) {
|
|
403
|
+
throw metadataError(
|
|
404
|
+
"CC_MCP_TOOL_METADATA_INVALID",
|
|
405
|
+
"MCP server returned an invalid tool inventory",
|
|
406
|
+
);
|
|
407
|
+
}
|
|
408
|
+
names.add(name);
|
|
409
|
+
metadataBytes += snapshot.bytes;
|
|
410
|
+
if (metadataBytes > limits.maxServerBytes) {
|
|
411
|
+
throw metadataError(
|
|
412
|
+
"CC_MCP_TOOL_METADATA_TOO_LARGE",
|
|
413
|
+
`MCP tool inventory exceeded the ${limits.maxServerBytes}-byte host budget`,
|
|
414
|
+
{ limitBytes: limits.maxServerBytes },
|
|
415
|
+
);
|
|
416
|
+
}
|
|
417
|
+
tools.push(freezeJsonSnapshot(snapshot.value));
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
const clientBytesUsed =
|
|
421
|
+
Number.isSafeInteger(options.clientBytesUsed) && options.clientBytesUsed > 0
|
|
422
|
+
? options.clientBytesUsed
|
|
423
|
+
: 0;
|
|
424
|
+
if (clientBytesUsed + metadataBytes > limits.maxClientBytes) {
|
|
425
|
+
throw metadataError(
|
|
426
|
+
"CC_MCP_TOOL_CLIENT_METADATA_TOO_LARGE",
|
|
427
|
+
`MCP client tool metadata exceeded the ${limits.maxClientBytes}-byte host budget`,
|
|
428
|
+
{ limitBytes: limits.maxClientBytes },
|
|
429
|
+
);
|
|
430
|
+
}
|
|
431
|
+
return Object.freeze({
|
|
432
|
+
tools: Object.freeze(tools),
|
|
433
|
+
metadataBytes,
|
|
434
|
+
limits,
|
|
435
|
+
});
|
|
436
|
+
}
|