chainlesschain 0.163.2 → 0.163.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/package.json +3 -2
  2. package/scripts/command-lifecycle-report.mjs +330 -38
  3. package/src/assets/web-panel/assets/{AIOps-DnGsmsqJ.js → AIOps-DB5X7qqV.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-CrO6fcQ7.js → ActionButton-DxHRtKLk.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-DsBdOaP2.js → Analytics-DIH5QrxT.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-DmQslKUB.js → AppLayout-uu0oxVz7.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-BvyrT_QQ.js → Artifacts-BNSMiW9Y.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-prndoLiC.js → Audit-DcAzB4_x.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-DOTFyA55.js → BackgroundAgents-ClSsvjIc.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-9zOnPp_8.js → Backup-BMciY0js.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-C4PC6sAG.js → BaseInput-Hn3b57Sh.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-BBAF-W9v.js → Chat-CoSlC53V.js} +6 -6
  13. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CWhvvloO.js → ChatBubbleRenderer-CFevJ3So.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-BI9iculd.js → Checkbox-B4L4Eu4w.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-3DP9BCKb.js → Codegen-C77FgRxF.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-df-2TnJX.js → Col-BrLtJLH3.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-CHs8gG_A.js → Community-Be7pXXhA.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-CDfF6q7V.js → Compact-DuGPecjo.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-CthrDnO7.js → Compliance-CzS66mjP.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-HjIqsWJw.js → Cowork-CEhjCoyK.js} +2 -2
  21. package/src/assets/web-panel/assets/{Cron-BKc196fb.js → Cron-D7ir8Vja.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-CJnjdc8W.js → Crosschain-BcXmuLxf.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-BHUy-8Q2.js → DID-Cto1dtBy.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-QDB7sKeY.js → Dashboard-B7KjgwOX.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-DStcVK11.js → Dropdown-COMqxijg.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-BwSUskMJ.js → EmailListRenderer-BZrya-nf.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DgF_kurT.js → FamilyGuardDashboard-AmVeMq0J.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-k8wvv-wN.js → Federation-kZU8c-27.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-C11qoq2r.js → FormItemContext-sOV22v2-.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-BIIpr9kg.js → GenericCardRenderer-BUuLtGCz.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-BlA1exTe.js → Git-K-ZxsLsH.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-CYa1ZYM4.js → Governance-D3OEnawI.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-6_kKVIt6.js → Inference-Bll0gRmP.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-CB4AwxYy.js → KnowledgeGraph-DBXwjr53.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-xf7nHFAe.js → Logs-CEzPwEfP.js} +2 -2
  36. package/src/assets/web-panel/assets/{MarkdownRenderer-Bf3DEqP6.js → MarkdownRenderer-CLmCbHx6.js} +1 -1
  37. package/src/assets/web-panel/assets/{Marketplace-aPg8e4Jt.js → Marketplace-BYyRyOPz.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-C-TNlVUf.js → McpTools-DVu8w_rM.js} +5 -5
  39. package/src/assets/web-panel/assets/{Memory-DMTPIpGa.js → Memory-tenuZ_hO.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-BxyvveRq.js → MobileBridge-Bxgy4ozS.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-DyPCrAyQ.js → MobileProjects-Dgx1D6sc.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-BdhqNXp6.js → Mtc-CRfJ8r8j.js} +5 -5
  43. package/src/assets/web-panel/assets/{MtcAudit-Cz-HFxzW.js → MtcAudit-BBJq4Aiz.js} +5 -5
  44. package/src/assets/web-panel/assets/{Multisig-CIUaFNsx.js → Multisig-B3ii9lai.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-CWe6-J17.js → NLProgramming-FIi-Cubv.js} +1 -1
  46. package/src/assets/web-panel/assets/{Notes-vYAKeviU.js → Notes-DIq8MPf1.js} +3 -3
  47. package/src/assets/web-panel/assets/{NotificationSettings-DQL9-2d7.js → NotificationSettings-BFOD9eGd.js} +1 -1
  48. package/src/assets/web-panel/assets/{OrderTableRenderer-DnXj1jBn.js → OrderTableRenderer--41u7vre.js} +1 -1
  49. package/src/assets/web-panel/assets/{Organization-B3spU8AN.js → Organization-B_0AWztW.js} +2 -2
  50. package/src/assets/web-panel/assets/{Overflow-DgEwo7vm.js → Overflow-B6I7TuXv.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-hujMRH8X.js → P2P-Cdf6qens.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser-C_qhdg9h.js → PdhVaultBrowser-B_0FcQJY.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-vp7LMcSf.js → Permissions-6nFBjsQp.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-Dxr5Hgnq.js → PersonalDataHub-nQYV7xpn.js} +3 -3
  55. package/src/assets/web-panel/assets/{Pipeline-DEPZqqH4.js → Pipeline-CBVod5jm.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-DTpDiKPe.js → Privacy-D52jW1Nt.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-jDJsRWmF.js → ProjectInit-Bdx3BYhf.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-Dhor5RWH.js → ProjectSettings-b7xr4DUa.js} +2 -2
  59. package/src/assets/web-panel/assets/Projects-DhfifCKx.js +1 -0
  60. package/src/assets/web-panel/assets/Providers-Dy_PgDMr.js +1 -0
  61. package/src/assets/web-panel/assets/{QrScannerModal-CjIw-wIb.js → QrScannerModal-FQKSmc3e.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-DX6jcqoi.js → QuickAsk-CSTrhzcF.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-DopXkhar.js → Recommend-CxMABOUh.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-BLvqJE9c.js → RemoteSession-Cv2T8yRa.js} +2 -2
  65. package/src/assets/web-panel/assets/{Reputation-DhRj2Me7.js → Reputation-CE1k4Vvu.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-DQ53vuPq.js → Row-BNgNcAV_.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-BslvwiBD.js → RssFeed-5ZiBZ3ph.js} +3 -3
  68. package/src/assets/web-panel/assets/{Search-DJKBDNKZ.js → Search-mDOIF1UV.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-COhpxHER.js → Security-CtuCTC-e.js} +3 -3
  70. package/src/assets/web-panel/assets/{Services-dbulD6cI.js → Services-DxFO2Zg7.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-ciIVNfhC.js → Skeleton-CKmKkH9y.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-AiRTkTCk.js → Skills-Bmzl9qkk.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-DDMcWYBc.js → Sla-9RqaWHOC.js} +1 -1
  74. package/src/assets/web-panel/assets/{SpeechSettings-BPxWbpXO.js → SpeechSettings-CGdzFIYw.js} +1 -1
  75. package/src/assets/web-panel/assets/{SyncSettings-BoEOXCyg.js → SyncSettings-CvNuCeBT.js} +2 -2
  76. package/src/assets/web-panel/assets/Tasks-B_sLdcnw.js +1 -0
  77. package/src/assets/web-panel/assets/{Templates-UowY8Ixe.js → Templates-D9_YijdK.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-DauSLQXN.js → Tenant-Cuc7BUSP.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-DBj7Jneq.js → Terminal-6VYRnJgd.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-UMrPwoZC.js → TimelineRenderer-GtK8xd8Y.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-4ea96-bn.js → Tokens-BZ94Lt5W.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger--ISCqt4b.js → Trigger-DEcZgDaX.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-D4GVimRJ.js → Trust-CC3z9THe.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-Ci-nXRQc.js → UkeySign-Cvtw8cV3.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-Cjk7mKPw.js → VideoEditing-CL4e6Bn3.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-BgOLOO3Z.js → Wallet-ycEemP27.js} +2 -2
  87. package/src/assets/web-panel/assets/{WebAuthn-CCX0K29i.js → WebAuthn-DgZ4X_aw.js} +5 -5
  88. package/src/assets/web-panel/assets/{WorkflowEditor-Ch3zgIsE.js → WorkflowEditor-D0qMhSv7.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-DKOU_2Vb.js → chat-DsAg01Zn.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-6OVo4u3C.js → colors-B0oqAhrQ.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-BH78Hlsq.js → compact-item-CmX0Rabz.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-CFRpSbbC.js → createContext-Be4cn1Ub.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-CP2qzG6D.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-DNQhgcVi.js → hasIn-D5v12kVq.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-BkN3iTTp.js → index-0eWLkQKT.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-CkNEMANR.js → index-301ogenv.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-D3RtTT4K.js → index-5LGY0JbG.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-dDkoL4Pe.js → index-7VKDn-t1.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BHa4WyTZ.js → index-8WvYGnON.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CaYqY35Z.js → index-B1YGjOWC.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-bKm3TUDp.js → index-B3mUHuVc.js} +1 -1
  102. package/src/assets/web-panel/assets/{index--rq90rL9.js → index-BA4oulaP.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DaDgdJYj.js → index-BBREnn1V.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-B_Z-YoxX.js → index-BBvyHguy.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-CkqHgG-b.js → index-BKmsS2jj.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CrcLHN2F.js → index-BRIqLy1m.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BaVE6E8y.js → index-BXGSbelg.js} +3 -3
  108. package/src/assets/web-panel/assets/{index-BYrnm5Ob.js → index-BaE0Ui07.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-BDSR7ecX.js → index-BoAIAZ5C.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-CNuCHHQT.js → index-BqltWojQ.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-Eag8e_mA.js → index-CGiIyTZw.js} +1 -1
  112. package/src/assets/web-panel/assets/index-CKB0vbJU.js +1 -0
  113. package/src/assets/web-panel/assets/{index-BepBTpa8.js → index-CZ2wUEgr.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-HNGGVF6o.js → index-CZpfzcuy.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-AuBhLqOm.js → index-Ckrk3pIV.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-7TC3S8SN.js → index-CqoCZ5vR.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CFPJ8yzF.js → index-CyWBir7N.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-Bb6kDrUx.js → index-CyyGTMKd.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DKN2noIF.js → index-D0BSkxYQ.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Du0rnksC.js → index-D5YVopyr.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BxRy5LPR.js → index-DKUBj36_.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-sm7W8AXy.js → index-DM724NgU.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BujsOZfc.js → index-DQRsQen0.js} +1 -1
  124. package/src/assets/web-panel/assets/index-DgoXmwqB.js +1 -0
  125. package/src/assets/web-panel/assets/{index-Y9MJv28e.js → index-DikJ0Qqe.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-caye7AOE.js → index-Dn2dSdXx.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-cdf7fd7d.js → index-DyUaFWEk.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BnnXQot_.js → index-Hfe_dEGx.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DvHGtNnF.js → index-_JjRLSD0.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-nbfHl1oV.js → index-frSojpHj.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-Cu3L4r5l.js → index-jK3ax6Z6.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-D84id2Y4.js → index-qMuZ-NRR.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-hPY0fFrd.js → index-q_fQ94SE.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-BZ9w6jPL.js → initDefaultProps-D4VdhJ9_.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-BnwUiOho.js → motion-CZJA0MQW.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-ByUKJnNm.js → move-BqEs7Sb1.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-V7yK1KEl.js → mtc-parser-BpHEtsu1.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-BEXBBt4j.js → omit-BW94tY9W.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-qDm_46Gi.js → pickAttrs-BnBjPWP9.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-BIbhEo_0.js → placementArrow-uUkjQ_hu.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-NbPbDgA_.js → responsiveObserve-B-klUqXK.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-BnUWglZ0.js → slide-CvY1cNAs.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-BX8_wZI5.js → statusUtils-Ix5sEDT2.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-BV4OycQX.js → styleChecker-C8qcXOne.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-Od_H5llY.js → useFlexGapSupport-KNF6Kj8f.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-BWI-PyiX.js → useFs-DGJr345n.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-BqMuhG3g.js → usePersonalDataHub-BboN99rI.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-DNd23z6f.js → vnode-Bgt8Vgte.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-Cjaxnm7l.js → zoom-BhJtErgt.js} +1 -1
  150. package/src/assets/web-panel/index.html +1 -1
  151. package/src/command-help-index.json +2 -2
  152. package/src/commands/agenda.js +6 -5
  153. package/src/commands/agent.js +237 -75
  154. package/src/commands/agents.js +6 -0
  155. package/src/commands/artifacts.js +98 -0
  156. package/src/commands/background-session.js +11 -1
  157. package/src/commands/mcp.js +218 -31
  158. package/src/commands/review.js +221 -22
  159. package/src/commands/session-mcp-recovery.js +5 -5
  160. package/src/data/changelog.json +27 -1
  161. package/src/gateways/ws/ws-agent-handler.js +492 -14
  162. package/src/harness/jsonl-session-store.js +39 -1
  163. package/src/harness/mcp-client.js +414 -71
  164. package/src/harness/prompt-compressor.js +24 -0
  165. package/src/harness/provider-backed-compaction.js +205 -0
  166. package/src/harness/worktree-isolator.js +26 -3
  167. package/src/lib/agent-worktree.js +41 -2
  168. package/src/lib/app-preview.js +3 -0
  169. package/src/lib/background-agent-supervisor.js +790 -186
  170. package/src/lib/background-command-argv.js +318 -0
  171. package/src/lib/background-launch-profile.js +1 -0
  172. package/src/lib/background-phase-reporter.js +22 -2
  173. package/src/lib/background-worktree-policy.js +109 -0
  174. package/src/lib/command-lifecycle-report.js +1340 -145
  175. package/src/lib/cowork-mcp-tools.js +51 -6
  176. package/src/lib/cowork-task-runner.js +1 -0
  177. package/src/lib/delivery-coordinator.js +30 -5
  178. package/src/lib/delivery-production-adapter.js +1777 -0
  179. package/src/lib/delivery-production-runner.js +240 -0
  180. package/src/lib/durable-security-store.js +29 -17
  181. package/src/lib/execution-trace/trace-context.cjs +179 -0
  182. package/src/lib/execution-trace/trace-context.js +8 -175
  183. package/src/lib/mcp-call-ledger-store.js +58 -6
  184. package/src/lib/mcp-headers-helper.js +76 -8
  185. package/src/lib/mcp-host-recovery-runtime.js +2 -0
  186. package/src/lib/mcp-ledger-recovery-admission.js +39 -3
  187. package/src/lib/mcp-recovery-adjudication.js +256 -19
  188. package/src/lib/mcp-sandbox-policy.js +184 -0
  189. package/src/lib/mcp-stdio-capsule-builder-worker.cjs +495 -0
  190. package/src/lib/mcp-stdio-executable-identity.js +33 -2
  191. package/src/lib/mcp-stdio-execution-authority.js +163 -0
  192. package/src/lib/mcp-stdio-immutable-vfs-resolver.cjs +830 -0
  193. package/src/lib/mcp-stdio-package-materialization.js +721 -333
  194. package/src/lib/mcp-stdio-workspace-authority.js +252 -0
  195. package/src/lib/observability/index.js +2 -0
  196. package/src/lib/observability/otlp-exporter.js +2 -2
  197. package/src/lib/packer/pack-update-applier.js +8 -1
  198. package/src/lib/packer/pkg-config-generator.js +34 -0
  199. package/src/lib/plugin-runtime/sandbox-policy.js +42 -2
  200. package/src/lib/process-execution-broker/index.js +213 -109
  201. package/src/lib/process-execution-broker/platform-sandbox.js +1024 -169
  202. package/src/lib/process-tree-termination.js +17 -1
  203. package/src/lib/scheduler-kernel/contract.js +315 -0
  204. package/src/lib/scheduler-kernel/store.js +1345 -0
  205. package/src/lib/session-host-lease.js +403 -30
  206. package/src/lib/session-persistence-failure.js +4 -1
  207. package/src/lib/skill-mcp.js +65 -4
  208. package/src/lib/sub-agent-context.js +8 -0
  209. package/src/lib/web-fetch.js +4 -4
  210. package/src/repl/agent-repl.js +285 -38
  211. package/src/runtime/agent-core.js +1044 -90
  212. package/src/runtime/agent-runtime.js +61 -8
  213. package/src/runtime/headless-runner.js +260 -166
  214. package/src/runtime/headless-stream.js +254 -25
  215. package/src/runtime/mcp-config.js +235 -28
  216. package/src/workers/background-agent-worker.js +492 -71
  217. package/src/assets/web-panel/assets/Projects-08xUDZGt.js +0 -1
  218. package/src/assets/web-panel/assets/Providers-BGs47s1a.js +0 -1
  219. package/src/assets/web-panel/assets/Tasks-CEYFJwmr.js +0 -1
  220. package/src/assets/web-panel/assets/devWarning-DEMblAIm.js +0 -1
  221. package/src/assets/web-panel/assets/index-BTvq-36D.js +0 -1
  222. package/src/assets/web-panel/assets/index-hUpvk6Jl.js +0 -1
@@ -34,13 +34,16 @@ export const MCP_CALL_LEDGER_EVENT = "mcp_call_ledger";
34
34
  export const MCP_CALL_LEDGER_EVENT_SCHEMA_VERSION = 1;
35
35
  export const MCP_CALL_RECOVERY_ADJUDICATION_EVENT =
36
36
  "mcp_call_recovery_adjudication";
37
- export const MCP_CALL_RECOVERY_ADJUDICATION_SCHEMA_VERSION = 1;
37
+ export const MCP_CALL_RECOVERY_ADJUDICATION_SCHEMA_VERSION = 2;
38
38
  export const McpCallRecoveryDecision = Object.freeze({
39
39
  CONFIRMED_APPLIED: "confirmed_applied",
40
40
  CONFIRMED_NOT_APPLIED: "confirmed_not_applied",
41
41
  });
42
42
  export const MCP_CALL_RECOVERY_AUTHORITY = "local-cli-tty";
43
- export const MCP_CALL_RECOVERY_CONFIRMATION = "typed-digest-host-stopped";
43
+ export const MCP_CALL_RECOVERY_CONFIRMATION =
44
+ "typed-digest-host-authority-revoke";
45
+ export const MCP_CALL_RECOVERY_LEGACY_CONFIRMATION =
46
+ "typed-digest-host-stopped";
44
47
 
45
48
  const TERMINAL = new Set([
46
49
  McpCallStatus.COMPLETED,
@@ -86,7 +89,7 @@ const EFFECT_CONTRACT_FIELDS = new Set([
86
89
  ]);
87
90
  const OUTPUT_SUMMARY_FIELDS = new Set(["sha256", "bytes", "kind"]);
88
91
  const ERROR_SUMMARY_FIELDS = new Set(["name", "code", "messageDigest"]);
89
- const ADJUDICATION_FIELDS = new Set([
92
+ const LEGACY_ADJUDICATION_FIELDS = new Set([
90
93
  "schemaVersion",
91
94
  "requestId",
92
95
  "sessionId",
@@ -98,6 +101,18 @@ const ADJUDICATION_FIELDS = new Set([
98
101
  "confirmation",
99
102
  "reasonDigest",
100
103
  ]);
104
+ const ADJUDICATION_FIELDS = new Set([
105
+ ...LEGACY_ADJUDICATION_FIELDS,
106
+ "hostRevocation",
107
+ ]);
108
+ const HOST_REVOCATION_FIELDS = new Set([
109
+ "requestId",
110
+ "revocationEpoch",
111
+ "targetLeaseId",
112
+ "targetFencingToken",
113
+ "targetOwnerPid",
114
+ ]);
115
+ const HOST_LEASE_ID = /^lease-[0-9a-f-]{36}$/;
101
116
  const RECOVERY_PROJECTION_FIELDS = new Set([
102
117
  "sessionId",
103
118
  "records",
@@ -414,9 +429,32 @@ function stableSorted(values) {
414
429
  }
415
430
 
416
431
  function canonicalAdjudication(value) {
432
+ const legacy = value?.schemaVersion === 1;
433
+ const validConfirmation =
434
+ (legacy && value?.confirmation === MCP_CALL_RECOVERY_LEGACY_CONFIRMATION) ||
435
+ (value?.schemaVersion === MCP_CALL_RECOVERY_ADJUDICATION_SCHEMA_VERSION &&
436
+ value?.confirmation === MCP_CALL_RECOVERY_CONFIRMATION);
437
+ const fields = legacy ? LEGACY_ADJUDICATION_FIELDS : ADJUDICATION_FIELDS;
438
+ const revocation = value?.hostRevocation;
439
+ const targetIsNull = revocation?.targetLeaseId === null;
440
+ const validRevocation =
441
+ legacy ||
442
+ (hasExactFields(revocation, HOST_REVOCATION_FIELDS) &&
443
+ revocation.requestId === value?.requestId &&
444
+ Number.isSafeInteger(revocation.revocationEpoch) &&
445
+ revocation.revocationEpoch >= 1 &&
446
+ (targetIsNull
447
+ ? revocation.targetFencingToken === null &&
448
+ revocation.targetOwnerPid === null
449
+ : HOST_LEASE_ID.test(String(revocation.targetLeaseId || "")) &&
450
+ Number.isSafeInteger(revocation.targetFencingToken) &&
451
+ revocation.targetFencingToken >= 1 &&
452
+ Number.isSafeInteger(revocation.targetOwnerPid) &&
453
+ revocation.targetOwnerPid >= 1));
417
454
  if (
418
- !hasExactFields(value, ADJUDICATION_FIELDS) ||
419
- value.schemaVersion !== MCP_CALL_RECOVERY_ADJUDICATION_SCHEMA_VERSION ||
455
+ !hasExactFields(value, fields) ||
456
+ !validConfirmation ||
457
+ !validRevocation ||
420
458
  !isCanonicalProtocolText(
421
459
  value.requestId,
422
460
  MCP_CALL_LEDGER_PROTOCOL_LIMITS.identifier,
@@ -433,7 +471,6 @@ function canonicalAdjudication(value) {
433
471
  !RAW_AUTHORITY_HASH.test(String(value.expectedHeadHash || "")) ||
434
472
  !PAYLOAD_DIGEST.test(String(value.expectedRecoveryDigest || "")) ||
435
473
  value.authority !== MCP_CALL_RECOVERY_AUTHORITY ||
436
- value.confirmation !== MCP_CALL_RECOVERY_CONFIRMATION ||
437
474
  !PAYLOAD_DIGEST.test(String(value.reasonDigest || ""))
438
475
  ) {
439
476
  return null;
@@ -449,6 +486,17 @@ function canonicalAdjudication(value) {
449
486
  authority: value.authority,
450
487
  confirmation: value.confirmation,
451
488
  reasonDigest: value.reasonDigest,
489
+ ...(legacy
490
+ ? {}
491
+ : {
492
+ hostRevocation: Object.freeze({
493
+ requestId: revocation.requestId,
494
+ revocationEpoch: revocation.revocationEpoch,
495
+ targetLeaseId: revocation.targetLeaseId,
496
+ targetFencingToken: revocation.targetFencingToken,
497
+ targetOwnerPid: revocation.targetOwnerPid,
498
+ }),
499
+ }),
452
500
  });
453
501
  }
454
502
 
@@ -546,6 +594,10 @@ export function computeMcpRecoveryFenceDigest(recovery = {}) {
546
594
  authority: entry?.authority || null,
547
595
  confirmation: entry?.confirmation || null,
548
596
  reasonDigest: entry?.reasonDigest || null,
597
+ ...(entry?.schemaVersion ===
598
+ MCP_CALL_RECOVERY_ADJUDICATION_SCHEMA_VERSION
599
+ ? { hostRevocation: entry?.hostRevocation || null }
600
+ : {}),
549
601
  })),
550
602
  ),
551
603
  replayDenied: stableSorted(
@@ -1,5 +1,6 @@
1
1
  import fs from "node:fs";
2
2
  import path from "node:path";
3
+ import { isProxy } from "node:util/types";
3
4
  import executionBroker from "./process-execution-broker/index.js";
4
5
  import hookShellCommand from "./hook-shell-command.cjs";
5
6
  import {
@@ -9,6 +10,7 @@ import {
9
10
  import { checkLocalMcpHeadersHelperTrust } from "./mcp-headers-helper-trust.js";
10
11
  import { resolvePluginWorkspaceAuthority } from "./plugin-runtime/sandbox-policy.js";
11
12
  import { resolveProjectMcpWorkspaceAuthority } from "./project-mcp-trust.js";
13
+ import { normalizeMcpSandboxPolicy } from "./mcp-sandbox-policy.js";
12
14
 
13
15
  const { buildExplicitHookShellInvocation } = hookShellCommand;
14
16
 
@@ -42,6 +44,45 @@ function helperError(code, message) {
42
44
  return error;
43
45
  }
44
46
 
47
+ function declaredSandboxPolicy(config) {
48
+ if (!config || typeof config !== "object" || isProxy(config)) {
49
+ throw helperError(
50
+ "CC_MCP_SANDBOX_POLICY_INVALID",
51
+ "MCP headersHelper sandbox policy owner must be a non-Proxy object",
52
+ );
53
+ }
54
+ const descriptor = Object.getOwnPropertyDescriptor(config, "sandboxPolicy");
55
+ if (!descriptor) return null;
56
+ if (!("value" in descriptor)) {
57
+ throw helperError(
58
+ "CC_MCP_SANDBOX_POLICY_INVALID",
59
+ "MCP headersHelper sandboxPolicy must be an own data property",
60
+ );
61
+ }
62
+ return normalizeMcpSandboxPolicy(descriptor.value, {
63
+ label: "MCP headersHelper sandboxPolicy",
64
+ });
65
+ }
66
+
67
+ function sandboxExecution(config, sandboxPolicy, fallbackOrigin) {
68
+ if (!sandboxPolicy) return null;
69
+ return Object.freeze({
70
+ origin:
71
+ typeof config.origin === "string" && config.origin.length > 0
72
+ ? config.origin
73
+ : fallbackOrigin,
74
+ policy:
75
+ typeof config.policy === "string" && config.policy.length > 0
76
+ ? config.policy
77
+ : "allow",
78
+ scope:
79
+ typeof config.scope === "string" && config.scope.length > 0
80
+ ? config.scope
81
+ : "mcp",
82
+ sandboxPolicy,
83
+ });
84
+ }
85
+
45
86
  function normalizeHelperCommand(value) {
46
87
  if (
47
88
  typeof value !== "string" ||
@@ -89,6 +130,16 @@ function canonicalHelperCwd(value, realpath = fs.realpathSync.native) {
89
130
  return canonical;
90
131
  }
91
132
 
133
+ function hasInvalidHeaderValueCharacter(value) {
134
+ for (let index = 0; index < value.length; index += 1) {
135
+ const code = value.charCodeAt(index);
136
+ if (code <= 0x08 || (code >= 0x0a && code <= 0x1f) || code === 0x7f) {
137
+ return true;
138
+ }
139
+ }
140
+ return false;
141
+ }
142
+
92
143
  function normalizeHeaderMap(value, source) {
93
144
  if (!value || typeof value !== "object" || Array.isArray(value)) {
94
145
  throw helperError(
@@ -108,7 +159,7 @@ function normalizeHeaderMap(value, source) {
108
159
  if (
109
160
  !HEADER_NAME.test(name) ||
110
161
  typeof headerValue !== "string" ||
111
- /[\0-\x08\x0a-\x1f\x7f]/.test(headerValue) ||
162
+ hasInvalidHeaderValueCharacter(headerValue) ||
112
163
  Buffer.byteLength(headerValue, "utf8") > MAX_HEADER_VALUE_BYTES ||
113
164
  (source === "dynamic" && TRANSPORT_OWNED_HEADERS.has(name.toLowerCase()))
114
165
  ) {
@@ -138,6 +189,7 @@ function isPathInside(root, candidate) {
138
189
  * plugin configs must carry the collector-issued opaque plugin authority.
139
190
  */
140
191
  export function resolveMcpHeadersHelperContext(config = {}, deps = {}) {
192
+ const sandboxPolicy = declaredSandboxPolicy(config);
141
193
  if (config.origin === "plugin:mcp") {
142
194
  const resolvePlugin =
143
195
  deps.resolvePluginWorkspaceAuthority || resolvePluginWorkspaceAuthority;
@@ -156,17 +208,15 @@ export function resolveMcpHeadersHelperContext(config = {}, deps = {}) {
156
208
  return {
157
209
  cwd: pluginRoot,
158
210
  pluginRoot,
159
- execution: {
211
+ execution: Object.freeze({
160
212
  origin: config.origin,
161
213
  policy: config.policy || "allow",
162
214
  scope: config.scope || "mcp",
163
215
  pluginId: config.pluginId,
164
216
  pluginVersion: config.pluginVersion,
165
217
  pluginSource: config.pluginSource,
166
- ...(config.sandboxPolicy
167
- ? { sandboxPolicy: config.sandboxPolicy }
168
- : {}),
169
- },
218
+ ...(sandboxPolicy ? { sandboxPolicy } : {}),
219
+ }),
170
220
  };
171
221
  }
172
222
 
@@ -253,12 +303,30 @@ export function resolveMcpHeadersHelperContext(config = {}, deps = {}) {
253
303
  );
254
304
  }
255
305
  }
256
- return { cwd: binding.workspaceRoot, pluginRoot: null, execution: null };
306
+ return {
307
+ cwd: binding.workspaceRoot,
308
+ pluginRoot: null,
309
+ execution: sandboxExecution(
310
+ config,
311
+ sandboxPolicy,
312
+ `mcp:headers-helper:${scope}`,
313
+ ),
314
+ };
315
+ }
316
+ if (sandboxPolicy && !binding?.workspaceRoot) {
317
+ throw helperError(
318
+ "CC_MCP_HEADERS_HELPER_UNTRUSTED_WORKSPACE",
319
+ "Policy-bearing MCP headersHelper requires a trusted host workspace",
320
+ );
257
321
  }
258
322
  return {
259
323
  cwd: binding?.workspaceRoot || path.resolve(deps.cwd || process.cwd()),
260
324
  pluginRoot: null,
261
- execution: null,
325
+ execution: sandboxExecution(
326
+ config,
327
+ sandboxPolicy,
328
+ `mcp:headers-helper:${scope}`,
329
+ ),
262
330
  };
263
331
  }
264
332
 
@@ -98,6 +98,7 @@ export function createMcpHostRecoveryRuntime({
98
98
  recovery = null,
99
99
  recoveryError = null,
100
100
  controller = null,
101
+ dispatchAdmission = null,
101
102
  } = {}) {
102
103
  const admissionController = tightenRecoveryController(
103
104
  controller,
@@ -120,6 +121,7 @@ export function createMcpHostRecoveryRuntime({
120
121
  resolveEffect: (serverName, toolName) =>
121
122
  resolveHostMcpEffect(bundle, serverName, toolName),
122
123
  sessionId,
124
+ dispatchAdmission,
123
125
  })
124
126
  : rawClient;
125
127
  return Object.freeze({
@@ -813,6 +813,7 @@ export function createRecoveryGuardedMcpClient({
813
813
  controller,
814
814
  resolveEffect = null,
815
815
  sessionId = null,
816
+ dispatchAdmission = null,
816
817
  } = {}) {
817
818
  if (!client || typeof client.callTool !== "function") {
818
819
  throw new TypeError("MCP client wrapper requires client.callTool()");
@@ -826,6 +827,9 @@ export function createRecoveryGuardedMcpClient({
826
827
  if (resolveEffect != null && typeof resolveEffect !== "function") {
827
828
  throw new TypeError("MCP client effect resolver must be a function");
828
829
  }
830
+ if (dispatchAdmission != null && typeof dispatchAdmission !== "function") {
831
+ throw new TypeError("MCP client dispatch admission must be a function");
832
+ }
829
833
 
830
834
  const existingGuard = GUARDED_MCP_CLIENTS.get(client);
831
835
  if (existingGuard) {
@@ -833,7 +837,8 @@ export function createRecoveryGuardedMcpClient({
833
837
  existingGuard.ledger === ledger &&
834
838
  existingGuard.controller === controller &&
835
839
  existingGuard.resolveEffect === resolveEffect &&
836
- existingGuard.sessionId === sessionId
840
+ existingGuard.sessionId === sessionId &&
841
+ existingGuard.dispatchAdmission === dispatchAdmission
837
842
  ) {
838
843
  return client;
839
844
  }
@@ -850,6 +855,33 @@ export function createRecoveryGuardedMcpClient({
850
855
  // Snapshot before the first await. Admission, durable identity and the raw
851
856
  // transport all receive this exact deeply-frozen JSON value.
852
857
  const inputSnapshot = snapshotMcpJsonRpcInput(input);
858
+ let callOptions = rest;
859
+ if (dispatchAdmission) {
860
+ const supplied = rest[0];
861
+ if (
862
+ supplied != null &&
863
+ (typeof supplied !== "object" ||
864
+ Array.isArray(supplied) ||
865
+ isProxy(supplied))
866
+ ) {
867
+ throw new TypeError("MCP call options must be a plain object");
868
+ }
869
+ const merged = {};
870
+ if (supplied) {
871
+ for (const key of Reflect.ownKeys(supplied)) {
872
+ if (typeof key !== "string") {
873
+ throw new TypeError("MCP call options cannot contain symbols");
874
+ }
875
+ const descriptor = Object.getOwnPropertyDescriptor(supplied, key);
876
+ if (!descriptor || !("value" in descriptor)) {
877
+ throw new TypeError("MCP call options cannot contain accessors");
878
+ }
879
+ merged[key] = descriptor.value;
880
+ }
881
+ }
882
+ merged.dispatchAdmission = dispatchAdmission;
883
+ callOptions = [merged, ...rest.slice(1)];
884
+ }
853
885
  const effect = await resolveHostEffectContract(
854
886
  resolveEffect,
855
887
  client,
@@ -871,10 +903,13 @@ export function createRecoveryGuardedMcpClient({
871
903
  serverName,
872
904
  toolName,
873
905
  inputSnapshot,
874
- ...rest,
906
+ ...callOptions,
875
907
  ]);
876
908
  } catch (callError) {
877
- if (effect.effectContract.effect !== McpEffect.READ) {
909
+ if (
910
+ effect.effectContract.effect !== McpEffect.READ &&
911
+ safeProperty(callError, "dispatched") !== false
912
+ ) {
878
913
  throw outcomeUnknown(
879
914
  controller,
880
915
  ticket,
@@ -1060,6 +1095,7 @@ export function createRecoveryGuardedMcpClient({
1060
1095
  controller,
1061
1096
  resolveEffect,
1062
1097
  sessionId,
1098
+ dispatchAdmission,
1063
1099
  });
1064
1100
  return wrappedClient;
1065
1101
  }