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
@@ -93,6 +93,8 @@ import {
93
93
  formatProviderHttpError,
94
94
  formatProviderResponseError,
95
95
  } from "../lib/provider-http-error.js";
96
+ import { buildPermissionDecision } from "../lib/permission-decision.js";
97
+ import { resolveSandboxPolicyPath } from "../lib/agent-sandbox.js";
96
98
 
97
99
  export { formatProviderHttpError };
98
100
 
@@ -1172,6 +1174,95 @@ const GUARDED_FILE_MUTATION_TOOLS = new Set([
1172
1174
  "notebook_edit",
1173
1175
  ]);
1174
1176
 
1177
+ function agentFileToolPathRequests(name, args = {}, workspaceRoots = []) {
1178
+ const one = (argument, access) =>
1179
+ typeof args[argument] === "string" && args[argument].length > 0
1180
+ ? [{ argument, path: args[argument], access }]
1181
+ : [];
1182
+ switch (name) {
1183
+ case "read_file":
1184
+ return one("path", "read");
1185
+ case "write_file":
1186
+ case "edit_file":
1187
+ case "edit_file_hashed":
1188
+ case "delete_file":
1189
+ case "notebook_edit":
1190
+ return one("path", "write");
1191
+ case "move_file":
1192
+ return [
1193
+ ...one("path", "write"),
1194
+ ...one("target_path", "write"),
1195
+ ];
1196
+ case "list_dir":
1197
+ return [
1198
+ {
1199
+ argument: "path",
1200
+ path:
1201
+ typeof args.path === "string" && args.path.length > 0
1202
+ ? args.path
1203
+ : ".",
1204
+ access: "read",
1205
+ },
1206
+ ];
1207
+ case "search_files":
1208
+ return typeof args.directory === "string" && args.directory.length > 0
1209
+ ? [
1210
+ {
1211
+ argument: "directory",
1212
+ path: args.directory,
1213
+ access: "read",
1214
+ },
1215
+ ]
1216
+ : workspaceRoots.map((root) => ({
1217
+ argument: "directory",
1218
+ path: root,
1219
+ access: "read",
1220
+ }));
1221
+ case "code_intelligence":
1222
+ return args.action === "workspace_symbols"
1223
+ ? workspaceRoots.map((root) => ({
1224
+ argument: "file",
1225
+ path: root,
1226
+ access: "read",
1227
+ }))
1228
+ : one("file", "read");
1229
+ case "publish_artifact":
1230
+ return one("path", "read");
1231
+ default:
1232
+ return [];
1233
+ }
1234
+ }
1235
+
1236
+ function guardAgentFileToolPaths(name, args, context, cwd) {
1237
+ const workspaceRoots = workspaceRootsFor(
1238
+ cwd,
1239
+ context.additionalDirectories,
1240
+ );
1241
+ const requests = agentFileToolPathRequests(name, args || {}, workspaceRoots);
1242
+ for (const request of requests) {
1243
+ const verdict = resolveSandboxPolicyPath(request.path, {
1244
+ access: request.access,
1245
+ cwd,
1246
+ workspaceRoots,
1247
+ sandbox: context.sandbox || null,
1248
+ });
1249
+ if (!verdict.ok) {
1250
+ return {
1251
+ error:
1252
+ `[Workspace Path Guard] ${name}.${request.argument} ` +
1253
+ `"${request.path}" was blocked: ${verdict.error}.`,
1254
+ policy: {
1255
+ decision: "deny",
1256
+ via: "workspace-path-guard",
1257
+ reason: verdict.reason,
1258
+ access: request.access,
1259
+ },
1260
+ };
1261
+ }
1262
+ }
1263
+ return null;
1264
+ }
1265
+
1175
1266
  function fileMutationPaths(name, args = {}) {
1176
1267
  return [
1177
1268
  args.path,
@@ -1553,6 +1644,16 @@ export async function executeTool(name, args, context = {}) {
1553
1644
  }
1554
1645
  context = { ...context, toolAttribution: attribution };
1555
1646
  }
1647
+
1648
+ // Built-in file tools are confined to the declared workspace roots even
1649
+ // when no process sandbox is enabled. Resolve existing targets (and the
1650
+ // nearest existing parent for creates) through symlinks/junctions before any
1651
+ // permission hook, IDE preview, credential check, or filesystem operation
1652
+ // can touch them. Explicit --add-dir roots and sandbox allowRead/allowWrite
1653
+ // paths are the only supported expansions beyond cwd; deny paths still win.
1654
+ const workspacePathDenial = guardAgentFileToolPaths(name, args, context, cwd);
1655
+ if (workspacePathDenial) return workspacePathDenial;
1656
+
1556
1657
  const toolContext = createToolContext({
1557
1658
  toolName: runtimeDescriptor?.name || name,
1558
1659
  cwd,
@@ -2758,6 +2859,39 @@ async function filterSkillsByCwd(skills, cwd) {
2758
2859
  }
2759
2860
  }
2760
2861
 
2862
+ async function promoteBrowserScreenshot(
2863
+ filePath,
2864
+ { sessionId = null, title = "Browser screenshot" } = {},
2865
+ ) {
2866
+ if (!filePath) return { artifact: null, error: null };
2867
+ try {
2868
+ const { ArtifactStore, publicArtifactMetadata } =
2869
+ await import("../lib/artifact-store.js");
2870
+ const entry = new ArtifactStore().publish({
2871
+ filePath,
2872
+ title,
2873
+ kind: "screenshot",
2874
+ sessionId: sessionId ? String(sessionId) : null,
2875
+ });
2876
+ return { artifact: publicArtifactMetadata(entry), error: null };
2877
+ } catch (err) {
2878
+ const code =
2879
+ typeof err?.code === "string"
2880
+ ? err.code.replace(/[^A-Z0-9_-]/gi, "").slice(0, 40)
2881
+ : "";
2882
+ return {
2883
+ artifact: null,
2884
+ error: `browser screenshot artifact publication failed${code ? ` (${code})` : ""}`,
2885
+ };
2886
+ } finally {
2887
+ try {
2888
+ fs.rmSync(filePath, { force: true });
2889
+ } catch {
2890
+ /* best-effort cleanup */
2891
+ }
2892
+ }
2893
+ }
2894
+
2761
2895
  async function executeToolInner(
2762
2896
  name,
2763
2897
  args,
@@ -4219,7 +4353,8 @@ async function executeToolInner(
4219
4353
  // Only METADATA returns to the conversation (the transcript never
4220
4354
  // carries the file body); `cc artifacts` lists/inspects/cleans.
4221
4355
  try {
4222
- const { ArtifactStore } = await import("../lib/artifact-store.js");
4356
+ const { ArtifactStore, publicArtifactMetadata } =
4357
+ await import("../lib/artifact-store.js");
4223
4358
  const store = new ArtifactStore();
4224
4359
  const entry = store.publish({
4225
4360
  filePath: path.resolve(cwd, String(args.path || "")),
@@ -4229,7 +4364,7 @@ async function executeToolInner(
4229
4364
  sessionId: sessionId ? String(sessionId) : null,
4230
4365
  });
4231
4366
  return attachDescriptor({
4232
- published: entry,
4367
+ published: publicArtifactMetadata(entry),
4233
4368
  hint: "The user can browse this with `cc artifacts list` / `cc artifacts show <id>`.",
4234
4369
  });
4235
4370
  } catch (err) {
@@ -4265,7 +4400,25 @@ async function executeToolInner(
4265
4400
  error: `browser_state failed: ${state.error}`,
4266
4401
  });
4267
4402
  }
4268
- return attachDescriptor(state);
4403
+ const safeState = { ...state };
4404
+ if (state.screenshotPath) {
4405
+ const promoted = await promoteBrowserScreenshot(
4406
+ state.screenshotPath,
4407
+ {
4408
+ sessionId,
4409
+ title: `Browser state — ${state.title || "page"}`,
4410
+ },
4411
+ );
4412
+ delete safeState.screenshotPath;
4413
+ delete safeState.screenshotRef;
4414
+ if (promoted.artifact) {
4415
+ safeState.screenshotArtifact = promoted.artifact;
4416
+ safeState.screenshotRef = promoted.artifact.id;
4417
+ } else {
4418
+ safeState.screenshotArtifactError = promoted.error;
4419
+ }
4420
+ }
4421
+ return attachDescriptor(safeState);
4269
4422
  } catch (err) {
4270
4423
  return attachDescriptor({
4271
4424
  error: `browser_state failed: ${err.message}`,
@@ -4336,7 +4489,32 @@ async function executeToolInner(
4336
4489
  error: `browser_act failed: ${result.error}`,
4337
4490
  });
4338
4491
  }
4339
- return attachDescriptor(result);
4492
+ const safeResult = { ...result, steps: [] };
4493
+ for (let i = 0; i < (result.steps || []).length; i += 1) {
4494
+ const originalStep = result.steps[i];
4495
+ const step = { ...originalStep };
4496
+ if (originalStep.screenshotPath) {
4497
+ const promoted = await promoteBrowserScreenshot(
4498
+ originalStep.screenshotPath,
4499
+ {
4500
+ sessionId,
4501
+ title: `Browser action screenshot ${i + 1}`,
4502
+ },
4503
+ );
4504
+ delete step.screenshotPath;
4505
+ delete step.screenshotRef;
4506
+ if (promoted.artifact) {
4507
+ step.screenshotArtifact = promoted.artifact;
4508
+ step.screenshotRef = promoted.artifact.id;
4509
+ step.detail = `screenshot artifact: ${promoted.artifact.id}`;
4510
+ } else {
4511
+ step.screenshotArtifactError = promoted.error;
4512
+ step.detail = promoted.error;
4513
+ }
4514
+ }
4515
+ safeResult.steps.push(step);
4516
+ }
4517
+ return attachDescriptor(safeResult);
4340
4518
  } catch (err) {
4341
4519
  return attachDescriptor({
4342
4520
  error: `browser_act failed: ${err.message}`,
@@ -5297,7 +5475,7 @@ export function safeStringifyToolResult(value) {
5297
5475
  }
5298
5476
  }
5299
5477
 
5300
- function emitToolHookLifecycle({
5478
+ export function emitToolHookLifecycle({
5301
5479
  tool,
5302
5480
  args,
5303
5481
  result,
@@ -5306,6 +5484,7 @@ function emitToolHookLifecycle({
5306
5484
  turnId = null,
5307
5485
  toolUseId = null,
5308
5486
  cwd = process.cwd(),
5487
+ emit = emitHooksV2Event,
5309
5488
  }) {
5310
5489
  const failed = Boolean(error || result?.error);
5311
5490
  const base = {
@@ -5317,7 +5496,7 @@ function emitToolHookLifecycle({
5317
5496
  duration_ms: Number(result?.toolTelemetryRecord?.durationMs || 0),
5318
5497
  cwd,
5319
5498
  };
5320
- emitHooksV2Event(failed ? "PostToolUseFailure" : "PostToolUse", {
5499
+ emit(failed ? "PostToolUseFailure" : "PostToolUse", {
5321
5500
  ...base,
5322
5501
  ...(failed
5323
5502
  ? {
@@ -5337,7 +5516,7 @@ function emitToolHookLifecycle({
5337
5516
  args?.targetPath ||
5338
5517
  args?.target_path ||
5339
5518
  null;
5340
- emitHooksV2Event("FileChanged", {
5519
+ emit("FileChanged", {
5341
5520
  ...base,
5342
5521
  path: changedPath == null ? null : String(changedPath),
5343
5522
  operation: tool,
@@ -5346,6 +5525,32 @@ function emitToolHookLifecycle({
5346
5525
  return failed;
5347
5526
  }
5348
5527
 
5528
+ export function emitToolBatchHookLifecycle({
5529
+ records = [],
5530
+ sessionId = null,
5531
+ turnId = null,
5532
+ cwd = process.cwd(),
5533
+ parallel = false,
5534
+ emit = emitHooksV2Event,
5535
+ }) {
5536
+ if (!Array.isArray(records) || records.length === 0) return null;
5537
+ const failed = records.filter((record) => record?.failed === true).length;
5538
+ const payload = {
5539
+ schema_version: 1,
5540
+ session_id: sessionId,
5541
+ turn_id: turnId,
5542
+ cwd,
5543
+ parallel: parallel === true,
5544
+ total: records.length,
5545
+ succeeded: records.length - failed,
5546
+ failed,
5547
+ tool_names: records.map((record) => record?.tool || "(unknown)"),
5548
+ tool_use_ids: records.map((record) => record?.toolUseId || null),
5549
+ };
5550
+ emit("PostToolBatch", payload);
5551
+ return payload;
5552
+ }
5553
+
5349
5554
  /**
5350
5555
  * Execute a spawn_sub_agent tool call.
5351
5556
  * Creates an isolated SubAgentContext, runs it, and returns only the summary.
@@ -7507,11 +7712,12 @@ function extractInitialPromptText(messages) {
7507
7712
  * recompute it. Not exported (no shim-parity impact) — only the telemetry seam
7508
7713
  * uses it.
7509
7714
  */
7510
- function permissionDecisionId(callId, policy) {
7511
- if (!policy || typeof policy !== "object" || !policy.decision) return null;
7512
- const gate = policy.via || policy.decision;
7513
- const base = callId || "call";
7514
- return `${base}:perm:${gate}`;
7715
+ function permissionDecision(callId, tool, result) {
7716
+ return buildPermissionDecision({
7717
+ toolUseId: callId,
7718
+ tool,
7719
+ result,
7720
+ });
7515
7721
  }
7516
7722
 
7517
7723
  export async function* agentLoop(messages, options) {
@@ -7931,6 +8137,14 @@ export async function* agentLoop(messages, options) {
7931
8137
  // self-persist is best-effort
7932
8138
  }
7933
8139
  }
8140
+ emitHooksV2Event("PostCompact", {
8141
+ schema_version: 1,
8142
+ trigger: "auto",
8143
+ session_id: options.sessionId || null,
8144
+ messages_after: messages.length,
8145
+ stats,
8146
+ cwd: options.cwd || process.cwd(),
8147
+ });
7934
8148
  yield { type: "compaction", stats, runId };
7935
8149
  }
7936
8150
  }
@@ -8182,7 +8396,33 @@ export async function* agentLoop(messages, options) {
8182
8396
  },
8183
8397
  { cwd: options.cwd || process.cwd() },
8184
8398
  );
8185
- } catch (_err) {
8399
+ const failures = (stopOutcome?.results || []).filter(
8400
+ (result) =>
8401
+ result?.nonBlockingError === true ||
8402
+ result?.malformedDecision === true ||
8403
+ result?.breakerOpen === true,
8404
+ );
8405
+ if (failures.length > 0) {
8406
+ emitHooksV2Event("StopFailure", {
8407
+ schema_version: 1,
8408
+ session_id: options.sessionId || null,
8409
+ run_id: runId,
8410
+ phase: "stop-hook",
8411
+ failures: failures.map((failure) => ({
8412
+ command: failure.command || null,
8413
+ exit_code: failure.exitCode ?? null,
8414
+ reason: failure.reason || failure.error || null,
8415
+ })),
8416
+ });
8417
+ }
8418
+ } catch (error) {
8419
+ emitHooksV2Event("StopFailure", {
8420
+ schema_version: 1,
8421
+ session_id: options.sessionId || null,
8422
+ run_id: runId,
8423
+ phase: "stop-hook",
8424
+ reason: error?.message || String(error),
8425
+ });
8186
8426
  stopOutcome = null; // never affect the run outcome
8187
8427
  }
8188
8428
  if (stopOutcome && stopOutcome.decision === "block") {
@@ -8243,6 +8483,8 @@ export async function* agentLoop(messages, options) {
8243
8483
  );
8244
8484
  if (parallelReads) {
8245
8485
  throwIfAborted(signal);
8486
+ const turnId = `${runId}:t${budget.consumed}`;
8487
+ const toolBatchRecords = [];
8246
8488
  // Kick every read off now; settle into {result,error} so an unawaited
8247
8489
  // promise can never surface as an unhandled rejection if the loop aborts
8248
8490
  // before it is consumed.
@@ -8277,6 +8519,21 @@ export async function* agentLoop(messages, options) {
8277
8519
  };
8278
8520
  const { result: toolResult, error: toolError } = await promise;
8279
8521
  throwIfAborted(signal);
8522
+ const failed = emitToolHookLifecycle({
8523
+ tool: call.function.name,
8524
+ args: toolArgs,
8525
+ result: toolResult,
8526
+ error: toolError,
8527
+ sessionId: options.sessionId || null,
8528
+ turnId,
8529
+ toolUseId: call.id,
8530
+ cwd: options.cwd || process.cwd(),
8531
+ });
8532
+ toolBatchRecords.push({
8533
+ tool: call.function.name,
8534
+ toolUseId: call.id,
8535
+ failed,
8536
+ });
8280
8537
  const warningMsg = budget.toWarningMessage();
8281
8538
  const resultStr = capToolResultString(
8282
8539
  safeStringifyToolResult(toolResult),
@@ -8284,6 +8541,11 @@ export async function* agentLoop(messages, options) {
8284
8541
  const toolContent = warningMsg
8285
8542
  ? `${resultStr}\n\n${warningMsg}`
8286
8543
  : resultStr;
8544
+ const decision = permissionDecision(
8545
+ call.id,
8546
+ call.function.name,
8547
+ toolResult,
8548
+ );
8287
8549
  yield {
8288
8550
  type: "tool-result",
8289
8551
  tool: call.function.name,
@@ -8291,10 +8553,8 @@ export async function* agentLoop(messages, options) {
8291
8553
  error: toolError,
8292
8554
  tool_use_id: call.id,
8293
8555
  turn_id: `${runId}:t${budget.consumed}`,
8294
- permission_decision_id: permissionDecisionId(
8295
- call.id,
8296
- toolResult?.policy,
8297
- ),
8556
+ permission_decision_id: decision?.id || null,
8557
+ permission_decision: decision,
8298
8558
  };
8299
8559
  messages.push({
8300
8560
  role: "tool",
@@ -8302,9 +8562,18 @@ export async function* agentLoop(messages, options) {
8302
8562
  tool_call_id: call.id,
8303
8563
  });
8304
8564
  }
8565
+ emitToolBatchHookLifecycle({
8566
+ records: toolBatchRecords,
8567
+ sessionId: options.sessionId || null,
8568
+ turnId,
8569
+ cwd: options.cwd || process.cwd(),
8570
+ parallel: true,
8571
+ });
8305
8572
  continue; // all read results in place — back to the LLM call
8306
8573
  }
8307
8574
 
8575
+ const turnId = `${runId}:t${budget.consumed}`;
8576
+ const toolBatchRecords = [];
8308
8577
  for (const call of toolCalls) {
8309
8578
  throwIfAborted(signal);
8310
8579
  const fn = call?.function;
@@ -8318,6 +8587,21 @@ export async function* agentLoop(messages, options) {
8318
8587
  // malformed call.
8319
8588
  if (typeof toolName !== "string" || !toolName) {
8320
8589
  const reason = "malformed tool call: missing function name";
8590
+ emitToolHookLifecycle({
8591
+ tool: "(unknown)",
8592
+ args: null,
8593
+ result: { error: reason },
8594
+ error: reason,
8595
+ sessionId: options.sessionId || null,
8596
+ turnId,
8597
+ toolUseId: call?.id || null,
8598
+ cwd: options.cwd || process.cwd(),
8599
+ });
8600
+ toolBatchRecords.push({
8601
+ tool: "(unknown)",
8602
+ toolUseId: call?.id || null,
8603
+ failed: true,
8604
+ });
8321
8605
  yield {
8322
8606
  type: "tool-result",
8323
8607
  tool: "(unknown)",
@@ -8413,14 +8697,14 @@ export async function* agentLoop(messages, options) {
8413
8697
  // (derived from the call + gate, so it's recomputable from the
8414
8698
  // tool-result's policy + tool_call_id) plus the low-cardinality
8415
8699
  // decision, letting a blocked tool span be tied to its decision.
8416
- const decId =
8700
+ const decision =
8417
8701
  r && typeof r === "object"
8418
- ? permissionDecisionId(call.id, r.policy)
8702
+ ? permissionDecision(call.id, toolName, r)
8419
8703
  : null;
8420
- if (decId) {
8704
+ if (decision?.id) {
8421
8705
  const permAttrs = buildTelemetryAttributes({
8422
- decisionId: decId,
8423
- "permission.decision": r.policy.decision,
8706
+ decisionId: decision.id,
8707
+ "permission.decision": decision.decision,
8424
8708
  });
8425
8709
  if (permAttrs["permission.decision_id"]) {
8426
8710
  span.setAttribute(
@@ -8458,6 +8742,7 @@ export async function* agentLoop(messages, options) {
8458
8742
  ? `${resultStr}\n\n${warningMsg}`
8459
8743
  : resultStr;
8460
8744
 
8745
+ const decision = permissionDecision(call.id, toolName, toolResult);
8461
8746
  yield {
8462
8747
  type: "tool-result",
8463
8748
  tool: toolName,
@@ -8465,10 +8750,8 @@ export async function* agentLoop(messages, options) {
8465
8750
  error: toolError,
8466
8751
  tool_use_id: call.id,
8467
8752
  turn_id: `${runId}:t${budget.consumed}`,
8468
- permission_decision_id: permissionDecisionId(
8469
- call.id,
8470
- toolResult?.policy,
8471
- ),
8753
+ permission_decision_id: decision?.id || null,
8754
+ permission_decision: decision,
8472
8755
  };
8473
8756
 
8474
8757
  messages.push({
@@ -8476,7 +8759,29 @@ export async function* agentLoop(messages, options) {
8476
8759
  content: toolContent,
8477
8760
  tool_call_id: call.id,
8478
8761
  });
8762
+ const failed = emitToolHookLifecycle({
8763
+ tool: toolName,
8764
+ args: toolArgs,
8765
+ result: toolResult,
8766
+ error: toolError,
8767
+ sessionId: options.sessionId || null,
8768
+ turnId,
8769
+ toolUseId: call.id,
8770
+ cwd: options.cwd || process.cwd(),
8771
+ });
8772
+ toolBatchRecords.push({
8773
+ tool: toolName,
8774
+ toolUseId: call.id,
8775
+ failed,
8776
+ });
8479
8777
  }
8778
+ emitToolBatchHookLifecycle({
8779
+ records: toolBatchRecords,
8780
+ sessionId: options.sessionId || null,
8781
+ turnId,
8782
+ cwd: options.cwd || process.cwd(),
8783
+ parallel: false,
8784
+ });
8480
8785
  }
8481
8786
 
8482
8787
  // Budget exhausted — flush any child usage the final iteration produced,
@@ -1155,7 +1155,7 @@ const CODING_AGENT_TOOL_CONTRACTS = Object.freeze([
1155
1155
  kind: "browser",
1156
1156
  tier: "extension",
1157
1157
  description:
1158
- "Capture live state from the user's real Chrome over CDP: current URL/title, open tabs, console messages and failed/error network requests observed during a short watch window, a capped DOM snapshot, and optionally a screenshot (saved to a temp file whose path is returned). Requires a debuggable Chrome — the user starts one with `cc browse chrome launch`. Console/network capture starts at attach time (CDP keeps no history) — set reload=true to observe load-time errors. Use to verify web changes in the user's logged-in browser.",
1158
+ "Capture live state from the user's real Chrome over CDP: current URL/title, open tabs, console messages and failed/error network requests observed during a short watch window, a capped DOM snapshot, and optionally a screenshot (published as a session-bound Artifact; no host temp path enters the agent result). Requires a debuggable Chrome — the user starts one with `cc browse chrome launch`. Console/network capture starts at attach time (CDP keeps no history) — set reload=true to observe load-time errors. Use to verify web changes in the user's logged-in browser.",
1159
1159
  inputSchema: {
1160
1160
  type: "object",
1161
1161
  properties: {
@@ -1187,7 +1187,7 @@ const CODING_AGENT_TOOL_CONTRACTS = Object.freeze([
1187
1187
  screenshot: {
1188
1188
  type: "boolean",
1189
1189
  description:
1190
- "Save a screenshot to a generated temp file and return its path (default false)",
1190
+ "Capture a screenshot and return opaque, session-bound Artifact metadata (default false)",
1191
1191
  },
1192
1192
  },
1193
1193
  required: [],
@@ -1208,7 +1208,7 @@ const CODING_AGENT_TOOL_CONTRACTS = Object.freeze([
1208
1208
  kind: "browser",
1209
1209
  tier: "extension",
1210
1210
  description:
1211
- "Perform EXPLICIT actions in the user's connected Chrome over loopback CDP: click, type, press, navigate (http/https only), waitForSelector, screenshot (saved to a generated temp path — never a chosen one), assertText. Approval-gated (HIGH risk): use browser_state first to observe; only act when the task genuinely requires driving the browser. Steps run in order and fail fast unless continue_on_error; each returns {ok, action, detail, durationMs} and every executed step is audit-logged under ~/.chainlesschain/browser-actions/. Requires a debuggable Chrome (`cc browse chrome launch`).",
1211
+ "Perform EXPLICIT actions in the user's connected Chrome over loopback CDP: click, type, press, navigate (http/https only), waitForSelector, screenshot (published as a session-bound Artifact; never a caller-chosen path), assertText. Approval-gated (HIGH risk): use browser_state first to observe; only act when the task genuinely requires driving the browser. Steps run in order and fail fast unless continue_on_error; each returns {ok, action, detail, durationMs} and every executed step is audit-logged under ~/.chainlesschain/browser-actions/. Requires a debuggable Chrome (`cc browse chrome launch`).",
1212
1212
  inputSchema: {
1213
1213
  type: "object",
1214
1214
  properties: {