chainlesschain 0.162.180 → 0.162.181

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 (249) hide show
  1. package/package.json +6 -3
  2. package/src/assets/web-panel/.build-hash +1 -1
  3. package/src/assets/web-panel/assets/{AIOps-D_TIL54O.js → AIOps-cq0dwbnf.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-eQwy9r-f.js → ActionButton-CvcgGl3w.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-D2eNuDgT.js → Analytics-hM2-jFqg.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-CFhwOFsf.js → AppLayout-B9_Gsd_g.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-CJUMw6PB.js → Artifacts-B7bu52Og.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-CDB9V58o.js → Audit-DThfDgqB.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-TBppYFjN.js → BackgroundAgents-DjlFiD4v.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-CYEOUpzJ.js → Backup-CK9xJKnG.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-C88fFT2u.js → BaseInput-DEiSU8K8.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-mkr1vC3N.js → Chat-CpT96czj.js} +6 -6
  13. package/src/assets/web-panel/assets/{ChatBubbleRenderer-C7bofJuA.js → ChatBubbleRenderer-BKPPNmZI.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-CVU4xqti.js → Checkbox-C1GfDnO0.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-rrNcByz3.js → Codegen-3DAKgiLx.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-Cqu-zCvh.js → Col-74cOwZU1.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-RGRlSgXV.js → Community-tn9Kkz9j.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-DBm6epOK.js → Compact-BcoXH7m4.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-BgKw5iaW.js → Compliance-DIPGUBgi.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-BqQcNO3Z.js → Cowork-doD5_91c.js} +2 -2
  21. package/src/assets/web-panel/assets/{Cron-DO5gTFNb.js → Cron-C-IDvubz.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-B8hbJNuN.js → Crosschain-CdcCoBdj.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-B08bFJ2C.js → DID-DdH5aMMA.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-xNdy_ifo.js → Dashboard-DHLA4mm0.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-D-KIZgWL.js → Dropdown-dEeCt7Md.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-DKCvsaGo.js → EmailListRenderer-BMaecFv9.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-D_cfqama.js → FamilyGuardDashboard-DUaUukTN.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-B-UqQD68.js → Federation-CMBE0_rp.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-BWWvWuJW.js → FormItemContext-PG-JDbXq.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-CPchx6N7.js → GenericCardRenderer-Bcb0p88m.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-Vx4co9Ff.js → Git-Bgv15myB.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-D4x0pp_m.js → Governance-DB8YTArI.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-T3KvwPYR.js → Inference-BQMwCWaS.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-Ddv3KUv3.js → KnowledgeGraph-B1_ZziiB.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-DfH-Dkae.js → Logs-DovEEnt_.js} +2 -2
  36. package/src/assets/web-panel/assets/{MarkdownRenderer-DHW3PbCq.js → MarkdownRenderer-D201OL4T.js} +1 -1
  37. package/src/assets/web-panel/assets/{Marketplace-tjgb0R3D.js → Marketplace-BlCXSpyB.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-DHAk5nYX.js → McpTools-CsCR09Wj.js} +5 -5
  39. package/src/assets/web-panel/assets/{Memory-A2Yx7thM.js → Memory-CBVRLKno.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-BEmTVfN5.js → MobileBridge-C9OIafgA.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-DuFHUgE4.js → MobileProjects-D_zoJ8Xs.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-BDSll0OZ.js → Mtc-vE-HdvLj.js} +4 -4
  43. package/src/assets/web-panel/assets/{MtcAudit-CuBvluaS.js → MtcAudit-CPLaekCd.js} +2 -2
  44. package/src/assets/web-panel/assets/{Multisig-BmXAA-Sb.js → Multisig-C_UP9C2o.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-ci2stZAe.js → NLProgramming-2nODJcU1.js} +1 -1
  46. package/src/assets/web-panel/assets/{Notes-D-1RpqnS.js → Notes-BhE-SJGu.js} +3 -3
  47. package/src/assets/web-panel/assets/{NotificationSettings-C0GyitIT.js → NotificationSettings-D21q7BNU.js} +1 -1
  48. package/src/assets/web-panel/assets/{OrderTableRenderer-U2bN-hj5.js → OrderTableRenderer-0b62GYOD.js} +1 -1
  49. package/src/assets/web-panel/assets/{Organization-BNZgpPci.js → Organization-CEqmw_sb.js} +4 -4
  50. package/src/assets/web-panel/assets/{Overflow-CDidKmUN.js → Overflow-MW-gMDO_.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-BnreBaXq.js → P2P-CY0hjI_G.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser-DwJUxO9j.js → PdhVaultBrowser-BbWh7Man.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-BQGgJPH0.js → Permissions-ChqEA_4Q.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-k_fSkCwL.js → PersonalDataHub-B3YrbYfD.js} +5 -5
  55. package/src/assets/web-panel/assets/{Pipeline-WGqKMqau.js → Pipeline-B8WBhhlW.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-DtHj9Ymq.js → Privacy-Cmb0PXNx.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-B3wH2SFC.js → ProjectInit-hF6zW3Nz.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-Cd0cgcA1.js → ProjectSettings-BFSVfpW0.js} +2 -2
  59. package/src/assets/web-panel/assets/Projects-DAWkVFkc.js +1 -0
  60. package/src/assets/web-panel/assets/{Providers-DTpxEXur.js → Providers-B8yux8Dx.js} +1 -1
  61. package/src/assets/web-panel/assets/{QrScannerModal-B2v6gR-C.js → QrScannerModal-N76cQluO.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-D3Nr9xXR.js → QuickAsk-ClvZ0KYR.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-C9inoMky.js → Recommend-B-GfgBpT.js} +1 -1
  64. package/src/assets/web-panel/assets/RemoteSession-mlglCdQi.js +5 -0
  65. package/src/assets/web-panel/assets/{Reputation-41KFG646.js → Reputation-DJIZzQeG.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-DqAaqqCv.js → Row-COzxu_bb.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-CMDpCDKc.js → RssFeed-CoYsJQuE.js} +3 -3
  68. package/src/assets/web-panel/assets/{Search-B6mtegNL.js → Search-DC77Mq9S.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-BaePFVZ8.js → Security-Loy2EdMO.js} +3 -3
  70. package/src/assets/web-panel/assets/{Services-DeG3Qscl.js → Services-GUD07Eu0.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-D_QP7F90.js → Skeleton-DWzkptYU.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-DLGyUgIA.js → Skills-CEDn1r-Z.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-BN2pxW1Q.js → Sla-ub_k4pXh.js} +1 -1
  74. package/src/assets/web-panel/assets/{SpeechSettings-BWsZPd8B.js → SpeechSettings-D7HLX9CA.js} +1 -1
  75. package/src/assets/web-panel/assets/{SyncSettings-VOZRPODW.js → SyncSettings-DbwOvl6m.js} +2 -2
  76. package/src/assets/web-panel/assets/Tasks-CBQzoAu5.js +1 -0
  77. package/src/assets/web-panel/assets/{Templates-eJSob-q0.js → Templates-BNVeIhud.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-Bdwk8Rwy.js → Tenant-PS9AzhXU.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-CsMLKIoV.js → Terminal-Cgb4eLB_.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-D5qkbPKT.js → TimelineRenderer-CrmXMOkg.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-DKgwn8hI.js → Tokens-DD-VDHw1.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-HlEHniGM.js → Trigger-BsoN_n-n.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-CdPcsBpN.js → Trust-n8LmN4ZV.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-vAdXd-vG.js → UkeySign-C9_7MImA.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-9hHBYFnH.js → VideoEditing-DyBteNgn.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-Dxh5d1yR.js → Wallet-BS5ixeXI.js} +4 -4
  87. package/src/assets/web-panel/assets/{WebAuthn-BsFmLHkp.js → WebAuthn-spc4UImU.js} +3 -3
  88. package/src/assets/web-panel/assets/{WorkflowEditor-Cn0OIwLn.js → WorkflowEditor-D7iVvaBO.js} +1 -1
  89. package/src/assets/web-panel/assets/chat-6CmBkHrL.js +1 -0
  90. package/src/assets/web-panel/assets/{colors-Du9jzLN0.js → colors-BGoCLkxI.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-DhEscfzw.js → compact-item-fYZBetMO.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-CwzEfF3i.js → createContext-BeM-1UVj.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-BzPwHnw8.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-DT_GSE6J.js → hasIn-CE7ZuEnV.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-53z1YUxX.js → index--lap6cf7.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-NA2oBLSB.js → index-ATcSr_2O.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DWL3SYN3.js → index-B2U-ObMq.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-D-QkW1fp.js → index-B3CDgvNW.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BF-ZCVGE.js → index-B4wiTEOM.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-D4kZoXNr.js → index-B8BsdNV_.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DnVVYKCE.js → index-BEVm0lCS.js} +10 -10
  102. package/src/assets/web-panel/assets/{index-DfRDyY1q.js → index-BNZDILcO.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-B8s5FxJY.js → index-BU_2qiDk.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BnHhFnwt.js → index-BV551878.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DhXay17G.js → index-BfPL-m46.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-B6QDWRLk.js → index-BowH1eLQ.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DN60VBn5.js → index-BsMfoaeo.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-Cnok8mhZ.js → index-BunaQCa0.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Dny_ZnAO.js → index-C0v6YKKO.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-D8gt0j7r.js → index-C4SJVjs4.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-Mobw3PHs.js → index-C9Y3k0HI.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-CAVW0cWM.js → index-CIpVrf5P.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-CyEhUJcu.js → index-CRLjEP1H.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DzjzrOli.js → index-CRnUE8Cb.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-D5IytTND.js → index-Cip8emOQ.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-BQWENaZf.js → index-CpIGIB85.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CQWxDOvM.js → index-D1r9tT3J.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-BrkJ7JPm.js → index-DT3zPSVX.js} +1 -1
  119. package/src/assets/web-panel/assets/index-DacrAdc-.js +1 -0
  120. package/src/assets/web-panel/assets/{index-BFD0cEna.js → index-De0quFDw.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-v5HLYCVa.js → index-DoXk5KJ8.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DtRwLhee.js → index-DsvfrESp.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BgSR2WMG.js → index-Dw1PyYPm.js} +1 -1
  124. package/src/assets/web-panel/assets/index-EHzNJozo.js +1 -0
  125. package/src/assets/web-panel/assets/{index-CGvgnfl9.js → index-MtOuq2i6.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-1LoutPJd.js → index-Puq6Luf1.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-tND8-TDU.js → index-QIpnpZgz.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-D3llLkYM.js → index-RMZ8a7Yt.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-C4SN3by5.js → index-WUrJ6S1j.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-VeHs6qH0.js → index-YjcumOZ4.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-Cc9aPkv-.js → index-lJBjB1QX.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-BIYTjbv_.js → index-ukg99D1V.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-gFjYdstW.js → index-zb7rVOhV.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-Cvt59c10.js → initDefaultProps-CYHMs1ag.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-D15pPEzl.js → motion-DDB2Ffk5.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-N55KeXJ7.js → move-Bg3cD-dX.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-CyFO1bYP.js → mtc-parser-B5nedjTS.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-B5IXfxU2.js → omit-BHyuUILu.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-CpVqsulV.js → pickAttrs-C9YQnEN9.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-ME36sMF3.js → placementArrow-DBUFYUe7.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-BXAIR1r-.js → responsiveObserve-nBs2Obnk.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-BkOX3-Dp.js → slide-DkCEaXNU.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-Cy4Aklpt.js → statusUtils-aqE1Wi6U.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-gUd2T206.js → styleChecker-CN5bhfHB.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-CaVD4o99.js → useFlexGapSupport-B_oX_kvJ.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs--pFGl0KD.js → useFs-rCuXHeme.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-D45iP86i.js → usePersonalDataHub-DZR9Abyd.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-BayoChH_.js → vnode-ConCYQlX.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-CpP38poi.js → zoom-CUdDxG5M.js} +1 -1
  150. package/src/assets/web-panel/index.html +1 -1
  151. package/src/commands/agent.js +4 -1
  152. package/src/commands/background-session.js +2 -1
  153. package/src/commands/context.js +69 -2
  154. package/src/data/changelog.json +13 -0
  155. package/src/gateways/ws/background-agent-protocol.js +38 -0
  156. package/src/gateways/ws/message-dispatcher.js +1 -0
  157. package/src/gateways/ws/remote-session-protocol.js +65 -6
  158. package/src/gateways/ws/ws-server.js +8 -1
  159. package/src/harness/feature-flags.js +15 -8
  160. package/src/harness/mcp-client.js +618 -43
  161. package/src/lazy-dispatch.js +30 -1
  162. package/src/lib/agent-authority.js +22 -0
  163. package/src/lib/agent-core.js +2 -0
  164. package/src/lib/agent-sandbox.js +161 -0
  165. package/src/lib/agent-team/team-runner.js +22 -0
  166. package/src/lib/artifact-store.js +35 -0
  167. package/src/lib/async-hook-supervisor.cjs +13 -2
  168. package/src/lib/audit-mtc.js +3 -2
  169. package/src/lib/background-agent-supervisor.js +104 -3
  170. package/src/lib/background-interaction-journal.js +407 -0
  171. package/src/lib/background-interaction-resolver.js +23 -34
  172. package/src/lib/background-session-transport.js +12 -2
  173. package/src/lib/capability-manifest.js +41 -3
  174. package/src/lib/capability-negotiation.js +1 -1
  175. package/src/lib/channels/channel-manager.js +33 -0
  176. package/src/lib/channels/telegram-channel.js +23 -5
  177. package/src/lib/channels/webhook-channel.js +38 -15
  178. package/src/lib/chrome-connector.js +169 -23
  179. package/src/lib/config-manager.js +23 -9
  180. package/src/lib/context-breakdown.js +31 -0
  181. package/src/lib/cowork-cron.js +274 -32
  182. package/src/lib/cross-chain-mtc.js +3 -2
  183. package/src/lib/durable-security-store.js +124 -0
  184. package/src/lib/event-runtime-host.js +67 -6
  185. package/src/lib/event-runtime-store.js +163 -0
  186. package/src/lib/goal-store.js +32 -12
  187. package/src/lib/headless-manifest.js +2 -1
  188. package/src/lib/hook-environment.cjs +58 -0
  189. package/src/lib/hook-manager.js +12 -5
  190. package/src/lib/hook-runner.cjs +122 -28
  191. package/src/lib/hook-runner.js +1 -0
  192. package/src/lib/hooks-v2-producers.js +36 -0
  193. package/src/lib/hooks-v2-runtime.js +329 -52
  194. package/src/lib/interaction-adapter.js +60 -19
  195. package/src/lib/interaction-binding.js +64 -0
  196. package/src/lib/json-schema-output.js +439 -14
  197. package/src/lib/json-schema-validate.js +514 -883
  198. package/src/lib/lan-pairing-tokens.js +115 -57
  199. package/src/lib/lsp/__tests__/lsp-client.test.js +32 -0
  200. package/src/lib/lsp/__tests__/lsp-manager.test.js +25 -0
  201. package/src/lib/lsp/lsp-client.js +4 -0
  202. package/src/lib/lsp/lsp-manager.js +3 -0
  203. package/src/lib/lsp/lsp-server-registry.js +18 -0
  204. package/src/lib/mcp-client.js +1 -0
  205. package/src/lib/mcp-oauth.js +35 -21
  206. package/src/lib/packer/pkg-config-generator.js +1 -0
  207. package/src/lib/permission-decision.js +99 -0
  208. package/src/lib/plugin-monitor-supervisor.js +3 -0
  209. package/src/lib/plugin-runtime/capabilities.js +50 -0
  210. package/src/lib/plugin-runtime/capability-consent.js +42 -35
  211. package/src/lib/plugin-runtime/hooks.js +36 -9
  212. package/src/lib/plugin-runtime/install.js +23 -7
  213. package/src/lib/plugin-runtime/lsp.js +4 -0
  214. package/src/lib/plugin-runtime/manifest.js +50 -2
  215. package/src/lib/plugin-runtime/mcp.js +30 -5
  216. package/src/lib/plugin-runtime/monitors.js +11 -0
  217. package/src/lib/plugin-runtime/plugin-options.js +94 -38
  218. package/src/lib/plugin-runtime/policy.js +29 -2
  219. package/src/lib/plugin-runtime/sandbox-policy.js +84 -0
  220. package/src/lib/plugin-runtime/scopes.js +7 -3
  221. package/src/lib/plugin-runtime/trust.js +36 -31
  222. package/src/lib/process-execution-broker/credential-agent.js +114 -16
  223. package/src/lib/process-execution-broker/credential-transport-worker.js +312 -0
  224. package/src/lib/process-execution-broker/credential-transport.js +378 -0
  225. package/src/lib/process-execution-broker/index.js +408 -19
  226. package/src/lib/process-execution-broker/platform-sandbox.js +561 -21
  227. package/src/lib/process-execution-broker/windows-sandbox.ps1 +999 -0
  228. package/src/lib/project-mcp-trust.js +21 -26
  229. package/src/lib/protocol-replay.js +19 -12
  230. package/src/lib/settings-hooks.cjs +13 -0
  231. package/src/lib/skill-loader.js +83 -10
  232. package/src/lib/sync-credentials.js +5 -4
  233. package/src/lib/turn-binding.js +8 -6
  234. package/src/repl/agent-repl.js +113 -28
  235. package/src/repl/repl-turn-binding.js +5 -2
  236. package/src/runtime/agent-core.js +331 -26
  237. package/src/runtime/coding-agent-contract-shared.cjs +3 -3
  238. package/src/runtime/headless-runner.js +101 -4
  239. package/src/runtime/headless-stream.js +209 -23
  240. package/src/runtime/mcp-config.js +29 -17
  241. package/src/runtime/policies/agent-policy.js +2 -0
  242. package/src/workers/background-agent-worker.js +128 -13
  243. package/src/assets/web-panel/assets/Projects-BbgmyQnS.js +0 -1
  244. package/src/assets/web-panel/assets/RemoteSession-Bqk3EYSu.js +0 -4
  245. package/src/assets/web-panel/assets/Tasks-3bDAUz8K.js +0 -1
  246. package/src/assets/web-panel/assets/chat-CJ19O6Dh.js +0 -1
  247. package/src/assets/web-panel/assets/devWarning-BBMFnsja.js +0 -1
  248. package/src/assets/web-panel/assets/index-Do8JMV4N.js +0 -1
  249. package/src/assets/web-panel/assets/index-UYAJ6iNM.js +0 -1
@@ -164,6 +164,22 @@ export function capabilityConsentRequired(managed, env) {
164
164
  );
165
165
  }
166
166
 
167
+ /**
168
+ * Require every loadable plugin to opt into the capability model with an
169
+ * explicit `permissions` block. Mandatory consent implies this gate: otherwise
170
+ * a legacy plugin could bypass consent simply by omitting the declaration.
171
+ */
172
+ export function capabilityDeclarationsRequired(managed, env) {
173
+ const runtimeEnv = env || process.env;
174
+ const raw = runtimeEnv.CC_REQUIRE_PLUGIN_CAPABILITIES;
175
+ if (raw != null && /^(1|true|yes|on)$/i.test(String(raw).trim())) return true;
176
+ return (
177
+ managed?.requirePluginCapabilityDeclarations === true ||
178
+ managed?.requirePluginCapabilityDeclarations === "require" ||
179
+ capabilityConsentRequired(managed, runtimeEnv)
180
+ );
181
+ }
182
+
167
183
  /**
168
184
  * Drop plugins that DECLARE capabilities but whose current capability SET has
169
185
  * not been consented (first request or any widening). Fail-closed: a consent
@@ -175,12 +191,23 @@ export function capabilityConsentRequired(managed, env) {
175
191
  * @param {Array<{name, scope, manifest}>} plugins
176
192
  * @returns {{ kept: Array, dropped: Array<{name, reason}> }}
177
193
  */
178
- export function filterByCapabilityConsent(plugins) {
194
+ export function filterByCapabilityConsent(
195
+ plugins,
196
+ { requireDeclarations = false } = {},
197
+ ) {
179
198
  const kept = [];
180
199
  const dropped = [];
181
200
  for (const p of plugins) {
182
201
  if (!p.manifest?.capabilitiesDeclared) {
183
- kept.push(p); // legacy plugin, no declaration → not gated
202
+ if (requireDeclarations) {
203
+ dropped.push({
204
+ name: p.name,
205
+ reason:
206
+ "capability declaration required: add an explicit `permissions` block to plugin.json",
207
+ });
208
+ } else {
209
+ kept.push(p); // migration window: legacy declaration remains compatible
210
+ }
184
211
  continue;
185
212
  }
186
213
  let consented = false;
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Normalize the small, declarative sandbox contract exposed to plugins.
3
+ *
4
+ * Plugins may require filesystem and/or network isolation for processes they
5
+ * cause the CLI to spawn. They may not select a sandbox profile or claim other
6
+ * broker guarantees. Keeping this layer narrower than ProcessExecutionBroker's
7
+ * internal contract prevents plugin-controlled policy from weakening managed
8
+ * defaults while still allowing an explicit requirement to fail closed.
9
+ */
10
+
11
+ export const PLUGIN_SANDBOX_BOUNDARIES = Object.freeze([
12
+ "filesystem",
13
+ "network",
14
+ ]);
15
+
16
+ const SUPPORTED_BOUNDARIES = new Set(PLUGIN_SANDBOX_BOUNDARIES);
17
+
18
+ function invalidPolicy(message) {
19
+ const error = new Error(message);
20
+ error.code = "ERR_PLUGIN_SANDBOX_POLICY_INVALID";
21
+ return error;
22
+ }
23
+
24
+ /**
25
+ * @param {unknown} raw
26
+ * @param {{ label?: string }} [opts]
27
+ * @returns {{requiredBoundaries: string[]}|null}
28
+ */
29
+ export function normalizePluginSandboxPolicy(raw, opts = {}) {
30
+ const label = opts.label || "sandboxPolicy";
31
+ if (raw === undefined || raw === null) return null;
32
+ if (typeof raw !== "object" || Array.isArray(raw)) {
33
+ throw invalidPolicy(`${label} must be an object`);
34
+ }
35
+ const unsupportedKeys = Object.keys(raw).filter(
36
+ (key) => key !== "requiredBoundaries",
37
+ );
38
+ if (unsupportedKeys.length > 0) {
39
+ throw invalidPolicy(
40
+ `${label} contains unsupported field: ${unsupportedKeys[0]}`,
41
+ );
42
+ }
43
+
44
+ const boundaries = raw.requiredBoundaries;
45
+ if (boundaries === undefined) return null;
46
+ if (!Array.isArray(boundaries)) {
47
+ throw invalidPolicy(`${label}.requiredBoundaries must be an array`);
48
+ }
49
+
50
+ const requiredBoundaries = [];
51
+ for (const boundary of boundaries) {
52
+ if (
53
+ typeof boundary !== "string" ||
54
+ !SUPPORTED_BOUNDARIES.has(boundary)
55
+ ) {
56
+ throw invalidPolicy(
57
+ `${label}.requiredBoundaries contains unsupported boundary: ${String(boundary)}`,
58
+ );
59
+ }
60
+ if (!requiredBoundaries.includes(boundary)) {
61
+ requiredBoundaries.push(boundary);
62
+ }
63
+ }
64
+
65
+ return requiredBoundaries.length > 0 ? { requiredBoundaries } : null;
66
+ }
67
+
68
+ /**
69
+ * Merge manifest/component/descriptor requirements additively. A child
70
+ * descriptor can require more isolation, but cannot remove a manifest-level
71
+ * requirement.
72
+ */
73
+ export function mergePluginSandboxPolicies(...policies) {
74
+ const requiredBoundaries = [];
75
+ for (const raw of policies) {
76
+ const policy = normalizePluginSandboxPolicy(raw);
77
+ for (const boundary of policy?.requiredBoundaries || []) {
78
+ if (!requiredBoundaries.includes(boundary)) {
79
+ requiredBoundaries.push(boundary);
80
+ }
81
+ }
82
+ }
83
+ return requiredBoundaries.length > 0 ? { requiredBoundaries } : null;
84
+ }
@@ -29,6 +29,7 @@ import {
29
29
  filterByManagedPolicy,
30
30
  filterByCapabilityConsent,
31
31
  capabilityConsentRequired,
32
+ capabilityDeclarationsRequired,
32
33
  warnDroppedOnce,
33
34
  } from "./policy.js";
34
35
 
@@ -163,9 +164,10 @@ export function discoverPlugins(opts = {}) {
163
164
  managedSettingsFile: opts.managedSettingsFile,
164
165
  });
165
166
  const consentGate = capabilityConsentRequired(managed, opts.env);
167
+ const declarationsGate = capabilityDeclarationsRequired(managed, opts.env);
166
168
  // Default (no managed policy AND consent enforcement off): byte-identical —
167
169
  // return every discovered plugin, exactly as before.
168
- if (!managed && !consentGate) return all;
170
+ if (!managed && !consentGate && !declarationsGate) return all;
169
171
  let list = all;
170
172
  if (managed) {
171
173
  const { kept, dropped } = filterByManagedPolicy(list, managed);
@@ -174,8 +176,10 @@ export function discoverPlugins(opts = {}) {
174
176
  }
175
177
  // Capability-consent enforcement funnels through the SAME chokepoint, so an
176
178
  // un-consented plugin loads NONE of its six component types (opt-in).
177
- if (consentGate) {
178
- const { kept, dropped } = filterByCapabilityConsent(list);
179
+ if (consentGate || declarationsGate) {
180
+ const { kept, dropped } = filterByCapabilityConsent(list, {
181
+ requireDeclarations: declarationsGate,
182
+ });
179
183
  if (dropped.length > 0) warnDroppedOnce(dropped);
180
184
  list = kept;
181
185
  }
@@ -21,16 +21,17 @@
21
21
  * running untrusted SHELL/binaries behind the user's back.
22
22
  */
23
23
 
24
- import fs from "fs";
25
24
  import path from "path";
26
25
  import { getElectronUserDataDir } from "../paths.js";
26
+ import { withFileLock } from "../with-file-lock.js";
27
+ import {
28
+ mutateSecurityStore,
29
+ readSecurityStore,
30
+ } from "../durable-security-store.js";
27
31
 
28
32
  export const _deps = {
29
- existsSync: fs.existsSync,
30
- readFileSync: fs.readFileSync,
31
- writeFileSync: fs.writeFileSync,
32
- mkdirSync: fs.mkdirSync,
33
33
  now: () => new Date().toISOString(),
34
+ withFileLock,
34
35
  // Path of the trust store; injectable so unit tests never touch the real
35
36
  // user-data dir.
36
37
  storePath: () => path.join(getElectronUserDataDir(), "plugin-trust.json"),
@@ -39,20 +40,7 @@ export const _deps = {
39
40
  const AUTO_TRUSTED_SCOPES = new Set(["user", "local"]);
40
41
 
41
42
  export function loadTrustStore() {
42
- try {
43
- const p = _deps.storePath();
44
- if (!_deps.existsSync(p)) return {};
45
- const data = JSON.parse(_deps.readFileSync(p, "utf8"));
46
- return data && typeof data === "object" && !Array.isArray(data) ? data : {};
47
- } catch {
48
- return {};
49
- }
50
- }
51
-
52
- function saveTrustStore(store) {
53
- const p = _deps.storePath();
54
- _deps.mkdirSync(path.dirname(p), { recursive: true });
55
- _deps.writeFileSync(p, JSON.stringify(store, null, 2), "utf8");
43
+ return readSecurityStore(_deps.storePath(), "plugin trust");
56
44
  }
57
45
 
58
46
  function trustKey(scope, name) {
@@ -66,27 +54,44 @@ function trustKey(scope, name) {
66
54
  export function isPluginTrusted(plugin) {
67
55
  if (!plugin || !plugin.name) return false;
68
56
  if (AUTO_TRUSTED_SCOPES.has(plugin.scope)) return true;
69
- const entry = loadTrustStore()[trustKey(plugin.scope, plugin.name)];
70
- return Boolean(entry && entry.version === plugin.version);
57
+ try {
58
+ const entry = loadTrustStore()[trustKey(plugin.scope, plugin.name)];
59
+ return Boolean(entry && entry.version === plugin.version);
60
+ } catch {
61
+ // Project code must stay disabled when the trust store is unavailable.
62
+ return false;
63
+ }
71
64
  }
72
65
 
73
66
  /** Trust a plugin (records the exact version). */
74
67
  export function trustPlugin(name, { scope = "project", version } = {}) {
75
68
  if (!version) throw new Error("trustPlugin requires a version");
76
- const store = loadTrustStore();
77
- store[trustKey(scope, name)] = { version, trustedAt: _deps.now() };
78
- saveTrustStore(store);
79
- return { name, scope, version };
69
+ const file = _deps.storePath();
70
+ return mutateSecurityStore(
71
+ file,
72
+ "plugin trust",
73
+ (store) => {
74
+ store[trustKey(scope, name)] = { version, trustedAt: _deps.now() };
75
+ return { name, scope, version };
76
+ },
77
+ { lock: _deps.withFileLock },
78
+ );
80
79
  }
81
80
 
82
81
  /** Revoke trust for a plugin at a scope. */
83
82
  export function untrustPlugin(name, { scope = "project" } = {}) {
84
- const store = loadTrustStore();
85
- const key = trustKey(scope, name);
86
- const existed = Object.prototype.hasOwnProperty.call(store, key);
87
- delete store[key];
88
- saveTrustStore(store);
89
- return { name, scope, removed: existed };
83
+ const file = _deps.storePath();
84
+ return mutateSecurityStore(
85
+ file,
86
+ "plugin trust",
87
+ (store) => {
88
+ const key = trustKey(scope, name);
89
+ const existed = Object.prototype.hasOwnProperty.call(store, key);
90
+ delete store[key];
91
+ return { name, scope, removed: existed };
92
+ },
93
+ { lock: _deps.withFileLock },
94
+ );
90
95
  }
91
96
 
92
97
  /** All trust entries (for `cc plugin trust --list`). */
@@ -6,12 +6,14 @@
6
6
  * receives short-lived opaque references. Resolving a reference requires an
7
7
  * attested agent id and the exact process/host target recorded at issuance.
8
8
  *
9
- * This module deliberately does not claim to provide an OS IPC transport. A
10
- * future broker-owned IPC implementation can call resolveCredentialRef() after
11
- * it has authenticated the requesting process and destination host.
9
+ * The production singleton also mirrors issued references into a broker-owned
10
+ * authenticated local transport. Per-launch capability tokens bind resolution
11
+ * to the approved process and destination host without putting credential
12
+ * values in the child environment or argv.
12
13
  */
13
14
 
14
15
  import crypto from "node:crypto";
16
+ import { CredentialTransport } from "./credential-transport.js";
15
17
 
16
18
  const REDACTED_VALUE = "***REDACTED***";
17
19
  const DEFAULT_TTL_MS = 60_000;
@@ -33,6 +35,7 @@ const CREDENTIAL_ERROR_CODES = Object.freeze({
33
35
  REVOKED: "CC_CREDENTIAL_REF_REVOKED",
34
36
  AGENT_MISMATCH: "CC_CREDENTIAL_AGENT_MISMATCH",
35
37
  TARGET_MISMATCH: "CC_CREDENTIAL_TARGET_MISMATCH",
38
+ TRANSPORT_UNAVAILABLE: "CC_CREDENTIAL_TRANSPORT_UNAVAILABLE",
36
39
  });
37
40
 
38
41
  // Patterns for environment variables that contain secrets.
@@ -126,6 +129,10 @@ const RESERVED_AGENT_ENV_KEYS = new Set([
126
129
  "CC_CREDENTIAL_AGENT_ID",
127
130
  "CC_CREDENTIAL_PROXY",
128
131
  "CC_CREDENTIAL_TRANSPORT",
132
+ "CC_CREDENTIAL_ENDPOINT",
133
+ "CC_CREDENTIAL_AUTH_TOKEN",
134
+ "CC_CREDENTIAL_TARGET_PROCESS",
135
+ "CC_CREDENTIAL_TARGET_HOST",
129
136
  ]);
130
137
 
131
138
  function credentialError(code, message) {
@@ -251,9 +258,21 @@ class CredentialAgent {
251
258
  Number.MAX_SAFE_INTEGER,
252
259
  );
253
260
 
254
- // "broker-api" is an in-process primitive, not a socket/pipe endpoint.
255
- this._transport = "broker-api";
256
- this._proxyReady = false;
261
+ this._transportMode = "broker-api";
262
+ this._credentialTransport = null;
263
+ if (options.transport) {
264
+ this._credentialTransport =
265
+ options.transport === true
266
+ ? new CredentialTransport({
267
+ agentId: this._agentId,
268
+ onAudit: (entry) => this._recordAudit(entry),
269
+ onSettlement: (settlement) =>
270
+ this._applyTransportSettlement(settlement),
271
+ })
272
+ : options.transport;
273
+ this._transportMode =
274
+ this._credentialTransport?.version || "local-ipc-v1";
275
+ }
257
276
  this._lastEnabledState = this._computeEnabled();
258
277
  }
259
278
 
@@ -270,10 +289,11 @@ class CredentialAgent {
270
289
 
271
290
  if (!enabled) {
272
291
  let revoked = 0;
273
- for (const record of this._credentialStore.values()) {
292
+ for (const [refId, record] of this._credentialStore) {
274
293
  if (record.status === "active") {
275
294
  record.value = null;
276
295
  record.status = "disabled";
296
+ this._credentialTransport?.revokeCredential(refId);
277
297
  revoked += 1;
278
298
  }
279
299
  }
@@ -387,6 +407,19 @@ class CredentialAgent {
387
407
  }
388
408
  }
389
409
 
410
+ _applyTransportSettlement(settlement) {
411
+ const record = this._credentialStore.get(settlement?.refId);
412
+ if (!record || record.status !== "active") return;
413
+ const useCount = Number(settlement.useCount);
414
+ if (Number.isFinite(useCount) && useCount > record.useCount) {
415
+ record.useCount = useCount;
416
+ }
417
+ if (settlement.status && settlement.status !== "active") {
418
+ record.status = settlement.status;
419
+ record.value = null;
420
+ }
421
+ }
422
+
390
423
  _ensureStoreCapacity() {
391
424
  this._expireStaleCredentials();
392
425
  if (this._credentialStore.size < this._maxCredentials) return;
@@ -447,6 +480,9 @@ class CredentialAgent {
447
480
  "Credential maxUses",
448
481
  ),
449
482
  origin: String(request.origin ?? "unknown"),
483
+ capabilityToken: request.capabilityToken
484
+ ? String(request.capabilityToken)
485
+ : null,
450
486
  };
451
487
  }
452
488
 
@@ -556,6 +592,38 @@ class CredentialAgent {
556
592
  target: normalized.target,
557
593
  approvalFingerprint: this._fingerprint(normalized.approvalId),
558
594
  });
595
+ if (this._credentialTransport && normalized.capabilityToken) {
596
+ try {
597
+ this._credentialTransport.registerCredential({
598
+ refId,
599
+ key: normalized.key,
600
+ value: normalized.value,
601
+ target: normalized.target,
602
+ createdAt,
603
+ expiresAt: createdAt + normalized.ttlMs,
604
+ maxUses: normalized.maxUses,
605
+ useCount: 0,
606
+ status: "active",
607
+ capabilityToken: normalized.capabilityToken,
608
+ });
609
+ } catch (error) {
610
+ const record = this._credentialStore.get(refId);
611
+ record.value = null;
612
+ record.status = "revoked";
613
+ this._recordAudit({
614
+ event: "credential_ref_issue",
615
+ outcome: "denied",
616
+ reason: CREDENTIAL_ERROR_CODES.TRANSPORT_UNAVAILABLE,
617
+ key: normalized.key,
618
+ target: normalized.target,
619
+ refFingerprint: this._fingerprint(refId),
620
+ });
621
+ throw credentialError(
622
+ CREDENTIAL_ERROR_CODES.TRANSPORT_UNAVAILABLE,
623
+ error?.message || "Credential transport is unavailable",
624
+ );
625
+ }
626
+ }
559
627
  this._recordAudit({
560
628
  event: "credential_ref_issue",
561
629
  outcome: "allowed",
@@ -695,6 +763,7 @@ class CredentialAgent {
695
763
  record.value = null;
696
764
  record.status = "exhausted";
697
765
  }
766
+ this._credentialTransport?.updateCredential(refId, record);
698
767
  this._recordAudit({
699
768
  event: "credential_ref_resolve",
700
769
  outcome: "allowed",
@@ -717,6 +786,7 @@ class CredentialAgent {
717
786
  if (!record) return false;
718
787
  record.value = null;
719
788
  record.status = "revoked";
789
+ this._credentialTransport?.revokeCredential(refId);
720
790
  this._recordAudit({
721
791
  event: "credential_ref_revoke",
722
792
  outcome: "allowed",
@@ -786,9 +856,18 @@ class CredentialAgent {
786
856
  );
787
857
  }
788
858
 
789
- _setReferenceMarkers(safeEnv) {
859
+ _setReferenceMarkers(safeEnv, context) {
790
860
  safeEnv.CC_CREDENTIAL_AGENT_ID = this._agentId;
791
- safeEnv.CC_CREDENTIAL_TRANSPORT = this._transport;
861
+ safeEnv.CC_CREDENTIAL_TRANSPORT = this._transportMode;
862
+ if (this._credentialTransport && context?.capabilityToken) {
863
+ safeEnv.CC_CREDENTIAL_ENDPOINT = this._credentialTransport.endpoint;
864
+ safeEnv.CC_CREDENTIAL_AUTH_TOKEN = context.capabilityToken;
865
+ safeEnv.CC_CREDENTIAL_TARGET_PROCESS = normalizeProcessTarget(
866
+ context.target?.process ?? context.process,
867
+ );
868
+ const host = normalizeHostTarget(context.target?.host ?? context.host);
869
+ if (host) safeEnv.CC_CREDENTIAL_TARGET_HOST = host;
870
+ }
792
871
  }
793
872
 
794
873
  /**
@@ -830,7 +909,7 @@ class CredentialAgent {
830
909
  redacted.push(entry);
831
910
  }
832
911
 
833
- if (refsIssued > 0) this._setReferenceMarkers(safeEnv);
912
+ if (refsIssued > 0) this._setReferenceMarkers(safeEnv, context);
834
913
  return {
835
914
  safeEnv,
836
915
  redacted,
@@ -984,7 +1063,17 @@ class CredentialAgent {
984
1063
  );
985
1064
  }
986
1065
 
987
- const context = this._contextForSpawn(spawnOptions);
1066
+ let context = this._contextForSpawn(spawnOptions);
1067
+ if (
1068
+ this._credentialTransport &&
1069
+ this.isEnabled() &&
1070
+ this._canIssueForContext(context)
1071
+ ) {
1072
+ context = {
1073
+ ...context,
1074
+ capabilityToken: this._credentialTransport.createCapabilityToken(),
1075
+ };
1076
+ }
988
1077
  const env = spawnOptions.env || process.env;
989
1078
  const {
990
1079
  safeEnv,
@@ -1019,7 +1108,7 @@ class CredentialAgent {
1019
1108
  }
1020
1109
 
1021
1110
  const refsIssued = envRefsIssued + argRefsIssued;
1022
- if (refsIssued > 0) this._setReferenceMarkers(safeEnv);
1111
+ if (refsIssued > 0) this._setReferenceMarkers(safeEnv, context);
1023
1112
  spawnOptions.env = safeEnv;
1024
1113
  spawnOptions.args = sanitizedArgs;
1025
1114
 
@@ -1094,6 +1183,14 @@ class CredentialAgent {
1094
1183
  this._accessLog = [];
1095
1184
  }
1096
1185
 
1186
+ waitForTransportReady() {
1187
+ return this._credentialTransport?.waitUntilReady() ?? Promise.resolve(null);
1188
+ }
1189
+
1190
+ closeTransport() {
1191
+ return this._credentialTransport?.close() ?? Promise.resolve();
1192
+ }
1193
+
1097
1194
  /**
1098
1195
  * Get credential agent info for status reporting. No raw references or
1099
1196
  * credential values are included.
@@ -1111,9 +1208,10 @@ class CredentialAgent {
1111
1208
  mode: this._lastEnabledState
1112
1209
  ? "broker-reference"
1113
1210
  : "redact-only-disabled",
1114
- transport: this._transport,
1115
- proxyReady: this._proxyReady,
1116
- ipcAvailable: false,
1211
+ transport: this._transportMode,
1212
+ proxyReady: this._credentialTransport?.ready === true,
1213
+ ipcAvailable: this._credentialTransport?.isAvailable() === true,
1214
+ transportInfo: this._credentialTransport?.getInfo() || null,
1117
1215
  credentialsTracked: this._credentialStore.size,
1118
1216
  activeCredentials: statusCounts.active || 0,
1119
1217
  accessCount: this._accessLog.length,
@@ -1126,7 +1224,7 @@ class CredentialAgent {
1126
1224
  }
1127
1225
  }
1128
1226
 
1129
- const credentialAgent = new CredentialAgent();
1227
+ const credentialAgent = new CredentialAgent({ transport: true });
1130
1228
 
1131
1229
  export {
1132
1230
  credentialAgent,