chainlesschain 0.162.179 → 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 (251) 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-BF13YdB-.js → AIOps-cq0dwbnf.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-B9y67AjF.js → ActionButton-CvcgGl3w.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-FcdDHoSC.js → Analytics-hM2-jFqg.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-CRm_zwSp.js → AppLayout-B9_Gsd_g.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-Cbo7-usf.js → Artifacts-B7bu52Og.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-vMaLpkHC.js → Audit-DThfDgqB.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-FiUY692t.js → BackgroundAgents-DjlFiD4v.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-BK80j_GQ.js → Backup-CK9xJKnG.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-ChNMuYR1.js → BaseInput-DEiSU8K8.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-928UREpm.js → Chat-CpT96czj.js} +5 -5
  13. package/src/assets/web-panel/assets/ChatBubbleRenderer-BKPPNmZI.js +1 -0
  14. package/src/assets/web-panel/assets/{Checkbox-dFW-zDbe.js → Checkbox-C1GfDnO0.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-BCcNJUj2.js → Codegen-3DAKgiLx.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-DcEkLv70.js → Col-74cOwZU1.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-DihBRRqg.js → Community-tn9Kkz9j.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-DGYxwWET.js → Compact-BcoXH7m4.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-OnYe1vS4.js → Compliance-DIPGUBgi.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-CmWB54c2.js → Cowork-doD5_91c.js} +2 -2
  21. package/src/assets/web-panel/assets/{Cron-BrANb2uw.js → Cron-C-IDvubz.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-2HgWzSxg.js → Crosschain-CdcCoBdj.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-DdDwNI6K.js → DID-DdH5aMMA.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-D6PnE78-.js → Dashboard-DHLA4mm0.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-ClzvSN4O.js → Dropdown-dEeCt7Md.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-BUk9B727.js → EmailListRenderer-BMaecFv9.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-C8hi3v7i.js → FamilyGuardDashboard-DUaUukTN.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-B5SP8xkg.js → Federation-CMBE0_rp.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-DWzJ8AU5.js → FormItemContext-PG-JDbXq.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-3E3Q3rjG.js → GenericCardRenderer-Bcb0p88m.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-z8IdCMId.js → Git-Bgv15myB.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-CgqCF9lX.js → Governance-DB8YTArI.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-zgS-AuH9.js → Inference-BQMwCWaS.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-BdbgmESJ.js → KnowledgeGraph-B1_ZziiB.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-BHpknnjy.js → Logs-DovEEnt_.js} +2 -2
  36. package/src/assets/web-panel/assets/MarkdownRenderer-D201OL4T.js +1 -0
  37. package/src/assets/web-panel/assets/{Marketplace-Di9sAR7j.js → Marketplace-BlCXSpyB.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-DtnR9Z_A.js → McpTools-CsCR09Wj.js} +5 -5
  39. package/src/assets/web-panel/assets/{Memory-BaX9uuXD.js → Memory-CBVRLKno.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-xelyKWTY.js → MobileBridge-C9OIafgA.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-BiFTOGBN.js → MobileProjects-D_zoJ8Xs.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-bV3OzTiO.js → Mtc-vE-HdvLj.js} +4 -4
  43. package/src/assets/web-panel/assets/{MtcAudit-BkwvFTdZ.js → MtcAudit-CPLaekCd.js} +2 -2
  44. package/src/assets/web-panel/assets/{Multisig-_6HQQ-oC.js → Multisig-C_UP9C2o.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-BBYhmWQZ.js → NLProgramming-2nODJcU1.js} +1 -1
  46. package/src/assets/web-panel/assets/{Notes-Cq-6dQnU.js → Notes-BhE-SJGu.js} +3 -3
  47. package/src/assets/web-panel/assets/{NotificationSettings-ILZ9zkX6.js → NotificationSettings-D21q7BNU.js} +1 -1
  48. package/src/assets/web-panel/assets/{OrderTableRenderer-DgmTBEvk.js → OrderTableRenderer-0b62GYOD.js} +1 -1
  49. package/src/assets/web-panel/assets/{Organization-CkLnWwCk.js → Organization-CEqmw_sb.js} +4 -4
  50. package/src/assets/web-panel/assets/{Overflow-CWVHZbhf.js → Overflow-MW-gMDO_.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-BXbqETkr.js → P2P-CY0hjI_G.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser--0JR-0ex.js → PdhVaultBrowser-BbWh7Man.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-Cz9_tfSy.js → Permissions-ChqEA_4Q.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-Dq7OWYtx.js → PersonalDataHub-B3YrbYfD.js} +5 -5
  55. package/src/assets/web-panel/assets/{Pipeline-DHPUNcc-.js → Pipeline-B8WBhhlW.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-CEAbrDkS.js → Privacy-Cmb0PXNx.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-CJYfclXE.js → ProjectInit-hF6zW3Nz.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-oCTgPCgp.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-BLTZtzTG.js → Providers-B8yux8Dx.js} +1 -1
  61. package/src/assets/web-panel/assets/{QrScannerModal-C0b0TQB3.js → QrScannerModal-N76cQluO.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-tOl6N_gM.js → QuickAsk-ClvZ0KYR.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-DPzKr8yr.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-Cji1Vl79.js → Reputation-DJIZzQeG.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-D-NERWf2.js → Row-COzxu_bb.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-DzlgmAlB.js → RssFeed-CoYsJQuE.js} +3 -3
  68. package/src/assets/web-panel/assets/{Search-Cs0SWSa4.js → Search-DC77Mq9S.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-DL7EzcUO.js → Security-Loy2EdMO.js} +4 -4
  70. package/src/assets/web-panel/assets/{Services-CT-PzgTd.js → Services-GUD07Eu0.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-tByJWdJg.js → Skeleton-DWzkptYU.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-Dnr_6TTl.js → Skills-CEDn1r-Z.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-4O-yq0LY.js → Sla-ub_k4pXh.js} +1 -1
  74. package/src/assets/web-panel/assets/{SpeechSettings-BYBVg1oR.js → SpeechSettings-D7HLX9CA.js} +1 -1
  75. package/src/assets/web-panel/assets/{SyncSettings-CpOYPbE5.js → SyncSettings-DbwOvl6m.js} +2 -2
  76. package/src/assets/web-panel/assets/{Tasks-CGVhOVh6.js → Tasks-CBQzoAu5.js} +1 -1
  77. package/src/assets/web-panel/assets/{Templates-BuHFxR4X.js → Templates-BNVeIhud.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-DxDxHzgf.js → Tenant-PS9AzhXU.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-B9g_nISg.js → Terminal-Cgb4eLB_.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-DlrBC_4A.js → TimelineRenderer-CrmXMOkg.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-DvBlYZ6i.js → Tokens-DD-VDHw1.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-Dg8G9bhF.js → Trigger-BsoN_n-n.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-COICx4E-.js → Trust-n8LmN4ZV.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-B4pOBv7T.js → UkeySign-C9_7MImA.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-Qt4NMA8Q.js → VideoEditing-DyBteNgn.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-X1EkQc2Z.js → Wallet-BS5ixeXI.js} +4 -4
  87. package/src/assets/web-panel/assets/{WebAuthn-CyeEFBE5.js → WebAuthn-spc4UImU.js} +3 -3
  88. package/src/assets/web-panel/assets/{WorkflowEditor-nwzbMiVQ.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-5Isz5lhJ.js → colors-BGoCLkxI.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-DsFQS3Oy.js → compact-item-fYZBetMO.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-OcEXp2uz.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-CZvC4p09.js → hasIn-CE7ZuEnV.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-BF1sab0Q.js → index--lap6cf7.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-C7yeL3rf.js → index-ATcSr_2O.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-VkFXA9N-.js → index-B2U-ObMq.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DSmGGg5h.js → index-B3CDgvNW.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-jrNIrpq4.js → index-B4wiTEOM.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-B8ibl7bc.js → index-B8BsdNV_.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DOLozRk8.js → index-BEVm0lCS.js} +10 -10
  102. package/src/assets/web-panel/assets/{index-BPgc_bdR.js → index-BNZDILcO.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BTZZzlMO.js → index-BU_2qiDk.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-Vubi6Tf5.js → index-BV551878.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-nXrnztXp.js → index-BfPL-m46.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CN8lPVpQ.js → index-BowH1eLQ.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BgE2BZl2.js → index-BsMfoaeo.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-Cd5b2JHB.js → index-BunaQCa0.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CQlGw0nQ.js → index-C0v6YKKO.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Do6FJK32.js → index-C4SJVjs4.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-Bqvo1f9T.js → index-C9Y3k0HI.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-LUdgPZg9.js → index-CIpVrf5P.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-BpD2O7_p.js → index-CRLjEP1H.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-r_9NG6P7.js → index-CRnUE8Cb.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-FIgMAfBh.js → index-Cip8emOQ.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-RsQ1lFDV.js → index-CpIGIB85.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DGJupV0S.js → index-D1r9tT3J.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-BpglwPWl.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-CG3B2wCF.js → index-De0quFDw.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CxA2PDK1.js → index-DoXk5KJ8.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DaGKOVvQ.js → index-DsvfrESp.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-C7CtJYXq.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-Bu9NXvIa.js → index-MtOuq2i6.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-BsZkTaa3.js → index-Puq6Luf1.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CPE4zHXF.js → index-QIpnpZgz.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-Bsb-iylv.js → index-RMZ8a7Yt.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DMtGRQqw.js → index-WUrJ6S1j.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-C3lWvhk4.js → index-YjcumOZ4.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CmVbCGx_.js → index-lJBjB1QX.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-A5SHQW_M.js → index-ukg99D1V.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-CFJgt6qM.js → index-zb7rVOhV.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-Cdgep9YT.js → initDefaultProps-CYHMs1ag.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-7yn1ACEm.js → motion-DDB2Ffk5.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-D8o133Xc.js → move-Bg3cD-dX.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-CClHIG9V.js → mtc-parser-B5nedjTS.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-CLnrPE2d.js → omit-BHyuUILu.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-1CTWoZWl.js → pickAttrs-C9YQnEN9.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-xNNtS4Sp.js → placementArrow-DBUFYUe7.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-ypzAofs7.js → responsiveObserve-nBs2Obnk.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-QsrY9UwD.js → slide-DkCEaXNU.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-DSdThzOB.js → statusUtils-aqE1Wi6U.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-B_kKM8Ob.js → styleChecker-CN5bhfHB.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-CcdTBNV9.js → useFlexGapSupport-B_oX_kvJ.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-BuAH2XFU.js → useFs-rCuXHeme.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-B3zWiG4A.js → usePersonalDataHub-DZR9Abyd.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-B45Rc-CQ.js → vnode-ConCYQlX.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-DaYZDU5f.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/commands/hub.js +30 -24
  155. package/src/data/changelog.json +27 -1
  156. package/src/gateways/ws/background-agent-protocol.js +38 -0
  157. package/src/gateways/ws/message-dispatcher.js +1 -0
  158. package/src/gateways/ws/remote-session-protocol.js +65 -6
  159. package/src/gateways/ws/ws-server.js +8 -1
  160. package/src/harness/feature-flags.js +15 -8
  161. package/src/harness/mcp-client.js +618 -43
  162. package/src/lazy-dispatch.js +30 -1
  163. package/src/lib/agent-authority.js +22 -0
  164. package/src/lib/agent-core.js +2 -0
  165. package/src/lib/agent-sandbox.js +161 -0
  166. package/src/lib/agent-team/team-runner.js +22 -0
  167. package/src/lib/artifact-store.js +35 -0
  168. package/src/lib/async-hook-supervisor.cjs +13 -2
  169. package/src/lib/audit-mtc.js +3 -2
  170. package/src/lib/background-agent-supervisor.js +104 -3
  171. package/src/lib/background-interaction-journal.js +407 -0
  172. package/src/lib/background-interaction-resolver.js +23 -34
  173. package/src/lib/background-session-transport.js +12 -2
  174. package/src/lib/capability-manifest.js +41 -3
  175. package/src/lib/capability-negotiation.js +1 -1
  176. package/src/lib/channels/channel-manager.js +33 -0
  177. package/src/lib/channels/telegram-channel.js +23 -5
  178. package/src/lib/channels/webhook-channel.js +38 -15
  179. package/src/lib/chrome-connector.js +169 -23
  180. package/src/lib/config-manager.js +23 -9
  181. package/src/lib/context-breakdown.js +31 -0
  182. package/src/lib/cowork-cron.js +274 -32
  183. package/src/lib/cross-chain-mtc.js +3 -2
  184. package/src/lib/durable-security-store.js +124 -0
  185. package/src/lib/event-runtime-host.js +67 -6
  186. package/src/lib/event-runtime-store.js +163 -0
  187. package/src/lib/goal-store.js +32 -12
  188. package/src/lib/headless-manifest.js +2 -1
  189. package/src/lib/hook-environment.cjs +58 -0
  190. package/src/lib/hook-manager.js +12 -5
  191. package/src/lib/hook-runner.cjs +122 -28
  192. package/src/lib/hook-runner.js +1 -0
  193. package/src/lib/hooks-v2-producers.js +36 -0
  194. package/src/lib/hooks-v2-runtime.js +329 -52
  195. package/src/lib/interaction-adapter.js +60 -19
  196. package/src/lib/interaction-binding.js +64 -0
  197. package/src/lib/json-schema-output.js +439 -14
  198. package/src/lib/json-schema-validate.js +514 -883
  199. package/src/lib/lan-pairing-tokens.js +115 -57
  200. package/src/lib/lsp/__tests__/lsp-client.test.js +32 -0
  201. package/src/lib/lsp/__tests__/lsp-manager.test.js +25 -0
  202. package/src/lib/lsp/lsp-client.js +4 -0
  203. package/src/lib/lsp/lsp-manager.js +3 -0
  204. package/src/lib/lsp/lsp-server-registry.js +18 -0
  205. package/src/lib/mcp-client.js +1 -0
  206. package/src/lib/mcp-oauth.js +35 -21
  207. package/src/lib/packer/pkg-config-generator.js +1 -0
  208. package/src/lib/permission-decision.js +99 -0
  209. package/src/lib/plugin-monitor-supervisor.js +3 -0
  210. package/src/lib/plugin-runtime/capabilities.js +50 -0
  211. package/src/lib/plugin-runtime/capability-consent.js +42 -35
  212. package/src/lib/plugin-runtime/hooks.js +36 -9
  213. package/src/lib/plugin-runtime/install.js +23 -7
  214. package/src/lib/plugin-runtime/lsp.js +4 -0
  215. package/src/lib/plugin-runtime/manifest.js +50 -2
  216. package/src/lib/plugin-runtime/mcp.js +30 -5
  217. package/src/lib/plugin-runtime/monitors.js +11 -0
  218. package/src/lib/plugin-runtime/plugin-options.js +94 -38
  219. package/src/lib/plugin-runtime/policy.js +29 -2
  220. package/src/lib/plugin-runtime/sandbox-policy.js +84 -0
  221. package/src/lib/plugin-runtime/scopes.js +7 -3
  222. package/src/lib/plugin-runtime/trust.js +36 -31
  223. package/src/lib/process-execution-broker/credential-agent.js +114 -16
  224. package/src/lib/process-execution-broker/credential-transport-worker.js +312 -0
  225. package/src/lib/process-execution-broker/credential-transport.js +378 -0
  226. package/src/lib/process-execution-broker/index.js +408 -19
  227. package/src/lib/process-execution-broker/platform-sandbox.js +561 -21
  228. package/src/lib/process-execution-broker/windows-sandbox.ps1 +999 -0
  229. package/src/lib/project-mcp-trust.js +21 -26
  230. package/src/lib/protocol-replay.js +19 -12
  231. package/src/lib/settings-hooks.cjs +13 -0
  232. package/src/lib/skill-loader.js +83 -10
  233. package/src/lib/sync-credentials.js +5 -4
  234. package/src/lib/turn-binding.js +8 -6
  235. package/src/repl/agent-repl.js +113 -28
  236. package/src/repl/repl-turn-binding.js +5 -2
  237. package/src/runtime/agent-core.js +331 -26
  238. package/src/runtime/coding-agent-contract-shared.cjs +3 -3
  239. package/src/runtime/headless-runner.js +101 -4
  240. package/src/runtime/headless-stream.js +209 -23
  241. package/src/runtime/mcp-config.js +29 -17
  242. package/src/runtime/policies/agent-policy.js +2 -0
  243. package/src/workers/background-agent-worker.js +128 -13
  244. package/src/assets/web-panel/assets/ChatBubbleRenderer-DvySUzxJ.js +0 -1
  245. package/src/assets/web-panel/assets/MarkdownRenderer-DkxCweb1.js +0 -1
  246. package/src/assets/web-panel/assets/Projects-ClomCrN0.js +0 -1
  247. package/src/assets/web-panel/assets/RemoteSession-pRgaWsUK.js +0 -4
  248. package/src/assets/web-panel/assets/chat-Bvl-ojg2.js +0 -1
  249. package/src/assets/web-panel/assets/devWarning-CSVgo71Z.js +0 -1
  250. package/src/assets/web-panel/assets/index-DMIWh9fu.js +0 -1
  251. package/src/assets/web-panel/assets/index-ssTvV1l6.js +0 -1
@@ -0,0 +1,312 @@
1
+ /**
2
+ * Broker-owned credential transport worker.
3
+ *
4
+ * The worker owns the local named-pipe / Unix-domain-socket server so it can
5
+ * answer a child while the broker's main thread is blocked in spawnSync().
6
+ * Credential values never enter the spawned command's argv or environment.
7
+ */
8
+
9
+ import crypto from "node:crypto";
10
+ import fs from "node:fs";
11
+ import net from "node:net";
12
+ import { parentPort, workerData } from "node:worker_threads";
13
+
14
+ const MAX_FRAME_BYTES = 1024 * 1024;
15
+ const records = new Map();
16
+ const endpoint = workerData.endpoint;
17
+ const agentId = workerData.agentId;
18
+ const platform = workerData.platform;
19
+
20
+ function normalizeProcessTarget(value) {
21
+ const normalized = String(value ?? "").trim();
22
+ if (!normalized) return null;
23
+ return platform === "win32"
24
+ ? normalized.replaceAll("/", "\\").toLowerCase()
25
+ : normalized;
26
+ }
27
+
28
+ function normalizeHostTarget(value) {
29
+ const candidate = String(value ?? "").trim();
30
+ if (!candidate) return null;
31
+ try {
32
+ const parsed = candidate.includes("://")
33
+ ? new URL(candidate)
34
+ : new URL(`https://${candidate}`);
35
+ return parsed.hostname.toLowerCase().replace(/\.$/, "");
36
+ } catch {
37
+ return candidate.toLowerCase().replace(/\.$/, "");
38
+ }
39
+ }
40
+
41
+ function fingerprint(value) {
42
+ return crypto
43
+ .createHash("sha256")
44
+ .update(String(value ?? ""))
45
+ .digest("hex")
46
+ .slice(0, 16);
47
+ }
48
+
49
+ function capabilityMatches(expected, supplied) {
50
+ const expectedBuffer = Buffer.from(String(expected ?? ""));
51
+ const suppliedBuffer = Buffer.from(String(supplied ?? ""));
52
+ return (
53
+ expectedBuffer.length > 0 &&
54
+ expectedBuffer.length === suppliedBuffer.length &&
55
+ crypto.timingSafeEqual(expectedBuffer, suppliedBuffer)
56
+ );
57
+ }
58
+
59
+ function send(socket, message) {
60
+ if (!socket.destroyed) {
61
+ socket.end(`${JSON.stringify(message)}\n`);
62
+ }
63
+ }
64
+
65
+ function deny(socket, code, message, record, refId) {
66
+ parentPort.postMessage({
67
+ type: "audit",
68
+ entry: {
69
+ event: "credential_transport_resolve",
70
+ outcome: "denied",
71
+ reason: code,
72
+ key: record?.key,
73
+ target: record?.target,
74
+ refFingerprint: fingerprint(refId),
75
+ },
76
+ });
77
+ send(socket, { ok: false, code, message });
78
+ }
79
+
80
+ function handleResolution(socket, request) {
81
+ const refId = typeof request.refId === "string" ? request.refId : "";
82
+ const record = records.get(refId);
83
+ if (!record) {
84
+ deny(
85
+ socket,
86
+ "CC_CREDENTIAL_REF_NOT_FOUND",
87
+ "Credential reference was not found",
88
+ null,
89
+ refId,
90
+ );
91
+ return;
92
+ }
93
+ if (
94
+ request.agentId !== agentId ||
95
+ !capabilityMatches(record.capabilityToken, request.capabilityToken)
96
+ ) {
97
+ deny(
98
+ socket,
99
+ "CC_CREDENTIAL_TRANSPORT_UNAUTHORIZED",
100
+ "Credential transport authentication failed",
101
+ record,
102
+ refId,
103
+ );
104
+ return;
105
+ }
106
+
107
+ const requestTarget = {
108
+ process: normalizeProcessTarget(request.process),
109
+ host: normalizeHostTarget(request.host),
110
+ };
111
+ if (
112
+ !requestTarget.process ||
113
+ requestTarget.process !== record.target.process ||
114
+ requestTarget.host !== record.target.host
115
+ ) {
116
+ deny(
117
+ socket,
118
+ "CC_CREDENTIAL_TARGET_MISMATCH",
119
+ "Credential resolution target does not match",
120
+ record,
121
+ refId,
122
+ );
123
+ return;
124
+ }
125
+
126
+ if (record.status !== "active") {
127
+ const code =
128
+ record.status === "expired"
129
+ ? "CC_CREDENTIAL_REF_EXPIRED"
130
+ : record.status === "exhausted"
131
+ ? "CC_CREDENTIAL_REF_EXHAUSTED"
132
+ : "CC_CREDENTIAL_REF_REVOKED";
133
+ deny(socket, code, "Credential reference is not active", record, refId);
134
+ return;
135
+ }
136
+ if (Date.now() >= record.expiresAt) {
137
+ record.status = "expired";
138
+ record.value = null;
139
+ deny(
140
+ socket,
141
+ "CC_CREDENTIAL_REF_EXPIRED",
142
+ "Credential reference has expired",
143
+ record,
144
+ refId,
145
+ );
146
+ return;
147
+ }
148
+ if (record.useCount >= record.maxUses) {
149
+ record.status = "exhausted";
150
+ record.value = null;
151
+ deny(
152
+ socket,
153
+ "CC_CREDENTIAL_REF_EXHAUSTED",
154
+ "Credential reference usage limit has been reached",
155
+ record,
156
+ refId,
157
+ );
158
+ return;
159
+ }
160
+
161
+ const value = record.value;
162
+ record.useCount += 1;
163
+ const remainingUses = record.maxUses - record.useCount;
164
+ if (remainingUses <= 0) {
165
+ record.status = "exhausted";
166
+ record.value = null;
167
+ }
168
+ parentPort.postMessage({
169
+ type: "audit",
170
+ entry: {
171
+ event: "credential_transport_resolve",
172
+ outcome: "allowed",
173
+ key: record.key,
174
+ target: record.target,
175
+ refFingerprint: fingerprint(refId),
176
+ useCount: record.useCount,
177
+ remainingUses: Math.max(remainingUses, 0),
178
+ },
179
+ });
180
+ parentPort.postMessage({
181
+ type: "settlement",
182
+ refId,
183
+ useCount: record.useCount,
184
+ status: record.status,
185
+ });
186
+ send(socket, { ok: true, value });
187
+ }
188
+
189
+ if (platform !== "win32") {
190
+ try {
191
+ fs.unlinkSync(endpoint);
192
+ } catch {
193
+ // A socket normally does not exist on first start.
194
+ }
195
+ }
196
+
197
+ const server = net.createServer((socket) => {
198
+ let carry = "";
199
+ let handled = false;
200
+ socket.setTimeout(5000, () => socket.destroy());
201
+ socket.on("data", (chunk) => {
202
+ if (handled) return;
203
+ carry += chunk.toString("utf8");
204
+ if (Buffer.byteLength(carry, "utf8") > MAX_FRAME_BYTES) {
205
+ handled = true;
206
+ deny(
207
+ socket,
208
+ "CC_CREDENTIAL_INVALID_REQUEST",
209
+ "Credential transport request is too large",
210
+ null,
211
+ "",
212
+ );
213
+ return;
214
+ }
215
+ const newline = carry.indexOf("\n");
216
+ if (newline === -1) return;
217
+ handled = true;
218
+ const line = carry.slice(0, newline).replace(/\r$/, "");
219
+ let request;
220
+ try {
221
+ request = JSON.parse(line);
222
+ } catch {
223
+ deny(
224
+ socket,
225
+ "CC_CREDENTIAL_INVALID_REQUEST",
226
+ "Credential transport request is not valid JSON",
227
+ null,
228
+ "",
229
+ );
230
+ return;
231
+ }
232
+ if (!request || request.type !== "resolve") {
233
+ deny(
234
+ socket,
235
+ "CC_CREDENTIAL_INVALID_REQUEST",
236
+ "Credential transport request type is invalid",
237
+ null,
238
+ request?.refId,
239
+ );
240
+ return;
241
+ }
242
+ handleResolution(socket, request);
243
+ });
244
+ socket.on("error", () => {
245
+ // Per-client failures must not take down the credential service.
246
+ });
247
+ });
248
+
249
+ server.on("error", (error) => {
250
+ parentPort.postMessage({
251
+ type: "fatal",
252
+ error: {
253
+ code: error.code || "CC_CREDENTIAL_TRANSPORT_UNAVAILABLE",
254
+ message: error.message,
255
+ },
256
+ });
257
+ });
258
+
259
+ server.listen(endpoint, () => {
260
+ if (platform !== "win32") {
261
+ try {
262
+ fs.chmodSync(endpoint, 0o600);
263
+ } catch {
264
+ // The random per-launch capability remains mandatory if chmod is absent.
265
+ }
266
+ }
267
+ parentPort.postMessage({ type: "ready", endpoint });
268
+ });
269
+
270
+ parentPort.on("message", (message) => {
271
+ if (!message || typeof message !== "object") return;
272
+ if (message.type === "register") {
273
+ records.set(message.record.refId, {
274
+ ...message.record,
275
+ target: {
276
+ process: normalizeProcessTarget(message.record.target?.process),
277
+ host: normalizeHostTarget(message.record.target?.host),
278
+ },
279
+ });
280
+ return;
281
+ }
282
+ if (message.type === "update") {
283
+ const record = records.get(message.refId);
284
+ if (!record) return;
285
+ record.useCount = message.useCount;
286
+ record.status = message.status;
287
+ if (record.status !== "active") record.value = null;
288
+ return;
289
+ }
290
+ if (message.type === "revoke") {
291
+ const record = records.get(message.refId);
292
+ if (!record) return;
293
+ record.status = "revoked";
294
+ record.value = null;
295
+ return;
296
+ }
297
+ if (message.type === "close") {
298
+ for (const record of records.values()) record.value = null;
299
+ records.clear();
300
+ server.close(() => {
301
+ if (platform !== "win32") {
302
+ try {
303
+ fs.unlinkSync(endpoint);
304
+ } catch {
305
+ // The socket may already have been removed.
306
+ }
307
+ }
308
+ parentPort.postMessage({ type: "closed" });
309
+ parentPort.close();
310
+ });
311
+ }
312
+ });
@@ -0,0 +1,378 @@
1
+ /**
2
+ * Authenticated local transport for broker-issued credential references.
3
+ *
4
+ * A worker thread hosts the pipe so spawnSync children can resolve a reference
5
+ * while the broker's main JavaScript thread is blocked.
6
+ */
7
+
8
+ import crypto from "node:crypto";
9
+ import net from "node:net";
10
+ import os from "node:os";
11
+ import path from "node:path";
12
+ import { Worker } from "node:worker_threads";
13
+
14
+ const TRANSPORT_VERSION = "local-ipc-v1";
15
+ const DEFAULT_TIMEOUT_MS = 5000;
16
+ const MAX_RESPONSE_BYTES = 1024 * 1024;
17
+
18
+ function transportError(code, message) {
19
+ const error = new Error(message);
20
+ error.code = code;
21
+ return error;
22
+ }
23
+
24
+ export function credentialTransportEndpoint(agentId, options = {}) {
25
+ const platform = options.platform || process.platform;
26
+ const safeId = crypto
27
+ .createHash("sha256")
28
+ .update(String(agentId))
29
+ .digest("hex")
30
+ .slice(0, 24);
31
+ if (platform === "win32") return `\\\\.\\pipe\\cc-cred-${safeId}`;
32
+ return path.join(options.tmpdir || os.tmpdir(), `cc-cred-${safeId}.sock`);
33
+ }
34
+
35
+ export class CredentialTransport {
36
+ constructor(options = {}) {
37
+ if (!options.agentId) {
38
+ throw transportError(
39
+ "CC_CREDENTIAL_INVALID_REQUEST",
40
+ "Credential transport requires an agent id",
41
+ );
42
+ }
43
+ this.agentId = String(options.agentId);
44
+ this.platform = options.platform || process.platform;
45
+ this.endpoint =
46
+ options.endpoint ||
47
+ credentialTransportEndpoint(this.agentId, {
48
+ platform: this.platform,
49
+ tmpdir: options.tmpdir,
50
+ });
51
+ this.version = TRANSPORT_VERSION;
52
+ this.ready = false;
53
+ this.closed = false;
54
+ this.error = null;
55
+ this._onAudit =
56
+ typeof options.onAudit === "function" ? options.onAudit : () => {};
57
+ this._onSettlement =
58
+ typeof options.onSettlement === "function"
59
+ ? options.onSettlement
60
+ : () => {};
61
+ this._workerFactory =
62
+ options.workerFactory ||
63
+ ((url, workerOptions) => new Worker(url, workerOptions));
64
+
65
+ this._readyPromise = new Promise((resolve, reject) => {
66
+ this._resolveReady = resolve;
67
+ this._rejectReady = reject;
68
+ });
69
+ this._readyPromise.catch(() => {});
70
+
71
+ try {
72
+ this._worker = this._workerFactory(
73
+ new URL("./credential-transport-worker.js", import.meta.url),
74
+ {
75
+ type: "module",
76
+ workerData: {
77
+ agentId: this.agentId,
78
+ endpoint: this.endpoint,
79
+ platform: this.platform,
80
+ },
81
+ },
82
+ );
83
+ this._worker.on("message", (message) =>
84
+ this._handleWorkerMessage(message),
85
+ );
86
+ this._worker.on("error", (error) => this._handleWorkerFailure(error));
87
+ this._worker.on("exit", (code) => {
88
+ if (!this.closed && code !== 0) {
89
+ this._handleWorkerFailure(
90
+ transportError(
91
+ "CC_CREDENTIAL_TRANSPORT_UNAVAILABLE",
92
+ `Credential transport worker exited with code ${code}`,
93
+ ),
94
+ );
95
+ }
96
+ });
97
+ this._worker.unref?.();
98
+ } catch (error) {
99
+ this._handleWorkerFailure(error);
100
+ }
101
+ }
102
+
103
+ _handleWorkerMessage(message) {
104
+ if (message?.type === "ready") {
105
+ this.ready = true;
106
+ this._resolveReady(this);
107
+ return;
108
+ }
109
+ if (message?.type === "audit" && message.entry) {
110
+ this._onAudit(message.entry);
111
+ return;
112
+ }
113
+ if (message?.type === "settlement") {
114
+ this._onSettlement(message);
115
+ return;
116
+ }
117
+ if (message?.type === "fatal") {
118
+ this._handleWorkerFailure(
119
+ transportError(
120
+ message.error?.code || "CC_CREDENTIAL_TRANSPORT_UNAVAILABLE",
121
+ message.error?.message || "Credential transport failed",
122
+ ),
123
+ );
124
+ }
125
+ }
126
+
127
+ _handleWorkerFailure(error) {
128
+ if (this.error) return;
129
+ this.error = transportError(
130
+ error?.code || "CC_CREDENTIAL_TRANSPORT_UNAVAILABLE",
131
+ error?.message || "Credential transport is unavailable",
132
+ );
133
+ this.ready = false;
134
+ this._rejectReady(this.error);
135
+ }
136
+
137
+ isAvailable() {
138
+ return Boolean(this._worker && !this.closed && !this.error);
139
+ }
140
+
141
+ waitUntilReady() {
142
+ return this._readyPromise;
143
+ }
144
+
145
+ createCapabilityToken() {
146
+ if (!this.isAvailable()) {
147
+ throw (
148
+ this.error ||
149
+ transportError(
150
+ "CC_CREDENTIAL_TRANSPORT_UNAVAILABLE",
151
+ "Credential transport is unavailable",
152
+ )
153
+ );
154
+ }
155
+ return crypto.randomBytes(32).toString("base64url");
156
+ }
157
+
158
+ registerCredential(record) {
159
+ if (!this.isAvailable()) {
160
+ throw (
161
+ this.error ||
162
+ transportError(
163
+ "CC_CREDENTIAL_TRANSPORT_UNAVAILABLE",
164
+ "Credential transport is unavailable",
165
+ )
166
+ );
167
+ }
168
+ this._worker.postMessage({ type: "register", record });
169
+ }
170
+
171
+ updateCredential(refId, state) {
172
+ if (!this.isAvailable()) return;
173
+ this._worker.postMessage({
174
+ type: "update",
175
+ refId,
176
+ useCount: state.useCount,
177
+ status: state.status,
178
+ });
179
+ }
180
+
181
+ revokeCredential(refId) {
182
+ if (!this.isAvailable()) return;
183
+ this._worker.postMessage({ type: "revoke", refId });
184
+ }
185
+
186
+ async close() {
187
+ if (this.closed) return;
188
+ this.closed = true;
189
+ if (!this._worker) return;
190
+ const worker = this._worker;
191
+ await new Promise((resolve) => {
192
+ const timer = setTimeout(resolve, 1000);
193
+ const onMessage = (message) => {
194
+ if (message?.type !== "closed") return;
195
+ clearTimeout(timer);
196
+ worker.removeListener("message", onMessage);
197
+ resolve();
198
+ };
199
+ worker.on("message", onMessage);
200
+ worker.postMessage({ type: "close" });
201
+ });
202
+ await worker.terminate();
203
+ this.ready = false;
204
+ }
205
+
206
+ getInfo() {
207
+ return {
208
+ version: this.version,
209
+ endpoint: this.endpoint,
210
+ available: this.isAvailable(),
211
+ ready: this.ready,
212
+ error: this.error
213
+ ? {
214
+ code: this.error.code,
215
+ message: this.error.message,
216
+ }
217
+ : null,
218
+ };
219
+ }
220
+ }
221
+
222
+ function connectOnce(endpoint) {
223
+ return new Promise((resolve, reject) => {
224
+ const socket = net.connect(endpoint);
225
+ const onError = (error) => {
226
+ socket.removeListener("connect", onConnect);
227
+ reject(error);
228
+ };
229
+ const onConnect = () => {
230
+ socket.removeListener("error", onError);
231
+ resolve(socket);
232
+ };
233
+ socket.once("error", onError);
234
+ socket.once("connect", onConnect);
235
+ });
236
+ }
237
+
238
+ async function connectWithRetry(endpoint, deadline) {
239
+ let lastError = null;
240
+ while (Date.now() < deadline) {
241
+ try {
242
+ return await connectOnce(endpoint);
243
+ } catch (error) {
244
+ lastError = error;
245
+ const retryable = ["ENOENT", "ECONNREFUSED", "EPIPE"].includes(
246
+ error?.code,
247
+ );
248
+ if (!retryable) throw error;
249
+ await new Promise((resolve) => {
250
+ setTimeout(resolve, 25);
251
+ });
252
+ }
253
+ }
254
+ throw (
255
+ lastError ||
256
+ transportError(
257
+ "CC_CREDENTIAL_TRANSPORT_UNAVAILABLE",
258
+ "Credential transport connection timed out",
259
+ )
260
+ );
261
+ }
262
+
263
+ /**
264
+ * Resolve one reference using only the capability material inherited by the
265
+ * approved target process.
266
+ */
267
+ export async function resolveCredentialRefOverTransport(refId, options = {}) {
268
+ const env = options.env || process.env;
269
+ const endpoint = options.endpoint || env.CC_CREDENTIAL_ENDPOINT;
270
+ const capabilityToken =
271
+ options.capabilityToken || env.CC_CREDENTIAL_AUTH_TOKEN;
272
+ const agentId = options.agentId || env.CC_CREDENTIAL_AGENT_ID;
273
+ const processTarget =
274
+ options.process ||
275
+ options.processTarget ||
276
+ env.CC_CREDENTIAL_TARGET_PROCESS;
277
+ const host =
278
+ options.host !== undefined
279
+ ? options.host
280
+ : env.CC_CREDENTIAL_TARGET_HOST || null;
281
+ const timeoutMs = Math.max(
282
+ 1,
283
+ Number(options.timeoutMs || DEFAULT_TIMEOUT_MS),
284
+ );
285
+
286
+ if (!endpoint || !capabilityToken || !agentId || !processTarget || !refId) {
287
+ throw transportError(
288
+ "CC_CREDENTIAL_INVALID_REQUEST",
289
+ "Credential transport environment is incomplete",
290
+ );
291
+ }
292
+
293
+ const deadline = Date.now() + timeoutMs;
294
+ const socket = await connectWithRetry(endpoint, deadline);
295
+ return await new Promise((resolve, reject) => {
296
+ let settled = false;
297
+ let carry = "";
298
+ const finish = (error, value) => {
299
+ if (settled) return;
300
+ settled = true;
301
+ clearTimeout(timer);
302
+ socket.destroy();
303
+ if (error) reject(error);
304
+ else resolve(value);
305
+ };
306
+ const timer = setTimeout(
307
+ () => {
308
+ finish(
309
+ transportError(
310
+ "CC_CREDENTIAL_TRANSPORT_TIMEOUT",
311
+ "Credential transport response timed out",
312
+ ),
313
+ );
314
+ },
315
+ Math.max(1, deadline - Date.now()),
316
+ );
317
+ timer.unref?.();
318
+ socket.on("data", (chunk) => {
319
+ carry += chunk.toString("utf8");
320
+ if (Buffer.byteLength(carry, "utf8") > MAX_RESPONSE_BYTES) {
321
+ finish(
322
+ transportError(
323
+ "CC_CREDENTIAL_INVALID_REQUEST",
324
+ "Credential transport response is too large",
325
+ ),
326
+ );
327
+ return;
328
+ }
329
+ const newline = carry.indexOf("\n");
330
+ if (newline === -1) return;
331
+ let response;
332
+ try {
333
+ response = JSON.parse(carry.slice(0, newline).replace(/\r$/, ""));
334
+ } catch {
335
+ finish(
336
+ transportError(
337
+ "CC_CREDENTIAL_INVALID_REQUEST",
338
+ "Credential transport returned invalid JSON",
339
+ ),
340
+ );
341
+ return;
342
+ }
343
+ if (!response.ok) {
344
+ finish(
345
+ transportError(
346
+ response.code || "CC_CREDENTIAL_TRANSPORT_UNAVAILABLE",
347
+ response.message || "Credential transport denied the request",
348
+ ),
349
+ );
350
+ return;
351
+ }
352
+ finish(null, response.value);
353
+ });
354
+ socket.once("error", (error) => finish(error));
355
+ socket.once("close", () => {
356
+ if (!settled) {
357
+ finish(
358
+ transportError(
359
+ "CC_CREDENTIAL_TRANSPORT_UNAVAILABLE",
360
+ "Credential transport closed without a response",
361
+ ),
362
+ );
363
+ }
364
+ });
365
+ socket.write(
366
+ `${JSON.stringify({
367
+ type: "resolve",
368
+ refId,
369
+ agentId,
370
+ capabilityToken,
371
+ process: processTarget,
372
+ host,
373
+ })}\n`,
374
+ );
375
+ });
376
+ }
377
+
378
+ export { TRANSPORT_VERSION };