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
@@ -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,8 +1006,13 @@ 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
- const materialized = materializeMcpStdioNpmPackage({
1015
+ const materialized = await materializeMcpStdioNpmPackage({
877
1016
  approvalRecord,
878
1017
  config: invocation,
879
1018
  packageSpec: exact.spec,
@@ -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(