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.
Files changed (185) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/assets/{AIOps-DnGsmsqJ.js → AIOps-DIY6KxV-.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-CrO6fcQ7.js → ActionButton-BXH0muPt.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-DsBdOaP2.js → Analytics-D39w8vmg.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-DmQslKUB.js → AppLayout-CUU1zvLs.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-BvyrT_QQ.js → Artifacts-D8azHO3T.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-prndoLiC.js → Audit-D0tAwXTg.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-DOTFyA55.js → BackgroundAgents-C29mhJll.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-9zOnPp_8.js → Backup-D6Aa1Gro.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-C4PC6sAG.js → BaseInput-B1uoHbPQ.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-BBAF-W9v.js → Chat-Bs4DLOR5.js} +6 -6
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CWhvvloO.js → ChatBubbleRenderer-DUYIBSle.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-BI9iculd.js → Checkbox-CNcBPEa4.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-3DP9BCKb.js → Codegen-CIY89763.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-df-2TnJX.js → Col-CsPYFmgo.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-CHs8gG_A.js → Community-BBocEge4.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-CDfF6q7V.js → Compact-TQ8Ux0Lf.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-CthrDnO7.js → Compliance-DfBsZTft.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-HjIqsWJw.js → Cowork-Cg-I6FVH.js} +2 -2
  20. package/src/assets/web-panel/assets/{Cron-BKc196fb.js → Cron-DTQzfRTp.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-CJnjdc8W.js → Crosschain-DGxEKGpR.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-BHUy-8Q2.js → DID-DLZ1RDSr.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-QDB7sKeY.js → Dashboard-XneICKNI.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-DStcVK11.js → Dropdown-BRU00J1-.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-BwSUskMJ.js → EmailListRenderer-BzCbJuAy.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DgF_kurT.js → FamilyGuardDashboard-D7BRyNBG.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-k8wvv-wN.js → Federation-D9DeFIhW.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-C11qoq2r.js → FormItemContext-6rAtA9Ko.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-BIIpr9kg.js → GenericCardRenderer-8Hqy80pU.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-BlA1exTe.js → Git-Cmvkj1rt.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-CYa1ZYM4.js → Governance-BRiQUjjw.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-6_kKVIt6.js → Inference-CKN_EzVf.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-CB4AwxYy.js → KnowledgeGraph-BCDHwpwQ.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-xf7nHFAe.js → Logs-DK9ovhaB.js} +2 -2
  35. package/src/assets/web-panel/assets/MarkdownRenderer-D53pHiHy.js +1 -0
  36. package/src/assets/web-panel/assets/{Marketplace-aPg8e4Jt.js → Marketplace-BILPGakp.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-C-TNlVUf.js → McpTools-DTVCOr9-.js} +5 -5
  38. package/src/assets/web-panel/assets/{Memory-DMTPIpGa.js → Memory-Hzc1iow4.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-BxyvveRq.js → MobileBridge-GXfgnGYV.js} +1 -1
  40. package/src/assets/web-panel/assets/{MobileProjects-DyPCrAyQ.js → MobileProjects-B-3TJWsS.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-BdhqNXp6.js → Mtc-DwSJMWtK.js} +5 -5
  42. package/src/assets/web-panel/assets/{MtcAudit-Cz-HFxzW.js → MtcAudit-D2uxf-DA.js} +5 -5
  43. package/src/assets/web-panel/assets/{Multisig-CIUaFNsx.js → Multisig-DG6kbKK0.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-CWe6-J17.js → NLProgramming-f5p49EDU.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-vYAKeviU.js → Notes-FUgHyzSD.js} +3 -3
  46. package/src/assets/web-panel/assets/{NotificationSettings-DQL9-2d7.js → NotificationSettings-DCHGee7e.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-DnXj1jBn.js → OrderTableRenderer-Dm6LlIoa.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-B3spU8AN.js → Organization-BawA7qAg.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-DgEwo7vm.js → Overflow-D6a5wZU1.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-hujMRH8X.js → P2P-K8WavwnA.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-C_qhdg9h.js → PdhVaultBrowser-4JAJYaqx.js} +3 -3
  52. package/src/assets/web-panel/assets/{Permissions-vp7LMcSf.js → Permissions-BDWvi8PD.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-Dxr5Hgnq.js → PersonalDataHub-DF_K4E9i.js} +3 -3
  54. package/src/assets/web-panel/assets/{Pipeline-DEPZqqH4.js → Pipeline-BYeZlesI.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-DTpDiKPe.js → Privacy-BIHlgnIc.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-jDJsRWmF.js → ProjectInit-Cvf-6B5P.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-Dhor5RWH.js → ProjectSettings-CnwfJrRz.js} +2 -2
  58. package/src/assets/web-panel/assets/Projects-b-jPXzF4.js +1 -0
  59. package/src/assets/web-panel/assets/{Providers-BGs47s1a.js → Providers-CxC7JuYv.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-CjIw-wIb.js → QrScannerModal-VLf3gAfL.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-DX6jcqoi.js → QuickAsk-B5vGjRiF.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-DopXkhar.js → Recommend--UW4iYs-.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-BLvqJE9c.js → RemoteSession-DMSPcfKR.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-DhRj2Me7.js → Reputation-kQXlEHmj.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-DQ53vuPq.js → Row-CxGu3pit.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-BslvwiBD.js → RssFeed-Bi5lo8MZ.js} +2 -2
  67. package/src/assets/web-panel/assets/{Search-DJKBDNKZ.js → Search-Cq_H5RTh.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-COhpxHER.js → Security-YFbmkaQS.js} +3 -3
  69. package/src/assets/web-panel/assets/{Services-dbulD6cI.js → Services-DLOGdaLm.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-ciIVNfhC.js → Skeleton-CteIxb3D.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-AiRTkTCk.js → Skills-CccopaIZ.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-DDMcWYBc.js → Sla-AzfEQKX1.js} +1 -1
  73. package/src/assets/web-panel/assets/{SpeechSettings-BPxWbpXO.js → SpeechSettings-ekGo5l77.js} +1 -1
  74. package/src/assets/web-panel/assets/{SyncSettings-BoEOXCyg.js → SyncSettings-BmZmAgYH.js} +2 -2
  75. package/src/assets/web-panel/assets/Tasks-D7q3Z4uL.js +1 -0
  76. package/src/assets/web-panel/assets/{Templates-UowY8Ixe.js → Templates-CX1Tgeka.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-DauSLQXN.js → Tenant-Zc59jF4i.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-DBj7Jneq.js → Terminal-CXOD7y83.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-UMrPwoZC.js → TimelineRenderer-B1aBHPBo.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-4ea96-bn.js → Tokens-zALlOq_U.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger--ISCqt4b.js → Trigger-CQfJMXaq.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-D4GVimRJ.js → Trust-BU0RcM-w.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-Ci-nXRQc.js → UkeySign-IFZ3HsbH.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-Cjk7mKPw.js → VideoEditing-BzslgW0v.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-BgOLOO3Z.js → Wallet-BZAcQNS6.js} +2 -2
  86. package/src/assets/web-panel/assets/{WebAuthn-CCX0K29i.js → WebAuthn-CBK1DMi0.js} +4 -4
  87. package/src/assets/web-panel/assets/{WorkflowEditor-Ch3zgIsE.js → WorkflowEditor-BlMTPzO-.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-DKOU_2Vb.js → chat-B51-8QVn.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-6OVo4u3C.js → colors-504RTByU.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-BH78Hlsq.js → compact-item-C-GP6IQM.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-CFRpSbbC.js → createContext-DOkIj7ID.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-kB0nCNwN.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-DNQhgcVi.js → hasIn-DN7V-_FW.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-dDkoL4Pe.js → index--n-ZciV3.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-CaYqY35Z.js → index-7jIqHbzw.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-BYrnm5Ob.js → index-B2-x9bS8.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-sm7W8AXy.js → index-BFIFJ5Dr.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DKN2noIF.js → index-B_vGU-Js.js} +1 -1
  99. package/src/assets/web-panel/assets/{index--rq90rL9.js → index-Bkxhaeta.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CFPJ8yzF.js → index-By6u5IV1.js} +1 -1
  101. package/src/assets/web-panel/assets/index-Bya64sZE.js +1 -0
  102. package/src/assets/web-panel/assets/{index-caye7AOE.js → index-C0k_Nqg9.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BxRy5LPR.js → index-C3TSohzc.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BepBTpa8.js → index-C4DV_5uA.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-D84id2Y4.js → index-C8UltbXK.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-Y9MJv28e.js → index-C9_48OzU.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-Bb6kDrUx.js → index-CKTfZyfU.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-CrcLHN2F.js → index-CP2A226L.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CkNEMANR.js → index-CUhQpiYv.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Cu3L4r5l.js → index-CX78k-qf.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DaDgdJYj.js → index-CYopNjcJ.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-Du0rnksC.js → index-Cao5DZy7.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-BaVE6E8y.js → index-CfiEM64n.js} +3 -3
  114. package/src/assets/web-panel/assets/{index-BujsOZfc.js → index-ConjaJro.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-hPY0fFrd.js → index-CqcLo5WV.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-BDSR7ecX.js → index-CySTJKeq.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BHa4WyTZ.js → index-D1phyca8.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-nbfHl1oV.js → index-D9LyiN-L.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-CkqHgG-b.js → index-DA2f1UV3.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Eag8e_mA.js → index-DAOpQvl_.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-cdf7fd7d.js → index-DE-hmI2l.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-bKm3TUDp.js → index-DEMPUVa3.js} +1 -1
  123. package/src/assets/web-panel/assets/index-D_FWpDZM.js +1 -0
  124. package/src/assets/web-panel/assets/{index-7TC3S8SN.js → index-DaA__-q1.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-DvHGtNnF.js → index-FcV8J_Qz.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-B_Z-YoxX.js → index-P2mfY27Z.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-AuBhLqOm.js → index-et5JIPHO.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-D3RtTT4K.js → index-f4Bo4KXm.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-CNuCHHQT.js → index-kAqQXfP6.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-BkN3iTTp.js → index-kt_5rfcZ.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-BnnXQot_.js → index-so8eIIxF.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-HNGGVF6o.js → index-yYTQZypF.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-BZ9w6jPL.js → initDefaultProps-CPYEIdpV.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-BnwUiOho.js → motion-Cjim9pxs.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-ByUKJnNm.js → move-DuU-cgz3.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-V7yK1KEl.js → mtc-parser-DJHNAkta.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-BEXBBt4j.js → omit-DSQBgdBj.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-qDm_46Gi.js → pickAttrs-CTmT_j5m.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-BIbhEo_0.js → placementArrow-Lfm6v-r4.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-NbPbDgA_.js → responsiveObserve-CgrcPcDi.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-BnUWglZ0.js → slide-CuE3110i.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-BX8_wZI5.js → statusUtils-DiK5nbpf.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-BV4OycQX.js → styleChecker-DPEJdQaZ.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-Od_H5llY.js → useFlexGapSupport-CnnodGmp.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-BWI-PyiX.js → useFs-DWF84Yav.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-BqMuhG3g.js → usePersonalDataHub-a5b5Dw2f.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-DNd23z6f.js → vnode-DAluzXOq.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-Cjaxnm7l.js → zoom-Dokg7uAZ.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/command-help-index.json +1 -1
  151. package/src/commands/agenda.js +6 -5
  152. package/src/commands/agent.js +237 -75
  153. package/src/commands/agents.js +6 -0
  154. package/src/commands/background-session.js +11 -1
  155. package/src/commands/mcp.js +217 -30
  156. package/src/data/changelog.json +14 -1
  157. package/src/harness/mcp-client.js +242 -42
  158. package/src/harness/worktree-isolator.js +26 -3
  159. package/src/lib/agent-worktree.js +41 -2
  160. package/src/lib/background-agent-supervisor.js +790 -186
  161. package/src/lib/background-command-argv.js +318 -0
  162. package/src/lib/background-launch-profile.js +1 -0
  163. package/src/lib/background-phase-reporter.js +22 -2
  164. package/src/lib/background-worktree-policy.js +109 -0
  165. package/src/lib/cowork-mcp-tools.js +51 -6
  166. package/src/lib/cowork-task-runner.js +1 -0
  167. package/src/lib/mcp-headers-helper.js +76 -8
  168. package/src/lib/mcp-sandbox-policy.js +155 -0
  169. package/src/lib/mcp-stdio-execution-authority.js +163 -0
  170. package/src/lib/mcp-stdio-workspace-authority.js +252 -0
  171. package/src/lib/plugin-runtime/sandbox-policy.js +42 -2
  172. package/src/lib/process-execution-broker/index.js +179 -104
  173. package/src/lib/process-execution-broker/platform-sandbox.js +942 -168
  174. package/src/lib/process-tree-termination.js +17 -1
  175. package/src/lib/skill-mcp.js +65 -4
  176. package/src/lib/web-fetch.js +4 -4
  177. package/src/runtime/agent-runtime.js +61 -8
  178. package/src/runtime/mcp-config.js +235 -28
  179. package/src/workers/background-agent-worker.js +492 -71
  180. package/src/assets/web-panel/assets/MarkdownRenderer-Bf3DEqP6.js +0 -1
  181. package/src/assets/web-panel/assets/Projects-08xUDZGt.js +0 -1
  182. package/src/assets/web-panel/assets/Tasks-CEYFJwmr.js +0 -1
  183. package/src/assets/web-panel/assets/devWarning-DEMblAIm.js +0 -1
  184. package/src/assets/web-panel/assets/index-BTvq-36D.js +0 -1
  185. package/src/assets/web-panel/assets/index-hUpvk6Jl.js +0 -1
@@ -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
- async function readManagedMcpRows() {
291
- const { loadManagedSettings } = await import("../lib/settings-loader.cjs");
292
- const loaded = loadManagedSettings({ env: process.env });
293
- const block =
294
- loaded.settings?.managedMcpServers || loaded.settings?.mcpServers || {};
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
- name,
300
- command: config.command || null,
301
- args: Array.isArray(config.args) ? config.args : [],
302
- env: config.env && typeof config.env === "object" ? config.env : {},
303
- runtimeKind: config.runtimeKind || null,
304
- url: config.url || null,
305
- transport: inferTransport(config),
306
- headers:
307
- config.headers && typeof config.headers === "object"
308
- ? config.headers
309
- : {},
310
- ...headersHelperField(config.headersHelper),
311
- autoConnect: config.autoConnect !== false,
312
- configScope: "managed",
313
- configSource: loaded.file,
314
- projectPath: null,
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: process.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: process.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 previousLocal =
1162
- configScope === "local"
1163
- ? config.get(name, { scope: "local", cwd: workspaceRoot })
1164
- : null;
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(
@@ -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** (release candidate,\n> 2026-08-09). CLI-only release metadata;\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- **Release condition**: publication remains blocked until the exact release\n SHA passes every configured Linux, Windows, and macOS job in `CLI CI` and the\n `CLI Strict Sandbox` matrix. Because this patch changes MCP isolation, tag\n `v-npm-0-163-2` additionally waits for exact-SHA three-platform safety and\n formal two-hour reliability/malicious MCP soak evidence."
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
  },