chainlesschain 0.162.197 → 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/package.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-D3Gu1a5d.js → AIOps-CSN-D2xb.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DrwAoKaz.js → ActionButton-CBSMlGzv.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-C7Q-gd_3.js → Analytics-3yr3Nt2t.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DgBtae-n.js → AppLayout-1b-o3lMH.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-pQ6LcA-W.js → Artifacts-Dr8rJi17.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-DK61tocB.js → Audit-2V689HC2.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BOKgDFRh.js → BackgroundAgents-DIxkNrD_.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-Bo9G4vTP.js → Backup-Pg6BcwrE.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-Do_dE9_v.js → BaseInput-CLUpqyfH.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-COVvZzOL.js → Chat-qVS8rD4G.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-ti49X12Q.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-Z9MJMolt.js → Checkbox-Bs9AaEay.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-BVzWKVbf.js → Codegen-Dvc1mq8q.js} +1 -1
- package/src/assets/web-panel/assets/{Col-C8MnYcbT.js → Col-C4_biO7A.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DQxqw15l.js → Community-al25XQUV.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BAUmrh3y.js → Compact-D-ZDB8M1.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-jPAkQ3zK.js → Compliance-6lIfDz1W.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BBQyxbh8.js → Cowork-DdI48XMJ.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-W5koq8Z5.js → Cron-DF5HZd2g.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BQhnu5hS.js → Crosschain-DuxeSvt3.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DD7PlI18.js → DID-B9yHkUTd.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-w_ILuwKI.js → Dashboard-Z5EuI3IM.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-qiDUAyAo.js → Dropdown-vuRfO3dY.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-PDeBcI5H.js → EmailListRenderer-QFLCc1uL.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-SuArscRM.js → FamilyGuardDashboard-BZ7EXkFJ.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BCovZaUn.js → Federation-DycIEg2s.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DjlFdVFk.js → FormItemContext-Ba0H_7yG.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DoEZ7fcS.js → GenericCardRenderer--JgSTK-C.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CV0-6GPI.js → Git-DEvTbldE.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-B_SFN50w.js → Governance-BJIljy18.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-heI0Eo6k.js → Inference-CVyW3G3q.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-Cz5INS5p.js → KnowledgeGraph-v8-borge.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BSFxiHkg.js → Logs-BCdS7gGo.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-CU-JB2Ns.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-0TWTpE7k.js → Marketplace-AN6tGA2B.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CV4-wBLm.js → McpTools-DGViXASN.js} +4 -4
- package/src/assets/web-panel/assets/{Memory-x5bH5rw5.js → Memory-Bpvmx9X4.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DaBmUu9G.js → MobileBridge-CTP-DOTC.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-C8qfktxn.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-B_zKEBif.js → Mtc-ndYr0M1s.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-BCfKD2yg.js → MtcAudit-Ci0-YK7W.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-DgYfj6c_.js → Multisig-BehSTFW7.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Dz09lFUm.js → NLProgramming-B91_YBLv.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Cuj6ugBE.js → Notes-BQlJ0-gq.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DK2WXjhg.js → NotificationSettings-CDgYMjYK.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-D1IAOQoo.js → OrderTableRenderer-BJkSlKeH.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-9fqnPvTw.js → Organization-B-b3cWCp.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-n5xHkhow.js → Overflow-CILUL4nL.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-B5AUWwH-.js → P2P-BTCFBkF0.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-CoUDV6dy.js → PdhVaultBrowser-BAR6AUx5.js} +4 -4
- package/src/assets/web-panel/assets/{Permissions-DPRmQf_H.js → Permissions-RRf6HbWJ.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-B37bsbEN.js → PersonalDataHub-BGTMiICa.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-CCAuPqu9.js → Pipeline-945qY9YF.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-B81msZdv.js → Privacy-DPZwI6lJ.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-B-Py2NbF.js → ProjectInit-BPH2NRKc.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CYsneiRB.js → ProjectSettings-BZCRNCvb.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-Y975Mh6R.js → Projects-BTI__tBt.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-uO-10aP1.js → Providers-DDCf_nIw.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-Bj_6gJ0l.js → QrScannerModal-N6rbqt1r.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BgpBCMPE.js → QuickAsk-DrwjPS7M.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DhUW3YUA.js → Recommend-Cog9Wd99.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DdeyfbkA.js → RemoteSession-DC9pynjM.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-fxW421xd.js → Reputation-D4th4gKS.js} +1 -1
- package/src/assets/web-panel/assets/{Row-De73w1og.js → Row-ogiWR6v9.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-3US_Q_lj.js → RssFeed-uYlk-2Oj.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DbZ_DU74.js → Search-DYzzwvtM.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DoIU1vMF.js → Security-Da7YOyX6.js} +4 -4
- package/src/assets/web-panel/assets/{Services-DB_RGqpc.js → Services-CLI1VM1X.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DnzLaayC.js → Skeleton-DK77dzDC.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-VzVXHENF.js → Skills-C_z7Lmhl.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DMfvjCAI.js → Sla-D6413Q8L.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-DQQOYWbF.js → SpeechSettings-C07ydbj2.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-Bmx3FG1P.js → SyncSettings-DGOm2W22.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DOQyfb-2.js → Tasks-Cr_PVyLM.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-D6hTRT7c.js → Templates-BhL2mZ0t.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CTPQZAzs.js → Tenant-CPk5oyUr.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-B7vII3oH.js → Terminal-ClhqUsqV.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-BkiFJeXV.js → TimelineRenderer-BCC7MV5a.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BPPdQMNo.js → Tokens-DD1Jt4oO.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BxG8JAEI.js → Trigger-BCydFvN2.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DHD7nMpM.js → Trust-DDHT1noa.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-B4BJpU47.js → UkeySign-CWPZC7oI.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CRiGpFx2.js → VideoEditing-9Ea0nJR0.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BSDSNiem.js → Wallet-BjxhLxTf.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DLTUh5Zv.js → WebAuthn-C6uCye67.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-tW2MwjhD.js → WorkflowEditor-d2g4reYo.js} +1 -1
- package/src/assets/web-panel/assets/{chat-SgsLQ3FC.js → chat-frTc6ScX.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BHjjLIKO.js → colors-B5K6lG3v.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-VceErdKq.js → compact-item-Cdn46r8D.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BZ332MYl.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-CBTjJOjn.js → hasIn-DdNH-aW_.js} +1 -1
- package/src/assets/web-panel/assets/{index-CawpdGTW.js → index-32ajXmTb.js} +1 -1
- package/src/assets/web-panel/assets/{index-BOtvPdHt.js → index-7ehytj1K.js} +1 -1
- package/src/assets/web-panel/assets/{index-vIXOpcjD.js → index-BC4eGkar.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cr4rjlW5.js → index-BVLL-mq_.js} +1 -1
- package/src/assets/web-panel/assets/{index-D_SePDWj.js → index-BXKhhx9V.js} +1 -1
- package/src/assets/web-panel/assets/{index-BETEjuNr.js → index-BcGwGIaR.js} +1 -1
- package/src/assets/web-panel/assets/{index-BY1wexYG.js → index-Be4OtL-N.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRWhLbWF.js → index-BoFak7le.js} +1 -1
- package/src/assets/web-panel/assets/{index-29wVzi-k.js → index-BwlIxAmX.js} +1 -1
- package/src/assets/web-panel/assets/{index-BeiqkxJG.js → index-CGiwfwB9.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQSmZGgs.js → index-CHmkkdfT.js} +1 -1
- package/src/assets/web-panel/assets/{index-BhXZEUAc.js → index-CQorP1Ng.js} +1 -1
- package/src/assets/web-panel/assets/{index-C_B9rFQE.js → index-CUoNAmE8.js} +1 -1
- package/src/assets/web-panel/assets/{index-iYQNU9za.js → index-Cj6P9Nst.js} +1 -1
- package/src/assets/web-panel/assets/{index-DePOeMDM.js → index-CtRPi4YC.js} +1 -1
- package/src/assets/web-panel/assets/index-CzrCHrFy.js +1 -0
- package/src/assets/web-panel/assets/{index-DdefYBSw.js → index-D1qIC4GR.js} +1 -1
- package/src/assets/web-panel/assets/{index-By5jBtkV.js → index-D23xGYjM.js} +1 -1
- package/src/assets/web-panel/assets/{index-CMVvxIS8.js → index-D4l82Me1.js} +1 -1
- package/src/assets/web-panel/assets/{index-CLc19alH.js → index-D4miNkWv.js} +1 -1
- package/src/assets/web-panel/assets/{index-B2u26AS3.js → index-DIVyTmZ3.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaCCy6lq.js → index-DM5FmPZU.js} +1 -1
- package/src/assets/web-panel/assets/{index-DUkVN794.js → index-DRzBBdQ0.js} +1 -1
- package/src/assets/web-panel/assets/{index-BPXFLYdW.js → index-Dca_i7H8.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpumS98o.js → index-DftZuyA7.js} +1 -1
- package/src/assets/web-panel/assets/{index-CrUgDQkf.js → index-DtBCCkC4.js} +1 -1
- package/src/assets/web-panel/assets/{index-CtjLcCNU.js → index-HjCvXHf5.js} +1 -1
- package/src/assets/web-panel/assets/{index-CaIS_TNX.js → index-LaivuXyF.js} +1 -1
- package/src/assets/web-panel/assets/{index-BC1xuQgX.js → index-MM4Zz2OE.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcUenmCX.js → index-NmEXVjzt.js} +1 -1
- package/src/assets/web-panel/assets/index-OJsGskZw.js +1 -0
- package/src/assets/web-panel/assets/{index-_PHrIO4O.js → index-PjAS0sIZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DgPvuIn2.js → index-VDM2KKo9.js} +1 -1
- package/src/assets/web-panel/assets/{index-B5KAGxNo.js → index-cYaWV4Mq.js} +1 -1
- package/src/assets/web-panel/assets/{index-B40dQn0G.js → index-gg3QPC3i.js} +3 -3
- package/src/assets/web-panel/assets/{index-BTlc-Bve.js → index-kVO_MDm-.js} +1 -1
- package/src/assets/web-panel/assets/{index-FJ3zC9LK.js → index-mgU3Q-lN.js} +1 -1
- package/src/assets/web-panel/assets/{index-1n7xjKDU.js → index-t_OBzIP4.js} +1 -1
- package/src/assets/web-panel/assets/{index-fU7wNHDB.js → index-yZRuZpwK.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-D1oZNz0D.js → initDefaultProps-DwLTRNdo.js} +1 -1
- package/src/assets/web-panel/assets/{motion-C8k6doMO.js → motion-BchZDXnh.js} +1 -1
- package/src/assets/web-panel/assets/{move-DJ4qSbYt.js → move-e8M-zZFl.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-CdpJD85j.js → mtc-parser-Ci40fQb3.js} +1 -1
- package/src/assets/web-panel/assets/{omit-B0V4slKA.js → omit-C7110_f2.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-Di5NiW1F.js → pickAttrs-skteMgnM.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-B5OMHgEM.js → placementArrow-MGZ-lh2B.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-C6U9IWql.js → responsiveObserve-N4Sd7uy-.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BMyTH3rN.js → slide-C7HDGRaa.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-C7d6BG7Z.js → statusUtils-BhRexlgy.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-CR50QnQy.js → styleChecker-ChEoQkN2.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DBEeoMb8.js → useFlexGapSupport-CDbG1s2Y.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-3r099cjv.js → useFs-CUIx0tcJ.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-C5IYNdTK.js → usePersonalDataHub-bkO7L7ec.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DmEOLRHf.js → vnode-B_ZvABIG.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DnpUiVCB.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/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 +14 -1
- 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/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 +174 -38
- package/src/repl/bg-dashboard.js +81 -28
- package/src/repl/chat-repl.js +77 -12
- 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/ChatBubbleRenderer-BUUyJ5QO.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-1mNozZ8v.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-DqnoFPgR.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DosMaL-k.js +0 -1
- package/src/assets/web-panel/assets/index-0O5ePnUq.js +0 -1
- package/src/assets/web-panel/assets/index-ChAzPigF.js +0 -1
- package/src/lib/skill-process-broker.js +0 -85
|
@@ -19,11 +19,16 @@ import { attachTopicHandlers } from "../gateways/ws/topic-handler-attachment.js"
|
|
|
19
19
|
import { PtyManager } from "../gateways/terminal/PtyManager.js";
|
|
20
20
|
import { createTerminalHandlers } from "../gateways/terminal/terminal-handlers.js";
|
|
21
21
|
import { createWebUIServer } from "../gateways/ui/web-ui-server.js";
|
|
22
|
-
import {
|
|
22
|
+
import {
|
|
23
|
+
MCPClient,
|
|
24
|
+
MCPServerConfig,
|
|
25
|
+
inferTransport,
|
|
26
|
+
} from "../harness/mcp-client.js";
|
|
23
27
|
import sharedManagedToolPolicy from "./coding-agent-managed-tool-policy.cjs";
|
|
24
28
|
import { findProjectRoot, loadProjectConfig } from "../lib/project-detector.js";
|
|
25
29
|
import { loadConfig } from "../lib/config-manager.js";
|
|
26
30
|
import { collectWorkspacePluginBinSandboxPolicy } from "../lib/plugin-runtime/bin.js";
|
|
31
|
+
import { issueMcpStdioExecutionAuthority } from "../lib/mcp-stdio-execution-authority.js";
|
|
27
32
|
|
|
28
33
|
const {
|
|
29
34
|
DEFAULT_ALLOWED_MCP_SERVER_NAMES,
|
|
@@ -266,7 +271,15 @@ export class AgentRuntime {
|
|
|
266
271
|
}
|
|
267
272
|
for (const [name, cfg] of entries) {
|
|
268
273
|
try {
|
|
269
|
-
|
|
274
|
+
const authorizedConfig = { ...cfg };
|
|
275
|
+
authorizedConfig.mcpStdioExecutionAuthority =
|
|
276
|
+
issueMcpStdioExecutionAuthority({
|
|
277
|
+
serverName: name,
|
|
278
|
+
config: authorizedConfig,
|
|
279
|
+
approvalKind: "explicit-config",
|
|
280
|
+
approvalSource: `agent-bundle:${path.resolve(this.policy.bundlePath)}`,
|
|
281
|
+
});
|
|
282
|
+
await bundleMcpClient.connect(name, authorizedConfig);
|
|
270
283
|
} catch (mcpErr) {
|
|
271
284
|
runtimeLogger.log(
|
|
272
285
|
chalk.yellow(
|
|
@@ -779,7 +792,17 @@ export class AgentRuntime {
|
|
|
779
792
|
|
|
780
793
|
for (const server of eligibleServers) {
|
|
781
794
|
try {
|
|
782
|
-
|
|
795
|
+
const authorizedServer = { ...server };
|
|
796
|
+
if (inferTransport(authorizedServer) === "stdio") {
|
|
797
|
+
authorizedServer.mcpStdioExecutionAuthority =
|
|
798
|
+
issueMcpStdioExecutionAuthority({
|
|
799
|
+
serverName: server.name,
|
|
800
|
+
config: authorizedServer,
|
|
801
|
+
approvalKind: "registered-config",
|
|
802
|
+
approvalSource: `${server.configScope || "user"}:${server.configSource || "database"}:${server.name}`,
|
|
803
|
+
});
|
|
804
|
+
}
|
|
805
|
+
await mcpClient.connect(server.name, authorizedServer);
|
|
783
806
|
connectedCount += 1;
|
|
784
807
|
} catch (err) {
|
|
785
808
|
options.logger?.log?.(
|
|
@@ -53,6 +53,7 @@ import {
|
|
|
53
53
|
findLatestEvent as jsonlFindLatestEvent,
|
|
54
54
|
rebuildMessages as jsonlRebuildMessages,
|
|
55
55
|
sessionExists as jsonlSessionExists,
|
|
56
|
+
sessionHasPersistedEvidence as jsonlSessionHasPersistedEvidence,
|
|
56
57
|
getLastSessionId as jsonlGetLastSessionId,
|
|
57
58
|
verifySession as jsonlVerifySession,
|
|
58
59
|
} from "../harness/jsonl-session-store.js";
|
|
@@ -153,6 +154,7 @@ const VALID_OUTPUT_FORMATS = Object.freeze(["text", "json", "stream-json"]);
|
|
|
153
154
|
// the stream-json driver + REPL); re-exported here for existing importers.
|
|
154
155
|
export { installPipeSafety } from "./pipe-safety.js";
|
|
155
156
|
import { installPipeSafety } from "./pipe-safety.js";
|
|
157
|
+
import { createHeadlessOutputBackpressure } from "./output-backpressure.js";
|
|
156
158
|
|
|
157
159
|
/**
|
|
158
160
|
* Normalize a public --permission-mode spelling to the canonical internal mode.
|
|
@@ -363,12 +365,92 @@ export function applyForkSession(opts = {}, store = {}) {
|
|
|
363
365
|
*/
|
|
364
366
|
export async function runAgentHeadless(options = {}, deps = {}) {
|
|
365
367
|
const trustedWorkspaceRoot = options.cwd || process.cwd();
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
368
|
+
const pipeState = { closed: false };
|
|
369
|
+
const stdout = deps.stdout || process.stdout;
|
|
370
|
+
const stderr = deps.stderr || process.stderr;
|
|
371
|
+
const shouldInstallPipeSafety =
|
|
372
|
+
typeof deps.installPipeSafety === "function" ||
|
|
373
|
+
(!deps.writeOut && !deps.writeErr);
|
|
374
|
+
const pipeAbort = shouldInstallPipeSafety ? new AbortController() : null;
|
|
375
|
+
const managesNativeOutput = !deps.writeOut || !deps.writeErr;
|
|
376
|
+
const outputAbort = managesNativeOutput ? new AbortController() : null;
|
|
377
|
+
const handlePipeClosed = () => {
|
|
378
|
+
if (pipeState.closed) return;
|
|
379
|
+
pipeState.closed = true;
|
|
380
|
+
process.exitCode = 0;
|
|
381
|
+
pipeAbort?.abort();
|
|
382
|
+
};
|
|
383
|
+
const outputFlow =
|
|
384
|
+
deps.outputFlow ||
|
|
385
|
+
createHeadlessOutputBackpressure({
|
|
386
|
+
stdout,
|
|
387
|
+
stderr,
|
|
388
|
+
writeOut: deps.writeOut,
|
|
389
|
+
writeErr: deps.writeErr,
|
|
390
|
+
maxQueuedBytes: deps.outputBackpressureMaxBytes,
|
|
391
|
+
onFailure: (error) => {
|
|
392
|
+
outputAbort?.abort(error);
|
|
393
|
+
if (error?.code === "EPIPE") handlePipeClosed();
|
|
394
|
+
},
|
|
395
|
+
});
|
|
396
|
+
const abortSignals = [
|
|
397
|
+
options.signal,
|
|
398
|
+
pipeAbort?.signal,
|
|
399
|
+
outputAbort?.signal,
|
|
400
|
+
].filter(Boolean);
|
|
401
|
+
const runtimeOptions =
|
|
402
|
+
abortSignals.length === 0
|
|
403
|
+
? options
|
|
404
|
+
: {
|
|
405
|
+
...options,
|
|
406
|
+
signal:
|
|
407
|
+
abortSignals.length === 1
|
|
408
|
+
? abortSignals[0]
|
|
409
|
+
: AbortSignal.any(abortSignals),
|
|
410
|
+
};
|
|
411
|
+
const runtimeDeps = {
|
|
412
|
+
...deps,
|
|
413
|
+
writeOut: outputFlow.writeOut,
|
|
414
|
+
writeErr: outputFlow.writeErr,
|
|
415
|
+
outputFlow,
|
|
416
|
+
};
|
|
417
|
+
const installSafety = deps.installPipeSafety || installPipeSafety;
|
|
418
|
+
const disposePipeSafety = shouldInstallPipeSafety
|
|
419
|
+
? installSafety([stdout, stderr], handlePipeClosed)
|
|
420
|
+
: null;
|
|
421
|
+
|
|
422
|
+
let outcome;
|
|
423
|
+
let failure = null;
|
|
424
|
+
try {
|
|
425
|
+
outcome = await runWithHostHooksV2Workspace(trustedWorkspaceRoot, () =>
|
|
426
|
+
runAgentHeadlessInWorkspace(runtimeOptions, runtimeDeps, pipeState),
|
|
427
|
+
);
|
|
428
|
+
} catch (error) {
|
|
429
|
+
failure = error;
|
|
430
|
+
} finally {
|
|
431
|
+
try {
|
|
432
|
+
await outputFlow.wait();
|
|
433
|
+
} catch (error) {
|
|
434
|
+
failure ||= error;
|
|
435
|
+
}
|
|
436
|
+
outputFlow.dispose();
|
|
437
|
+
disposePipeSafety?.();
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
if (pipeState.closed) {
|
|
441
|
+
return outcome
|
|
442
|
+
? { ...outcome, exitCode: 0, isError: false }
|
|
443
|
+
: { exitCode: 0, result: "", isError: false };
|
|
444
|
+
}
|
|
445
|
+
if (failure) throw failure;
|
|
446
|
+
return outcome;
|
|
369
447
|
}
|
|
370
448
|
|
|
371
|
-
async function runAgentHeadlessInWorkspace(
|
|
449
|
+
async function runAgentHeadlessInWorkspace(
|
|
450
|
+
options = {},
|
|
451
|
+
deps = {},
|
|
452
|
+
pipeState = { closed: false },
|
|
453
|
+
) {
|
|
372
454
|
const prompt = (options.prompt || "").trim();
|
|
373
455
|
if (!prompt) {
|
|
374
456
|
throw new Error(
|
|
@@ -386,11 +468,11 @@ async function runAgentHeadlessInWorkspace(options = {}, deps = {}) {
|
|
|
386
468
|
const isStream = outputFormat === "stream-json";
|
|
387
469
|
const isJson = outputFormat === "json";
|
|
388
470
|
const isText = outputFormat === "text";
|
|
389
|
-
const writeOut = deps.writeOut
|
|
390
|
-
const writeErr = deps.writeErr
|
|
391
|
-
if (!deps.writeOut && !deps.writeErr) installPipeSafety();
|
|
471
|
+
const writeOut = deps.writeOut;
|
|
472
|
+
const writeErr = deps.writeErr;
|
|
392
473
|
|
|
393
474
|
const hasInjectedSessionStore =
|
|
475
|
+
typeof deps.sessionHasPersistedEvidence === "function" ||
|
|
394
476
|
typeof deps.sessionExists === "function" ||
|
|
395
477
|
typeof deps.rebuildMessages === "function" ||
|
|
396
478
|
typeof deps.appendEvent === "function" ||
|
|
@@ -435,27 +517,36 @@ async function runAgentHeadlessInWorkspace(options = {}, deps = {}) {
|
|
|
435
517
|
// settings/plugin loading, bootstrap, model access, hooks, MCP and tools.
|
|
436
518
|
const canReadCanonicalResume =
|
|
437
519
|
!hasInjectedSessionStore || typeof deps.readVerifiedEvents === "function";
|
|
438
|
-
const
|
|
439
|
-
|
|
440
|
-
|
|
520
|
+
const canonicalAdmissionId = resumeId || (persist ? sessionId : null);
|
|
521
|
+
const canonicalAdmission =
|
|
522
|
+
canonicalAdmissionId && canReadCanonicalResume
|
|
523
|
+
? readSessionHostResumeState(canonicalAdmissionId, {
|
|
524
|
+
sessionHasPersistedEvidence:
|
|
525
|
+
deps.sessionHasPersistedEvidence ||
|
|
526
|
+
(!hasInjectedSessionStore
|
|
527
|
+
? jsonlSessionHasPersistedEvidence
|
|
528
|
+
: undefined),
|
|
441
529
|
sessionExists: deps.sessionExists || jsonlSessionExists,
|
|
442
530
|
readVerifiedEvents:
|
|
443
531
|
deps.readVerifiedEvents || jsonlReadVerifiedEvents,
|
|
444
532
|
})
|
|
445
533
|
: null;
|
|
446
|
-
if (
|
|
534
|
+
if (canonicalAdmission && !canonicalAdmission.snapshot.verified) {
|
|
447
535
|
const message =
|
|
448
536
|
"CC_SESSION_HOST_SNAPSHOT_UNVERIFIED: canonical JSONL session is not " +
|
|
449
|
-
"fully verified; resume was refused";
|
|
537
|
+
"fully verified; resume/write admission was refused";
|
|
450
538
|
emitHeadlessError(message);
|
|
451
539
|
writeErr(`${message}\n`);
|
|
452
540
|
return {
|
|
453
541
|
exitCode: 1,
|
|
454
542
|
result: message,
|
|
455
543
|
isError: true,
|
|
456
|
-
sessionSnapshot:
|
|
544
|
+
sessionSnapshot: canonicalAdmission.snapshot,
|
|
457
545
|
};
|
|
458
546
|
}
|
|
547
|
+
// A persist-only target must pass the same canonical admission boundary, but
|
|
548
|
+
// it does not opt into replaying the target's prior conversation.
|
|
549
|
+
const canonicalResume = resumeId ? canonicalAdmission : null;
|
|
459
550
|
|
|
460
551
|
// `let` (not const): a custom-command macro's `model:` frontmatter may
|
|
461
552
|
// override it below (when the user passed no explicit --model), mirroring
|
|
@@ -533,7 +624,7 @@ async function runAgentHeadlessInWorkspace(options = {}, deps = {}) {
|
|
|
533
624
|
cwd,
|
|
534
625
|
settingsFile: options.settingsFile,
|
|
535
626
|
});
|
|
536
|
-
if (notice)
|
|
627
|
+
if (notice) writeErr(notice + "\n");
|
|
537
628
|
} catch {
|
|
538
629
|
/* trust notice is best-effort */
|
|
539
630
|
}
|
|
@@ -1465,9 +1556,12 @@ async function runAgentHeadlessInWorkspace(options = {}, deps = {}) {
|
|
|
1465
1556
|
bundle: mcp,
|
|
1466
1557
|
sessionId,
|
|
1467
1558
|
sink: persist
|
|
1468
|
-
? createSessionMcpLedgerSink(
|
|
1469
|
-
|
|
1470
|
-
|
|
1559
|
+
? createSessionMcpLedgerSink(
|
|
1560
|
+
sessionId,
|
|
1561
|
+
hasInjectedSessionStore
|
|
1562
|
+
? { appendEvent: store.appendAuthorityEvent }
|
|
1563
|
+
: { recovery: resumeMcpRecovery },
|
|
1564
|
+
)
|
|
1471
1565
|
: null,
|
|
1472
1566
|
recovery: resumeMcpRecovery,
|
|
1473
1567
|
recoveryError: resumeMcpRecoveryError,
|
|
@@ -1831,6 +1925,24 @@ async function runAgentHeadlessInWorkspace(options = {}, deps = {}) {
|
|
|
1831
1925
|
const suffix = retryIn > 0 ? ` · will retry in ${retryIn}s` : "";
|
|
1832
1926
|
writeErr(` ⏳ waiting for API response (silent ${silent}s)${suffix}…\n`);
|
|
1833
1927
|
},
|
|
1928
|
+
onProviderFallback: (info) => {
|
|
1929
|
+
if (isStream) {
|
|
1930
|
+
emitStream({
|
|
1931
|
+
type: "raw",
|
|
1932
|
+
subtype: "provider_fallback",
|
|
1933
|
+
text:
|
|
1934
|
+
info.message || `provider switched from ${info.from} to ${info.to}`,
|
|
1935
|
+
from: info.from,
|
|
1936
|
+
to: info.to,
|
|
1937
|
+
reason: info.reason,
|
|
1938
|
+
session_id: sessionId,
|
|
1939
|
+
});
|
|
1940
|
+
} else {
|
|
1941
|
+
writeErr(
|
|
1942
|
+
`[provider] ${info.message || `switched from ${info.from} to ${info.to}`}\n`,
|
|
1943
|
+
);
|
|
1944
|
+
}
|
|
1945
|
+
},
|
|
1834
1946
|
};
|
|
1835
1947
|
|
|
1836
1948
|
// Goal binding (cc goal, Phase 1). `--goal <id>` binds explicitly; `--goal`
|
|
@@ -2421,6 +2533,7 @@ async function runAgentHeadlessInWorkspace(options = {}, deps = {}) {
|
|
|
2421
2533
|
if (isStream && event.type) emitStream(event);
|
|
2422
2534
|
break;
|
|
2423
2535
|
}
|
|
2536
|
+
await deps.outputFlow?.wait?.();
|
|
2424
2537
|
// Hard cost cap reached: stop consuming the loop so no further paid LLM
|
|
2425
2538
|
// call is made (break out of the for-await, not just the switch).
|
|
2426
2539
|
if (stopForCost) break;
|
|
@@ -2660,7 +2773,11 @@ async function runAgentHeadlessInWorkspace(options = {}, deps = {}) {
|
|
|
2660
2773
|
try {
|
|
2661
2774
|
const { runObserveHooks, dispatchAsyncHooks } =
|
|
2662
2775
|
await import("../lib/settings-hook-events.js");
|
|
2663
|
-
const stopPayload = {
|
|
2776
|
+
const stopPayload = {
|
|
2777
|
+
reason: pipeState.closed ? "pipe_closed" : endReason,
|
|
2778
|
+
cwd,
|
|
2779
|
+
session_id: sessionId,
|
|
2780
|
+
};
|
|
2664
2781
|
const stopOutcome = runObserveHooks(
|
|
2665
2782
|
settingsHooks,
|
|
2666
2783
|
"Stop",
|
|
@@ -2736,7 +2853,11 @@ async function runAgentHeadlessInWorkspace(options = {}, deps = {}) {
|
|
|
2736
2853
|
runObserveHooks(
|
|
2737
2854
|
settingsHooks,
|
|
2738
2855
|
"SessionEnd",
|
|
2739
|
-
{
|
|
2856
|
+
{
|
|
2857
|
+
reason: pipeState.closed ? "pipe_closed" : "completed",
|
|
2858
|
+
cwd,
|
|
2859
|
+
session_id: sessionId,
|
|
2860
|
+
},
|
|
2740
2861
|
{ cwd },
|
|
2741
2862
|
);
|
|
2742
2863
|
} catch (error) {
|
|
@@ -2751,6 +2872,14 @@ async function runAgentHeadlessInWorkspace(options = {}, deps = {}) {
|
|
|
2751
2872
|
}
|
|
2752
2873
|
}
|
|
2753
2874
|
|
|
2875
|
+
// A downstream consumer closed stdout/stderr. The abort above unwound the
|
|
2876
|
+
// model loop through the same `finally` as every other termination, so MCP,
|
|
2877
|
+
// background tasks, approval bridges, and hooks are settled. Do not attempt
|
|
2878
|
+
// more writes to the closed pipe or persist a partial assistant answer.
|
|
2879
|
+
if (pipeState.closed) {
|
|
2880
|
+
return { exitCode: 0, result: finalText, isError: false };
|
|
2881
|
+
}
|
|
2882
|
+
|
|
2754
2883
|
// coreAgentLoop emits run-ended reason "budget-exhausted" when the iteration
|
|
2755
2884
|
// cap is hit; treat that as the max-turns error surface. A cost-budget stop
|
|
2756
2885
|
// (--max-budget-usd) is its own error surface so callers can tell them apart.
|
|
@@ -2923,12 +3052,10 @@ async function runAgentHeadlessInWorkspace(options = {}, deps = {}) {
|
|
|
2923
3052
|
);
|
|
2924
3053
|
if (!isStream) {
|
|
2925
3054
|
const sum = _otlpRecorder.summary();
|
|
2926
|
-
|
|
2927
|
-
`[otlp] ${sum.spanCount} span(s) → ${options.otlp}\n`,
|
|
2928
|
-
);
|
|
3055
|
+
writeErr(`[otlp] ${sum.spanCount} span(s) → ${options.otlp}\n`);
|
|
2929
3056
|
}
|
|
2930
3057
|
} catch (err) {
|
|
2931
|
-
|
|
3058
|
+
writeErr(`[otlp] export failed: ${err.message}\n`);
|
|
2932
3059
|
}
|
|
2933
3060
|
}
|
|
2934
3061
|
if (_collectorEnabled) {
|