chainlesschain 0.163.2 → 0.163.3
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-DnGsmsqJ.js → AIOps-DIY6KxV-.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CrO6fcQ7.js → ActionButton-BXH0muPt.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DsBdOaP2.js → Analytics-D39w8vmg.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DmQslKUB.js → AppLayout-CUU1zvLs.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-BvyrT_QQ.js → Artifacts-D8azHO3T.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-prndoLiC.js → Audit-D0tAwXTg.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-DOTFyA55.js → BackgroundAgents-C29mhJll.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-9zOnPp_8.js → Backup-D6Aa1Gro.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-C4PC6sAG.js → BaseInput-B1uoHbPQ.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-BBAF-W9v.js → Chat-Bs4DLOR5.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CWhvvloO.js → ChatBubbleRenderer-DUYIBSle.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-BI9iculd.js → Checkbox-CNcBPEa4.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-3DP9BCKb.js → Codegen-CIY89763.js} +1 -1
- package/src/assets/web-panel/assets/{Col-df-2TnJX.js → Col-CsPYFmgo.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CHs8gG_A.js → Community-BBocEge4.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-CDfF6q7V.js → Compact-TQ8Ux0Lf.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CthrDnO7.js → Compliance-DfBsZTft.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-HjIqsWJw.js → Cowork-Cg-I6FVH.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-BKc196fb.js → Cron-DTQzfRTp.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CJnjdc8W.js → Crosschain-DGxEKGpR.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BHUy-8Q2.js → DID-DLZ1RDSr.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-QDB7sKeY.js → Dashboard-XneICKNI.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DStcVK11.js → Dropdown-BRU00J1-.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-BwSUskMJ.js → EmailListRenderer-BzCbJuAy.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DgF_kurT.js → FamilyGuardDashboard-D7BRyNBG.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-k8wvv-wN.js → Federation-D9DeFIhW.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-C11qoq2r.js → FormItemContext-6rAtA9Ko.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-BIIpr9kg.js → GenericCardRenderer-8Hqy80pU.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BlA1exTe.js → Git-Cmvkj1rt.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CYa1ZYM4.js → Governance-BRiQUjjw.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-6_kKVIt6.js → Inference-CKN_EzVf.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-CB4AwxYy.js → KnowledgeGraph-BCDHwpwQ.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-xf7nHFAe.js → Logs-DK9ovhaB.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-D53pHiHy.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-aPg8e4Jt.js → Marketplace-BILPGakp.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-C-TNlVUf.js → McpTools-DTVCOr9-.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-DMTPIpGa.js → Memory-Hzc1iow4.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BxyvveRq.js → MobileBridge-GXfgnGYV.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DyPCrAyQ.js → MobileProjects-B-3TJWsS.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BdhqNXp6.js → Mtc-DwSJMWtK.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-Cz-HFxzW.js → MtcAudit-D2uxf-DA.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-CIUaFNsx.js → Multisig-DG6kbKK0.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CWe6-J17.js → NLProgramming-f5p49EDU.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-vYAKeviU.js → Notes-FUgHyzSD.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DQL9-2d7.js → NotificationSettings-DCHGee7e.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DnXj1jBn.js → OrderTableRenderer-Dm6LlIoa.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-B3spU8AN.js → Organization-BawA7qAg.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-DgEwo7vm.js → Overflow-D6a5wZU1.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-hujMRH8X.js → P2P-K8WavwnA.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-C_qhdg9h.js → PdhVaultBrowser-4JAJYaqx.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-vp7LMcSf.js → Permissions-BDWvi8PD.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-Dxr5Hgnq.js → PersonalDataHub-DF_K4E9i.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-DEPZqqH4.js → Pipeline-BYeZlesI.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DTpDiKPe.js → Privacy-BIHlgnIc.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-jDJsRWmF.js → ProjectInit-Cvf-6B5P.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-Dhor5RWH.js → ProjectSettings-CnwfJrRz.js} +2 -2
- package/src/assets/web-panel/assets/Projects-b-jPXzF4.js +1 -0
- package/src/assets/web-panel/assets/{Providers-BGs47s1a.js → Providers-CxC7JuYv.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-CjIw-wIb.js → QrScannerModal-VLf3gAfL.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DX6jcqoi.js → QuickAsk-B5vGjRiF.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DopXkhar.js → Recommend--UW4iYs-.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BLvqJE9c.js → RemoteSession-DMSPcfKR.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-DhRj2Me7.js → Reputation-kQXlEHmj.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DQ53vuPq.js → Row-CxGu3pit.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BslvwiBD.js → RssFeed-Bi5lo8MZ.js} +2 -2
- package/src/assets/web-panel/assets/{Search-DJKBDNKZ.js → Search-Cq_H5RTh.js} +1 -1
- package/src/assets/web-panel/assets/{Security-COhpxHER.js → Security-YFbmkaQS.js} +3 -3
- package/src/assets/web-panel/assets/{Services-dbulD6cI.js → Services-DLOGdaLm.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-ciIVNfhC.js → Skeleton-CteIxb3D.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-AiRTkTCk.js → Skills-CccopaIZ.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DDMcWYBc.js → Sla-AzfEQKX1.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BPxWbpXO.js → SpeechSettings-ekGo5l77.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BoEOXCyg.js → SyncSettings-BmZmAgYH.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-D7q3Z4uL.js +1 -0
- package/src/assets/web-panel/assets/{Templates-UowY8Ixe.js → Templates-CX1Tgeka.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DauSLQXN.js → Tenant-Zc59jF4i.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-DBj7Jneq.js → Terminal-CXOD7y83.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-UMrPwoZC.js → TimelineRenderer-B1aBHPBo.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-4ea96-bn.js → Tokens-zALlOq_U.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger--ISCqt4b.js → Trigger-CQfJMXaq.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-D4GVimRJ.js → Trust-BU0RcM-w.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-Ci-nXRQc.js → UkeySign-IFZ3HsbH.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-Cjk7mKPw.js → VideoEditing-BzslgW0v.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BgOLOO3Z.js → Wallet-BZAcQNS6.js} +2 -2
- package/src/assets/web-panel/assets/{WebAuthn-CCX0K29i.js → WebAuthn-CBK1DMi0.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-Ch3zgIsE.js → WorkflowEditor-BlMTPzO-.js} +1 -1
- package/src/assets/web-panel/assets/{chat-DKOU_2Vb.js → chat-B51-8QVn.js} +1 -1
- package/src/assets/web-panel/assets/{colors-6OVo4u3C.js → colors-504RTByU.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BH78Hlsq.js → compact-item-C-GP6IQM.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CFRpSbbC.js → createContext-DOkIj7ID.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-kB0nCNwN.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DNQhgcVi.js → hasIn-DN7V-_FW.js} +1 -1
- package/src/assets/web-panel/assets/{index-dDkoL4Pe.js → index--n-ZciV3.js} +1 -1
- package/src/assets/web-panel/assets/{index-CaYqY35Z.js → index-7jIqHbzw.js} +1 -1
- package/src/assets/web-panel/assets/{index-BYrnm5Ob.js → index-B2-x9bS8.js} +1 -1
- package/src/assets/web-panel/assets/{index-sm7W8AXy.js → index-BFIFJ5Dr.js} +1 -1
- package/src/assets/web-panel/assets/{index-DKN2noIF.js → index-B_vGU-Js.js} +1 -1
- package/src/assets/web-panel/assets/{index--rq90rL9.js → index-Bkxhaeta.js} +1 -1
- package/src/assets/web-panel/assets/{index-CFPJ8yzF.js → index-By6u5IV1.js} +1 -1
- package/src/assets/web-panel/assets/index-Bya64sZE.js +1 -0
- package/src/assets/web-panel/assets/{index-caye7AOE.js → index-C0k_Nqg9.js} +1 -1
- package/src/assets/web-panel/assets/{index-BxRy5LPR.js → index-C3TSohzc.js} +1 -1
- package/src/assets/web-panel/assets/{index-BepBTpa8.js → index-C4DV_5uA.js} +1 -1
- package/src/assets/web-panel/assets/{index-D84id2Y4.js → index-C8UltbXK.js} +1 -1
- package/src/assets/web-panel/assets/{index-Y9MJv28e.js → index-C9_48OzU.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bb6kDrUx.js → index-CKTfZyfU.js} +1 -1
- package/src/assets/web-panel/assets/{index-CrcLHN2F.js → index-CP2A226L.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkNEMANR.js → index-CUhQpiYv.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cu3L4r5l.js → index-CX78k-qf.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaDgdJYj.js → index-CYopNjcJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Du0rnksC.js → index-Cao5DZy7.js} +1 -1
- package/src/assets/web-panel/assets/{index-BaVE6E8y.js → index-CfiEM64n.js} +3 -3
- package/src/assets/web-panel/assets/{index-BujsOZfc.js → index-ConjaJro.js} +1 -1
- package/src/assets/web-panel/assets/{index-hPY0fFrd.js → index-CqcLo5WV.js} +1 -1
- package/src/assets/web-panel/assets/{index-BDSR7ecX.js → index-CySTJKeq.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHa4WyTZ.js → index-D1phyca8.js} +1 -1
- package/src/assets/web-panel/assets/{index-nbfHl1oV.js → index-D9LyiN-L.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkqHgG-b.js → index-DA2f1UV3.js} +1 -1
- package/src/assets/web-panel/assets/{index-Eag8e_mA.js → index-DAOpQvl_.js} +1 -1
- package/src/assets/web-panel/assets/{index-cdf7fd7d.js → index-DE-hmI2l.js} +1 -1
- package/src/assets/web-panel/assets/{index-bKm3TUDp.js → index-DEMPUVa3.js} +1 -1
- package/src/assets/web-panel/assets/index-D_FWpDZM.js +1 -0
- package/src/assets/web-panel/assets/{index-7TC3S8SN.js → index-DaA__-q1.js} +1 -1
- package/src/assets/web-panel/assets/{index-DvHGtNnF.js → index-FcV8J_Qz.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_Z-YoxX.js → index-P2mfY27Z.js} +1 -1
- package/src/assets/web-panel/assets/{index-AuBhLqOm.js → index-et5JIPHO.js} +1 -1
- package/src/assets/web-panel/assets/{index-D3RtTT4K.js → index-f4Bo4KXm.js} +1 -1
- package/src/assets/web-panel/assets/{index-CNuCHHQT.js → index-kAqQXfP6.js} +1 -1
- package/src/assets/web-panel/assets/{index-BkN3iTTp.js → index-kt_5rfcZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BnnXQot_.js → index-so8eIIxF.js} +1 -1
- package/src/assets/web-panel/assets/{index-HNGGVF6o.js → index-yYTQZypF.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-BZ9w6jPL.js → initDefaultProps-CPYEIdpV.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BnwUiOho.js → motion-Cjim9pxs.js} +1 -1
- package/src/assets/web-panel/assets/{move-ByUKJnNm.js → move-DuU-cgz3.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-V7yK1KEl.js → mtc-parser-DJHNAkta.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BEXBBt4j.js → omit-DSQBgdBj.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-qDm_46Gi.js → pickAttrs-CTmT_j5m.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BIbhEo_0.js → placementArrow-Lfm6v-r4.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-NbPbDgA_.js → responsiveObserve-CgrcPcDi.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BnUWglZ0.js → slide-CuE3110i.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BX8_wZI5.js → statusUtils-DiK5nbpf.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BV4OycQX.js → styleChecker-DPEJdQaZ.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-Od_H5llY.js → useFlexGapSupport-CnnodGmp.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BWI-PyiX.js → useFs-DWF84Yav.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BqMuhG3g.js → usePersonalDataHub-a5b5Dw2f.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DNd23z6f.js → vnode-DAluzXOq.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-Cjaxnm7l.js → zoom-Dokg7uAZ.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/agenda.js +6 -5
- package/src/commands/agent.js +237 -75
- package/src/commands/agents.js +6 -0
- package/src/commands/background-session.js +11 -1
- package/src/commands/mcp.js +217 -30
- package/src/data/changelog.json +14 -1
- package/src/harness/mcp-client.js +242 -42
- package/src/harness/worktree-isolator.js +26 -3
- package/src/lib/agent-worktree.js +41 -2
- 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/cowork-mcp-tools.js +51 -6
- package/src/lib/cowork-task-runner.js +1 -0
- package/src/lib/mcp-headers-helper.js +76 -8
- package/src/lib/mcp-sandbox-policy.js +155 -0
- package/src/lib/mcp-stdio-execution-authority.js +163 -0
- package/src/lib/mcp-stdio-workspace-authority.js +252 -0
- package/src/lib/plugin-runtime/sandbox-policy.js +42 -2
- package/src/lib/process-execution-broker/index.js +179 -104
- package/src/lib/process-execution-broker/platform-sandbox.js +942 -168
- package/src/lib/process-tree-termination.js +17 -1
- package/src/lib/skill-mcp.js +65 -4
- package/src/lib/web-fetch.js +4 -4
- package/src/runtime/agent-runtime.js +61 -8
- package/src/runtime/mcp-config.js +235 -28
- package/src/workers/background-agent-worker.js +492 -71
- package/src/assets/web-panel/assets/MarkdownRenderer-Bf3DEqP6.js +0 -1
- package/src/assets/web-panel/assets/Projects-08xUDZGt.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/commands/mcp.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import fs from "fs";
|
|
7
7
|
import path from "path";
|
|
8
|
+
import { isProxy } from "node:util/types";
|
|
8
9
|
import chalk from "chalk";
|
|
9
10
|
import ora from "ora";
|
|
10
11
|
import { logger } from "../lib/logger.js";
|
|
@@ -45,11 +46,19 @@ import {
|
|
|
45
46
|
issueMcpStdioExecutionAuthority,
|
|
46
47
|
materializeApprovedMcpStdioInvocation,
|
|
47
48
|
resolveMcpStdioExecutionApproval,
|
|
49
|
+
verifyMcpStdioApprovedWorkingDirectory,
|
|
48
50
|
} from "../lib/mcp-stdio-execution-authority.js";
|
|
49
51
|
import {
|
|
50
52
|
MCP_STDIO_RUNTIME_KINDS,
|
|
51
53
|
prepareMcpStdioExecutableIdentity,
|
|
52
54
|
} from "../lib/mcp-stdio-executable-identity.js";
|
|
55
|
+
import { resolveMcpStdioSandboxContext } from "../lib/mcp-stdio-workspace-authority.js";
|
|
56
|
+
import {
|
|
57
|
+
MCP_SANDBOX_BOUNDARIES,
|
|
58
|
+
MCP_SANDBOX_POLICY_INVALID_CODE,
|
|
59
|
+
normalizeMcpSandboxPolicy,
|
|
60
|
+
readMcpStdioCwd,
|
|
61
|
+
} from "../lib/mcp-sandbox-policy.js";
|
|
53
62
|
import {
|
|
54
63
|
materializeMcpStdioNpmPackage,
|
|
55
64
|
parseExactNpmPackageSpec,
|
|
@@ -116,6 +125,7 @@ export function authorizeMcpRowForConnect(row, overrides = {}) {
|
|
|
116
125
|
config,
|
|
117
126
|
approvalKind,
|
|
118
127
|
approvalSource: `${row?.configScope || "user"}:${row?.configSource || "database"}:${row.name}`,
|
|
128
|
+
workspaceRoot: projectMcpLocation(process.cwd()).root,
|
|
119
129
|
});
|
|
120
130
|
return config;
|
|
121
131
|
}
|
|
@@ -124,6 +134,25 @@ function commandWorkspaceBinding() {
|
|
|
124
134
|
return registerHostHooksV2Workspace(projectMcpLocation(process.cwd()).root);
|
|
125
135
|
}
|
|
126
136
|
|
|
137
|
+
export function resolveMcpCommandStdioWorkingDirectory(
|
|
138
|
+
serverName,
|
|
139
|
+
config,
|
|
140
|
+
approval,
|
|
141
|
+
workspaceBinding = commandWorkspaceBinding(),
|
|
142
|
+
) {
|
|
143
|
+
const context = resolveMcpStdioSandboxContext({
|
|
144
|
+
serverName,
|
|
145
|
+
config,
|
|
146
|
+
workspaceBinding,
|
|
147
|
+
});
|
|
148
|
+
if (context.sandboxPolicy && config.cwd) {
|
|
149
|
+
verifyMcpStdioApprovedWorkingDirectory(approval, context.workingDirectory);
|
|
150
|
+
}
|
|
151
|
+
return (
|
|
152
|
+
context.workingDirectory || context.pluginWorkspaceRoot || process.cwd()
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
|
|
127
156
|
function getClient() {
|
|
128
157
|
if (!mcpClient) {
|
|
129
158
|
mcpClient = new MCPClient({ workspaceBinding: commandWorkspaceBinding() });
|
|
@@ -287,32 +316,95 @@ function headersHelperField(value) {
|
|
|
287
316
|
: {};
|
|
288
317
|
}
|
|
289
318
|
|
|
290
|
-
|
|
291
|
-
const
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
319
|
+
function invalidMcpSandboxPolicy(message) {
|
|
320
|
+
const error = new TypeError(message);
|
|
321
|
+
error.code = MCP_SANDBOX_POLICY_INVALID_CODE;
|
|
322
|
+
return error;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
function readMcpSandboxPolicy(owner, label) {
|
|
326
|
+
if (!owner || typeof owner !== "object" || isProxy(owner)) {
|
|
327
|
+
throw invalidMcpSandboxPolicy(`${label} must be a non-Proxy object`);
|
|
328
|
+
}
|
|
329
|
+
const descriptor = Object.getOwnPropertyDescriptor(owner, "sandboxPolicy");
|
|
330
|
+
if (!descriptor) return { present: false, policy: null };
|
|
331
|
+
if (!("value" in descriptor)) {
|
|
332
|
+
throw invalidMcpSandboxPolicy(
|
|
333
|
+
`${label}.sandboxPolicy must be an own data property`,
|
|
334
|
+
);
|
|
335
|
+
}
|
|
336
|
+
return {
|
|
337
|
+
present: true,
|
|
338
|
+
policy: normalizeMcpSandboxPolicy(descriptor.value, {
|
|
339
|
+
label: `${label}.sandboxPolicy`,
|
|
340
|
+
}),
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
function collectMcpSandboxBoundary(value, previous = []) {
|
|
345
|
+
return [...previous, value];
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
export function mcpSandboxPolicyUpdateFromAddOptions(options = {}) {
|
|
349
|
+
const boundaries = options.sandboxBoundary;
|
|
350
|
+
if (boundaries !== undefined && !Array.isArray(boundaries)) {
|
|
351
|
+
throw invalidMcpSandboxPolicy(
|
|
352
|
+
"--sandbox-boundary must be supplied as a repeatable option",
|
|
353
|
+
);
|
|
354
|
+
}
|
|
355
|
+
if (options.clearSandboxBoundaries && boundaries?.length > 0) {
|
|
356
|
+
throw invalidMcpSandboxPolicy(
|
|
357
|
+
"--clear-sandbox-boundaries cannot be combined with --sandbox-boundary",
|
|
358
|
+
);
|
|
359
|
+
}
|
|
360
|
+
if (options.clearSandboxBoundaries) return null;
|
|
361
|
+
if (!boundaries || boundaries.length === 0) return undefined;
|
|
362
|
+
return normalizeMcpSandboxPolicy(
|
|
363
|
+
{ requiredBoundaries: boundaries },
|
|
364
|
+
{ label: "--sandbox-boundary" },
|
|
365
|
+
);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
export function managedMcpRowsFromSettings(settings, file) {
|
|
369
|
+
const block = settings?.managedMcpServers || settings?.mcpServers || {};
|
|
295
370
|
if (!block || typeof block !== "object" || Array.isArray(block)) return [];
|
|
296
371
|
return Object.entries(block)
|
|
297
372
|
.filter(([, config]) => config && typeof config === "object")
|
|
298
|
-
.map(([name, config]) =>
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
373
|
+
.map(([name, config]) => {
|
|
374
|
+
const { policy: sandboxPolicy } = readMcpSandboxPolicy(
|
|
375
|
+
config,
|
|
376
|
+
`Managed MCP server "${name}"`,
|
|
377
|
+
);
|
|
378
|
+
const { cwd } = readMcpStdioCwd(config, {
|
|
379
|
+
label: `Managed MCP server "${name}"`,
|
|
380
|
+
});
|
|
381
|
+
return {
|
|
382
|
+
name,
|
|
383
|
+
command: config.command || null,
|
|
384
|
+
args: Array.isArray(config.args) ? config.args : [],
|
|
385
|
+
env: config.env && typeof config.env === "object" ? config.env : {},
|
|
386
|
+
runtimeKind: config.runtimeKind || null,
|
|
387
|
+
...(cwd ? { cwd } : {}),
|
|
388
|
+
...(sandboxPolicy ? { sandboxPolicy } : {}),
|
|
389
|
+
url: config.url || null,
|
|
390
|
+
transport: inferTransport(config),
|
|
391
|
+
headers:
|
|
392
|
+
config.headers && typeof config.headers === "object"
|
|
393
|
+
? config.headers
|
|
394
|
+
: {},
|
|
395
|
+
...headersHelperField(config.headersHelper),
|
|
396
|
+
autoConnect: config.autoConnect !== false,
|
|
397
|
+
configScope: "managed",
|
|
398
|
+
configSource: file,
|
|
399
|
+
projectPath: null,
|
|
400
|
+
};
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
async function readManagedMcpRows() {
|
|
405
|
+
const { loadManagedSettings } = await import("../lib/settings-loader.cjs");
|
|
406
|
+
const loaded = loadManagedSettings({ env: process.env });
|
|
407
|
+
return managedMcpRowsFromSettings(loaded.settings, loaded.file);
|
|
316
408
|
}
|
|
317
409
|
|
|
318
410
|
function projectMcpLocation(cwd = process.cwd()) {
|
|
@@ -365,12 +457,21 @@ export function readProjectMcpRows(cwd = process.cwd()) {
|
|
|
365
457
|
return Object.entries(document.mcpServers)
|
|
366
458
|
.filter(([, config]) => config && typeof config === "object")
|
|
367
459
|
.map(([name, config]) => {
|
|
460
|
+
const { policy: sandboxPolicy } = readMcpSandboxPolicy(
|
|
461
|
+
config,
|
|
462
|
+
`Project MCP server "${name}"`,
|
|
463
|
+
);
|
|
464
|
+
const { cwd } = readMcpStdioCwd(config, {
|
|
465
|
+
label: `Project MCP server "${name}"`,
|
|
466
|
+
});
|
|
368
467
|
const row = {
|
|
369
468
|
name,
|
|
370
469
|
command: config.command || null,
|
|
371
470
|
args: Array.isArray(config.args) ? config.args : [],
|
|
372
471
|
env: config.env && typeof config.env === "object" ? config.env : {},
|
|
373
472
|
runtimeKind: config.runtimeKind || null,
|
|
473
|
+
...(cwd ? { cwd } : {}),
|
|
474
|
+
...(sandboxPolicy ? { sandboxPolicy } : {}),
|
|
374
475
|
url: config.url || null,
|
|
375
476
|
transport: inferTransport(config),
|
|
376
477
|
headers:
|
|
@@ -384,7 +485,7 @@ export function readProjectMcpRows(cwd = process.cwd()) {
|
|
|
384
485
|
projectPath: root,
|
|
385
486
|
};
|
|
386
487
|
Object.defineProperty(row, PROJECT_MCP_FILE_TRUST, { value: trusted });
|
|
387
|
-
if (trusted && row.headersHelper) {
|
|
488
|
+
if (trusted && (row.headersHelper || inferTransport(row) === "stdio")) {
|
|
388
489
|
row.projectMcpWorkspaceAuthority = issueProjectMcpWorkspaceAuthority({
|
|
389
490
|
file,
|
|
390
491
|
content,
|
|
@@ -414,11 +515,44 @@ function writeProjectMcpDocument(file, document) {
|
|
|
414
515
|
|
|
415
516
|
export function writeProjectMcpServer(name, server, cwd = process.cwd()) {
|
|
416
517
|
const { file, document } = readProjectMcpDocument(cwd);
|
|
518
|
+
if (!server || typeof server !== "object" || isProxy(server)) {
|
|
519
|
+
throw invalidMcpSandboxPolicy(
|
|
520
|
+
`Project MCP server "${name}" must be a non-Proxy object`,
|
|
521
|
+
);
|
|
522
|
+
}
|
|
523
|
+
const existing = document.mcpServers[name];
|
|
524
|
+
const requestedPolicy = readMcpSandboxPolicy(
|
|
525
|
+
server,
|
|
526
|
+
`Project MCP server "${name}" update`,
|
|
527
|
+
);
|
|
528
|
+
const retainedPolicy = requestedPolicy.present
|
|
529
|
+
? requestedPolicy
|
|
530
|
+
: existing && typeof existing === "object" && !Array.isArray(existing)
|
|
531
|
+
? readMcpSandboxPolicy(existing, `Existing project MCP server "${name}"`)
|
|
532
|
+
: { present: false, policy: null };
|
|
533
|
+
const requestedCwd = readMcpStdioCwd(server, {
|
|
534
|
+
label: `Project MCP server "${name}" update`,
|
|
535
|
+
});
|
|
536
|
+
const existingCwd =
|
|
537
|
+
existing && typeof existing === "object" && !Array.isArray(existing)
|
|
538
|
+
? readMcpStdioCwd(existing, {
|
|
539
|
+
label: `Existing project MCP server "${name}"`,
|
|
540
|
+
})
|
|
541
|
+
: { present: false, cwd: null };
|
|
542
|
+
const retainedCwd = requestedCwd.present
|
|
543
|
+
? requestedCwd.cwd
|
|
544
|
+
: existingCwd.present
|
|
545
|
+
? existingCwd.cwd
|
|
546
|
+
: null;
|
|
417
547
|
const config = {};
|
|
418
548
|
if (server.command) config.command = server.command;
|
|
419
549
|
if (server.args?.length) config.args = server.args;
|
|
420
550
|
if (server.env && Object.keys(server.env).length > 0) config.env = server.env;
|
|
421
551
|
if (server.runtimeKind) config.runtimeKind = server.runtimeKind;
|
|
552
|
+
if (typeof retainedCwd === "string" && retainedCwd.length > 0) {
|
|
553
|
+
config.cwd = retainedCwd;
|
|
554
|
+
}
|
|
555
|
+
if (retainedPolicy.policy) config.sandboxPolicy = retainedPolicy.policy;
|
|
422
556
|
if (server.url) config.url = server.url;
|
|
423
557
|
if (server.transport) config.transport = server.transport;
|
|
424
558
|
if (server.headers && Object.keys(server.headers).length > 0) {
|
|
@@ -872,6 +1006,11 @@ export function registerMcpCommand(program) {
|
|
|
872
1006
|
{ serverName: name, config: authorized },
|
|
873
1007
|
);
|
|
874
1008
|
const invocation = materializeApprovedMcpStdioInvocation(approval);
|
|
1009
|
+
const approvedCwd = resolveMcpCommandStdioWorkingDirectory(
|
|
1010
|
+
name,
|
|
1011
|
+
invocation,
|
|
1012
|
+
approval,
|
|
1013
|
+
);
|
|
875
1014
|
const approvalRecord = resolveMcpStdioExecutionApproval(approval);
|
|
876
1015
|
const materialized = materializeMcpStdioNpmPackage({
|
|
877
1016
|
approvalRecord,
|
|
@@ -892,7 +1031,7 @@ export function registerMcpCommand(program) {
|
|
|
892
1031
|
serverName: name,
|
|
893
1032
|
config: invocation,
|
|
894
1033
|
approval,
|
|
895
|
-
cwd:
|
|
1034
|
+
cwd: approvedCwd,
|
|
896
1035
|
env: process.env,
|
|
897
1036
|
retrust: true,
|
|
898
1037
|
});
|
|
@@ -973,11 +1112,16 @@ export function registerMcpCommand(program) {
|
|
|
973
1112
|
{ serverName: name, config: authorized },
|
|
974
1113
|
);
|
|
975
1114
|
const invocation = materializeApprovedMcpStdioInvocation(approval);
|
|
1115
|
+
const approvedCwd = resolveMcpCommandStdioWorkingDirectory(
|
|
1116
|
+
name,
|
|
1117
|
+
invocation,
|
|
1118
|
+
approval,
|
|
1119
|
+
);
|
|
976
1120
|
const prepared = prepareMcpStdioExecutableIdentity({
|
|
977
1121
|
serverName: name,
|
|
978
1122
|
config: invocation,
|
|
979
1123
|
approval,
|
|
980
|
-
cwd:
|
|
1124
|
+
cwd: approvedCwd,
|
|
981
1125
|
env: process.env,
|
|
982
1126
|
retrust: true,
|
|
983
1127
|
});
|
|
@@ -1022,6 +1166,15 @@ export function registerMcpCommand(program) {
|
|
|
1022
1166
|
"--runtime-kind <kind>",
|
|
1023
1167
|
"stdio runtime semantics: native | node | python | posix-shell | powershell | java | dotnet",
|
|
1024
1168
|
)
|
|
1169
|
+
.option(
|
|
1170
|
+
"--sandbox-boundary <boundary>",
|
|
1171
|
+
`Require a stdio sandbox boundary (${MCP_SANDBOX_BOUNDARIES.join(" | ")}); repeatable`,
|
|
1172
|
+
collectMcpSandboxBoundary,
|
|
1173
|
+
)
|
|
1174
|
+
.option(
|
|
1175
|
+
"--clear-sandbox-boundaries",
|
|
1176
|
+
"Explicitly remove previously configured stdio sandbox boundaries",
|
|
1177
|
+
)
|
|
1025
1178
|
.option(
|
|
1026
1179
|
"-u, --url <url>",
|
|
1027
1180
|
"Server URL (http / https / ws / wss transports)",
|
|
@@ -1072,6 +1225,13 @@ export function registerMcpCommand(program) {
|
|
|
1072
1225
|
`Invalid --runtime-kind; expected one of: ${MCP_STDIO_RUNTIME_KINDS.join(", ")}`,
|
|
1073
1226
|
);
|
|
1074
1227
|
}
|
|
1228
|
+
const sandboxPolicyUpdate =
|
|
1229
|
+
mcpSandboxPolicyUpdateFromAddOptions(options);
|
|
1230
|
+
if (sandboxPolicyUpdate !== undefined && !options.command) {
|
|
1231
|
+
throw new Error(
|
|
1232
|
+
"--sandbox-boundary and --clear-sandbox-boundaries are only supported with --command",
|
|
1233
|
+
);
|
|
1234
|
+
}
|
|
1075
1235
|
|
|
1076
1236
|
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
1077
1237
|
if (!ctx.db) {
|
|
@@ -1158,14 +1318,28 @@ export function registerMcpCommand(program) {
|
|
|
1158
1318
|
}
|
|
1159
1319
|
|
|
1160
1320
|
const workspaceRoot = projectMcpLocation(process.cwd()).root;
|
|
1161
|
-
const
|
|
1162
|
-
configScope === "
|
|
1163
|
-
?
|
|
1164
|
-
:
|
|
1321
|
+
const previousStored =
|
|
1322
|
+
configScope === "project"
|
|
1323
|
+
? null
|
|
1324
|
+
: config.get(name, {
|
|
1325
|
+
scope: configScope,
|
|
1326
|
+
cwd: workspaceRoot,
|
|
1327
|
+
});
|
|
1328
|
+
const previousLocal = configScope === "local" ? previousStored : null;
|
|
1329
|
+
const effectiveSandboxPolicy =
|
|
1330
|
+
sandboxPolicyUpdate === undefined
|
|
1331
|
+
? previousStored?.sandboxPolicy || null
|
|
1332
|
+
: sandboxPolicyUpdate;
|
|
1333
|
+
let configuredSandboxPolicy = effectiveSandboxPolicy;
|
|
1165
1334
|
const storedConfig = {
|
|
1166
1335
|
command: options.command || null,
|
|
1167
1336
|
args,
|
|
1168
1337
|
runtimeKind: options.command ? options.runtimeKind || null : null,
|
|
1338
|
+
...(sandboxPolicyUpdate !== undefined
|
|
1339
|
+
? { sandboxPolicy: sandboxPolicyUpdate }
|
|
1340
|
+
: effectiveSandboxPolicy
|
|
1341
|
+
? { sandboxPolicy: effectiveSandboxPolicy }
|
|
1342
|
+
: {}),
|
|
1169
1343
|
url: options.url || null,
|
|
1170
1344
|
transport,
|
|
1171
1345
|
env: {},
|
|
@@ -1182,6 +1356,9 @@ export function registerMcpCommand(program) {
|
|
|
1182
1356
|
storedConfig,
|
|
1183
1357
|
process.cwd(),
|
|
1184
1358
|
);
|
|
1359
|
+
configuredSandboxPolicy =
|
|
1360
|
+
readProjectMcpRows(process.cwd()).find((row) => row.name === name)
|
|
1361
|
+
?.sandboxPolicy || null;
|
|
1185
1362
|
} else {
|
|
1186
1363
|
if (configScope === "local" && previousLocal?.headersHelper) {
|
|
1187
1364
|
revokeLocalMcpHeadersHelperTrust({
|
|
@@ -1213,6 +1390,11 @@ export function registerMcpCommand(program) {
|
|
|
1213
1390
|
command: options.command || null,
|
|
1214
1391
|
args,
|
|
1215
1392
|
runtimeKind: storedConfig.runtimeKind,
|
|
1393
|
+
...(configuredSandboxPolicy
|
|
1394
|
+
? { sandboxPolicy: configuredSandboxPolicy }
|
|
1395
|
+
: sandboxPolicyUpdate === null
|
|
1396
|
+
? { sandboxPolicy: null }
|
|
1397
|
+
: {}),
|
|
1216
1398
|
url: options.url || null,
|
|
1217
1399
|
transport,
|
|
1218
1400
|
autoConnect: !!options.autoConnect,
|
|
@@ -1240,6 +1422,11 @@ export function registerMcpCommand(program) {
|
|
|
1240
1422
|
` ${chalk.gray("Runtime kind:")} ${storedConfig.runtimeKind}`,
|
|
1241
1423
|
);
|
|
1242
1424
|
}
|
|
1425
|
+
if (configuredSandboxPolicy) {
|
|
1426
|
+
logger.log(
|
|
1427
|
+
` ${chalk.gray("Sandbox boundaries:")} ${configuredSandboxPolicy.requiredBoundaries.join(", ")}`,
|
|
1428
|
+
);
|
|
1429
|
+
}
|
|
1243
1430
|
}
|
|
1244
1431
|
if (configScope === "project") {
|
|
1245
1432
|
logger.log(
|
package/src/data/changelog.json
CHANGED
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"source": "CHANGELOG.md",
|
|
3
3
|
"releases": [
|
|
4
|
+
{
|
|
5
|
+
"productVersion": null,
|
|
6
|
+
"cliVersion": "0.163.3",
|
|
7
|
+
"cliVersions": ["0.163.2", "0.163.3"],
|
|
8
|
+
"date": "2026-08-10",
|
|
9
|
+
"title": "",
|
|
10
|
+
"sections": [
|
|
11
|
+
{
|
|
12
|
+
"heading": "Added — cc CLI 0.163.3: isolated background agents and policy-bound runtimes",
|
|
13
|
+
"body": "> `chainlesschain` **0.163.2 → 0.163.3** (candidate; not yet published,\n> 2026-08-10).\n> CLI-only candidate; `@chainlesschain/personal-data-hub` remains **0.4.57**\n> and `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Git background isolation by default**: `cc agent --bg` runs started from a\n clean Git checkout and not using `--input-format stream-json` now create a\n worktree at committed `HEAD`; `--worktree` requests the same path and only\n `--no-worktree` opts into the shared checkout. Foreground runs, runs using\n `--input-format stream-json`, and non-Git runs retain their prior behavior,\n while a dirty Git source is rejected instead of silently omitting uncommitted\n changes.\n- **Generation- and token-fenced ownership**: locked atomic state, immutable\n worktree/profile identity, worker-generation claims, terminal-absorbing\n updates, durable turn intents, and stop/cleanup fences prevent stale\n cooperative workers from reviving or deleting live work. Versioned,\n secret-free launch profiles preserve compatible resume settings.\n- **Grammar-safe detached arguments**: new background launches preserve option\n values and `--` literals, pass prompts as one `--print=<text>` token,\n canonicalize resume/continue/fork to one session, and remap repository\n `--add-dir` roots into the worktree. Canonical external roots remain shared\n and produce a warning.\n- **Policy-bearing stdio MCP sources**: explicit `--mcp-config`, managed and\n registered local/project/user sources, trusted project configuration, Skill,\n and Cowork definitions propagate normalized `filesystem`/`network`\n requirements plus separately validated working-directory/workspace authority\n to the Process Broker. Unprovable requirements fail closed, and invalid named\n higher-precedence entries do not fall through to a weaker source.\n- **Sealed Linux plugin file sets**: strict direct Plugin Node and supported\n narrow native ELF launches snapshot every pinned regular plugin file into\n sealed anonymous data-bind mounts. Dynamic native evidence covers only\n `PT_INTERP` and direct `DT_NEEDED`; tree attestation remains per-file rather\n than one atomic filesystem snapshot.\n- **Contained Windows adapter artifacts**: helper, cache, and test artifacts use\n an attested non-reparse local temporary root, identity/content rechecks,\n randomized materialization, and bounded retirement. Unknown or unverifiable\n leftovers are preserved and make cleanup fail closed.\n- **Fail-closed CI routing**: the generic selector routes the defined Windows\n helper-support paths to their CLI contract tests, supports multi-suite\n execution, and cannot turn selected-test or primary-run failure into a\n fallback/diagnostic pass. Full-suite workflows provision their required\n dependencies explicitly; this routing does not replace the exact-SHA release\n matrices.\n- **Known residuals**: non-Git, `--input-format stream-json`, `--no-worktree`,\n and external `add-dir` roots are not worktree-isolated. Spawn-to-PID\n hard-crash recovery and long-soak closure remain open; Linux native\n dependency evidence is non-transitive and has no `dlopen` closure; Windows\n path operations are\n re-attested but not handle-atomic. macOS atomic runtime execution, arbitrary\n shared-library closure, remote revocation, signed native distribution, and\n alias telemetry/removal remain out of scope, so this release does not claim\n complete P1-2 closure.\n- **Release status**: final tag, exact source SHA, workflow run IDs, package\n digest, provenance, and public registry readback are intentionally omitted\n until the exact `0.163.3` release commit passes the required Linux, Windows,\n and macOS `CLI CI` and `CLI Strict Sandbox` gates and the npm release/readback\n workflows complete successfully."
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
},
|
|
4
17
|
{
|
|
5
18
|
"productVersion": null,
|
|
6
19
|
"cliVersion": "0.163.2",
|
|
@@ -10,7 +23,7 @@
|
|
|
10
23
|
"sections": [
|
|
11
24
|
{
|
|
12
25
|
"heading": "Fixed — cc CLI 0.163.2: fail-closed MCP capsule sandbox composition",
|
|
13
|
-
"body": "> `chainlesschain` **0.163.1 → 0.163.2** (
|
|
26
|
+
"body": "> `chainlesschain` **0.163.1 → 0.163.2** (published from exact SHA\n> `2d6f19aea243ed4f054b585d4bc709d4209ff80d`, 2026-08-09). CLI-only release;\n> `@chainlesschain/personal-data-hub` remains **0.4.57** and\n> `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Explicit MCP runtime identity**: stdio MCP configuration now supports\n `--runtime-kind` for `native`, `node`, `python`, `posix-shell`, `powershell`,\n `java`, and `dotnet`. Recognized runtimes cannot be relabeled, while renamed\n or custom runtime executables must declare their semantics before trust is\n granted. The declaration persists through local, project, managed, Skill, and\n Cowork configuration sources.\n- **Descriptor-bound Linux MCP capsules**: fixed npm/Node MCP servers now keep\n the verified Node runtime and entry source bound through launch. The direct\n inherited-FD path and the `bwrap` filesystem/network/process-tree path both\n validate the exact runtime, entry, and passthrough arguments; ambiguous\n separators, path traversal, mixed evidence families, and pathname replacement\n fail closed.\n- **One-launch Windows MCP authority**: restricted-token and AppContainer plans\n are issued only by the production adapter and admitted only by the built-in\n Broker. The private capability binds the original contract, helper payload,\n environment, stdio handles, and post-spawn closure; validation and post-spawn\n authority are delete-before-use, cleanup revokes abandoned plans, and replay\n or injected-adapter plans are rejected before native spawn.\n- **Honest macOS boundary**: public Darwin exec/spawn APIs cannot atomically bind\n the verified runtime descriptor to the launched image, so strict MCP capsule\n startup now returns a typed fail-closed result instead of claiming a\n pathname-based code snapshot. A root-owned/signed broker or equivalent atomic\n exec design remains a separate roadmap requirement.\n- **Malicious-host evidence v4**: repeated Linux descriptor-bound\n pathname-replacement probes, explicit macOS fail-closed evidence, and the\n separately enforced Windows strict gate now use distinct evidence contracts.\n Formal soak workflows bind their inputs and aggregate artifacts to an exact\n source SHA.\n- **Accurate native release status**: the unsigned six-target native build/run\n validation is no longer reported as missing. Native publication remains\n fail-closed pending Linux signing, Windows Authenticode, macOS\n signing/notarization, signed install/upgrade/rollback validation,\n package-manager publication, and public artifact readback.\n- **Scope remains narrow**: this patch does not claim arbitrary native/shared\n library closure, remote distributed revocation, permissioned or unrestricted\n Node-builtin modes, the complete malicious Skill matrix, or signed native\n distribution. All 25 deprecated command aliases remain retained; the\n `0.164.0` removal floor and representative opt-in telemetry are still unmet.\n- **Published release evidence**: immutable tag `v-npm-0-163-2` resolves to\n exact source commit `2d6f19aea243ed4f054b585d4bc709d4209ff80d`.\n Its Linux, Windows, and macOS `CLI CI` and `CLI Strict Sandbox` matrices,\n formal two-hour reliability/malicious MCP soak, and dedicated npm release all\n succeeded. The release workflow completed its exact-SHA gate, immutable\n tarball/CycloneDX SBOM, Trusted Publishing, SLSA provenance, registry\n readback, and npmmirror synchronization; the independent public readback\n proved the registry tarball byte-identical to the workflow artifact. The\n public tarball SHA-256 is\n `394a755d52fca98e7527228859a78e1c57eae69abfdcaf77cc56e9b665b13fe1`."
|
|
14
27
|
}
|
|
15
28
|
]
|
|
16
29
|
},
|