chainlesschain 0.163.2 → 0.163.4
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 +3 -2
- package/scripts/command-lifecycle-report.mjs +330 -38
- package/src/assets/web-panel/assets/{AIOps-DnGsmsqJ.js → AIOps-DB5X7qqV.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CrO6fcQ7.js → ActionButton-DxHRtKLk.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DsBdOaP2.js → Analytics-DIH5QrxT.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DmQslKUB.js → AppLayout-uu0oxVz7.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-BvyrT_QQ.js → Artifacts-BNSMiW9Y.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-prndoLiC.js → Audit-DcAzB4_x.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-DOTFyA55.js → BackgroundAgents-ClSsvjIc.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-9zOnPp_8.js → Backup-BMciY0js.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-C4PC6sAG.js → BaseInput-Hn3b57Sh.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-BBAF-W9v.js → Chat-CoSlC53V.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CWhvvloO.js → ChatBubbleRenderer-CFevJ3So.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-BI9iculd.js → Checkbox-B4L4Eu4w.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-3DP9BCKb.js → Codegen-C77FgRxF.js} +1 -1
- package/src/assets/web-panel/assets/{Col-df-2TnJX.js → Col-BrLtJLH3.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CHs8gG_A.js → Community-Be7pXXhA.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-CDfF6q7V.js → Compact-DuGPecjo.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CthrDnO7.js → Compliance-CzS66mjP.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-HjIqsWJw.js → Cowork-CEhjCoyK.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-BKc196fb.js → Cron-D7ir8Vja.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CJnjdc8W.js → Crosschain-BcXmuLxf.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BHUy-8Q2.js → DID-Cto1dtBy.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-QDB7sKeY.js → Dashboard-B7KjgwOX.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DStcVK11.js → Dropdown-COMqxijg.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-BwSUskMJ.js → EmailListRenderer-BZrya-nf.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DgF_kurT.js → FamilyGuardDashboard-AmVeMq0J.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-k8wvv-wN.js → Federation-kZU8c-27.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-C11qoq2r.js → FormItemContext-sOV22v2-.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-BIIpr9kg.js → GenericCardRenderer-BUuLtGCz.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BlA1exTe.js → Git-K-ZxsLsH.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CYa1ZYM4.js → Governance-D3OEnawI.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-6_kKVIt6.js → Inference-Bll0gRmP.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-CB4AwxYy.js → KnowledgeGraph-DBXwjr53.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-xf7nHFAe.js → Logs-CEzPwEfP.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-Bf3DEqP6.js → MarkdownRenderer-CLmCbHx6.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-aPg8e4Jt.js → Marketplace-BYyRyOPz.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-C-TNlVUf.js → McpTools-DVu8w_rM.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-DMTPIpGa.js → Memory-tenuZ_hO.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BxyvveRq.js → MobileBridge-Bxgy4ozS.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DyPCrAyQ.js → MobileProjects-Dgx1D6sc.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BdhqNXp6.js → Mtc-CRfJ8r8j.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-Cz-HFxzW.js → MtcAudit-BBJq4Aiz.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-CIUaFNsx.js → Multisig-B3ii9lai.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CWe6-J17.js → NLProgramming-FIi-Cubv.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-vYAKeviU.js → Notes-DIq8MPf1.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DQL9-2d7.js → NotificationSettings-BFOD9eGd.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DnXj1jBn.js → OrderTableRenderer--41u7vre.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-B3spU8AN.js → Organization-B_0AWztW.js} +2 -2
- package/src/assets/web-panel/assets/{Overflow-DgEwo7vm.js → Overflow-B6I7TuXv.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-hujMRH8X.js → P2P-Cdf6qens.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-C_qhdg9h.js → PdhVaultBrowser-B_0FcQJY.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-vp7LMcSf.js → Permissions-6nFBjsQp.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-Dxr5Hgnq.js → PersonalDataHub-nQYV7xpn.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-DEPZqqH4.js → Pipeline-CBVod5jm.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DTpDiKPe.js → Privacy-D52jW1Nt.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-jDJsRWmF.js → ProjectInit-Bdx3BYhf.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-Dhor5RWH.js → ProjectSettings-b7xr4DUa.js} +2 -2
- package/src/assets/web-panel/assets/Projects-DhfifCKx.js +1 -0
- package/src/assets/web-panel/assets/Providers-Dy_PgDMr.js +1 -0
- package/src/assets/web-panel/assets/{QrScannerModal-CjIw-wIb.js → QrScannerModal-FQKSmc3e.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DX6jcqoi.js → QuickAsk-CSTrhzcF.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DopXkhar.js → Recommend-CxMABOUh.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BLvqJE9c.js → RemoteSession-Cv2T8yRa.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-DhRj2Me7.js → Reputation-CE1k4Vvu.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DQ53vuPq.js → Row-BNgNcAV_.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BslvwiBD.js → RssFeed-5ZiBZ3ph.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DJKBDNKZ.js → Search-mDOIF1UV.js} +1 -1
- package/src/assets/web-panel/assets/{Security-COhpxHER.js → Security-CtuCTC-e.js} +3 -3
- package/src/assets/web-panel/assets/{Services-dbulD6cI.js → Services-DxFO2Zg7.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-ciIVNfhC.js → Skeleton-CKmKkH9y.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-AiRTkTCk.js → Skills-Bmzl9qkk.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DDMcWYBc.js → Sla-9RqaWHOC.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BPxWbpXO.js → SpeechSettings-CGdzFIYw.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BoEOXCyg.js → SyncSettings-CvNuCeBT.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-B_sLdcnw.js +1 -0
- package/src/assets/web-panel/assets/{Templates-UowY8Ixe.js → Templates-D9_YijdK.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DauSLQXN.js → Tenant-Cuc7BUSP.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-DBj7Jneq.js → Terminal-6VYRnJgd.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-UMrPwoZC.js → TimelineRenderer-GtK8xd8Y.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-4ea96-bn.js → Tokens-BZ94Lt5W.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger--ISCqt4b.js → Trigger-DEcZgDaX.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-D4GVimRJ.js → Trust-CC3z9THe.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-Ci-nXRQc.js → UkeySign-Cvtw8cV3.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-Cjk7mKPw.js → VideoEditing-CL4e6Bn3.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BgOLOO3Z.js → Wallet-ycEemP27.js} +2 -2
- package/src/assets/web-panel/assets/{WebAuthn-CCX0K29i.js → WebAuthn-DgZ4X_aw.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-Ch3zgIsE.js → WorkflowEditor-D0qMhSv7.js} +1 -1
- package/src/assets/web-panel/assets/{chat-DKOU_2Vb.js → chat-DsAg01Zn.js} +1 -1
- package/src/assets/web-panel/assets/{colors-6OVo4u3C.js → colors-B0oqAhrQ.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BH78Hlsq.js → compact-item-CmX0Rabz.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CFRpSbbC.js → createContext-Be4cn1Ub.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CP2qzG6D.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DNQhgcVi.js → hasIn-D5v12kVq.js} +1 -1
- package/src/assets/web-panel/assets/{index-BkN3iTTp.js → index-0eWLkQKT.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkNEMANR.js → index-301ogenv.js} +1 -1
- package/src/assets/web-panel/assets/{index-D3RtTT4K.js → index-5LGY0JbG.js} +1 -1
- package/src/assets/web-panel/assets/{index-dDkoL4Pe.js → index-7VKDn-t1.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHa4WyTZ.js → index-8WvYGnON.js} +1 -1
- package/src/assets/web-panel/assets/{index-CaYqY35Z.js → index-B1YGjOWC.js} +1 -1
- package/src/assets/web-panel/assets/{index-bKm3TUDp.js → index-B3mUHuVc.js} +1 -1
- package/src/assets/web-panel/assets/{index--rq90rL9.js → index-BA4oulaP.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaDgdJYj.js → index-BBREnn1V.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_Z-YoxX.js → index-BBvyHguy.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkqHgG-b.js → index-BKmsS2jj.js} +1 -1
- package/src/assets/web-panel/assets/{index-CrcLHN2F.js → index-BRIqLy1m.js} +1 -1
- package/src/assets/web-panel/assets/{index-BaVE6E8y.js → index-BXGSbelg.js} +3 -3
- package/src/assets/web-panel/assets/{index-BYrnm5Ob.js → index-BaE0Ui07.js} +1 -1
- package/src/assets/web-panel/assets/{index-BDSR7ecX.js → index-BoAIAZ5C.js} +1 -1
- package/src/assets/web-panel/assets/{index-CNuCHHQT.js → index-BqltWojQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Eag8e_mA.js → index-CGiIyTZw.js} +1 -1
- package/src/assets/web-panel/assets/index-CKB0vbJU.js +1 -0
- package/src/assets/web-panel/assets/{index-BepBTpa8.js → index-CZ2wUEgr.js} +1 -1
- package/src/assets/web-panel/assets/{index-HNGGVF6o.js → index-CZpfzcuy.js} +1 -1
- package/src/assets/web-panel/assets/{index-AuBhLqOm.js → index-Ckrk3pIV.js} +1 -1
- package/src/assets/web-panel/assets/{index-7TC3S8SN.js → index-CqoCZ5vR.js} +1 -1
- package/src/assets/web-panel/assets/{index-CFPJ8yzF.js → index-CyWBir7N.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bb6kDrUx.js → index-CyyGTMKd.js} +1 -1
- package/src/assets/web-panel/assets/{index-DKN2noIF.js → index-D0BSkxYQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Du0rnksC.js → index-D5YVopyr.js} +1 -1
- package/src/assets/web-panel/assets/{index-BxRy5LPR.js → index-DKUBj36_.js} +1 -1
- package/src/assets/web-panel/assets/{index-sm7W8AXy.js → index-DM724NgU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BujsOZfc.js → index-DQRsQen0.js} +1 -1
- package/src/assets/web-panel/assets/index-DgoXmwqB.js +1 -0
- package/src/assets/web-panel/assets/{index-Y9MJv28e.js → index-DikJ0Qqe.js} +1 -1
- package/src/assets/web-panel/assets/{index-caye7AOE.js → index-Dn2dSdXx.js} +1 -1
- package/src/assets/web-panel/assets/{index-cdf7fd7d.js → index-DyUaFWEk.js} +1 -1
- package/src/assets/web-panel/assets/{index-BnnXQot_.js → index-Hfe_dEGx.js} +1 -1
- package/src/assets/web-panel/assets/{index-DvHGtNnF.js → index-_JjRLSD0.js} +1 -1
- package/src/assets/web-panel/assets/{index-nbfHl1oV.js → index-frSojpHj.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cu3L4r5l.js → index-jK3ax6Z6.js} +1 -1
- package/src/assets/web-panel/assets/{index-D84id2Y4.js → index-qMuZ-NRR.js} +1 -1
- package/src/assets/web-panel/assets/{index-hPY0fFrd.js → index-q_fQ94SE.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-BZ9w6jPL.js → initDefaultProps-D4VdhJ9_.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BnwUiOho.js → motion-CZJA0MQW.js} +1 -1
- package/src/assets/web-panel/assets/{move-ByUKJnNm.js → move-BqEs7Sb1.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-V7yK1KEl.js → mtc-parser-BpHEtsu1.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BEXBBt4j.js → omit-BW94tY9W.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-qDm_46Gi.js → pickAttrs-BnBjPWP9.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BIbhEo_0.js → placementArrow-uUkjQ_hu.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-NbPbDgA_.js → responsiveObserve-B-klUqXK.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BnUWglZ0.js → slide-CvY1cNAs.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BX8_wZI5.js → statusUtils-Ix5sEDT2.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BV4OycQX.js → styleChecker-C8qcXOne.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-Od_H5llY.js → useFlexGapSupport-KNF6Kj8f.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BWI-PyiX.js → useFs-DGJr345n.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BqMuhG3g.js → usePersonalDataHub-BboN99rI.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DNd23z6f.js → vnode-Bgt8Vgte.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-Cjaxnm7l.js → zoom-BhJtErgt.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +2 -2
- package/src/commands/agenda.js +6 -5
- package/src/commands/agent.js +237 -75
- package/src/commands/agents.js +6 -0
- package/src/commands/artifacts.js +98 -0
- package/src/commands/background-session.js +11 -1
- package/src/commands/mcp.js +218 -31
- package/src/commands/review.js +221 -22
- package/src/commands/session-mcp-recovery.js +5 -5
- package/src/data/changelog.json +27 -1
- package/src/gateways/ws/ws-agent-handler.js +492 -14
- package/src/harness/jsonl-session-store.js +39 -1
- package/src/harness/mcp-client.js +414 -71
- package/src/harness/prompt-compressor.js +24 -0
- package/src/harness/provider-backed-compaction.js +205 -0
- package/src/harness/worktree-isolator.js +26 -3
- package/src/lib/agent-worktree.js +41 -2
- package/src/lib/app-preview.js +3 -0
- package/src/lib/background-agent-supervisor.js +790 -186
- package/src/lib/background-command-argv.js +318 -0
- package/src/lib/background-launch-profile.js +1 -0
- package/src/lib/background-phase-reporter.js +22 -2
- package/src/lib/background-worktree-policy.js +109 -0
- package/src/lib/command-lifecycle-report.js +1340 -145
- package/src/lib/cowork-mcp-tools.js +51 -6
- package/src/lib/cowork-task-runner.js +1 -0
- package/src/lib/delivery-coordinator.js +30 -5
- package/src/lib/delivery-production-adapter.js +1777 -0
- package/src/lib/delivery-production-runner.js +240 -0
- package/src/lib/durable-security-store.js +29 -17
- package/src/lib/execution-trace/trace-context.cjs +179 -0
- package/src/lib/execution-trace/trace-context.js +8 -175
- package/src/lib/mcp-call-ledger-store.js +58 -6
- package/src/lib/mcp-headers-helper.js +76 -8
- package/src/lib/mcp-host-recovery-runtime.js +2 -0
- package/src/lib/mcp-ledger-recovery-admission.js +39 -3
- package/src/lib/mcp-recovery-adjudication.js +256 -19
- package/src/lib/mcp-sandbox-policy.js +184 -0
- package/src/lib/mcp-stdio-capsule-builder-worker.cjs +495 -0
- package/src/lib/mcp-stdio-executable-identity.js +33 -2
- package/src/lib/mcp-stdio-execution-authority.js +163 -0
- package/src/lib/mcp-stdio-immutable-vfs-resolver.cjs +830 -0
- package/src/lib/mcp-stdio-package-materialization.js +721 -333
- package/src/lib/mcp-stdio-workspace-authority.js +252 -0
- package/src/lib/observability/index.js +2 -0
- package/src/lib/observability/otlp-exporter.js +2 -2
- package/src/lib/packer/pack-update-applier.js +8 -1
- package/src/lib/packer/pkg-config-generator.js +34 -0
- package/src/lib/plugin-runtime/sandbox-policy.js +42 -2
- package/src/lib/process-execution-broker/index.js +213 -109
- package/src/lib/process-execution-broker/platform-sandbox.js +1024 -169
- package/src/lib/process-tree-termination.js +17 -1
- package/src/lib/scheduler-kernel/contract.js +315 -0
- package/src/lib/scheduler-kernel/store.js +1345 -0
- package/src/lib/session-host-lease.js +403 -30
- package/src/lib/session-persistence-failure.js +4 -1
- package/src/lib/skill-mcp.js +65 -4
- package/src/lib/sub-agent-context.js +8 -0
- package/src/lib/web-fetch.js +4 -4
- package/src/repl/agent-repl.js +285 -38
- package/src/runtime/agent-core.js +1044 -90
- package/src/runtime/agent-runtime.js +61 -8
- package/src/runtime/headless-runner.js +260 -166
- package/src/runtime/headless-stream.js +254 -25
- package/src/runtime/mcp-config.js +235 -28
- package/src/workers/background-agent-worker.js +492 -71
- package/src/assets/web-panel/assets/Projects-08xUDZGt.js +0 -1
- package/src/assets/web-panel/assets/Providers-BGs47s1a.js +0 -1
- package/src/assets/web-panel/assets/Tasks-CEYFJwmr.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DEMblAIm.js +0 -1
- package/src/assets/web-panel/assets/index-BTvq-36D.js +0 -1
- package/src/assets/web-panel/assets/index-hUpvk6Jl.js +0 -1
package/src/lib/skill-mcp.js
CHANGED
|
@@ -32,6 +32,47 @@ import {
|
|
|
32
32
|
issueMcpStdioExecutionAuthority,
|
|
33
33
|
} from "./mcp-stdio-execution-authority.js";
|
|
34
34
|
import { MCP_STDIO_RUNTIME_KINDS } from "./mcp-stdio-executable-identity.js";
|
|
35
|
+
import { isProxy } from "node:util/types";
|
|
36
|
+
import {
|
|
37
|
+
MCP_SANDBOX_POLICY_INVALID_CODE,
|
|
38
|
+
normalizeMcpSandboxPolicy,
|
|
39
|
+
readMcpStdioCwd,
|
|
40
|
+
} from "./mcp-sandbox-policy.js";
|
|
41
|
+
|
|
42
|
+
function invalidSandboxPolicy(message) {
|
|
43
|
+
const error = new TypeError(message);
|
|
44
|
+
error.code = MCP_SANDBOX_POLICY_INVALID_CODE;
|
|
45
|
+
return error;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function sandboxPolicyFromEntry(entry) {
|
|
49
|
+
if (!entry || typeof entry !== "object" || isProxy(entry)) {
|
|
50
|
+
throw invalidSandboxPolicy(
|
|
51
|
+
"skill MCP server config must be a non-Proxy object",
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
const descriptor = Object.getOwnPropertyDescriptor(entry, "sandboxPolicy");
|
|
55
|
+
if (!descriptor) return null;
|
|
56
|
+
if (!("value" in descriptor)) {
|
|
57
|
+
throw invalidSandboxPolicy(
|
|
58
|
+
"skill MCP server sandboxPolicy must be an own data property",
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
return normalizeMcpSandboxPolicy(descriptor.value, {
|
|
62
|
+
label: "skill MCP server sandboxPolicy",
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function safeServerName(entry) {
|
|
67
|
+
if (!entry || typeof entry !== "object" || isProxy(entry)) return "(invalid)";
|
|
68
|
+
const descriptor = Object.getOwnPropertyDescriptor(entry, "name");
|
|
69
|
+
return descriptor &&
|
|
70
|
+
"value" in descriptor &&
|
|
71
|
+
typeof descriptor.value === "string" &&
|
|
72
|
+
descriptor.value.length > 0
|
|
73
|
+
? descriptor.value
|
|
74
|
+
: "(invalid)";
|
|
75
|
+
}
|
|
35
76
|
|
|
36
77
|
/**
|
|
37
78
|
* Parse MCP server declarations from a SKILL.md body.
|
|
@@ -77,6 +118,10 @@ export function parseSkillMcpServers(body) {
|
|
|
77
118
|
*/
|
|
78
119
|
export function validateMcpServerConfig(entry) {
|
|
79
120
|
if (!entry || typeof entry !== "object") return null;
|
|
121
|
+
const sandboxPolicy = sandboxPolicyFromEntry(entry);
|
|
122
|
+
const { cwd } = readMcpStdioCwd(entry, {
|
|
123
|
+
label: "skill MCP server config",
|
|
124
|
+
});
|
|
80
125
|
if (typeof entry.name !== "string" || entry.name.trim().length === 0) {
|
|
81
126
|
return null;
|
|
82
127
|
}
|
|
@@ -102,9 +147,8 @@ export function validateMcpServerConfig(entry) {
|
|
|
102
147
|
} else if (entry.runtimeKind !== undefined) {
|
|
103
148
|
return null;
|
|
104
149
|
}
|
|
105
|
-
if (
|
|
106
|
-
|
|
107
|
-
}
|
|
150
|
+
if (cwd) normalized.cwd = cwd;
|
|
151
|
+
if (sandboxPolicy) normalized.sandboxPolicy = sandboxPolicy;
|
|
108
152
|
return Object.freeze(normalized);
|
|
109
153
|
}
|
|
110
154
|
|
|
@@ -131,7 +175,19 @@ export async function mountSkillMcpServers(mcpClient, skill, opts = {}) {
|
|
|
131
175
|
}
|
|
132
176
|
|
|
133
177
|
for (const server of declared) {
|
|
134
|
-
|
|
178
|
+
let normalized;
|
|
179
|
+
try {
|
|
180
|
+
normalized = validateMcpServerConfig(server);
|
|
181
|
+
} catch (error) {
|
|
182
|
+
const name = safeServerName(server);
|
|
183
|
+
const message = error?.message || String(error);
|
|
184
|
+
skipped.push({ name, error: message });
|
|
185
|
+
opts.onWarn?.(
|
|
186
|
+
`[skill-mcp] Skipped "${name}" for skill "${skill?.id || skill?.name}": ${message}`,
|
|
187
|
+
error,
|
|
188
|
+
);
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
135
191
|
if (!normalized) {
|
|
136
192
|
const name = server?.name || "(invalid)";
|
|
137
193
|
skipped.push({ name, error: "invalid config" });
|
|
@@ -157,6 +213,7 @@ export async function mountSkillMcpServers(mcpClient, skill, opts = {}) {
|
|
|
157
213
|
runtimeKind: normalized.runtimeKind || null,
|
|
158
214
|
cwd: normalized.cwd || null,
|
|
159
215
|
envKeys: Object.keys(normalized.env || {}).sort(),
|
|
216
|
+
sandboxPolicy: normalized.sandboxPolicy || null,
|
|
160
217
|
})) === true;
|
|
161
218
|
} catch (error) {
|
|
162
219
|
const message = error?.message || String(error);
|
|
@@ -182,6 +239,10 @@ export async function mountSkillMcpServers(mcpClient, skill, opts = {}) {
|
|
|
182
239
|
config,
|
|
183
240
|
approvalKind: "explicit-config",
|
|
184
241
|
approvalSource: `skill:${skill?.id || skill?.name || "unknown"}:${normalized.name}`,
|
|
242
|
+
workspaceBinding:
|
|
243
|
+
typeof mcpClient.executionWorkspaceBinding === "function"
|
|
244
|
+
? mcpClient.executionWorkspaceBinding()
|
|
245
|
+
: null,
|
|
185
246
|
});
|
|
186
247
|
await mcpClient.connect(normalized.name, config);
|
|
187
248
|
mounted.push(normalized.name);
|
|
@@ -190,8 +190,10 @@ export class SubAgentContext {
|
|
|
190
190
|
? options.externalToolExecutors
|
|
191
191
|
: {};
|
|
192
192
|
this._mcpClient = options.mcpClient || null;
|
|
193
|
+
this._mcpHostClient = options.mcpHostClient || this._mcpClient;
|
|
193
194
|
this._mcpCallLedger = options.mcpCallLedger || null;
|
|
194
195
|
this._mcpConflictScheduler = options.mcpConflictScheduler || null;
|
|
196
|
+
this._mcpDispatchAdmission = options.mcpDispatchAdmission || null;
|
|
195
197
|
|
|
196
198
|
// Inherited settings hooks (Pre/PostToolUse) for this child loop. null =
|
|
197
199
|
// no hooks (the spawn default). The spawn path passes the parent's hooks
|
|
@@ -549,12 +551,18 @@ export class SubAgentContext {
|
|
|
549
551
|
if (this._mcpClient) {
|
|
550
552
|
options.mcpClient = this._mcpClient;
|
|
551
553
|
}
|
|
554
|
+
if (this._mcpHostClient) {
|
|
555
|
+
options.mcpHostClient = this._mcpHostClient;
|
|
556
|
+
}
|
|
552
557
|
if (this._mcpCallLedger) {
|
|
553
558
|
options.mcpCallLedger = this._mcpCallLedger;
|
|
554
559
|
}
|
|
555
560
|
if (this._mcpConflictScheduler) {
|
|
556
561
|
options.mcpConflictScheduler = this._mcpConflictScheduler;
|
|
557
562
|
}
|
|
563
|
+
if (this._mcpDispatchAdmission) {
|
|
564
|
+
options.mcpDispatchAdmission = this._mcpDispatchAdmission;
|
|
565
|
+
}
|
|
558
566
|
// Inherited Pre/PostToolUse hooks (spawn passes the parent's, filtered by
|
|
559
567
|
// the contract's `hooks` allow-list). Only set when non-null so a plain
|
|
560
568
|
// sub-agent keeps its no-hooks default.
|
package/src/lib/web-fetch.js
CHANGED
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
* private/loopback hosts unless explicitly allowlisted.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import http from "http";
|
|
9
|
-
import https from "https";
|
|
10
|
-
import { lookup as dnsLookup } from "dns";
|
|
11
|
-
import { URL } from "url";
|
|
8
|
+
import http from "node:http";
|
|
9
|
+
import https from "node:https";
|
|
10
|
+
import { lookup as dnsLookup } from "node:dns";
|
|
11
|
+
import { URL } from "node:url";
|
|
12
12
|
|
|
13
13
|
const DEFAULT_MAX_BYTES = 2_000_000;
|
|
14
14
|
const DEFAULT_TIMEOUT_MS = 15_000;
|
package/src/repl/agent-repl.js
CHANGED
|
@@ -101,10 +101,13 @@ import { runnableTaskModel, hasUsableKey } from "../lib/runnable-provider.js";
|
|
|
101
101
|
import { CLIPermanentMemory } from "../lib/permanent-memory.js";
|
|
102
102
|
import { CLIAutonomousAgent, GoalStatus } from "../lib/autonomous-agent.js";
|
|
103
103
|
import {
|
|
104
|
+
estimateMessagesTokens,
|
|
104
105
|
PromptCompressor,
|
|
105
106
|
estimateTokens,
|
|
106
107
|
getContextWindow,
|
|
107
108
|
} from "../harness/prompt-compressor.js";
|
|
109
|
+
import { compactConversationWithProvider } from "../harness/provider-backed-compaction.js";
|
|
110
|
+
import { isAbortError } from "../lib/abort-utils.js";
|
|
108
111
|
import {
|
|
109
112
|
buildAutoPinPredicate,
|
|
110
113
|
resolveAutoPinOption,
|
|
@@ -1303,6 +1306,7 @@ export function createReplCompactPersistence(
|
|
|
1303
1306
|
canonicalPayload,
|
|
1304
1307
|
persistedMessages,
|
|
1305
1308
|
);
|
|
1309
|
+
synchronousReplRecoveryValue(result, "REPL compact settlement result");
|
|
1306
1310
|
replace(canonicalMessages);
|
|
1307
1311
|
return result;
|
|
1308
1312
|
},
|
|
@@ -1312,6 +1316,84 @@ export function createReplCompactPersistence(
|
|
|
1312
1316
|
});
|
|
1313
1317
|
}
|
|
1314
1318
|
|
|
1319
|
+
/**
|
|
1320
|
+
* Account one provider-backed REPL compaction and settle its canonical message
|
|
1321
|
+
* checkpoint before changing the live array. Provider work must already be
|
|
1322
|
+
* complete when this synchronous boundary is entered.
|
|
1323
|
+
*/
|
|
1324
|
+
export function settleReplCompactionCandidate({
|
|
1325
|
+
messages,
|
|
1326
|
+
expectedMessages,
|
|
1327
|
+
compacted,
|
|
1328
|
+
stats,
|
|
1329
|
+
trigger,
|
|
1330
|
+
useJsonl,
|
|
1331
|
+
sessionId,
|
|
1332
|
+
persistence,
|
|
1333
|
+
usageEvent = null,
|
|
1334
|
+
usageUnknownEvent = null,
|
|
1335
|
+
costStore = null,
|
|
1336
|
+
appendUsage = appendTokenUsage,
|
|
1337
|
+
}) {
|
|
1338
|
+
if (usageUnknownEvent) {
|
|
1339
|
+
return {
|
|
1340
|
+
applied: false,
|
|
1341
|
+
block: Object.freeze({
|
|
1342
|
+
code: "CC_COMPACTION_USAGE_UNKNOWN",
|
|
1343
|
+
reason:
|
|
1344
|
+
usageUnknownEvent.reason || "provider_transport_outcome_unknown",
|
|
1345
|
+
commitState: "provider-usage-unknown",
|
|
1346
|
+
usageOutcome: "unknown",
|
|
1347
|
+
}),
|
|
1348
|
+
};
|
|
1349
|
+
}
|
|
1350
|
+
|
|
1351
|
+
let usagePersistenceError = null;
|
|
1352
|
+
if (usageEvent) {
|
|
1353
|
+
addUsage(costStore, [usageEvent]);
|
|
1354
|
+
if (useJsonl && sessionId) {
|
|
1355
|
+
try {
|
|
1356
|
+
appendUsage(sessionId, {
|
|
1357
|
+
provider: usageEvent.provider,
|
|
1358
|
+
model: usageEvent.model,
|
|
1359
|
+
usage: usageEvent.usage,
|
|
1360
|
+
});
|
|
1361
|
+
} catch (error) {
|
|
1362
|
+
// The paid request is accounted in-memory exactly once. Never retry an
|
|
1363
|
+
// append whose durable commit state may be unknown.
|
|
1364
|
+
usagePersistenceError = error;
|
|
1365
|
+
}
|
|
1366
|
+
}
|
|
1367
|
+
}
|
|
1368
|
+
|
|
1369
|
+
const liveChanged =
|
|
1370
|
+
messages.length !== expectedMessages.length ||
|
|
1371
|
+
messages.some((message, index) => message !== expectedMessages[index]);
|
|
1372
|
+
if (liveChanged) {
|
|
1373
|
+
const error = new Error(
|
|
1374
|
+
"REPL messages changed while provider compaction was running",
|
|
1375
|
+
);
|
|
1376
|
+
error.code = "CC_COMPACTION_LOCAL_STATE_CHANGED";
|
|
1377
|
+
return { applied: false, error, usagePersistenceError };
|
|
1378
|
+
}
|
|
1379
|
+
|
|
1380
|
+
if (useJsonl && sessionId && stats?.strategy !== "none") {
|
|
1381
|
+
try {
|
|
1382
|
+
persistence.persist(sessionId, {
|
|
1383
|
+
...stats,
|
|
1384
|
+
trigger: trigger || "manual",
|
|
1385
|
+
messages: compacted,
|
|
1386
|
+
});
|
|
1387
|
+
} catch (error) {
|
|
1388
|
+
return { applied: false, error, usagePersistenceError };
|
|
1389
|
+
}
|
|
1390
|
+
}
|
|
1391
|
+
|
|
1392
|
+
messages.length = 0;
|
|
1393
|
+
messages.push(...compacted);
|
|
1394
|
+
return { applied: true, usagePersistenceError };
|
|
1395
|
+
}
|
|
1396
|
+
|
|
1315
1397
|
function validateRawReplReplayMessages(rebuiltMessages) {
|
|
1316
1398
|
for (let index = 0; index < rebuiltMessages.length; index += 1) {
|
|
1317
1399
|
const message = rebuiltMessages[index];
|
|
@@ -1972,6 +2054,7 @@ export function createReplMcpHostRuntimeManager(dependencies = {}) {
|
|
|
1972
2054
|
recovery = null,
|
|
1973
2055
|
recoveryError = null,
|
|
1974
2056
|
verifiedRecovery = false,
|
|
2057
|
+
dispatchAdmission = null,
|
|
1975
2058
|
} = {}) => {
|
|
1976
2059
|
const bundle = adhocMcp?.mcpClient
|
|
1977
2060
|
? adhocMcp
|
|
@@ -1988,7 +2071,8 @@ export function createReplMcpHostRuntimeManager(dependencies = {}) {
|
|
|
1988
2071
|
current.sessionId === sessionId &&
|
|
1989
2072
|
current.persistent === persistLedger &&
|
|
1990
2073
|
current.recovery === recovery &&
|
|
1991
|
-
current.recoveryError === recoveryError
|
|
2074
|
+
current.recoveryError === recoveryError &&
|
|
2075
|
+
current.dispatchAdmission === dispatchAdmission
|
|
1992
2076
|
) {
|
|
1993
2077
|
return current;
|
|
1994
2078
|
}
|
|
@@ -2012,6 +2096,7 @@ export function createReplMcpHostRuntimeManager(dependencies = {}) {
|
|
|
2012
2096
|
sink,
|
|
2013
2097
|
recovery,
|
|
2014
2098
|
recoveryError,
|
|
2099
|
+
...(dispatchAdmission ? { dispatchAdmission } : {}),
|
|
2015
2100
|
...(sharedController ? { controller: sharedController } : {}),
|
|
2016
2101
|
});
|
|
2017
2102
|
const candidate = Object.freeze({
|
|
@@ -2027,6 +2112,7 @@ export function createReplMcpHostRuntimeManager(dependencies = {}) {
|
|
|
2027
2112
|
persistent: persistLedger,
|
|
2028
2113
|
recovery,
|
|
2029
2114
|
recoveryError,
|
|
2115
|
+
dispatchAdmission,
|
|
2030
2116
|
verifiedRecovery: Boolean(verifiedRecovery),
|
|
2031
2117
|
});
|
|
2032
2118
|
candidates.add(candidate);
|
|
@@ -2417,6 +2503,7 @@ async function startAgentReplInWorkspaceOwned(
|
|
|
2417
2503
|
const _replCompactPersistence = createReplCompactPersistence(
|
|
2418
2504
|
_startupJsonlResume?.ok ? _startupJsonlResume.rebuiltMessages : [],
|
|
2419
2505
|
);
|
|
2506
|
+
let _compactionUsageBlock = null;
|
|
2420
2507
|
|
|
2421
2508
|
try {
|
|
2422
2509
|
const ctx = await bootstrap({ verbose: false });
|
|
@@ -2438,6 +2525,7 @@ async function startAgentReplInWorkspaceOwned(
|
|
|
2438
2525
|
model,
|
|
2439
2526
|
baseUrl,
|
|
2440
2527
|
apiKey,
|
|
2528
|
+
signal: _sessionHostLeaseScope?.lease?.signal,
|
|
2441
2529
|
enabledToolNames: [],
|
|
2442
2530
|
extraToolDefinitions: [],
|
|
2443
2531
|
maxOutputTokens: 2048,
|
|
@@ -3387,6 +3475,17 @@ async function startAgentReplInWorkspaceOwned(
|
|
|
3387
3475
|
_persistReplContextSources();
|
|
3388
3476
|
|
|
3389
3477
|
const _mcpHostRuntimeManager = createReplMcpHostRuntimeManager();
|
|
3478
|
+
const _mcpDispatchAdmission = (metadata, dispatch) => {
|
|
3479
|
+
const lease = _sessionHostLeaseScope?.lease || null;
|
|
3480
|
+
if (!lease || typeof lease.admitMcpDispatch !== "function") {
|
|
3481
|
+
const error = new Error(
|
|
3482
|
+
"REPL session host authority is unavailable for MCP dispatch",
|
|
3483
|
+
);
|
|
3484
|
+
error.code = "CC_SESSION_HOST_LEASE_FENCED";
|
|
3485
|
+
throw error;
|
|
3486
|
+
}
|
|
3487
|
+
return lease.admitMcpDispatch(metadata, dispatch);
|
|
3488
|
+
};
|
|
3390
3489
|
const _mcpRuntimeInputs = ({
|
|
3391
3490
|
targetSessionId = sessionId,
|
|
3392
3491
|
recovery = _mcpLedgerRecovery,
|
|
@@ -3398,6 +3497,8 @@ async function startAgentReplInWorkspaceOwned(
|
|
|
3398
3497
|
persistent: useJsonl && Boolean(targetSessionId),
|
|
3399
3498
|
recovery,
|
|
3400
3499
|
recoveryError,
|
|
3500
|
+
dispatchAdmission:
|
|
3501
|
+
useJsonl && _sessionHostLeaseScope ? _mcpDispatchAdmission : null,
|
|
3401
3502
|
});
|
|
3402
3503
|
const _activateMcpHostRuntime = () =>
|
|
3403
3504
|
_mcpHostRuntimeManager.activate(_mcpRuntimeInputs());
|
|
@@ -5960,13 +6061,73 @@ async function startAgentReplInWorkspaceOwned(
|
|
|
5960
6061
|
}
|
|
5961
6062
|
|
|
5962
6063
|
if (trimmed === "/compact") {
|
|
6064
|
+
if (_compactionUsageBlock) {
|
|
6065
|
+
logger.error(
|
|
6066
|
+
`Compaction blocked (${_compactionUsageBlock.code}): ${_compactionUsageBlock.reason}`,
|
|
6067
|
+
);
|
|
6068
|
+
prompt();
|
|
6069
|
+
return;
|
|
6070
|
+
}
|
|
6071
|
+
|
|
6072
|
+
const expectedMessages = [...messages];
|
|
5963
6073
|
if (_compressor && messages.length > 3) {
|
|
5964
|
-
|
|
6074
|
+
let result;
|
|
6075
|
+
try {
|
|
6076
|
+
result = await compactConversationWithProvider(messages, {
|
|
6077
|
+
compressor: _compressor,
|
|
6078
|
+
preserveCompletedExchange: true,
|
|
6079
|
+
..._compactOpts(messages),
|
|
6080
|
+
});
|
|
6081
|
+
} catch (error) {
|
|
6082
|
+
if (
|
|
6083
|
+
isAbortError(error) ||
|
|
6084
|
+
_sessionHostLeaseScope?.lease?.signal?.aborted
|
|
6085
|
+
) {
|
|
6086
|
+
throw error;
|
|
6087
|
+
}
|
|
6088
|
+
logger.error(`Compaction failed: ${error.message}`);
|
|
6089
|
+
prompt();
|
|
6090
|
+
return;
|
|
6091
|
+
}
|
|
6092
|
+
const {
|
|
6093
|
+
messages: compacted,
|
|
6094
|
+
stats,
|
|
6095
|
+
usageEvent,
|
|
6096
|
+
usageUnknownEvent,
|
|
6097
|
+
} = result;
|
|
6098
|
+
const settlement = settleReplCompactionCandidate({
|
|
5965
6099
|
messages,
|
|
5966
|
-
|
|
5967
|
-
|
|
5968
|
-
|
|
5969
|
-
|
|
6100
|
+
expectedMessages,
|
|
6101
|
+
compacted,
|
|
6102
|
+
stats,
|
|
6103
|
+
trigger: "manual",
|
|
6104
|
+
useJsonl,
|
|
6105
|
+
sessionId,
|
|
6106
|
+
persistence: _replCompactPersistence,
|
|
6107
|
+
usageEvent,
|
|
6108
|
+
usageUnknownEvent,
|
|
6109
|
+
costStore: _costStore,
|
|
6110
|
+
});
|
|
6111
|
+
if (settlement.usagePersistenceError) {
|
|
6112
|
+
logger.warn(
|
|
6113
|
+
`Compaction usage was counted locally but not durably persisted: ${settlement.usagePersistenceError.message}`,
|
|
6114
|
+
);
|
|
6115
|
+
}
|
|
6116
|
+
if (settlement.block) {
|
|
6117
|
+
_compactionUsageBlock = settlement.block;
|
|
6118
|
+
logger.error(
|
|
6119
|
+
`Compaction usage is unknown (${settlement.block.code}); the paid compaction will not be retried.`,
|
|
6120
|
+
);
|
|
6121
|
+
prompt();
|
|
6122
|
+
return;
|
|
6123
|
+
}
|
|
6124
|
+
if (!settlement.applied) {
|
|
6125
|
+
logger.warn(
|
|
6126
|
+
`Compaction was not applied: ${settlement.error?.message || "canonical settlement failed"}`,
|
|
6127
|
+
);
|
|
6128
|
+
prompt();
|
|
6129
|
+
return;
|
|
6130
|
+
}
|
|
5970
6131
|
recordCompressionMetric(stats, {
|
|
5971
6132
|
source: "manual-compact",
|
|
5972
6133
|
provider,
|
|
@@ -5982,17 +6143,67 @@ async function startAgentReplInWorkspaceOwned(
|
|
|
5982
6143
|
}
|
|
5983
6144
|
} else if (contextEngine && messages.length > 5) {
|
|
5984
6145
|
const compacted = contextEngine.smartCompact(messages);
|
|
5985
|
-
|
|
5986
|
-
|
|
5987
|
-
|
|
5988
|
-
|
|
5989
|
-
|
|
6146
|
+
const originalTokens = estimateMessagesTokens(messages);
|
|
6147
|
+
const compressedTokens = estimateMessagesTokens(compacted);
|
|
6148
|
+
const settlement = settleReplCompactionCandidate({
|
|
6149
|
+
messages,
|
|
6150
|
+
expectedMessages,
|
|
6151
|
+
compacted,
|
|
6152
|
+
stats: {
|
|
6153
|
+
strategy: "importance",
|
|
6154
|
+
originalMessages: messages.length,
|
|
6155
|
+
compressedMessages: compacted.length,
|
|
6156
|
+
originalTokens,
|
|
6157
|
+
compressedTokens,
|
|
6158
|
+
saved: originalTokens - compressedTokens,
|
|
6159
|
+
ratio: originalTokens > 0 ? compressedTokens / originalTokens : 1,
|
|
6160
|
+
},
|
|
6161
|
+
trigger: "manual",
|
|
6162
|
+
useJsonl,
|
|
6163
|
+
sessionId,
|
|
6164
|
+
persistence: _replCompactPersistence,
|
|
6165
|
+
costStore: _costStore,
|
|
6166
|
+
});
|
|
6167
|
+
if (settlement.applied) {
|
|
6168
|
+
logger.info(
|
|
6169
|
+
`Compacted to ${messages.length} messages (importance-based)`,
|
|
6170
|
+
);
|
|
6171
|
+
} else {
|
|
6172
|
+
logger.warn(
|
|
6173
|
+
`Compaction was not applied: ${settlement.error?.message || "canonical settlement failed"}`,
|
|
6174
|
+
);
|
|
6175
|
+
}
|
|
5990
6176
|
} else if (messages.length > 5) {
|
|
5991
6177
|
const systemMsg = messages[0];
|
|
5992
6178
|
const recent = messages.slice(-4);
|
|
5993
|
-
|
|
5994
|
-
messages
|
|
5995
|
-
|
|
6179
|
+
const compacted = [systemMsg, ...recent];
|
|
6180
|
+
const originalTokens = estimateMessagesTokens(messages);
|
|
6181
|
+
const compressedTokens = estimateMessagesTokens(compacted);
|
|
6182
|
+
const settlement = settleReplCompactionCandidate({
|
|
6183
|
+
messages,
|
|
6184
|
+
expectedMessages,
|
|
6185
|
+
compacted,
|
|
6186
|
+
stats: {
|
|
6187
|
+
strategy: "truncate",
|
|
6188
|
+
originalMessages: messages.length,
|
|
6189
|
+
compressedMessages: compacted.length,
|
|
6190
|
+
originalTokens,
|
|
6191
|
+
compressedTokens,
|
|
6192
|
+
saved: originalTokens - compressedTokens,
|
|
6193
|
+
ratio: originalTokens > 0 ? compressedTokens / originalTokens : 1,
|
|
6194
|
+
},
|
|
6195
|
+
trigger: "manual",
|
|
6196
|
+
useJsonl,
|
|
6197
|
+
sessionId,
|
|
6198
|
+
persistence: _replCompactPersistence,
|
|
6199
|
+
costStore: _costStore,
|
|
6200
|
+
});
|
|
6201
|
+
if (settlement.applied) logger.info("Compacted to last 4 messages");
|
|
6202
|
+
else {
|
|
6203
|
+
logger.warn(
|
|
6204
|
+
`Compaction was not applied: ${settlement.error?.message || "canonical settlement failed"}`,
|
|
6205
|
+
);
|
|
6206
|
+
}
|
|
5996
6207
|
}
|
|
5997
6208
|
prompt();
|
|
5998
6209
|
return;
|
|
@@ -8212,6 +8423,8 @@ async function startAgentReplInWorkspaceOwned(
|
|
|
8212
8423
|
// session has no durable sink. Otherwise an outcome-unknown call could
|
|
8213
8424
|
// be retried in the same process after agent-core creates a plain ledger.
|
|
8214
8425
|
mcpCallLedger: activeMcpRuntime.runtime.ledger,
|
|
8426
|
+
mcpDispatchAdmission:
|
|
8427
|
+
useJsonl && _sessionHostLeaseScope ? _mcpDispatchAdmission : null,
|
|
8215
8428
|
chatFn: _fallbackChatFn,
|
|
8216
8429
|
});
|
|
8217
8430
|
_persistReplContextSources();
|
|
@@ -8427,39 +8640,73 @@ async function startAgentReplInWorkspaceOwned(
|
|
|
8427
8640
|
if (
|
|
8428
8641
|
feature("PROMPT_COMPRESSOR") &&
|
|
8429
8642
|
_compressor &&
|
|
8643
|
+
!_compactionUsageBlock &&
|
|
8430
8644
|
_compressor.shouldAutoCompact(messages)
|
|
8431
8645
|
) {
|
|
8432
8646
|
try {
|
|
8433
|
-
const
|
|
8647
|
+
const expectedMessages = [...messages];
|
|
8648
|
+
const {
|
|
8649
|
+
messages: compacted,
|
|
8650
|
+
stats,
|
|
8651
|
+
usageEvent,
|
|
8652
|
+
usageUnknownEvent,
|
|
8653
|
+
} = await compactConversationWithProvider(messages, {
|
|
8654
|
+
compressor: _compressor,
|
|
8655
|
+
preserveCompletedExchange: true,
|
|
8656
|
+
..._compactOpts(messages),
|
|
8657
|
+
});
|
|
8658
|
+
const settlement = settleReplCompactionCandidate({
|
|
8434
8659
|
messages,
|
|
8435
|
-
|
|
8436
|
-
|
|
8437
|
-
|
|
8438
|
-
|
|
8439
|
-
|
|
8440
|
-
|
|
8441
|
-
|
|
8442
|
-
|
|
8660
|
+
expectedMessages,
|
|
8661
|
+
compacted,
|
|
8662
|
+
stats,
|
|
8663
|
+
trigger: "auto",
|
|
8664
|
+
useJsonl,
|
|
8665
|
+
sessionId,
|
|
8666
|
+
persistence: _replCompactPersistence,
|
|
8667
|
+
usageEvent,
|
|
8668
|
+
usageUnknownEvent,
|
|
8669
|
+
costStore: _costStore,
|
|
8443
8670
|
});
|
|
8444
|
-
if (
|
|
8445
|
-
logger.
|
|
8446
|
-
`Auto-
|
|
8671
|
+
if (settlement.usagePersistenceError) {
|
|
8672
|
+
logger.warn(
|
|
8673
|
+
`Auto-compaction usage was counted locally but not durably persisted: ${settlement.usagePersistenceError.message}`,
|
|
8447
8674
|
);
|
|
8448
|
-
|
|
8449
|
-
|
|
8450
|
-
|
|
8675
|
+
}
|
|
8676
|
+
if (settlement.block) {
|
|
8677
|
+
_compactionUsageBlock = settlement.block;
|
|
8678
|
+
logger.error(
|
|
8679
|
+
`Auto-compaction usage is unknown (${settlement.block.code}); the paid compaction will not be retried.`,
|
|
8680
|
+
);
|
|
8681
|
+
} else if (!settlement.applied) {
|
|
8682
|
+
logger.warn(
|
|
8683
|
+
`Auto-compaction was not applied: ${settlement.error?.message || "canonical settlement failed"}`,
|
|
8684
|
+
);
|
|
8685
|
+
} else {
|
|
8686
|
+
recordCompressionMetric(stats, {
|
|
8687
|
+
source: "auto-compact",
|
|
8688
|
+
provider,
|
|
8689
|
+
model: activeModel,
|
|
8690
|
+
});
|
|
8691
|
+
if (stats.saved > 0) {
|
|
8692
|
+
logger.verbose(
|
|
8693
|
+
`Auto-compacted: ${stats.strategy} (saved ${stats.saved} tokens)`,
|
|
8451
8694
|
);
|
|
8452
|
-
|
|
8453
|
-
|
|
8454
|
-
|
|
8455
|
-
|
|
8456
|
-
|
|
8457
|
-
messages: compacted,
|
|
8458
|
-
});
|
|
8695
|
+
if (stats.degraded === true) {
|
|
8696
|
+
logger.warn(
|
|
8697
|
+
`Auto-compaction degraded to ${stats.summaryMode}: ${stats.degradedReason}`,
|
|
8698
|
+
);
|
|
8699
|
+
}
|
|
8459
8700
|
}
|
|
8460
8701
|
}
|
|
8461
|
-
} catch (
|
|
8462
|
-
|
|
8702
|
+
} catch (error) {
|
|
8703
|
+
if (
|
|
8704
|
+
isAbortError(error) ||
|
|
8705
|
+
_sessionHostLeaseScope?.lease?.signal?.aborted
|
|
8706
|
+
) {
|
|
8707
|
+
throw error;
|
|
8708
|
+
}
|
|
8709
|
+
logger.warn(`Auto-compaction failed: ${error.message}`);
|
|
8463
8710
|
}
|
|
8464
8711
|
}
|
|
8465
8712
|
|