chainlesschain 0.163.1 → 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 (191) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/assets/{AIOps-Cn7quRgL.js → AIOps-DIY6KxV-.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-YqMX3ueH.js → ActionButton-BXH0muPt.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-Bxmy1b7Y.js → Analytics-D39w8vmg.js} +2 -2
  5. package/src/assets/web-panel/assets/{AppLayout-DBOw69jE.js → AppLayout-CUU1zvLs.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-mq1nyzN1.js → Artifacts-D8azHO3T.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-mMiKtZ0D.js → Audit-D0tAwXTg.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-WBUjpYVh.js → BackgroundAgents-C29mhJll.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-c25OoJgs.js → Backup-D6Aa1Gro.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-BbfWhZ4-.js → BaseInput-B1uoHbPQ.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-CVVzsTwU.js → Chat-Bs4DLOR5.js} +5 -5
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CVCjZJ04.js → ChatBubbleRenderer-DUYIBSle.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-C9o2HK-1.js → Checkbox-CNcBPEa4.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-B7X5LfKc.js → Codegen-CIY89763.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-jpPj2Pur.js → Col-CsPYFmgo.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-Dti6bHxN.js → Community-BBocEge4.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-S4ZsLt3W.js → Compact-TQ8Ux0Lf.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-Bge0sQ3O.js → Compliance-DfBsZTft.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-C4XyzVI7.js → Cowork-Cg-I6FVH.js} +2 -2
  20. package/src/assets/web-panel/assets/{Cron-CPR0v2xy.js → Cron-DTQzfRTp.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-DAX8lDaj.js → Crosschain-DGxEKGpR.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-fBHPa0QH.js → DID-DLZ1RDSr.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-vvaUTafU.js → Dashboard-XneICKNI.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-DyaQM63v.js → Dropdown-BRU00J1-.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-CAF0wiU2.js → EmailListRenderer-BzCbJuAy.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-ia-WzDRs.js → FamilyGuardDashboard-D7BRyNBG.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-Cz3gHoT5.js → Federation-D9DeFIhW.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-CJQDJr4Q.js → FormItemContext-6rAtA9Ko.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-B05BZlQp.js → GenericCardRenderer-8Hqy80pU.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-DT0YcQnI.js → Git-Cmvkj1rt.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-Bqbl6m5Q.js → Governance-BRiQUjjw.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-BdebLR0N.js → Inference-CKN_EzVf.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-M36b8YYV.js → KnowledgeGraph-BCDHwpwQ.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-5LN_XL43.js → Logs-DK9ovhaB.js} +2 -2
  35. package/src/assets/web-panel/assets/{MarkdownRenderer-BCb1Dm8l.js → MarkdownRenderer-D53pHiHy.js} +1 -1
  36. package/src/assets/web-panel/assets/{Marketplace-BkIin-QY.js → Marketplace-BILPGakp.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-Bkppx8Uj.js → McpTools-DTVCOr9-.js} +5 -5
  38. package/src/assets/web-panel/assets/{Memory-Qk9wg_Ib.js → Memory-Hzc1iow4.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-BsTDU3Aj.js → MobileBridge-GXfgnGYV.js} +1 -1
  40. package/src/assets/web-panel/assets/{MobileProjects-CrZW5I28.js → MobileProjects-B-3TJWsS.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-BMkmgtsA.js → Mtc-DwSJMWtK.js} +2 -2
  42. package/src/assets/web-panel/assets/{MtcAudit-6m4CC0Yn.js → MtcAudit-D2uxf-DA.js} +2 -2
  43. package/src/assets/web-panel/assets/{Multisig-BZ8yB7QV.js → Multisig-DG6kbKK0.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-CxitAMIO.js → NLProgramming-f5p49EDU.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-Bv0msnHu.js → Notes-FUgHyzSD.js} +4 -4
  46. package/src/assets/web-panel/assets/{NotificationSettings-DeVMqM3P.js → NotificationSettings-DCHGee7e.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-CXBSWa3R.js → OrderTableRenderer-Dm6LlIoa.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-b_G5Vs1Q.js → Organization-BawA7qAg.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-DW7riOmA.js → Overflow-D6a5wZU1.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-CtpQNYjL.js → P2P-K8WavwnA.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-Ba63yT4l.js → PdhVaultBrowser-4JAJYaqx.js} +3 -3
  52. package/src/assets/web-panel/assets/{Permissions-DnzyeB67.js → Permissions-BDWvi8PD.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-DbPZ7HWw.js → PersonalDataHub-DF_K4E9i.js} +3 -3
  54. package/src/assets/web-panel/assets/{Pipeline-gs_HOThJ.js → Pipeline-BYeZlesI.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-CZlQ1EjE.js → Privacy-BIHlgnIc.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-DQp__Ccb.js → ProjectInit-Cvf-6B5P.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-C7h2sOWZ.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-CxC7JuYv.js +1 -0
  60. package/src/assets/web-panel/assets/{QrScannerModal-B_8M1-FC.js → QrScannerModal-VLf3gAfL.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-Bpycr8WD.js → QuickAsk-B5vGjRiF.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-Z4TrcNzs.js → Recommend--UW4iYs-.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-BD6TsJlS.js → RemoteSession-DMSPcfKR.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-IKxDXHEu.js → Reputation-kQXlEHmj.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-DbmR20tJ.js → Row-CxGu3pit.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-CLjA5PPf.js → RssFeed-Bi5lo8MZ.js} +2 -2
  67. package/src/assets/web-panel/assets/{Search-Bm3owbIU.js → Search-Cq_H5RTh.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-CY4RyOuq.js → Security-YFbmkaQS.js} +2 -2
  69. package/src/assets/web-panel/assets/{Services-CYO9qrd_.js → Services-DLOGdaLm.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-ClF51Go6.js → Skeleton-CteIxb3D.js} +1 -1
  71. package/src/assets/web-panel/assets/Skills-CccopaIZ.js +1 -0
  72. package/src/assets/web-panel/assets/{Sla-zqpDUxzP.js → Sla-AzfEQKX1.js} +1 -1
  73. package/src/assets/web-panel/assets/{SpeechSettings-DPSi8Qco.js → SpeechSettings-ekGo5l77.js} +1 -1
  74. package/src/assets/web-panel/assets/{SyncSettings-CqABopsQ.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-Dzl6f0M2.js → Templates-CX1Tgeka.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-XeZkw40a.js → Tenant-Zc59jF4i.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-CYw2YzPm.js → Terminal-CXOD7y83.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-Bc2pko4i.js → TimelineRenderer-B1aBHPBo.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-CfCenOHx.js → Tokens-zALlOq_U.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-DTz-_YqV.js → Trigger-CQfJMXaq.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-CB3tt3Z6.js → Trust-BU0RcM-w.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-y1ykmMvU.js → UkeySign-IFZ3HsbH.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-UlZ_lX0e.js → VideoEditing-BzslgW0v.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-DMBaHTha.js → Wallet-BZAcQNS6.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-Cksm-hBI.js → WebAuthn-CBK1DMi0.js} +4 -4
  87. package/src/assets/web-panel/assets/{WorkflowEditor-BhOa40sX.js → WorkflowEditor-BlMTPzO-.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-DNbeSTDO.js → chat-B51-8QVn.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-9zz8gBmW.js → colors-504RTByU.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-D7aoVv-5.js → compact-item-C-GP6IQM.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-DYg7B8nd.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-BNbhkcoI.js → hasIn-DN7V-_FW.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-DeD1wWA8.js → index--n-ZciV3.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-Da0SysnX.js → index-7jIqHbzw.js} +1 -1
  96. package/src/assets/web-panel/assets/{index--TvoQ6UC.js → index-B2-x9bS8.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-m2pXS3W2.js → index-BFIFJ5Dr.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-CzDDeZBo.js → index-B_vGU-Js.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-gNKj00Fx.js → index-Bkxhaeta.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-C8LC0nvw.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-B8irlIUK.js → index-C0k_Nqg9.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-B9zUawcE.js → index-C3TSohzc.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BPojutcZ.js → index-C4DV_5uA.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-ZPDbEh-L.js → index-C8UltbXK.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-jS6NASar.js → index-C9_48OzU.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-67GdrUx2.js → index-CKTfZyfU.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-CYu-F-gp.js → index-CP2A226L.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Cq3l0L7C.js → index-CUhQpiYv.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-DtQzs0hH.js → index-CX78k-qf.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-Bdxe0nrD.js → index-CYopNjcJ.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-uc8Rz96X.js → index-Cao5DZy7.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DnTM8FWK.js → index-CfiEM64n.js} +3 -3
  114. package/src/assets/web-panel/assets/{index-DHskwmwI.js → index-ConjaJro.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CA72qB1n.js → index-CqcLo5WV.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-Dn-JFqEi.js → index-CySTJKeq.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DUWmZ059.js → index-D1phyca8.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-_-Vt1Wqk.js → index-D9LyiN-L.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DIljkSt9.js → index-DA2f1UV3.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-B9TzVW7i.js → index-DAOpQvl_.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CRKukX1W.js → index-DE-hmI2l.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DIMVe3HJ.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-FlBuITVG.js → index-DaA__-q1.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-Cqy-hqD9.js → index-FcV8J_Qz.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CpEIwp4A.js → index-P2mfY27Z.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-nnmo3ipi.js → index-et5JIPHO.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-SmEIFaRm.js → index-f4Bo4KXm.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DMrqEsOS.js → index-kAqQXfP6.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CV06YdPO.js → index-kt_5rfcZ.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CN6-OEgS.js → index-so8eIIxF.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-BRd1zkLB.js → index-yYTQZypF.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-D0mTMUGz.js → initDefaultProps-CPYEIdpV.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-DK16p4-o.js → motion-Cjim9pxs.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-DalC20HC.js → move-DuU-cgz3.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-B5RusszF.js → mtc-parser-DJHNAkta.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-C9Mhitht.js → omit-DSQBgdBj.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-51xQLgwM.js → pickAttrs-CTmT_j5m.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-CJzIqp8u.js → placementArrow-Lfm6v-r4.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-HQvC19u4.js → responsiveObserve-CgrcPcDi.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-C6hhabOp.js → slide-CuE3110i.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-Q1r48-oc.js → statusUtils-DiK5nbpf.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-UakVWrHs.js → styleChecker-DPEJdQaZ.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-Dmv94cxx.js → useFlexGapSupport-CnnodGmp.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-DrxOnt_V.js → useFs-DWF84Yav.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-BVf2M-Hg.js → usePersonalDataHub-a5b5Dw2f.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-BzzW9qKH.js → vnode-DAluzXOq.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-C1ZvMgAZ.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 +245 -30
  156. package/src/data/changelog.json +28 -2
  157. package/src/harness/mcp-client.js +256 -43
  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 +52 -6
  166. package/src/lib/cowork-task-runner.js +1 -0
  167. package/src/lib/cowork-task-templates.js +1 -0
  168. package/src/lib/mcp-headers-helper.js +76 -8
  169. package/src/lib/mcp-sandbox-policy.js +155 -0
  170. package/src/lib/mcp-stdio-executable-identity.js +75 -11
  171. package/src/lib/mcp-stdio-execution-authority.js +168 -0
  172. package/src/lib/mcp-stdio-workspace-authority.js +252 -0
  173. package/src/lib/plugin-runtime/sandbox-policy.js +42 -2
  174. package/src/lib/process-execution-broker/index.js +495 -126
  175. package/src/lib/process-execution-broker/platform-sandbox.js +1424 -189
  176. package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
  177. package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
  178. package/src/lib/process-execution-broker/windows-sandbox.cs +5 -4
  179. package/src/lib/process-tree-termination.js +17 -1
  180. package/src/lib/skill-mcp.js +74 -3
  181. package/src/lib/web-fetch.js +4 -4
  182. package/src/runtime/agent-runtime.js +61 -8
  183. package/src/runtime/mcp-config.js +238 -28
  184. package/src/workers/background-agent-worker.js +492 -71
  185. package/src/assets/web-panel/assets/Projects-DdCpNRNt.js +0 -1
  186. package/src/assets/web-panel/assets/Providers-CyvtUkUf.js +0 -1
  187. package/src/assets/web-panel/assets/Skills-CCCEmSf5.js +0 -1
  188. package/src/assets/web-panel/assets/Tasks-4dbAJng4.js +0 -1
  189. package/src/assets/web-panel/assets/devWarning-uadaGF_y.js +0 -1
  190. package/src/assets/web-panel/assets/index-C7zhie9M.js +0 -1
  191. package/src/assets/web-panel/assets/index-Cmbg0Wbr.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,8 +46,19 @@ import {
45
46
  issueMcpStdioExecutionAuthority,
46
47
  materializeApprovedMcpStdioInvocation,
47
48
  resolveMcpStdioExecutionApproval,
49
+ verifyMcpStdioApprovedWorkingDirectory,
48
50
  } from "../lib/mcp-stdio-execution-authority.js";
49
- import { prepareMcpStdioExecutableIdentity } from "../lib/mcp-stdio-executable-identity.js";
51
+ import {
52
+ MCP_STDIO_RUNTIME_KINDS,
53
+ prepareMcpStdioExecutableIdentity,
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";
50
62
  import {
51
63
  materializeMcpStdioNpmPackage,
52
64
  parseExactNpmPackageSpec,
@@ -113,6 +125,7 @@ export function authorizeMcpRowForConnect(row, overrides = {}) {
113
125
  config,
114
126
  approvalKind,
115
127
  approvalSource: `${row?.configScope || "user"}:${row?.configSource || "database"}:${row.name}`,
128
+ workspaceRoot: projectMcpLocation(process.cwd()).root,
116
129
  });
117
130
  return config;
118
131
  }
@@ -121,6 +134,25 @@ function commandWorkspaceBinding() {
121
134
  return registerHostHooksV2Workspace(projectMcpLocation(process.cwd()).root);
122
135
  }
123
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
+
124
156
  function getClient() {
125
157
  if (!mcpClient) {
126
158
  mcpClient = new MCPClient({ workspaceBinding: commandWorkspaceBinding() });
@@ -284,31 +316,95 @@ function headersHelperField(value) {
284
316
  : {};
285
317
  }
286
318
 
287
- async function readManagedMcpRows() {
288
- const { loadManagedSettings } = await import("../lib/settings-loader.cjs");
289
- const loaded = loadManagedSettings({ env: process.env });
290
- const block =
291
- 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 || {};
292
370
  if (!block || typeof block !== "object" || Array.isArray(block)) return [];
293
371
  return Object.entries(block)
294
372
  .filter(([, config]) => config && typeof config === "object")
295
- .map(([name, config]) => ({
296
- name,
297
- command: config.command || null,
298
- args: Array.isArray(config.args) ? config.args : [],
299
- env: config.env && typeof config.env === "object" ? config.env : {},
300
- url: config.url || null,
301
- transport: inferTransport(config),
302
- headers:
303
- config.headers && typeof config.headers === "object"
304
- ? config.headers
305
- : {},
306
- ...headersHelperField(config.headersHelper),
307
- autoConnect: config.autoConnect !== false,
308
- configScope: "managed",
309
- configSource: loaded.file,
310
- projectPath: null,
311
- }));
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);
312
408
  }
313
409
 
314
410
  function projectMcpLocation(cwd = process.cwd()) {
@@ -361,11 +457,21 @@ export function readProjectMcpRows(cwd = process.cwd()) {
361
457
  return Object.entries(document.mcpServers)
362
458
  .filter(([, config]) => config && typeof config === "object")
363
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
+ });
364
467
  const row = {
365
468
  name,
366
469
  command: config.command || null,
367
470
  args: Array.isArray(config.args) ? config.args : [],
368
471
  env: config.env && typeof config.env === "object" ? config.env : {},
472
+ runtimeKind: config.runtimeKind || null,
473
+ ...(cwd ? { cwd } : {}),
474
+ ...(sandboxPolicy ? { sandboxPolicy } : {}),
369
475
  url: config.url || null,
370
476
  transport: inferTransport(config),
371
477
  headers:
@@ -379,7 +485,7 @@ export function readProjectMcpRows(cwd = process.cwd()) {
379
485
  projectPath: root,
380
486
  };
381
487
  Object.defineProperty(row, PROJECT_MCP_FILE_TRUST, { value: trusted });
382
- if (trusted && row.headersHelper) {
488
+ if (trusted && (row.headersHelper || inferTransport(row) === "stdio")) {
383
489
  row.projectMcpWorkspaceAuthority = issueProjectMcpWorkspaceAuthority({
384
490
  file,
385
491
  content,
@@ -409,10 +515,44 @@ function writeProjectMcpDocument(file, document) {
409
515
 
410
516
  export function writeProjectMcpServer(name, server, cwd = process.cwd()) {
411
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;
412
547
  const config = {};
413
548
  if (server.command) config.command = server.command;
414
549
  if (server.args?.length) config.args = server.args;
415
550
  if (server.env && Object.keys(server.env).length > 0) config.env = server.env;
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;
416
556
  if (server.url) config.url = server.url;
417
557
  if (server.transport) config.transport = server.transport;
418
558
  if (server.headers && Object.keys(server.headers).length > 0) {
@@ -866,6 +1006,11 @@ export function registerMcpCommand(program) {
866
1006
  { serverName: name, config: authorized },
867
1007
  );
868
1008
  const invocation = materializeApprovedMcpStdioInvocation(approval);
1009
+ const approvedCwd = resolveMcpCommandStdioWorkingDirectory(
1010
+ name,
1011
+ invocation,
1012
+ approval,
1013
+ );
869
1014
  const approvalRecord = resolveMcpStdioExecutionApproval(approval);
870
1015
  const materialized = materializeMcpStdioNpmPackage({
871
1016
  approvalRecord,
@@ -886,7 +1031,7 @@ export function registerMcpCommand(program) {
886
1031
  serverName: name,
887
1032
  config: invocation,
888
1033
  approval,
889
- cwd: process.cwd(),
1034
+ cwd: approvedCwd,
890
1035
  env: process.env,
891
1036
  retrust: true,
892
1037
  });
@@ -967,11 +1112,16 @@ export function registerMcpCommand(program) {
967
1112
  { serverName: name, config: authorized },
968
1113
  );
969
1114
  const invocation = materializeApprovedMcpStdioInvocation(approval);
1115
+ const approvedCwd = resolveMcpCommandStdioWorkingDirectory(
1116
+ name,
1117
+ invocation,
1118
+ approval,
1119
+ );
970
1120
  const prepared = prepareMcpStdioExecutableIdentity({
971
1121
  serverName: name,
972
1122
  config: invocation,
973
1123
  approval,
974
- cwd: process.cwd(),
1124
+ cwd: approvedCwd,
975
1125
  env: process.env,
976
1126
  retrust: true,
977
1127
  });
@@ -1012,6 +1162,19 @@ export function registerMcpCommand(program) {
1012
1162
  .argument("<name>", "Server name")
1013
1163
  .option("-c, --command <cmd>", "Server command to run (stdio transport)")
1014
1164
  .option("-a, --args <args>", "Command arguments (comma-separated)")
1165
+ .option(
1166
+ "--runtime-kind <kind>",
1167
+ "stdio runtime semantics: native | node | python | posix-shell | powershell | java | dotnet",
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
+ )
1015
1178
  .option(
1016
1179
  "-u, --url <url>",
1017
1180
  "Server URL (http / https / ws / wss transports)",
@@ -1051,6 +1214,24 @@ export function registerMcpCommand(program) {
1051
1214
  logger.error("Use either -c <command> or -u <url>, not both.");
1052
1215
  process.exit(1);
1053
1216
  }
1217
+ if (options.runtimeKind && !options.command) {
1218
+ throw new Error("--runtime-kind is only supported with --command");
1219
+ }
1220
+ if (
1221
+ options.runtimeKind &&
1222
+ !MCP_STDIO_RUNTIME_KINDS.includes(options.runtimeKind)
1223
+ ) {
1224
+ throw new Error(
1225
+ `Invalid --runtime-kind; expected one of: ${MCP_STDIO_RUNTIME_KINDS.join(", ")}`,
1226
+ );
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
+ }
1054
1235
 
1055
1236
  const ctx = await bootstrap({ verbose: program.opts().verbose });
1056
1237
  if (!ctx.db) {
@@ -1137,13 +1318,28 @@ export function registerMcpCommand(program) {
1137
1318
  }
1138
1319
 
1139
1320
  const workspaceRoot = projectMcpLocation(process.cwd()).root;
1140
- const previousLocal =
1141
- configScope === "local"
1142
- ? config.get(name, { scope: "local", cwd: workspaceRoot })
1143
- : 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;
1144
1334
  const storedConfig = {
1145
1335
  command: options.command || null,
1146
1336
  args,
1337
+ runtimeKind: options.command ? options.runtimeKind || null : null,
1338
+ ...(sandboxPolicyUpdate !== undefined
1339
+ ? { sandboxPolicy: sandboxPolicyUpdate }
1340
+ : effectiveSandboxPolicy
1341
+ ? { sandboxPolicy: effectiveSandboxPolicy }
1342
+ : {}),
1147
1343
  url: options.url || null,
1148
1344
  transport,
1149
1345
  env: {},
@@ -1160,6 +1356,9 @@ export function registerMcpCommand(program) {
1160
1356
  storedConfig,
1161
1357
  process.cwd(),
1162
1358
  );
1359
+ configuredSandboxPolicy =
1360
+ readProjectMcpRows(process.cwd()).find((row) => row.name === name)
1361
+ ?.sandboxPolicy || null;
1163
1362
  } else {
1164
1363
  if (configScope === "local" && previousLocal?.headersHelper) {
1165
1364
  revokeLocalMcpHeadersHelperTrust({
@@ -1190,6 +1389,12 @@ export function registerMcpCommand(program) {
1190
1389
  name,
1191
1390
  command: options.command || null,
1192
1391
  args,
1392
+ runtimeKind: storedConfig.runtimeKind,
1393
+ ...(configuredSandboxPolicy
1394
+ ? { sandboxPolicy: configuredSandboxPolicy }
1395
+ : sandboxPolicyUpdate === null
1396
+ ? { sandboxPolicy: null }
1397
+ : {}),
1193
1398
  url: options.url || null,
1194
1399
  transport,
1195
1400
  autoConnect: !!options.autoConnect,
@@ -1212,6 +1417,16 @@ export function registerMcpCommand(program) {
1212
1417
  logger.log(
1213
1418
  ` ${chalk.gray("Command:")} ${options.command} ${args.join(" ")}`,
1214
1419
  );
1420
+ if (storedConfig.runtimeKind) {
1421
+ logger.log(
1422
+ ` ${chalk.gray("Runtime kind:")} ${storedConfig.runtimeKind}`,
1423
+ );
1424
+ }
1425
+ if (configuredSandboxPolicy) {
1426
+ logger.log(
1427
+ ` ${chalk.gray("Sandbox boundaries:")} ${configuredSandboxPolicy.requiredBoundaries.join(", ")}`,
1428
+ );
1429
+ }
1215
1430
  }
1216
1431
  if (configScope === "project") {
1217
1432
  logger.log(
@@ -1,6 +1,32 @@
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
+ },
17
+ {
18
+ "productVersion": null,
19
+ "cliVersion": "0.163.2",
20
+ "cliVersions": ["0.163.1", "0.163.2"],
21
+ "date": "2026-08-09",
22
+ "title": "",
23
+ "sections": [
24
+ {
25
+ "heading": "Fixed — cc CLI 0.163.2: fail-closed MCP capsule sandbox composition",
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`."
27
+ }
28
+ ]
29
+ },
4
30
  {
5
31
  "productVersion": null,
6
32
  "cliVersion": "0.163.1",
@@ -10,7 +36,7 @@
10
36
  "sections": [
11
37
  {
12
38
  "heading": "Fixed — cc CLI 0.163.1: bounded long sessions and reliability gates",
13
- "body": "> `chainlesschain` **0.163.0 → 0.163.1** (release candidate,\n> 2026-08-08). CLI-only release metadata;\n> `@chainlesschain/personal-data-hub` remains **0.4.57** and\n> `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Bounded long-session compaction**: prior durable conversation summaries and\n compacted tool records are folded into the next summary instead of remaining\n as permanently accumulated system messages. A 2,000-turn regression keeps\n compaction state bounded while preserving checkpoint and other trusted host\n provenance.\n- **Race-safe live session tails**: transcript deletion or restoration between\n the path check and asynchronous `stat`/`open` is reclassified through the\n durable session witness. Followers now fail closed with the governed deleted\n or unverified-transcript error instead of leaking a platform-dependent raw\n `ENOENT`.\n- **Atomic Windows MCP runtime launch**: the strict sandbox holds verified\n runtime and entry identities through suspended process image creation, then\n re-attests before resume. A real pathname-replacement race fails closed\n before untrusted entry code executes.\n- **Real cross-platform reliability probes**: the formal matrix now includes\n persisted EROFS/ENOSPC sessions, bounded pipe consumers, native TTY\n screen-reader mode with multilingual keyboard input, Windows/macOS Unicode\n clipboard round trips, localhost SSH disconnects, oversized MCP output,\n concurrent agents, and two-hour resource accounting. Disk mounts are retired\n from their actual `sessions` targets during cleanup.\n- **Deterministic two-hour workload**: the required 1,000 duplex turns are\n paced across the complete soak window instead of becoming a platform-speed\n stress loop with millions of extra turns. The RSS/FD/handle thresholds remain\n unchanged, and the screen-reader probe waits for the real REPL prompt before\n injecting multilingual keyboard input.\n- **Native release credentials fail closed**: the six-target native workflow\n refuses to build a release until Linux signing, Windows Authenticode, macOS\n signing/notarization, and updater keys are all configured. This npm release\n does not claim the separate native distribution chain is complete.\n- **Release status**: exact source commit `a29eb4203d` passed the complete Linux,\n Windows, and macOS `CLI CI` and `CLI Strict Sandbox` matrices. The dedicated\n release workflow then ran in dry-run mode, with the exact-SHA, artifact, and\n publish jobs skipped; neither `v-npm-0-163-1` nor registry version `0.163.1`\n exists. The two-hour reliability matrix is recorded separately as product\n evidence and cannot be replaced by local smoke tests."
39
+ "body": "> `chainlesschain` **0.163.0 → 0.163.1** (published from exact SHA\n> `e3f56b11e27ae1bd5d19ad8638434843c244aa68`, 2026-08-08). CLI-only release;\n> `@chainlesschain/personal-data-hub` remains **0.4.57** and\n> `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Bounded long-session compaction**: prior durable conversation summaries and\n compacted tool records are folded into the next summary instead of remaining\n as permanently accumulated system messages. A 2,000-turn regression keeps\n compaction state bounded while preserving checkpoint and other trusted host\n provenance.\n- **Race-safe live session tails**: transcript deletion or restoration between\n the path check and asynchronous `stat`/`open` is reclassified through the\n durable session witness. Followers now fail closed with the governed deleted\n or unverified-transcript error instead of leaking a platform-dependent raw\n `ENOENT`.\n- **Atomic Windows MCP runtime launch**: the strict sandbox holds verified\n runtime and entry identities through suspended process image creation, then\n re-attests before resume. A real pathname-replacement race fails closed\n before untrusted entry code executes.\n- **Real cross-platform reliability probes**: the formal matrix now includes\n persisted EROFS/ENOSPC sessions, bounded pipe consumers, native TTY\n screen-reader mode with multilingual keyboard input, Windows/macOS Unicode\n clipboard round trips, localhost SSH disconnects, oversized MCP output,\n concurrent agents, and two-hour resource accounting. Disk mounts are retired\n from their actual `sessions` targets during cleanup.\n- **Deterministic two-hour workload**: the required 1,000 duplex turns are\n paced across the complete soak window instead of becoming a platform-speed\n stress loop with millions of extra turns. The RSS/FD/handle thresholds remain\n unchanged, and the screen-reader probe waits for the real REPL prompt before\n injecting multilingual keyboard input.\n- **Native release credentials fail closed**: the six-target native workflow\n refuses to build a release until Linux signing, Windows Authenticode, macOS\n signing/notarization, and updater keys are all configured. This npm release\n does not claim the separate native distribution chain is complete.\n- **Reproducible embedded Web Panel**: the CLI pack path now builds from a clean,\n lockfile-driven Web Panel dependency graph, pins the Vite/Rollup/Intlify runtime\n chain, bounds Rollup file concurrency, and keeps Node 22 standalone bases\n deterministic across Linux, Windows, macOS, x64, and ARM64 validation hosts.\n- **Release status**: immutable tag `v-npm-0-163-1` resolves to exact source\n commit `e3f56b11e27ae1bd5d19ad8638434843c244aa68`. That SHA passed the complete\n Linux, Windows, and macOS `CLI CI` and `CLI Strict Sandbox` matrices, the\n unsigned six-target native validation, and the three-OS two-hour reliability\n gate. The dedicated npm release completed its exact-SHA gate, immutable\n tarball/CycloneDX SBOM, Trusted Publishing, SLSA provenance, registry readback,\n and npmmirror synchronization. The public registry tarball is byte-identical\n to the workflow artifact (SHA-256\n `d9e09e25c6086e0777e97a670105649e3a7e5fb1c2816e1834557da32157cbee`)."
14
40
  }
15
41
  ]
16
42
  },
@@ -23,7 +49,7 @@
23
49
  "sections": [
24
50
  {
25
51
  "heading": "Fixed — cc CLI 0.163.0: macOS PTY launch and native host validation",
26
- "body": "> `chainlesschain` **0.162.200 → 0.163.0** (release candidate,\n> 2026-08-08). CLI-only release metadata;\n> `@chainlesschain/personal-data-hub` remains **0.4.57** and\n> `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **macOS PTY installation repair**: `node-pty@1.1.0` publishes its macOS\n `spawn-helper` prebuilds without executable bits, which made fresh ARM64 and\n Intel installs fail with `posix_spawnp failed`. The CLI postinstall now\n repairs and verifies that narrowly resolved regular file, rejects symlinked\n helpers, and the reliability workflow fails early if the executable bit is\n missing before running a real PTY scenario.\n- **Real native target hosts**: the standalone native release matrix now maps\n Linux, Windows, and macOS x64/ARM64 targets to six matching GitHub-hosted\n runners and requires each artifact to execute on its own architecture. The\n previous cross-target smoke-test skip is removed. This improves native\n evidence readiness but does not claim signing, notarization, or public native\n distribution is complete.\n- **Second command-observation cycle starts**: `0.163.0` begins the second minor\n release cycle for lifecycle telemetry. All 25 deprecated compatibility\n aliases remain retained because representative opt-in collector coverage,\n per-command sample floors, and the `0.164.0` removal floor are not yet met.\n- **Pre-release evidence**: implementation SHA `38cd849ed16f` passed\n [CLI Strict Sandbox](https://github.com/chainlesschain/chainlesschain/actions/runs/31202334570)\n on Ubuntu, Windows, and macOS. This final version commit must independently\n pass exact-SHA `CLI CI` and `CLI Strict Sandbox` before publication."
52
+ "body": "> `chainlesschain` **0.162.200 → 0.163.0** (published from exact SHA\n> `aed0a3ae5327917ce0490a5decbddd777f66f33b`, 2026-08-08). CLI-only release;\n> `@chainlesschain/personal-data-hub` remains **0.4.57** and\n> `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **macOS PTY installation repair**: `node-pty@1.1.0` publishes its macOS\n `spawn-helper` prebuilds without executable bits, which made fresh ARM64 and\n Intel installs fail with `posix_spawnp failed`. The CLI postinstall now\n repairs and verifies that narrowly resolved regular file, rejects symlinked\n helpers, and the reliability workflow fails early if the executable bit is\n missing before running a real PTY scenario.\n- **Real native target hosts**: the standalone native release matrix now maps\n Linux, Windows, and macOS x64/ARM64 targets to six matching GitHub-hosted\n runners and requires each artifact to execute on its own architecture. The\n previous cross-target smoke-test skip is removed. This improves native\n evidence readiness but does not claim signing, notarization, or public native\n distribution is complete.\n- **Second command-observation cycle starts**: `0.163.0` begins the second minor\n release cycle for lifecycle telemetry. All 25 deprecated compatibility\n aliases remain retained because representative opt-in collector coverage,\n per-command sample floors, and the `0.164.0` removal floor are not yet met.\n- **Release evidence**: tag `v-npm-0-163-0` resolves to exact SHA\n `aed0a3ae5327917ce0490a5decbddd777f66f33b`. Its\n [CLI CI](https://github.com/chainlesschain/chainlesschain/actions/runs/31205224902),\n [CLI Strict Sandbox](https://github.com/chainlesschain/chainlesschain/actions/runs/31205231874),\n and [dedicated npm release](https://github.com/chainlesschain/chainlesschain/actions/runs/31209345410)\n completed the three-OS matrices, immutable tarball/SBOM, provenance, registry\n readback, and npmmirror synchronization before `0.163.1` superseded it."
27
53
  }
28
54
  ]
29
55
  },