@xopcai/xopc 0.0.113 → 0.0.115

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 (567) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
  3. package/dist/extensions/feishu/src/workflow-progress.js +1 -1
  4. package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
  5. package/dist/extensions/telegram/src/inbound-processor.js +1 -1
  6. package/dist/extensions/telegram/src/plugin.js +1 -1
  7. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  8. package/dist/extensions/telegram/src/update-offset-store.js +1 -1
  9. package/dist/extensions/telegram/src/workflow-progress.js +1 -1
  10. package/dist/extensions/telegram/xopc.extension.json +1 -1
  11. package/dist/extensions/weixin/src/api/api.js +2 -2
  12. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  13. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  14. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  15. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  16. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  17. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  18. package/dist/extensions/weixin/src/plugin.js +1 -1
  19. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  20. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  21. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CBlklyNr.js → agent-avatar-dicebear-DVnBfANm.js} +1 -1
  22. package/dist/gateway/static/root/assets/agent-browser-settings-page-DPXc4hz8.js +6 -0
  23. package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-CTJ0YnRQ.js +1 -0
  24. package/dist/gateway/static/root/assets/agents-zJXQfJ_W.js +71 -0
  25. package/dist/gateway/static/root/assets/{app-management-settings-panel-28E_WfMe.js → app-management-settings-panel-DzGbdr04.js} +1 -1
  26. package/dist/gateway/static/root/assets/{appearance-settings-Do1z0XgJ.js → appearance-settings-BQpPSTHD.js} +1 -1
  27. package/dist/gateway/static/root/assets/apps-page-CPjfyzSD.js +1 -0
  28. package/dist/gateway/static/root/assets/{archive-plugin-BAFlsov_.js → archive-plugin-CXu-Csep.js} +1 -1
  29. package/dist/gateway/static/root/assets/{attachment-load-V3qGPC3x.js → attachment-load-BAjgOoGY.js} +1 -1
  30. package/dist/gateway/static/root/assets/{binary-plugins-DT8NvA6W.js → binary-plugins-BSBgB2hO.js} +1 -1
  31. package/dist/gateway/static/root/assets/{block-editor-CdLMEcHd.js → block-editor-BpXw9TTR.js} +3 -3
  32. package/dist/gateway/static/root/assets/channels-settings-BbPUpzWB.js +1 -0
  33. package/dist/gateway/static/root/assets/{config-api-Bf5mjpu7.js → config-api-NOoPiIYz.js} +1 -1
  34. package/dist/gateway/static/root/assets/connectors-settings-CAXYMOdp.js +2 -0
  35. package/dist/gateway/static/root/assets/{cron-api--pAB_rps.js → cron-api-C9BOqAXd.js} +1 -1
  36. package/dist/gateway/static/root/assets/cron-page-DuUbBeKI.js +3 -0
  37. package/dist/gateway/static/root/assets/{dreaming-settings-6UZE1FSK.js → dreaming-settings-DQ4DtiK1.js} +1 -1
  38. package/dist/gateway/static/root/assets/{extension-debug-page-BGhE7msg.js → extension-debug-page-D9kgUHCc.js} +1 -1
  39. package/dist/gateway/static/root/assets/{extension-page-CvpI45WG.js → extension-page-CGyhXqzR.js} +1 -1
  40. package/dist/gateway/static/root/assets/{extension-settings-page-DAmR5FUe.js → extension-settings-page-DL8Xquqd.js} +1 -1
  41. package/dist/gateway/static/root/assets/{fetch-NZmjSXLl.js → fetch-D0VXA932.js} +1 -1
  42. package/dist/gateway/static/root/assets/{format-interval-label-qhth3BMV.js → format-interval-label-Be8SmgUw.js} +1 -1
  43. package/dist/gateway/static/root/assets/{gateway-config-api-CaXBt-9R.js → gateway-config-api-C-xjn__h.js} +1 -1
  44. package/dist/gateway/static/root/assets/{gateway-settings-DphpbLBc.js → gateway-settings-BMPwIjKI.js} +1 -1
  45. package/dist/gateway/static/root/assets/{gateway-startup-retry-Be1omjh3.js → gateway-startup-retry-DERUH61L.js} +1 -1
  46. package/dist/gateway/static/root/assets/goal-detail-page-BJsyjJnF.js +1 -0
  47. package/dist/gateway/static/root/assets/goals-config-api-BPmqWk90.js +1 -0
  48. package/dist/gateway/static/root/assets/goals-page-BerDgIhw.js +2 -0
  49. package/dist/gateway/static/root/assets/goals-settings-ByTjeAto.js +1 -0
  50. package/dist/gateway/static/root/assets/{heartbeat-config-api-BzO6G4fD.js → heartbeat-config-api-Bfdzr8oV.js} +1 -1
  51. package/dist/gateway/static/root/assets/{heartbeat-settings-DCST9-du.js → heartbeat-settings-TbHgcjTn.js} +1 -1
  52. package/dist/gateway/static/root/assets/index-AkTrf6Pb.js +122 -0
  53. package/dist/gateway/static/root/assets/index-fh5sXTj9.css +1 -0
  54. package/dist/gateway/static/root/assets/{interval-presets-DJmshV8n.js → interval-presets-utKbuCRY.js} +1 -1
  55. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-9AUUlQ5Q.js → keyboard-shortcuts-settings-CjqS6c6V.js} +1 -1
  56. package/dist/gateway/static/root/assets/logs-page-DGXuPf5B.js +2 -0
  57. package/dist/gateway/static/root/assets/{markdown-split-CYYELqAr.js → markdown-split-DW8C47iB.js} +1 -1
  58. package/dist/gateway/static/root/assets/{media-plugins-BEcMR2M8.js → media-plugins-D6HwDhDT.js} +1 -1
  59. package/dist/gateway/static/root/assets/messages-upgxw6Ub.js +3 -0
  60. package/dist/gateway/static/root/assets/models-hub-panel-Bot16nn7.js +2 -0
  61. package/dist/gateway/static/root/assets/note-detail-page-Brlyou8M.js +2 -0
  62. package/dist/gateway/static/root/assets/{note-image-lightbox-DNAoPcmm.js → note-image-lightbox-pJM35Pz5.js} +1 -1
  63. package/dist/gateway/static/root/assets/notes-page-DvZ4pwc-.js +1 -0
  64. package/dist/gateway/static/root/assets/{preview-open-alternatives-BPLz0AIv.js → preview-open-alternatives-CVwHuyN6.js} +1 -1
  65. package/dist/gateway/static/root/assets/remote-access-hub-BZEDmxbZ.js +1 -0
  66. package/dist/gateway/static/root/assets/{save-bar-controls-CrWwWRVK.js → save-bar-controls-Ba-UEk7x.js} +1 -1
  67. package/dist/gateway/static/root/assets/{schedule-field-CF2sadvN.js → schedule-field-CNN9595U.js} +1 -1
  68. package/dist/gateway/static/root/assets/{schema-form-Di5cKjYE.js → schema-form-DnNMmtD5.js} +1 -1
  69. package/dist/gateway/static/root/assets/sessions-page-DdGGlsfn.js +1 -0
  70. package/dist/gateway/static/root/assets/settings-advanced-gate-DlkEkPf9.js +1 -0
  71. package/dist/gateway/static/root/assets/{settings-collapsible-section-Chh282jW.js → settings-collapsible-section-CmOz80i5.js} +1 -1
  72. package/dist/gateway/static/root/assets/{settings-form-section-Dq-83cQd.js → settings-form-section-BmK7JJOV.js} +1 -1
  73. package/dist/gateway/static/root/assets/settings-page-DFPTrsPF.js +1 -0
  74. package/dist/gateway/static/root/assets/setup-status-panel-CYCCfgh4.js +1 -0
  75. package/dist/gateway/static/root/assets/{share-preview-page-0FXYnSUA.js → share-preview-page-Dp2qGrHC.js} +1 -1
  76. package/dist/gateway/static/root/assets/shares-settings-Bff1pGd0.js +1 -0
  77. package/dist/gateway/static/root/assets/skill-reload-api-CJGKpBur.js +1 -0
  78. package/dist/gateway/static/root/assets/skills-page-C6ocduTD.js +2 -0
  79. package/dist/gateway/static/root/assets/{system-settings-panel-W1pTcojB.js → system-settings-panel-5jrIEr5b.js} +1 -1
  80. package/dist/gateway/static/root/assets/{use-agent-defaults-form-BVRvkK7m.js → use-agent-defaults-form-BuiXLIs5.js} +1 -1
  81. package/dist/gateway/static/root/assets/{use-channel-catalog-CgJibfMM.js → use-channel-catalog-CHlO8J9G.js} +1 -1
  82. package/dist/gateway/static/root/assets/{use-settings-tab-guard-Bw_qkRQE.js → use-settings-tab-guard-CW5JORnl.js} +1 -1
  83. package/dist/gateway/static/root/assets/voice-api-key-field-DDoQyghO.js +1 -0
  84. package/dist/gateway/static/root/assets/{voice-player-store-C7lziaAx.js → voice-player-store-DDDWYHvg.js} +1 -1
  85. package/dist/gateway/static/root/assets/workflow-page.utils-CKjeEGqx.js +1 -0
  86. package/dist/gateway/static/root/assets/workflows-page-B604ehHG.js +18 -0
  87. package/dist/gateway/static/root/index.html +5 -5
  88. package/dist/gateway/static/root/logo.svg +4 -3
  89. package/dist/package.js +1 -1
  90. package/dist/src/agent/agent-manager.d.ts +8 -0
  91. package/dist/src/agent/agent-manager.js +63 -28
  92. package/dist/src/agent/agent-manager.js.map +1 -1
  93. package/dist/src/agent/agent-scope.js +1 -1
  94. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  95. package/dist/src/agent/bootstrap/project-agents-context.d.ts +2 -0
  96. package/dist/src/agent/bootstrap/project-agents-context.js +32 -0
  97. package/dist/src/agent/bootstrap/project-agents-context.js.map +1 -0
  98. package/dist/src/agent/context/workspace-seed.js +2 -2
  99. package/dist/src/agent/context/workspace-state.js +1 -1
  100. package/dist/src/agent/context/workspace.js +1 -1
  101. package/dist/src/agent/embedded/session-tool-result-guard.js +8 -1
  102. package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
  103. package/dist/src/agent/goals/checklist-judge.d.ts +1 -0
  104. package/dist/src/agent/goals/checklist-judge.js +3 -2
  105. package/dist/src/agent/goals/checklist-judge.js.map +1 -1
  106. package/dist/src/agent/goals/evaluate-turn.d.ts +1 -1
  107. package/dist/src/agent/goals/evaluate-turn.js +1 -0
  108. package/dist/src/agent/goals/evaluate-turn.js.map +1 -1
  109. package/dist/src/agent/goals/goal-locale.js +2 -2
  110. package/dist/src/agent/goals/persistent-goal-service.js +2 -4
  111. package/dist/src/agent/goals/persistent-goal-service.js.map +1 -1
  112. package/dist/src/agent/goals/post-turn.d.ts +6 -1
  113. package/dist/src/agent/goals/post-turn.js +15 -6
  114. package/dist/src/agent/goals/post-turn.js.map +1 -1
  115. package/dist/src/agent/image/load-image-media.js +2 -2
  116. package/dist/src/agent/inbound/inbound-loop.js +5 -1
  117. package/dist/src/agent/inbound/inbound-loop.js.map +1 -1
  118. package/dist/src/agent/inbound/turn-dispatcher.d.ts +2 -2
  119. package/dist/src/agent/inbound/turn-dispatcher.js +2 -2
  120. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
  121. package/dist/src/agent/ipc/inbox.js +3 -3
  122. package/dist/src/agent/ipc/socket.js +1 -1
  123. package/dist/src/agent/mcp/bundle-mcp-materialize.d.ts +27 -0
  124. package/dist/src/agent/mcp/bundle-mcp-materialize.js +50 -2
  125. package/dist/src/agent/mcp/bundle-mcp-materialize.js.map +1 -1
  126. package/dist/src/agent/mcp/bundle-mcp-runtime.js +79 -4
  127. package/dist/src/agent/mcp/bundle-mcp-runtime.js.map +1 -1
  128. package/dist/src/agent/mcp/bundle-mcp-types.d.ts +19 -0
  129. package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
  130. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  131. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  132. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  133. package/dist/src/agent/memory/dreaming/events.js +1 -1
  134. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  135. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  136. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  137. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  138. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  139. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  140. package/dist/src/agent/memory/memory-flush.js +1 -1
  141. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  142. package/dist/src/agent/models/manager.js +1 -1
  143. package/dist/src/agent/prompt/memory/index.js +1 -1
  144. package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
  145. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  146. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  147. package/dist/src/agent/sandbox/path-policy.js +2 -2
  148. package/dist/src/agent/service/btw-query.js +11 -3
  149. package/dist/src/agent/service/btw-query.js.map +1 -1
  150. package/dist/src/agent/service/parse-outbound-session-key.js +13 -8
  151. package/dist/src/agent/service/parse-outbound-session-key.js.map +1 -1
  152. package/dist/src/agent/service/process-direct-one-shot.d.ts +2 -2
  153. package/dist/src/agent/service/process-direct-one-shot.js +1 -1
  154. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  155. package/dist/src/agent/service/process-direct-streaming.d.ts +2 -2
  156. package/dist/src/agent/service/process-direct-streaming.js +1 -1
  157. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  158. package/dist/src/agent/service.d.ts +1 -1
  159. package/dist/src/agent/service.js +13 -9
  160. package/dist/src/agent/service.js.map +1 -1
  161. package/dist/src/agent/service.types.d.ts +5 -0
  162. package/dist/src/agent/session/session-inspector.js +1 -1
  163. package/dist/src/agent/skills/config.js +2 -2
  164. package/dist/src/agent/skills/filesystem-watcher.js +5 -4
  165. package/dist/src/agent/skills/filesystem-watcher.js.map +1 -1
  166. package/dist/src/agent/skills/hub-hash.js +2 -2
  167. package/dist/src/agent/skills/hub-lock.js +1 -1
  168. package/dist/src/agent/skills/hub-pull.js +2 -2
  169. package/dist/src/agent/skills/index.js +4 -3
  170. package/dist/src/agent/skills/index.js.map +1 -1
  171. package/dist/src/agent/skills/installer.js +2 -2
  172. package/dist/src/agent/skills/managed-store.js +1 -1
  173. package/dist/src/agent/skills/skill-manage-ops.js +3 -2
  174. package/dist/src/agent/skills/skill-manage-ops.js.map +1 -1
  175. package/dist/src/agent/skills/skill-manager.js +1 -1
  176. package/dist/src/agent/skills/skill-view-path.js +1 -1
  177. package/dist/src/agent/skills/test-framework.js +1 -1
  178. package/dist/src/agent/skills/types.d.ts +1 -1
  179. package/dist/src/agent/skills/watcher.js +2 -5
  180. package/dist/src/agent/skills/watcher.js.map +1 -1
  181. package/dist/src/agent/skills/workspace-skills-dir.d.ts +1 -0
  182. package/dist/src/agent/skills/workspace-skills-dir.js +11 -0
  183. package/dist/src/agent/skills/workspace-skills-dir.js.map +1 -0
  184. package/dist/src/agent/starter-agents.js +1 -1
  185. package/dist/src/agent/tool-manuals/browser.d.ts +1 -1
  186. package/dist/src/agent/tool-manuals/browser.js +62 -3
  187. package/dist/src/agent/tool-manuals/browser.js.map +1 -1
  188. package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +4 -1
  189. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +13 -4
  190. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
  191. package/dist/src/agent/tools/browser/tool/schemas.d.ts +0 -2
  192. package/dist/src/agent/tools/browser/tool/schemas.js +1 -2
  193. package/dist/src/agent/tools/browser/tool/schemas.js.map +1 -1
  194. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  195. package/dist/src/agent/tools/factory.js +1 -10
  196. package/dist/src/agent/tools/factory.js.map +1 -1
  197. package/dist/src/agent/tools/find.js +1 -1
  198. package/dist/src/agent/tools/grep.js +1 -1
  199. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  200. package/dist/src/agent/tools/skill-manage-tool.js +2 -2
  201. package/dist/src/agent/tools/skill-manage-tool.js.map +1 -1
  202. package/dist/src/agent/tools/workflow-tool.js +1 -1
  203. package/dist/src/agent/workflow/catalog.js +1 -1
  204. package/dist/src/agent/workflow/snapshot.d.ts +10 -0
  205. package/dist/src/agent/workflow/snapshot.js +136 -1
  206. package/dist/src/agent/workflow/snapshot.js.map +1 -1
  207. package/dist/src/agent/workflow/subagent-runner.js +18 -1
  208. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  209. package/dist/src/ai-assist/text-assist.js +1 -1
  210. package/dist/src/auth/credentials.js +2 -2
  211. package/dist/src/auth/profiles/store.js +2 -2
  212. package/dist/src/auth/sync-provider-auth.js +1 -1
  213. package/dist/src/browser/actions/extension-registry-bridge.js +91 -7
  214. package/dist/src/browser/actions/extension-registry-bridge.js.map +1 -1
  215. package/dist/src/browser/actions/registry.js +383 -7
  216. package/dist/src/browser/actions/registry.js.map +1 -1
  217. package/dist/src/browser/actions/types.d.ts +11 -3
  218. package/dist/src/browser/cache-dir-policy.js +1 -1
  219. package/dist/src/browser/cdp-local-launcher.js +2 -2
  220. package/dist/src/browser/index.js +2 -2
  221. package/dist/src/browser/pipeline/output.d.ts +18 -16
  222. package/dist/src/browser/pipeline/output.js +28 -20
  223. package/dist/src/browser/pipeline/output.js.map +1 -1
  224. package/dist/src/browser/pipeline/runner.d.ts +7 -14
  225. package/dist/src/browser/pipeline/runner.js +349 -102
  226. package/dist/src/browser/pipeline/runner.js.map +1 -1
  227. package/dist/src/browser/pipeline/schema.d.ts +1 -0
  228. package/dist/src/browser/pipeline/schema.js +35 -58
  229. package/dist/src/browser/pipeline/schema.js.map +1 -1
  230. package/dist/src/browser/pipeline/source.d.ts +2 -0
  231. package/dist/src/browser/pipeline/source.js +10 -1
  232. package/dist/src/browser/pipeline/source.js.map +1 -1
  233. package/dist/src/browser/pipeline/template.d.ts +10 -2
  234. package/dist/src/browser/pipeline/template.js +50 -8
  235. package/dist/src/browser/pipeline/template.js.map +1 -1
  236. package/dist/src/browser/providers/browser-ext-install.js +4 -4
  237. package/dist/src/browser/providers/cloakbrowser.js +5 -5
  238. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  239. package/dist/src/browser/stealth.js +1 -1
  240. package/dist/src/channels/catalog/channel-catalog-service.d.ts +2 -1
  241. package/dist/src/channels/catalog/channel-catalog-service.js +133 -16
  242. package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -1
  243. package/dist/src/channels/catalog/channel-catalog-types.d.ts +13 -0
  244. package/dist/src/channels/outbound/persist-store.js +1 -1
  245. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  246. package/dist/src/channels/pairing/pairing-store.js +2 -2
  247. package/dist/src/chat-commands/agent-edit.js +2 -2
  248. package/dist/src/chat-commands/builtins/config.js +5 -7
  249. package/dist/src/chat-commands/builtins/config.js.map +1 -1
  250. package/dist/src/chat-commands/context.d.ts +5 -0
  251. package/dist/src/chat-commands/context.js +18 -9
  252. package/dist/src/chat-commands/context.js.map +1 -1
  253. package/dist/src/chat-commands/index.d.ts +1 -1
  254. package/dist/src/chat-commands/index.js +2 -2
  255. package/dist/src/chat-commands/index.js.map +1 -1
  256. package/dist/src/chat-commands/processor.js +22 -21
  257. package/dist/src/chat-commands/processor.js.map +1 -1
  258. package/dist/src/chat-commands/session-key.d.ts +3 -15
  259. package/dist/src/chat-commands/session-key.js +3 -49
  260. package/dist/src/chat-commands/session-key.js.map +1 -1
  261. package/dist/src/chat-commands/types.d.ts +4 -0
  262. package/dist/src/cli/commands/browser-cli-helpers.js +11 -5
  263. package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
  264. package/dist/src/cli/commands/config.js +1 -1
  265. package/dist/src/cli/commands/doctor/checks/channel-config.js +14 -1
  266. package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
  267. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  268. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  269. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  270. package/dist/src/cli/commands/doctor/checks/session-integrity.js +8 -8
  271. package/dist/src/cli/commands/doctor/checks/session-integrity.js.map +1 -1
  272. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  273. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  274. package/dist/src/cli/commands/extension-create.js +1 -1
  275. package/dist/src/cli/commands/extension-dev.js +2 -2
  276. package/dist/src/cli/commands/extension-marketplace.js +2 -2
  277. package/dist/src/cli/commands/extension-pack.js +2 -2
  278. package/dist/src/cli/commands/extension.js +3 -3
  279. package/dist/src/cli/commands/gateway/logs.js +1 -1
  280. package/dist/src/cli/commands/image.js +1 -1
  281. package/dist/src/cli/commands/init.js +2 -2
  282. package/dist/src/cli/commands/models.js +1 -1
  283. package/dist/src/cli/commands/skills-test.js +1 -1
  284. package/dist/src/cli/templates.js +1 -1
  285. package/dist/src/cli/utils/gateway-client.js +1 -1
  286. package/dist/src/cli/utils/init-workspace-core.js +2 -2
  287. package/dist/src/config/agent-profile.js +1 -1
  288. package/dist/src/config/agent-typed-models.js +1 -1
  289. package/dist/src/config/gateway-bind.js +1 -1
  290. package/dist/src/config/index.js +7 -7
  291. package/dist/src/config/loader.js +4 -4
  292. package/dist/src/config/models-json.js +2 -2
  293. package/dist/src/config/paths-state.js +1 -1
  294. package/dist/src/config/paths.js +1 -1
  295. package/dist/src/config/profile.js +1 -1
  296. package/dist/src/config/reload.js +1 -1
  297. package/dist/src/config/rules.js +5 -0
  298. package/dist/src/config/rules.js.map +1 -1
  299. package/dist/src/config/schema.d.ts +8 -0
  300. package/dist/src/config/schema.js +7 -0
  301. package/dist/src/config/schema.js.map +1 -1
  302. package/dist/src/config/web-patch.d.ts +1 -0
  303. package/dist/src/config/web-patch.js +1 -0
  304. package/dist/src/config/web-patch.js.map +1 -1
  305. package/dist/src/config/workspace-path.js +1 -1
  306. package/dist/src/connectors/builtin-catalog.js +180 -1
  307. package/dist/src/connectors/builtin-catalog.js.map +1 -1
  308. package/dist/src/connectors/health.js +18 -9
  309. package/dist/src/connectors/health.js.map +1 -1
  310. package/dist/src/connectors/types.d.ts +19 -0
  311. package/dist/src/connectors/usage.js +12 -4
  312. package/dist/src/connectors/usage.js.map +1 -1
  313. package/dist/src/cron/executor.js +1 -1
  314. package/dist/src/cron/service.js +1 -1
  315. package/dist/src/daemon/constants.js +1 -1
  316. package/dist/src/daemon/install-plan.js +2 -2
  317. package/dist/src/daemon/launchd.js +2 -2
  318. package/dist/src/daemon/schtasks.js +2 -2
  319. package/dist/src/daemon/systemd.js +2 -2
  320. package/dist/src/extensions/bundle-mcp.js +1 -1
  321. package/dist/src/extensions/discover-extensions.js +2 -2
  322. package/dist/src/extensions/health.js +1 -1
  323. package/dist/src/extensions/install.js +2 -2
  324. package/dist/src/extensions/loader.js +2 -2
  325. package/dist/src/extensions/lockfile.js +3 -3
  326. package/dist/src/extensions/security.js +1 -1
  327. package/dist/src/extensions/types/tui.d.ts +2 -0
  328. package/dist/src/extensions/update.js +2 -2
  329. package/dist/src/gateway/agents-admin.js +2 -2
  330. package/dist/src/gateway/file-path-classifier.js +2 -2
  331. package/dist/src/gateway/heartbeat/service.js +13 -1
  332. package/dist/src/gateway/heartbeat/service.js.map +1 -1
  333. package/dist/src/gateway/hono/app.js +18 -5
  334. package/dist/src/gateway/hono/app.js.map +1 -1
  335. package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -1
  336. package/dist/src/gateway/hono/lib/config-payload.js +7 -4
  337. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  338. package/dist/src/gateway/hono/lib/extension-store.js +2 -2
  339. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  340. package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +4 -0
  341. package/dist/src/gateway/hono/middleware/strict-rate-limit.js +19 -5
  342. package/dist/src/gateway/hono/middleware/strict-rate-limit.js.map +1 -1
  343. package/dist/src/gateway/hono/oauth-async.js +1 -1
  344. package/dist/src/gateway/hono/routes/agent-stream.js +6 -6
  345. package/dist/src/gateway/hono/routes/agent-stream.js.map +1 -1
  346. package/dist/src/gateway/hono/routes/agents.js +1 -1
  347. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  348. package/dist/src/gateway/hono/routes/channels.js +18 -14
  349. package/dist/src/gateway/hono/routes/channels.js.map +1 -1
  350. package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +1 -1
  351. package/dist/src/gateway/hono/routes/config-patch/gateway.js +6 -0
  352. package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -1
  353. package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
  354. package/dist/src/gateway/hono/routes/deps.d.ts +1 -0
  355. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  356. package/dist/src/gateway/hono/routes/goals.js +16 -3
  357. package/dist/src/gateway/hono/routes/goals.js.map +1 -1
  358. package/dist/src/gateway/hono/routes/host-fs.js +2 -2
  359. package/dist/src/gateway/hono/routes/logs.js +1 -0
  360. package/dist/src/gateway/hono/routes/logs.js.map +1 -1
  361. package/dist/src/gateway/hono/routes/mcp.js +27 -8
  362. package/dist/src/gateway/hono/routes/mcp.js.map +1 -1
  363. package/dist/src/gateway/hono/routes/models.js +1 -1
  364. package/dist/src/gateway/hono/routes/notes.js +14 -2
  365. package/dist/src/gateway/hono/routes/notes.js.map +1 -1
  366. package/dist/src/gateway/hono/routes/sessions.js +62 -4
  367. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  368. package/dist/src/gateway/hono/routes/shares.js +1 -1
  369. package/dist/src/gateway/hono/routes/workflows.js +1 -1
  370. package/dist/src/gateway/hono/routes/workspace.js +5 -68
  371. package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
  372. package/dist/src/gateway/hono/sse.d.ts +2 -2
  373. package/dist/src/gateway/hono/sse.js +7 -15
  374. package/dist/src/gateway/hono/sse.js.map +1 -1
  375. package/dist/src/gateway/lock.js +3 -3
  376. package/dist/src/gateway/ports.js +1 -1
  377. package/dist/src/gateway/rate-limit/buckets.d.ts +3 -0
  378. package/dist/src/gateway/rate-limit/buckets.js +12 -0
  379. package/dist/src/gateway/rate-limit/buckets.js.map +1 -1
  380. package/dist/src/gateway/resolve-webchat-session-key.d.ts +2 -6
  381. package/dist/src/gateway/resolve-webchat-session-key.js +5 -31
  382. package/dist/src/gateway/resolve-webchat-session-key.js.map +1 -1
  383. package/dist/src/gateway/service/agent-runner.d.ts +2 -3
  384. package/dist/src/gateway/service/agent-runner.js +9 -22
  385. package/dist/src/gateway/service/agent-runner.js.map +1 -1
  386. package/dist/src/gateway/service/config-coordinator.js +1 -1
  387. package/dist/src/gateway/service/marketplace-service.js +2 -2
  388. package/dist/src/gateway/service/run-gateway-agent.js +9 -7
  389. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  390. package/dist/src/gateway/service/sessions-api.d.ts +9 -0
  391. package/dist/src/gateway/service/sessions-api.js +11 -0
  392. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  393. package/dist/src/gateway/service.d.ts +1 -1
  394. package/dist/src/gateway/service.js +23 -9
  395. package/dist/src/gateway/service.js.map +1 -1
  396. package/dist/src/gateway/workspace-file-search.d.ts +9 -0
  397. package/dist/src/gateway/workspace-file-search.js +76 -0
  398. package/dist/src/gateway/workspace-file-search.js.map +1 -0
  399. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  400. package/dist/src/goals/goal-notifications.d.ts +2 -0
  401. package/dist/src/goals/goal-notifications.js +16 -11
  402. package/dist/src/goals/goal-notifications.js.map +1 -1
  403. package/dist/src/goals/goal-service.js +1 -6
  404. package/dist/src/goals/goal-service.js.map +1 -1
  405. package/dist/src/goals/goal-workflow-judge.js +2 -2
  406. package/dist/src/i18n/goals-bundle.js +1 -1
  407. package/dist/src/i18n/index.js +1 -1
  408. package/dist/src/i18n/share-tool-bundle.js +2 -2
  409. package/dist/src/infra/brew.js +1 -1
  410. package/dist/src/infra/package-json.js +1 -1
  411. package/dist/src/infra/package-update-steps.js +1 -1
  412. package/dist/src/infra/path-env.js +2 -2
  413. package/dist/src/infra/restart.js +1 -1
  414. package/dist/src/infra/stable-node-path.js +1 -1
  415. package/dist/src/infra/update-check.js +1 -1
  416. package/dist/src/infra/update-global.js +1 -1
  417. package/dist/src/infra/update-lock.js +2 -2
  418. package/dist/src/infra/update-restart.js +1 -1
  419. package/dist/src/infra/update-runner.js +1 -1
  420. package/dist/src/infra/update-startup.js +1 -1
  421. package/dist/src/infra/write-file-atomic.js +2 -2
  422. package/dist/src/media/store.js +1 -1
  423. package/dist/src/notes/agent-context.js +1 -1
  424. package/dist/src/notes/service.js +1 -1
  425. package/dist/src/notes/store.js +2 -2
  426. package/dist/src/project-trust/trust-store.js +4 -2
  427. package/dist/src/project-trust/trust-store.js.map +1 -1
  428. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  429. package/dist/src/providers/index.js +1 -1
  430. package/dist/src/providers/model-registry.js +4 -4
  431. package/dist/src/session/index.d.ts +1 -1
  432. package/dist/src/session/index.js +2 -2
  433. package/dist/src/session/init-session-turn.js +7 -10
  434. package/dist/src/session/init-session-turn.js.map +1 -1
  435. package/dist/src/session/manager.d.ts +5 -1
  436. package/dist/src/session/manager.js +5 -2
  437. package/dist/src/session/manager.js.map +1 -1
  438. package/dist/src/session/reset-type.d.ts +0 -2
  439. package/dist/src/session/reset-type.js +3 -9
  440. package/dist/src/session/reset-type.js.map +1 -1
  441. package/dist/src/session/resolve-session.js +10 -21
  442. package/dist/src/session/resolve-session.js.map +1 -1
  443. package/dist/src/session/session-title.js +2 -2
  444. package/dist/src/session/store.d.ts +11 -3
  445. package/dist/src/session/store.js +30 -14
  446. package/dist/src/session/store.js.map +1 -1
  447. package/dist/src/session/types.d.ts +2 -4
  448. package/dist/src/session/types.js.map +1 -1
  449. package/dist/src/share/share-auto.js +2 -2
  450. package/dist/src/share/share-store.js +3 -3
  451. package/dist/src/share/share-thumbnail.js +2 -2
  452. package/dist/src/share/share-zip.js +1 -1
  453. package/dist/src/share/site-share-store.js +3 -3
  454. package/dist/src/share/site-static-serve.js +1 -1
  455. package/dist/src/storage/sqlite/connection.js +1 -1
  456. package/dist/src/storage/sqlite/index.d.ts +2 -2
  457. package/dist/src/storage/sqlite/index.js +3 -3
  458. package/dist/src/storage/sqlite/memory-index-repository.js +2 -2
  459. package/dist/src/storage/sqlite/migrations/010_session_id_identity.sql +30 -0
  460. package/dist/src/storage/sqlite/migrations/discover.js +1 -1
  461. package/dist/src/storage/sqlite/migrations/runner.d.ts +2 -2
  462. package/dist/src/storage/sqlite/migrations/runner.js +5 -5
  463. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  464. package/dist/src/storage/sqlite/migrations/runner.ts +2 -2
  465. package/dist/src/storage/sqlite/row-mappers.d.ts +4 -4
  466. package/dist/src/storage/sqlite/row-mappers.js +11 -14
  467. package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
  468. package/dist/src/storage/sqlite/schema.js +4 -4
  469. package/dist/src/storage/sqlite/schema.js.map +1 -1
  470. package/dist/src/storage/sqlite/schema.sql +37 -10
  471. package/dist/src/storage/sqlite/session-metadata.d.ts +2 -7
  472. package/dist/src/storage/sqlite/session-metadata.js +18 -72
  473. package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
  474. package/dist/src/storage/sqlite/session-repository.d.ts +6 -5
  475. package/dist/src/storage/sqlite/session-repository.js +34 -40
  476. package/dist/src/storage/sqlite/session-repository.js.map +1 -1
  477. package/dist/src/storage/sqlite/transcript-repository.d.ts +2 -2
  478. package/dist/src/storage/sqlite/transcript-repository.js +52 -52
  479. package/dist/src/storage/sqlite/transcript-repository.js.map +1 -1
  480. package/dist/src/tui/backends/embedded-backend.d.ts +18 -4
  481. package/dist/src/tui/backends/embedded-backend.js +100 -1
  482. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  483. package/dist/src/tui/backends/gateway-sse-backend.d.ts +5 -1
  484. package/dist/src/tui/backends/gateway-sse-backend.js +45 -2
  485. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  486. package/dist/src/tui/clipboard-image.js +3 -3
  487. package/dist/src/tui/components/chat-log.d.ts +2 -0
  488. package/dist/src/tui/components/chat-log.js +19 -0
  489. package/dist/src/tui/components/chat-log.js.map +1 -1
  490. package/dist/src/tui/extension-host/autocomplete.d.ts +3 -2
  491. package/dist/src/tui/extension-host/autocomplete.js +29 -12
  492. package/dist/src/tui/extension-host/autocomplete.js.map +1 -1
  493. package/dist/src/tui/extension-host/load-extensions.js +1 -1
  494. package/dist/src/tui/extension-host/runtime.d.ts +12 -0
  495. package/dist/src/tui/extension-host/runtime.js +6 -4
  496. package/dist/src/tui/extension-host/runtime.js.map +1 -1
  497. package/dist/src/tui/theme-manager.js +1 -1
  498. package/dist/src/tui/tui-backend.d.ts +23 -0
  499. package/dist/src/tui/tui-command-formatters.js +4 -4
  500. package/dist/src/tui/tui-commands.d.ts +16 -3
  501. package/dist/src/tui/tui-commands.js +134 -27
  502. package/dist/src/tui/tui-commands.js.map +1 -1
  503. package/dist/src/tui/tui-file-autocomplete.d.ts +5 -0
  504. package/dist/src/tui/tui-file-autocomplete.js +26 -0
  505. package/dist/src/tui/tui-file-autocomplete.js.map +1 -0
  506. package/dist/src/tui/tui-keybindings-file.js +1 -1
  507. package/dist/src/tui/tui-picker-overlay.js +1 -1
  508. package/dist/src/tui/tui-scoped-models.js +2 -2
  509. package/dist/src/tui/tui-settings.js +1 -1
  510. package/dist/src/tui/tui-startup-resources.js +1 -1
  511. package/dist/src/tui/tui-startup-text.js +1 -1
  512. package/dist/src/tui/tui-startup-text.js.map +1 -1
  513. package/dist/src/tui/tui.js +106 -17
  514. package/dist/src/tui/tui.js.map +1 -1
  515. package/dist/src/tunnel/frpc-binary.js +4 -4
  516. package/dist/src/tunnel/frpc-config.js +1 -1
  517. package/dist/src/tunnel/frpc-extract.js +1 -1
  518. package/dist/src/tunnel/tunnel-state.js +1 -1
  519. package/dist/src/utils/logger/audit.js +1 -1
  520. package/dist/src/utils/logger/context.d.ts +2 -2
  521. package/dist/src/utils/logger/context.js +2 -1
  522. package/dist/src/utils/logger/context.js.map +1 -1
  523. package/dist/src/utils/logger/log-store.js +2 -1
  524. package/dist/src/utils/logger/log-store.js.map +1 -1
  525. package/dist/src/utils/logger/pino-record.js +3 -0
  526. package/dist/src/utils/logger/pino-record.js.map +1 -1
  527. package/dist/src/utils/logger/rotation.js +1 -1
  528. package/dist/src/utils/logger/streams.js +1 -1
  529. package/dist/src/utils/logger/types.d.ts +5 -0
  530. package/dist/src/utils/logger/types.js.map +1 -1
  531. package/dist/src/voice/tts/audio.js +1 -1
  532. package/dist/src/voice/tts/providers/edge-speech.js +2 -2
  533. package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
  534. package/dist/src/workflows/service/workflow-run-service.js +1 -1
  535. package/dist/src/workflows/service/workflow-session-bridge.js +13 -1
  536. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  537. package/dist/src/workflows/store/event-store.js +1 -1
  538. package/dist/src/workflows/store/run-store.js +1 -1
  539. package/package.json +1 -1
  540. package/dist/gateway/static/root/assets/agent-browser-settings-page-rGbKc2Hh.js +0 -6
  541. package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-CtwVbjOA.js +0 -1
  542. package/dist/gateway/static/root/assets/agents-CCBmGcwc.js +0 -71
  543. package/dist/gateway/static/root/assets/apps-page-xwCsJS15.js +0 -1
  544. package/dist/gateway/static/root/assets/channels-settings-C044DcYk.js +0 -1
  545. package/dist/gateway/static/root/assets/connectors-settings-8VEWUOTj.js +0 -2
  546. package/dist/gateway/static/root/assets/cron-page-DqmNGNOy.js +0 -3
  547. package/dist/gateway/static/root/assets/goal-detail-page-bv0VRDaf.js +0 -1
  548. package/dist/gateway/static/root/assets/goals-page-1Ywnt4Cb.js +0 -2
  549. package/dist/gateway/static/root/assets/goals-settings-ceEBjnfc.js +0 -1
  550. package/dist/gateway/static/root/assets/index-Cxm6xsps.js +0 -122
  551. package/dist/gateway/static/root/assets/index-b_R4tKqt.css +0 -1
  552. package/dist/gateway/static/root/assets/logs-page-B_wrxhee.js +0 -2
  553. package/dist/gateway/static/root/assets/messages-CkT-lcgP.js +0 -3
  554. package/dist/gateway/static/root/assets/models-hub-panel-D0JDSbNu.js +0 -2
  555. package/dist/gateway/static/root/assets/note-detail-page-DpFV-EO6.js +0 -2
  556. package/dist/gateway/static/root/assets/notes-page-CdkjTch8.js +0 -1
  557. package/dist/gateway/static/root/assets/remote-access-hub-DSYVAi96.js +0 -1
  558. package/dist/gateway/static/root/assets/sessions-page-CenkcVjF.js +0 -1
  559. package/dist/gateway/static/root/assets/settings-advanced-gate-D9sva86V.js +0 -1
  560. package/dist/gateway/static/root/assets/settings-page-DL35U0x0.js +0 -1
  561. package/dist/gateway/static/root/assets/setup-status-panel-Ctwbp9Er.js +0 -1
  562. package/dist/gateway/static/root/assets/shares-settings-DIM3JNsr.js +0 -1
  563. package/dist/gateway/static/root/assets/skill-reload-api-DAlNaNzL.js +0 -1
  564. package/dist/gateway/static/root/assets/skills-page-CLrHVzAt.js +0 -2
  565. package/dist/gateway/static/root/assets/voice-api-key-field-vYAO71Gn.js +0 -1
  566. package/dist/gateway/static/root/assets/workflow-page.utils-sgHjOXOm.js +0 -1
  567. package/dist/gateway/static/root/assets/workflows-page-DYyOTmFx.js +0 -18
@@ -5,11 +5,13 @@ import { resolveBrowserCommandTimeoutMs } from "../browser-command-timeout.js";
5
5
  import { assertBrowserUrlAllowed, checkPostRedirectUrl, containsApiKeyPattern } from "../url-policy.js";
6
6
  import { truncateSnapshotAtBoundary } from "../snapshot-helpers.js";
7
7
  import { humanizedClick, humanizedFill, humanizedScroll } from "../humanize.js";
8
+ import { isTruthyValue, resolvePath, valueContains } from "../pipeline/template.js";
8
9
  //#region src/browser/actions/registry.ts
9
10
  init_logger();
10
11
  const log = createLogger("BrowserActionRegistry");
11
12
  const DEFAULT_SNAPSHOT_MAX = 3e4;
12
13
  const AUTO_SNAPSHOT_MAX = 8e3;
14
+ const networkMonitors = /* @__PURE__ */ new WeakMap();
13
15
  function toMs(ctx) {
14
16
  return resolveBrowserCommandTimeoutMs(ctx.config);
15
17
  }
@@ -82,6 +84,28 @@ function fail(action, code, message, diagnostics) {
82
84
  diagnostics
83
85
  };
84
86
  }
87
+ function asObject(value) {
88
+ return value && typeof value === "object" && !Array.isArray(value) ? value : {};
89
+ }
90
+ function pipelineLast(ctx) {
91
+ return ctx.pipeline?.last;
92
+ }
93
+ function valueFromArgs(ctx, args) {
94
+ if ("value" in args) return args.value;
95
+ if (typeof args.path === "string") return resolvePath(pipelineLast(ctx), args.path);
96
+ return pipelineLast(ctx);
97
+ }
98
+ function compareValues(a, b) {
99
+ const av = typeof a === "number" ? a : String(a ?? "");
100
+ const bv = typeof b === "number" ? b : String(b ?? "");
101
+ if (av < bv) return -1;
102
+ if (av > bv) return 1;
103
+ return 0;
104
+ }
105
+ function matchesNetworkPattern(url, pattern) {
106
+ if (!pattern) return true;
107
+ return url.includes(pattern);
108
+ }
85
109
  const navigateAction = async (ctx, args) => {
86
110
  const url = String(args.url ?? "");
87
111
  if (!url) return fail("navigate", "MISSING_URL", "url is required");
@@ -279,16 +303,18 @@ const dialogAction = async (ctx, args) => {
279
303
  const waitAction = async (ctx, args) => {
280
304
  const selector = args.selector;
281
305
  const text = args.text;
306
+ const state = args.state ?? "visible";
282
307
  const timeoutMs = typeof args.timeout_ms === "number" ? args.timeout_ms : toMs(ctx);
283
308
  try {
284
309
  if (selector?.trim()) await ctx.page.locator(selector.trim()).first().waitFor({
285
- state: "visible",
310
+ state,
286
311
  timeout: timeoutMs
287
312
  });
288
313
  else if (text?.trim()) await ctx.page.getByText(text.trim()).first().waitFor({
289
314
  state: "visible",
290
315
  timeout: timeoutMs
291
316
  });
317
+ else if (args.function || args.expression) await ctx.page.waitForFunction(String(args.function ?? args.expression), null, { timeout: timeoutMs });
292
318
  else {
293
319
  const ms = typeof args.ms === "number" ? args.ms : 1e3;
294
320
  await ctx.page.waitForTimeout(ms);
@@ -299,16 +325,339 @@ const waitAction = async (ctx, args) => {
299
325
  }
300
326
  };
301
327
  const outputAction = async (ctx, args) => {
302
- return ok("output", "Output captured.", args.value ?? ctx.pipelineData);
328
+ return ok("output", "Output captured.", valueFromArgs(ctx, args));
303
329
  };
304
330
  const assertAction = async (ctx, args) => {
305
- const value = String(args.value ?? ctx.pipelineData ?? "");
306
- const contains = args.contains;
307
- const equals = args.equals;
308
- if (contains && !value.includes(contains)) return fail("assert", "ASSERTION_FAILED", `Expected value to contain "${contains}"`);
309
- if (equals !== void 0 && value !== equals) return fail("assert", "ASSERTION_FAILED", `Expected value to equal "${equals}"`);
331
+ const actual = valueFromArgs(ctx, args);
332
+ if ("equals" in args && JSON.stringify(actual) !== JSON.stringify(args.equals)) return fail("assert", "ASSERTION_FAILED", `Expected value to equal ${JSON.stringify(args.equals)}, got ${JSON.stringify(actual)?.slice(0, 500)}`);
333
+ if ("contains" in args && !valueContains(actual, args.contains)) return fail("assert", "ASSERTION_FAILED", `Expected value to contain ${JSON.stringify(args.contains)}`);
334
+ if ("matches" in args) {
335
+ const pattern = new RegExp(String(args.matches));
336
+ if (!pattern.test(String(actual ?? ""))) return fail("assert", "ASSERTION_FAILED", `Expected value to match /${pattern.source}/`);
337
+ }
338
+ if (args.truthy === true && !isTruthyValue(actual)) return fail("assert", "ASSERTION_FAILED", `Expected value to be truthy, got ${JSON.stringify(actual)}`);
339
+ if (args.exists === true && (actual === void 0 || actual === null || actual === "")) return fail("assert", "ASSERTION_FAILED", "Expected value to exist");
310
340
  return ok("assert", "Assertion passed.");
311
341
  };
342
+ const waitForNavigationAction = async (ctx, args) => {
343
+ const timeout = typeof args.timeout_ms === "number" ? args.timeout_ms : toMs(ctx);
344
+ const waitUntil = args.wait_until ?? "domcontentloaded";
345
+ try {
346
+ await ctx.page.waitForLoadState(waitUntil, { timeout });
347
+ return ok("wait_for_navigation", "Navigation wait completed.");
348
+ } catch (e) {
349
+ return fail("wait_for_navigation", "WAIT_TIMEOUT", e instanceof Error ? e.message : String(e));
350
+ }
351
+ };
352
+ const waitForTimeoutAction = async (ctx, args) => {
353
+ const ms = Number(args.ms ?? args.timeout_ms ?? 1e3);
354
+ await ctx.page.waitForTimeout(Number.isFinite(ms) ? ms : 1e3);
355
+ return ok("wait_for_timeout", `Waited ${ms}ms.`);
356
+ };
357
+ const waitForFunctionAction = async (ctx, args) => {
358
+ const expression = String(args.expression ?? args.function ?? "");
359
+ if (!expression.trim()) return fail("wait_for_function", "MISSING_EXPRESSION", "expression is required");
360
+ const timeout = typeof args.timeout_ms === "number" ? args.timeout_ms : toMs(ctx);
361
+ try {
362
+ await ctx.page.waitForFunction(expression, null, { timeout });
363
+ return ok("wait_for_function", "Function wait completed.");
364
+ } catch (e) {
365
+ return fail("wait_for_function", "WAIT_TIMEOUT", e instanceof Error ? e.message : String(e));
366
+ }
367
+ };
368
+ const waitForNetworkIdleAction = async (ctx, args) => {
369
+ const timeout = typeof args.timeout_ms === "number" ? args.timeout_ms : toMs(ctx);
370
+ try {
371
+ await ctx.page.waitForLoadState("networkidle", { timeout });
372
+ return ok("wait_for_network_idle", "Network idle reached.");
373
+ } catch (e) {
374
+ return fail("wait_for_network_idle", "WAIT_TIMEOUT", e instanceof Error ? e.message : String(e));
375
+ }
376
+ };
377
+ const elementTextAction = async (ctx, args) => {
378
+ const selector = String(args.selector ?? "");
379
+ if (!selector) return fail("element_text", "MISSING_SELECTOR", "selector is required");
380
+ const timeout = toMs(ctx);
381
+ const loc = ctx.page.locator(selector).first();
382
+ await loc.waitFor({
383
+ state: "attached",
384
+ timeout
385
+ });
386
+ const text = await loc.innerText({ timeout }).catch(() => loc.textContent({ timeout }));
387
+ return ok("element_text", String(text ?? ""), text ?? "");
388
+ };
389
+ const elementAttributeAction = async (ctx, args) => {
390
+ const selector = String(args.selector ?? "");
391
+ const attribute = String(args.attribute ?? "");
392
+ if (!selector || !attribute) return fail("element_attribute", "INVALID_ARGS", "selector and attribute are required");
393
+ const timeout = toMs(ctx);
394
+ const loc = ctx.page.locator(selector).first();
395
+ await loc.waitFor({
396
+ state: "attached",
397
+ timeout
398
+ });
399
+ const value = await loc.getAttribute(attribute, { timeout });
400
+ return ok("element_attribute", value ?? "", value);
401
+ };
402
+ const boundingBoxAction = async (ctx, args) => {
403
+ const selector = String(args.selector ?? "");
404
+ if (!selector) return fail("bounding_box", "MISSING_SELECTOR", "selector is required");
405
+ const timeout = toMs(ctx);
406
+ const loc = ctx.page.locator(selector).first();
407
+ await loc.waitFor({
408
+ state: "visible",
409
+ timeout
410
+ });
411
+ const box = await loc.boundingBox({ timeout });
412
+ return ok("bounding_box", JSON.stringify(box), box);
413
+ };
414
+ const setInputFilesAction = async (ctx, args) => {
415
+ const selector = String(args.selector ?? "");
416
+ const files = Array.isArray(args.files) ? args.files.map(String) : typeof args.file === "string" ? [args.file] : [];
417
+ if (!selector || files.length === 0) return fail("set_input_files", "INVALID_ARGS", "selector and files are required");
418
+ await ctx.page.locator(selector).first().setInputFiles(files, { timeout: toMs(ctx) });
419
+ return ok("set_input_files", `Attached ${files.length} file(s).`, { files });
420
+ };
421
+ const getCookiesAction = async (ctx, args) => {
422
+ const urls = Array.isArray(args.urls) ? args.urls.map(String) : void 0;
423
+ const cookies = await ctx.page.context().cookies(urls);
424
+ return ok("cookies", JSON.stringify(cookies, null, 2), cookies);
425
+ };
426
+ const addCookiesAction = async (ctx, args) => {
427
+ const cookies = Array.isArray(args.cookies) ? args.cookies : [];
428
+ if (cookies.length === 0) return fail("add_cookies", "INVALID_ARGS", "cookies must be a non-empty array");
429
+ await ctx.page.context().addCookies(cookies);
430
+ return ok("add_cookies", `Added ${cookies.length} cookie(s).`);
431
+ };
432
+ const clearCookiesAction = async (ctx) => {
433
+ await ctx.page.context().clearCookies();
434
+ return ok("clear_cookies", "Cookies cleared.");
435
+ };
436
+ const listTabsAction = async (ctx) => {
437
+ const pages = ctx.page.context().pages();
438
+ const tabs = await Promise.all(pages.map(async (page, index) => ({
439
+ index,
440
+ url: page.url(),
441
+ title: await page.title().catch(() => "")
442
+ })));
443
+ return ok("tabs", JSON.stringify(tabs, null, 2), tabs);
444
+ };
445
+ const newTabAction = async (ctx, args) => {
446
+ const page = await ctx.page.context().newPage();
447
+ if (args.url) await page.goto(String(args.url), {
448
+ waitUntil: "domcontentloaded",
449
+ timeout: toMs(ctx)
450
+ });
451
+ return ok("new_tab", `Opened tab: ${page.url()}`, {
452
+ url: page.url(),
453
+ title: await page.title().catch(() => "")
454
+ });
455
+ };
456
+ const switchTabAction = async (ctx, args) => {
457
+ const index = Number(args.index ?? args.tab_index ?? 0);
458
+ const page = ctx.page.context().pages()[index];
459
+ if (!page) return fail("switch_tab", "TAB_NOT_FOUND", `No tab at index ${index}`);
460
+ await page.bringToFront();
461
+ return ok("switch_tab", `Switched to tab ${index}.`, {
462
+ index,
463
+ url: page.url()
464
+ });
465
+ };
466
+ const selectAction = async (ctx, args) => {
467
+ const source = "from" in args ? args.from : pipelineLast(ctx);
468
+ const path = String(args.path ?? args.value ?? "");
469
+ const value = path ? resolvePath(source, path) : source;
470
+ return ok("select", typeof value === "string" ? value : JSON.stringify(value, null, 2), value);
471
+ };
472
+ const mapAction = async (ctx, args) => {
473
+ const source = "from" in args ? args.from : pipelineLast(ctx);
474
+ if (!Array.isArray(source)) return fail("map", "INVALID_INPUT", "map input must be an array");
475
+ const path = String(args.path ?? "");
476
+ const result = path ? source.map((item) => resolvePath(item, path)) : source;
477
+ return ok("map", JSON.stringify(result, null, 2), result);
478
+ };
479
+ const filterAction = async (ctx, args) => {
480
+ const source = "from" in args ? args.from : pipelineLast(ctx);
481
+ if (!Array.isArray(source)) return fail("filter", "INVALID_INPUT", "filter input must be an array");
482
+ const path = String(args.path ?? "");
483
+ const equals = args.equals;
484
+ const contains = args.contains;
485
+ const truthy = args.truthy === true;
486
+ const result = source.filter((item) => {
487
+ const value = path ? resolvePath(item, path) : item;
488
+ if ("equals" in args) return JSON.stringify(value) === JSON.stringify(equals);
489
+ if ("contains" in args) return valueContains(value, contains);
490
+ if (truthy) return isTruthyValue(value);
491
+ return isTruthyValue(value);
492
+ });
493
+ return ok("filter", JSON.stringify(result, null, 2), result);
494
+ };
495
+ const sortAction = async (ctx, args) => {
496
+ const source = "from" in args ? args.from : pipelineLast(ctx);
497
+ if (!Array.isArray(source)) return fail("sort", "INVALID_INPUT", "sort input must be an array");
498
+ const path = String(args.path ?? "");
499
+ const direction = String(args.direction ?? "asc");
500
+ const result = [...source].sort((a, b) => {
501
+ const cmp = compareValues(path ? resolvePath(a, path) : a, path ? resolvePath(b, path) : b);
502
+ return direction === "desc" ? -cmp : cmp;
503
+ });
504
+ return ok("sort", JSON.stringify(result, null, 2), result);
505
+ };
506
+ const limitAction = async (ctx, args) => {
507
+ const source = "from" in args ? args.from : pipelineLast(ctx);
508
+ if (!Array.isArray(source)) return fail("limit", "INVALID_INPUT", "limit input must be an array");
509
+ const count = Math.max(0, Number(args.count ?? args.limit ?? 10));
510
+ const offset = Math.max(0, Number(args.offset ?? 0));
511
+ const result = source.slice(offset, offset + count);
512
+ return ok("limit", JSON.stringify(result, null, 2), result);
513
+ };
514
+ const fetchAction = async (ctx, args) => {
515
+ const url = String(args.url ?? "");
516
+ if (!url) return fail("fetch", "MISSING_URL", "url is required");
517
+ const method = String(args.method ?? "GET");
518
+ const headers = asObject(args.headers);
519
+ const body = args.body === void 0 ? void 0 : typeof args.body === "string" ? args.body : JSON.stringify(args.body);
520
+ const result = await ctx.page.evaluate(async ({ url, method, headers, body }) => {
521
+ const response = await fetch(url, {
522
+ method,
523
+ headers,
524
+ body
525
+ });
526
+ const text = await response.text();
527
+ const contentType = response.headers.get("content-type") ?? "";
528
+ let parsed = text;
529
+ if (contentType.includes("application/json")) try {
530
+ parsed = JSON.parse(text);
531
+ } catch {
532
+ parsed = text;
533
+ }
534
+ return {
535
+ ok: response.ok,
536
+ status: response.status,
537
+ url: response.url,
538
+ headers: Object.fromEntries(response.headers.entries()),
539
+ body: parsed
540
+ };
541
+ }, {
542
+ url,
543
+ method,
544
+ headers,
545
+ body
546
+ });
547
+ return ok("fetch", JSON.stringify(result, null, 2), result);
548
+ };
549
+ const networkStartAction = async (ctx, args) => {
550
+ networkMonitors.get(ctx.page)?.dispose();
551
+ const includeBody = args.include_body === true || args.includeBody === true;
552
+ const urlPattern = typeof args.url_pattern === "string" ? args.url_pattern : typeof args.urlPattern === "string" ? args.urlPattern : void 0;
553
+ const events = [];
554
+ const onRequest = (request) => {
555
+ if (!matchesNetworkPattern(request.url(), urlPattern)) return;
556
+ events.push({
557
+ type: "request",
558
+ url: request.url(),
559
+ method: request.method(),
560
+ resourceType: request.resourceType(),
561
+ postData: request.postData(),
562
+ timestamp: Date.now()
563
+ });
564
+ };
565
+ const onResponse = async (response) => {
566
+ if (!matchesNetworkPattern(response.url(), urlPattern)) return;
567
+ const event = {
568
+ type: "response",
569
+ url: response.url(),
570
+ status: response.status(),
571
+ timestamp: Date.now()
572
+ };
573
+ if (includeBody) event.body = await response.text().catch(() => void 0);
574
+ events.push(event);
575
+ };
576
+ const onRequestFailed = (request) => {
577
+ if (!matchesNetworkPattern(request.url(), urlPattern)) return;
578
+ events.push({
579
+ type: "requestfailed",
580
+ url: request.url(),
581
+ method: request.method(),
582
+ errorText: request.failure()?.errorText,
583
+ timestamp: Date.now()
584
+ });
585
+ };
586
+ ctx.page.on("request", onRequest);
587
+ ctx.page.on("response", onResponse);
588
+ ctx.page.on("requestfailed", onRequestFailed);
589
+ networkMonitors.set(ctx.page, {
590
+ events,
591
+ includeBody,
592
+ urlPattern,
593
+ dispose: () => {
594
+ ctx.page.off("request", onRequest);
595
+ ctx.page.off("response", onResponse);
596
+ ctx.page.off("requestfailed", onRequestFailed);
597
+ networkMonitors.delete(ctx.page);
598
+ }
599
+ });
600
+ return ok("network_start", "Network monitoring started.", {
601
+ includeBody,
602
+ urlPattern
603
+ });
604
+ };
605
+ const networkEventsAction = async (ctx) => {
606
+ const events = networkMonitors.get(ctx.page)?.events ?? [];
607
+ return ok("network_events", JSON.stringify(events, null, 2), events);
608
+ };
609
+ const networkStopAction = async (ctx) => {
610
+ const events = networkMonitors.get(ctx.page)?.events ?? [];
611
+ networkMonitors.get(ctx.page)?.dispose();
612
+ return ok("network_stop", JSON.stringify(events, null, 2), events);
613
+ };
614
+ const collectAction = async (ctx, args) => {
615
+ const events = networkMonitors.get(ctx.page)?.events ?? [];
616
+ if (args.parse) {
617
+ const parsed = await ctx.page.evaluate(({ events, parse }) => {
618
+ return (0, eval)(`(${parse})`)(events);
619
+ }, {
620
+ events,
621
+ parse: String(args.parse)
622
+ });
623
+ return ok("collect", JSON.stringify(parsed, null, 2), parsed);
624
+ }
625
+ return ok("collect", JSON.stringify(events, null, 2), events);
626
+ };
627
+ const tapAction = async (ctx, args) => {
628
+ const pattern = String(args.capture ?? args.url ?? args.pattern ?? "");
629
+ const timeoutMs = Number(args.timeout_ms ?? args.timeoutMs ?? 5e3);
630
+ const captured = await ctx.page.evaluate(async ({ pattern, timeoutMs }) => {
631
+ let result = null;
632
+ const g = globalThis;
633
+ const originalFetch = g.fetch;
634
+ g.fetch = async (...fetchArgs) => {
635
+ const response = await originalFetch(...fetchArgs);
636
+ try {
637
+ const url = typeof fetchArgs[0] === "string" ? fetchArgs[0] : fetchArgs[0]?.url ?? String(fetchArgs[0]);
638
+ if ((!pattern || url.includes(pattern)) && result === null) {
639
+ const text = await response.clone().text();
640
+ try {
641
+ result = JSON.parse(text);
642
+ } catch {
643
+ result = text;
644
+ }
645
+ }
646
+ } catch {}
647
+ return response;
648
+ };
649
+ try {
650
+ await new Promise((resolve) => setTimeout(resolve, timeoutMs));
651
+ } finally {
652
+ g.fetch = originalFetch;
653
+ }
654
+ return result;
655
+ }, {
656
+ pattern,
657
+ timeoutMs
658
+ });
659
+ return ok("tap", JSON.stringify(captured, null, 2), captured);
660
+ };
312
661
  function createBrowserActionRegistry() {
313
662
  const handlers = /* @__PURE__ */ new Map();
314
663
  handlers.set("open", navigateAction);
@@ -330,8 +679,35 @@ function createBrowserActionRegistry() {
330
679
  handlers.set("dialog", dialogAction);
331
680
  handlers.set("close", closeAction);
332
681
  handlers.set("wait", waitAction);
682
+ handlers.set("wait_for_navigation", waitForNavigationAction);
683
+ handlers.set("wait_for_timeout", waitForTimeoutAction);
684
+ handlers.set("wait_for_function", waitForFunctionAction);
685
+ handlers.set("wait_for_network_idle", waitForNetworkIdleAction);
333
686
  handlers.set("output", outputAction);
334
687
  handlers.set("assert", assertAction);
688
+ handlers.set("select", selectAction);
689
+ handlers.set("map", mapAction);
690
+ handlers.set("filter", filterAction);
691
+ handlers.set("sort", sortAction);
692
+ handlers.set("limit", limitAction);
693
+ handlers.set("fetch", fetchAction);
694
+ handlers.set("collect", collectAction);
695
+ handlers.set("tap", tapAction);
696
+ handlers.set("element_text", elementTextAction);
697
+ handlers.set("element_attribute", elementAttributeAction);
698
+ handlers.set("bounding_box", boundingBoxAction);
699
+ handlers.set("set_input_files", setInputFilesAction);
700
+ handlers.set("cookies", getCookiesAction);
701
+ handlers.set("get_cookies", getCookiesAction);
702
+ handlers.set("add_cookies", addCookiesAction);
703
+ handlers.set("clear_cookies", clearCookiesAction);
704
+ handlers.set("tabs", listTabsAction);
705
+ handlers.set("list_tabs", listTabsAction);
706
+ handlers.set("new_tab", newTabAction);
707
+ handlers.set("switch_tab", switchTabAction);
708
+ handlers.set("network_start", networkStartAction);
709
+ handlers.set("network_events", networkEventsAction);
710
+ handlers.set("network_stop", networkStopAction);
335
711
  return {
336
712
  get(name) {
337
713
  return handlers.get(name);
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","names":[],"sources":["../../../../src/browser/actions/registry.ts"],"sourcesContent":["/**\n * Browser Action Registry — unified action layer shared by browser_use tool, CLI, and pipeline.\n */\n\nimport type { Page } from 'playwright-core';\n\nimport { createLogger } from '../../utils/logger.js';\nimport { assertBrowserUrlAllowed, checkPostRedirectUrl, containsApiKeyPattern } from '../url-policy.js';\nimport { checkWebsiteBlocklist } from '../../agent/tools/url-safety.js';\nimport { resolveBrowserCommandTimeoutMs } from '../browser-command-timeout.js';\nimport { truncateSnapshotAtBoundary } from '../snapshot-helpers.js';\nimport { humanizedClick, humanizedFill, humanizedScroll, type HumanPreset } from '../humanize.js';\n\nimport type {\n BrowserActionContext,\n BrowserActionHandler,\n BrowserActionRegistry,\n BrowserActionResult,\n} from './types.js';\n\nconst log = createLogger('BrowserActionRegistry');\n\nconst DEFAULT_SNAPSHOT_MAX = 30_000;\nconst AUTO_SNAPSHOT_MAX = 8_000;\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction toMs(ctx: BrowserActionContext): number {\n return resolveBrowserCommandTimeoutMs(ctx.config);\n}\n\n/** Whether humanize mode is active for this context (local/cdp/cloakbrowser only). */\nfunction isHumanizeEnabled(ctx: BrowserActionContext): boolean {\n const browser = ctx.config?.agents?.defaults?.browser;\n if (!browser?.humanize) return false;\n // Extension backend has its own event dispatch — humanize is not applicable\n const backend = browser.backend;\n if (backend === 'extension') return false;\n return true;\n}\n\nfunction humanPreset(ctx: BrowserActionContext): HumanPreset {\n return (ctx.config?.agents?.defaults?.browser?.humanPreset as HumanPreset) ?? 'default';\n}\n\nasync function ariaSnapshot(page: Page, selector: string | undefined, maxLength: number, timeoutMs: number): Promise<string> {\n const loc = selector?.trim() ? page.locator(selector.trim()).first() : page.locator('body');\n await loc.waitFor({ state: 'attached', timeout: timeoutMs });\n let text = await loc.ariaSnapshot({ mode: 'ai', timeout: timeoutMs });\n if (!text || !text.trim()) text = '(empty snapshot)';\n if (text.length > maxLength) text = truncateSnapshotAtBoundary(text, maxLength);\n return text;\n}\n\nfunction resolveClickLocator(page: Page, args: Record<string, unknown>) {\n const selector = args.selector as string | undefined;\n const text = args.text as string | undefined;\n const role = args.role as string | undefined;\n const hasSel = Boolean(selector?.trim());\n const hasText = Boolean(text?.trim());\n const hasRole = Boolean(role?.trim());\n const n = (hasSel ? 1 : 0) + (hasText ? 1 : 0) + (hasRole ? 1 : 0);\n if (n !== 1) throw new Error('Provide exactly one of: selector, text, role');\n if (hasSel) return page.locator(selector!.trim()).first();\n if (hasText) return page.getByText(text!.trim(), { exact: false }).first();\n const raw = role!.trim();\n const idx = raw.indexOf(':');\n const roleName = (idx >= 0 ? raw.slice(0, idx) : raw).trim();\n const name = idx >= 0 ? raw.slice(idx + 1).trim() : '';\n if (!roleName) throw new Error('Invalid role: empty ARIA role');\n return page.getByRole(roleName as never, name ? { name } : undefined).first();\n}\n\nfunction resolveTypeLocator(page: Page, args: Record<string, unknown>) {\n const selector = args.selector as string | undefined;\n const label = args.label as string | undefined;\n const hasSel = Boolean(selector?.trim());\n const hasLab = Boolean(label?.trim());\n if (hasSel === hasLab) throw new Error('Provide exactly one of: selector, label');\n if (hasSel) return page.locator(selector!.trim()).first();\n return page.getByLabel(label!.trim()).first();\n}\n\nfunction ok(action: string, text: string, data?: unknown, artifacts?: BrowserActionResult['artifacts']): BrowserActionResult {\n return { ok: true, action, text, data, artifacts };\n}\n\nfunction fail(action: string, code: string, message: string, diagnostics?: BrowserActionResult['diagnostics']): BrowserActionResult {\n return { ok: false, action, error: { code, message }, diagnostics };\n}\n\n// ─── Action Handlers ────────────────────────────────────────────────────────\n\nconst navigateAction: BrowserActionHandler = async (ctx, args) => {\n const url = String(args.url ?? '');\n if (!url) return fail('navigate', 'MISSING_URL', 'url is required');\n\n const allowPrivate = ctx.config?.agents?.defaults?.browser?.allowPrivateUrls === true;\n if (containsApiKeyPattern(url)) return fail('navigate', 'BLOCKED', 'URL contains API key/token');\n const block = checkWebsiteBlocklist(url, ctx.config?.tools?.web?.blocklist);\n if (block) return fail('navigate', 'BLOCKED', block.message);\n assertBrowserUrlAllowed(url, { allowPrivateUrls: allowPrivate });\n\n const waitUntil = (args.wait_until as string) ?? (args.waitFor as string) ?? 'domcontentloaded';\n const navTimeout = toMs(ctx);\n await ctx.page.goto(url, { waitUntil: waitUntil as any, timeout: navTimeout });\n\n const title = await ctx.page.title();\n const finalUrl = ctx.page.url();\n\n if (finalUrl && finalUrl !== url) {\n const redirectBlock = checkPostRedirectUrl(finalUrl, { allowPrivateUrls: allowPrivate });\n if (redirectBlock) {\n await ctx.page.goto('about:blank').catch(() => {});\n return fail('navigate', 'REDIRECT_BLOCKED', redirectBlock);\n }\n }\n\n let snapshot = '';\n try { snapshot = await ariaSnapshot(ctx.page, undefined, AUTO_SNAPSHOT_MAX, navTimeout); } catch { /* non-fatal */ }\n\n const text = `Navigated to: ${title}\\nURL: ${finalUrl}${snapshot ? `\\n--- Page Snapshot ---\\n${snapshot}` : ''}`;\n return ok('navigate', text, { url: finalUrl, title });\n};\n\nconst stateAction: BrowserActionHandler = async (ctx, args) => {\n const maxLen = typeof args.maxLength === 'number' ? args.maxLength : DEFAULT_SNAPSHOT_MAX;\n const selector = args.selector as string | undefined;\n const timeout = toMs(ctx);\n try {\n const text = await ariaSnapshot(ctx.page, selector, maxLen, timeout);\n return ok('state', text, { length: text.length });\n } catch (e) {\n return fail('state', 'SNAPSHOT_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst clickAction: BrowserActionHandler = async (ctx, args) => {\n const timeout = toMs(ctx);\n try {\n if (isHumanizeEnabled(ctx) && args.selector) {\n await humanizedClick(ctx.page, String(args.selector), humanPreset(ctx));\n return ok('click', 'Click succeeded (humanized).');\n }\n const loc = resolveClickLocator(ctx.page, args);\n await loc.click({ timeout });\n return ok('click', 'Click succeeded.');\n } catch (e) {\n return fail('click', 'CLICK_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst typeAction: BrowserActionHandler = async (ctx, args) => {\n const timeout = toMs(ctx);\n try {\n if (isHumanizeEnabled(ctx) && args.selector) {\n await humanizedFill(ctx.page, String(args.selector), String(args.text ?? ''), humanPreset(ctx));\n if (args.pressEnter) await ctx.page.keyboard.press('Enter');\n return ok('type', 'Typed into field (humanized).');\n }\n const loc = resolveTypeLocator(ctx.page, args);\n await loc.clear({ timeout: Math.min(5000, timeout) }).catch(() => {});\n await loc.fill(String(args.text ?? ''), { timeout });\n if (args.pressEnter) await ctx.page.keyboard.press('Enter');\n return ok('type', 'Typed into field.');\n } catch (e) {\n return fail('type', 'TYPE_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst scrollAction: BrowserActionHandler = async (ctx, args) => {\n const direction = (args.direction as string) ?? 'down';\n const amount = typeof args.amount === 'number' ? args.amount : 500;\n const dy = direction === 'down' ? amount : -amount;\n try {\n if (isHumanizeEnabled(ctx)) {\n await humanizedScroll(ctx.page, dy, humanPreset(ctx));\n return ok('scroll', `Scrolled ${direction} by ${amount}px (humanized).`);\n }\n await ctx.page.evaluate(({ deltaY }) => {\n (globalThis as any).scrollBy(0, deltaY);\n }, { deltaY: dy });\n return ok('scroll', `Scrolled ${direction} by ${amount}px.`);\n } catch (e) {\n return fail('scroll', 'SCROLL_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst screenshotAction: BrowserActionHandler = async (ctx, args) => {\n const timeout = toMs(ctx);\n const selector = args.selector as string | undefined;\n const fullPage = args.full_page === true || args.fullPage === true;\n const path = args.path as string | undefined;\n try {\n let buf: Buffer;\n if (selector?.trim()) {\n const loc = ctx.page.locator(selector.trim()).first();\n await loc.waitFor({ state: 'visible', timeout });\n buf = await loc.screenshot({ type: 'png', timeout });\n } else {\n buf = await ctx.page.screenshot({ type: 'png', fullPage, timeout });\n }\n const artifact = { type: 'screenshot' as const, path, data: buf.toString('base64'), mimeType: 'image/png' };\n return ok('screenshot', `Screenshot captured (${buf.length} bytes).`, { bytes: buf.length }, [artifact]);\n } catch (e) {\n return fail('screenshot', 'SCREENSHOT_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst backAction: BrowserActionHandler = async (ctx, args) => {\n const waitUntil = (args.waitFor as string) ?? 'domcontentloaded';\n const timeout = toMs(ctx);\n try {\n const response = await ctx.page.goBack({ waitUntil: waitUntil as any, timeout });\n if (!response) return fail('back', 'NO_HISTORY', 'No previous page in history.');\n const title = await ctx.page.title();\n const url = ctx.page.url();\n return ok('back', `Navigated back to: ${title}\\nURL: ${url}`, { url, title });\n } catch (e) {\n return fail('back', 'BACK_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst pressAction: BrowserActionHandler = async (ctx, args) => {\n const key = String(args.key ?? '');\n if (!key) return fail('press', 'MISSING_KEY', 'key is required');\n try {\n await ctx.page.keyboard.press(key);\n return ok('press', `Pressed key: ${key}`);\n } catch (e) {\n return fail('press', 'PRESS_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst evalAction: BrowserActionHandler = async (ctx, args) => {\n const js = (args.javascript as string) ?? (args.expression as string) ?? (args.code as string) ?? '';\n if (!js.trim()) return fail('eval', 'MISSING_JS', 'javascript expression is required');\n try {\n const result = await ctx.page.evaluate(js);\n const serialized = result === undefined ? 'undefined' : JSON.stringify(result, null, 2);\n const text = serialized.length > DEFAULT_SNAPSHOT_MAX\n ? `${serialized.slice(0, DEFAULT_SNAPSHOT_MAX)}\\n... (truncated)`\n : serialized;\n return ok('eval', text, result);\n } catch (e) {\n return fail('eval', 'EVAL_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst imagesAction: BrowserActionHandler = async (ctx, args) => {\n const selector = args.selector as string | undefined;\n const maxImages = typeof args.maxImages === 'number' ? args.maxImages : 20;\n try {\n const images = await ctx.page.evaluate(\n ([sel, max]: [string | null, number]) => {\n const d = globalThis.document as any;\n const root = sel ? d.querySelector(sel) : d;\n if (!root) return [];\n const imgs = Array.from(root.querySelectorAll('img') as ArrayLike<any>);\n return imgs.slice(0, max).map((img: any) => ({\n src: String(img.src ?? ''),\n alt: String(img.alt ?? ''),\n width: Number(img.naturalWidth ?? 0),\n height: Number(img.naturalHeight ?? 0),\n }));\n },\n [selector?.trim() || null, maxImages] as [string | null, number],\n );\n if (!images || images.length === 0) return ok('images', 'No images found on the page.', []);\n const lines = images.map((img: any, i: number) =>\n `${i + 1}. ${img.alt || '(no alt)'} — ${img.width}×${img.height}\\n ${img.src}`);\n return ok('images', `Found ${images.length} image(s):\\n${lines.join('\\n')}`, images);\n } catch (e) {\n return fail('images', 'IMAGES_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst closeAction: BrowserActionHandler = async (ctx, _args) => {\n await ctx.manager.closePage(ctx.taskId);\n return ok('close', 'Browser page closed.');\n};\n\nconst dialogAction: BrowserActionHandler = async (ctx, args) => {\n const action = args.action as string;\n if (action !== 'accept' && action !== 'dismiss') {\n return fail('dialog', 'INVALID_ACTION', 'action must be \"accept\" or \"dismiss\"');\n }\n // Dialog handling relies on the CdpSupervisor event queue; this is a placeholder\n // that signals the supervisor to accept/dismiss the next pending dialog.\n const sup = ctx.supervisor;\n if (!sup) return fail('dialog', 'NO_SUPERVISOR', 'No dialog supervisor available');\n // Forward to supervisor (implementation detail in cdp-supervisor.ts)\n return ok('dialog', `Dialog ${action}ed.`);\n};\n\nconst waitAction: BrowserActionHandler = async (ctx, args) => {\n const selector = args.selector as string | undefined;\n const text = args.text as string | undefined;\n const timeoutMs = typeof args.timeout_ms === 'number' ? args.timeout_ms : toMs(ctx);\n try {\n if (selector?.trim()) {\n await ctx.page.locator(selector.trim()).first().waitFor({ state: 'visible', timeout: timeoutMs });\n } else if (text?.trim()) {\n await ctx.page.getByText(text.trim()).first().waitFor({ state: 'visible', timeout: timeoutMs });\n } else {\n const ms = typeof args.ms === 'number' ? args.ms : 1000;\n await ctx.page.waitForTimeout(ms);\n }\n return ok('wait', 'Wait completed.');\n } catch (e) {\n return fail('wait', 'WAIT_TIMEOUT', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst outputAction: BrowserActionHandler = async (ctx, args) => {\n return ok('output', 'Output captured.', args.value ?? ctx.pipelineData);\n};\n\nconst assertAction: BrowserActionHandler = async (ctx, args) => {\n const value = String(args.value ?? ctx.pipelineData ?? '');\n const contains = args.contains as string | undefined;\n const equals = args.equals as string | undefined;\n if (contains && !value.includes(contains)) {\n return fail('assert', 'ASSERTION_FAILED', `Expected value to contain \"${contains}\"`);\n }\n if (equals !== undefined && value !== equals) {\n return fail('assert', 'ASSERTION_FAILED', `Expected value to equal \"${equals}\"`);\n }\n return ok('assert', 'Assertion passed.');\n};\n\n// ─── Registry Construction ──────────────────────────────────────────────────\n\nexport function createBrowserActionRegistry(): BrowserActionRegistry {\n const handlers = new Map<string, BrowserActionHandler>();\n\n // Navigate\n handlers.set('open', navigateAction);\n handlers.set('navigate', navigateAction);\n // State / snapshot\n handlers.set('state', stateAction);\n handlers.set('snapshot', stateAction);\n // Interaction\n handlers.set('click', clickAction);\n handlers.set('type', typeAction);\n handlers.set('input', typeAction);\n handlers.set('scroll', scrollAction);\n handlers.set('back', backAction);\n handlers.set('keys', pressAction);\n handlers.set('press', pressAction);\n // Inspection\n handlers.set('screenshot', screenshotAction);\n handlers.set('images', imagesAction);\n // Eval\n handlers.set('console', evalAction);\n handlers.set('eval', evalAction);\n handlers.set('evaluate', evalAction);\n // Control\n handlers.set('dialog', dialogAction);\n handlers.set('close', closeAction);\n handlers.set('wait', waitAction);\n // Pipeline-specific\n handlers.set('output', outputAction);\n handlers.set('assert', assertAction);\n\n return {\n get(name: string) { return handlers.get(name); },\n has(name: string) { return handlers.has(name); },\n names() { return [...handlers.keys()]; },\n async execute(name: string, ctx: BrowserActionContext, args: Record<string, unknown>): Promise<BrowserActionResult> {\n if (ctx.signal?.aborted) {\n return fail(name, 'ABORTED', 'Operation was aborted');\n }\n if (ctx.manager.getExtensionProvider()) {\n const { runExtensionRegistryAction } = await import('./extension-registry-bridge.js');\n return runExtensionRegistryAction(name, ctx, args);\n }\n const handler = handlers.get(name);\n if (!handler) {\n return fail(name, 'UNKNOWN_ACTION', `Unknown browser action: ${name}`);\n }\n if (ctx.signal?.aborted) {\n return fail(name, 'ABORTED', 'Operation was aborted');\n }\n try {\n return await handler(ctx, args);\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n log.error({ err: e, action: name }, `Action failed: ${message}`);\n return fail(name, 'ACTION_ERROR', message);\n }\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","names":[],"sources":["../../../../src/browser/actions/registry.ts"],"sourcesContent":["/**\n * Browser Action Registry — unified action layer shared by browser_use tool, CLI, and pipeline.\n */\n\nimport type { Page } from 'playwright-core';\n\nimport { createLogger } from '../../utils/logger.js';\nimport { assertBrowserUrlAllowed, checkPostRedirectUrl, containsApiKeyPattern } from '../url-policy.js';\nimport { checkWebsiteBlocklist } from '../../agent/tools/url-safety.js';\nimport { resolveBrowserCommandTimeoutMs } from '../browser-command-timeout.js';\nimport { truncateSnapshotAtBoundary } from '../snapshot-helpers.js';\nimport { humanizedClick, humanizedFill, humanizedScroll, type HumanPreset } from '../humanize.js';\nimport { isTruthyValue, resolvePath, valueContains } from '../pipeline/template.js';\n\nimport type {\n BrowserActionContext,\n BrowserActionHandler,\n BrowserActionRegistry,\n BrowserActionResult,\n} from './types.js';\n\nconst log = createLogger('BrowserActionRegistry');\n\nconst DEFAULT_SNAPSHOT_MAX = 30_000;\nconst AUTO_SNAPSHOT_MAX = 8_000;\n\ninterface NetworkEvent {\n type: 'request' | 'response' | 'requestfailed';\n url: string;\n method?: string;\n status?: number;\n resourceType?: string;\n postData?: string | null;\n body?: string;\n errorText?: string;\n timestamp: number;\n}\n\ninterface NetworkMonitor {\n events: NetworkEvent[];\n includeBody: boolean;\n urlPattern?: string;\n dispose: () => void;\n}\n\nconst networkMonitors = new WeakMap<Page, NetworkMonitor>();\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction toMs(ctx: BrowserActionContext): number {\n return resolveBrowserCommandTimeoutMs(ctx.config);\n}\n\n/** Whether humanize mode is active for this context (local/cdp/cloakbrowser only). */\nfunction isHumanizeEnabled(ctx: BrowserActionContext): boolean {\n const browser = ctx.config?.agents?.defaults?.browser;\n if (!browser?.humanize) return false;\n // Extension backend has its own event dispatch — humanize is not applicable\n const backend = browser.backend;\n if (backend === 'extension') return false;\n return true;\n}\n\nfunction humanPreset(ctx: BrowserActionContext): HumanPreset {\n return (ctx.config?.agents?.defaults?.browser?.humanPreset as HumanPreset) ?? 'default';\n}\n\nasync function ariaSnapshot(page: Page, selector: string | undefined, maxLength: number, timeoutMs: number): Promise<string> {\n const loc = selector?.trim() ? page.locator(selector.trim()).first() : page.locator('body');\n await loc.waitFor({ state: 'attached', timeout: timeoutMs });\n let text = await loc.ariaSnapshot({ mode: 'ai', timeout: timeoutMs });\n if (!text || !text.trim()) text = '(empty snapshot)';\n if (text.length > maxLength) text = truncateSnapshotAtBoundary(text, maxLength);\n return text;\n}\n\nfunction resolveClickLocator(page: Page, args: Record<string, unknown>) {\n const selector = args.selector as string | undefined;\n const text = args.text as string | undefined;\n const role = args.role as string | undefined;\n const hasSel = Boolean(selector?.trim());\n const hasText = Boolean(text?.trim());\n const hasRole = Boolean(role?.trim());\n const n = (hasSel ? 1 : 0) + (hasText ? 1 : 0) + (hasRole ? 1 : 0);\n if (n !== 1) throw new Error('Provide exactly one of: selector, text, role');\n if (hasSel) return page.locator(selector!.trim()).first();\n if (hasText) return page.getByText(text!.trim(), { exact: false }).first();\n const raw = role!.trim();\n const idx = raw.indexOf(':');\n const roleName = (idx >= 0 ? raw.slice(0, idx) : raw).trim();\n const name = idx >= 0 ? raw.slice(idx + 1).trim() : '';\n if (!roleName) throw new Error('Invalid role: empty ARIA role');\n return page.getByRole(roleName as never, name ? { name } : undefined).first();\n}\n\nfunction resolveTypeLocator(page: Page, args: Record<string, unknown>) {\n const selector = args.selector as string | undefined;\n const label = args.label as string | undefined;\n const hasSel = Boolean(selector?.trim());\n const hasLab = Boolean(label?.trim());\n if (hasSel === hasLab) throw new Error('Provide exactly one of: selector, label');\n if (hasSel) return page.locator(selector!.trim()).first();\n return page.getByLabel(label!.trim()).first();\n}\n\nfunction ok(action: string, text: string, data?: unknown, artifacts?: BrowserActionResult['artifacts']): BrowserActionResult {\n return { ok: true, action, text, data, artifacts };\n}\n\nfunction fail(action: string, code: string, message: string, diagnostics?: BrowserActionResult['diagnostics']): BrowserActionResult {\n return { ok: false, action, error: { code, message }, diagnostics };\n}\n\nfunction asObject(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {};\n}\n\nfunction pipelineLast(ctx: BrowserActionContext): unknown {\n return ctx.pipeline?.last;\n}\n\nfunction valueFromArgs(ctx: BrowserActionContext, args: Record<string, unknown>): unknown {\n if ('value' in args) return args.value;\n if (typeof args.path === 'string') return resolvePath(pipelineLast(ctx), args.path);\n return pipelineLast(ctx);\n}\n\nfunction compareValues(a: unknown, b: unknown): number {\n const av = typeof a === 'number' ? a : String(a ?? '');\n const bv = typeof b === 'number' ? b : String(b ?? '');\n if (av < bv) return -1;\n if (av > bv) return 1;\n return 0;\n}\n\nfunction matchesNetworkPattern(url: string, pattern: string | undefined): boolean {\n if (!pattern) return true;\n return url.includes(pattern);\n}\n\n// ─── Action Handlers ────────────────────────────────────────────────────────\n\nconst navigateAction: BrowserActionHandler = async (ctx, args) => {\n const url = String(args.url ?? '');\n if (!url) return fail('navigate', 'MISSING_URL', 'url is required');\n\n const allowPrivate = ctx.config?.agents?.defaults?.browser?.allowPrivateUrls === true;\n if (containsApiKeyPattern(url)) return fail('navigate', 'BLOCKED', 'URL contains API key/token');\n const block = checkWebsiteBlocklist(url, ctx.config?.tools?.web?.blocklist);\n if (block) return fail('navigate', 'BLOCKED', block.message);\n assertBrowserUrlAllowed(url, { allowPrivateUrls: allowPrivate });\n\n const waitUntil = (args.wait_until as string) ?? (args.waitFor as string) ?? 'domcontentloaded';\n const navTimeout = toMs(ctx);\n await ctx.page.goto(url, { waitUntil: waitUntil as any, timeout: navTimeout });\n\n const title = await ctx.page.title();\n const finalUrl = ctx.page.url();\n\n if (finalUrl && finalUrl !== url) {\n const redirectBlock = checkPostRedirectUrl(finalUrl, { allowPrivateUrls: allowPrivate });\n if (redirectBlock) {\n await ctx.page.goto('about:blank').catch(() => {});\n return fail('navigate', 'REDIRECT_BLOCKED', redirectBlock);\n }\n }\n\n let snapshot = '';\n try { snapshot = await ariaSnapshot(ctx.page, undefined, AUTO_SNAPSHOT_MAX, navTimeout); } catch { /* non-fatal */ }\n\n const text = `Navigated to: ${title}\\nURL: ${finalUrl}${snapshot ? `\\n--- Page Snapshot ---\\n${snapshot}` : ''}`;\n return ok('navigate', text, { url: finalUrl, title });\n};\n\nconst stateAction: BrowserActionHandler = async (ctx, args) => {\n const maxLen = typeof args.maxLength === 'number' ? args.maxLength : DEFAULT_SNAPSHOT_MAX;\n const selector = args.selector as string | undefined;\n const timeout = toMs(ctx);\n try {\n const text = await ariaSnapshot(ctx.page, selector, maxLen, timeout);\n return ok('state', text, { length: text.length });\n } catch (e) {\n return fail('state', 'SNAPSHOT_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst clickAction: BrowserActionHandler = async (ctx, args) => {\n const timeout = toMs(ctx);\n try {\n if (isHumanizeEnabled(ctx) && args.selector) {\n await humanizedClick(ctx.page, String(args.selector), humanPreset(ctx));\n return ok('click', 'Click succeeded (humanized).');\n }\n const loc = resolveClickLocator(ctx.page, args);\n await loc.click({ timeout });\n return ok('click', 'Click succeeded.');\n } catch (e) {\n return fail('click', 'CLICK_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst typeAction: BrowserActionHandler = async (ctx, args) => {\n const timeout = toMs(ctx);\n try {\n if (isHumanizeEnabled(ctx) && args.selector) {\n await humanizedFill(ctx.page, String(args.selector), String(args.text ?? ''), humanPreset(ctx));\n if (args.pressEnter) await ctx.page.keyboard.press('Enter');\n return ok('type', 'Typed into field (humanized).');\n }\n const loc = resolveTypeLocator(ctx.page, args);\n await loc.clear({ timeout: Math.min(5000, timeout) }).catch(() => {});\n await loc.fill(String(args.text ?? ''), { timeout });\n if (args.pressEnter) await ctx.page.keyboard.press('Enter');\n return ok('type', 'Typed into field.');\n } catch (e) {\n return fail('type', 'TYPE_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst scrollAction: BrowserActionHandler = async (ctx, args) => {\n const direction = (args.direction as string) ?? 'down';\n const amount = typeof args.amount === 'number' ? args.amount : 500;\n const dy = direction === 'down' ? amount : -amount;\n try {\n if (isHumanizeEnabled(ctx)) {\n await humanizedScroll(ctx.page, dy, humanPreset(ctx));\n return ok('scroll', `Scrolled ${direction} by ${amount}px (humanized).`);\n }\n await ctx.page.evaluate(({ deltaY }) => {\n (globalThis as any).scrollBy(0, deltaY);\n }, { deltaY: dy });\n return ok('scroll', `Scrolled ${direction} by ${amount}px.`);\n } catch (e) {\n return fail('scroll', 'SCROLL_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst screenshotAction: BrowserActionHandler = async (ctx, args) => {\n const timeout = toMs(ctx);\n const selector = args.selector as string | undefined;\n const fullPage = args.full_page === true || args.fullPage === true;\n const path = args.path as string | undefined;\n try {\n let buf: Buffer;\n if (selector?.trim()) {\n const loc = ctx.page.locator(selector.trim()).first();\n await loc.waitFor({ state: 'visible', timeout });\n buf = await loc.screenshot({ type: 'png', timeout });\n } else {\n buf = await ctx.page.screenshot({ type: 'png', fullPage, timeout });\n }\n const artifact = { type: 'screenshot' as const, path, data: buf.toString('base64'), mimeType: 'image/png' };\n return ok('screenshot', `Screenshot captured (${buf.length} bytes).`, { bytes: buf.length }, [artifact]);\n } catch (e) {\n return fail('screenshot', 'SCREENSHOT_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst backAction: BrowserActionHandler = async (ctx, args) => {\n const waitUntil = (args.waitFor as string) ?? 'domcontentloaded';\n const timeout = toMs(ctx);\n try {\n const response = await ctx.page.goBack({ waitUntil: waitUntil as any, timeout });\n if (!response) return fail('back', 'NO_HISTORY', 'No previous page in history.');\n const title = await ctx.page.title();\n const url = ctx.page.url();\n return ok('back', `Navigated back to: ${title}\\nURL: ${url}`, { url, title });\n } catch (e) {\n return fail('back', 'BACK_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst pressAction: BrowserActionHandler = async (ctx, args) => {\n const key = String(args.key ?? '');\n if (!key) return fail('press', 'MISSING_KEY', 'key is required');\n try {\n await ctx.page.keyboard.press(key);\n return ok('press', `Pressed key: ${key}`);\n } catch (e) {\n return fail('press', 'PRESS_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst evalAction: BrowserActionHandler = async (ctx, args) => {\n const js = (args.javascript as string) ?? (args.expression as string) ?? (args.code as string) ?? '';\n if (!js.trim()) return fail('eval', 'MISSING_JS', 'javascript expression is required');\n try {\n const result = await ctx.page.evaluate(js);\n const serialized = result === undefined ? 'undefined' : JSON.stringify(result, null, 2);\n const text = serialized.length > DEFAULT_SNAPSHOT_MAX\n ? `${serialized.slice(0, DEFAULT_SNAPSHOT_MAX)}\\n... (truncated)`\n : serialized;\n return ok('eval', text, result);\n } catch (e) {\n return fail('eval', 'EVAL_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst imagesAction: BrowserActionHandler = async (ctx, args) => {\n const selector = args.selector as string | undefined;\n const maxImages = typeof args.maxImages === 'number' ? args.maxImages : 20;\n try {\n const images = await ctx.page.evaluate(\n ([sel, max]: [string | null, number]) => {\n const d = globalThis.document as any;\n const root = sel ? d.querySelector(sel) : d;\n if (!root) return [];\n const imgs = Array.from(root.querySelectorAll('img') as ArrayLike<any>);\n return imgs.slice(0, max).map((img: any) => ({\n src: String(img.src ?? ''),\n alt: String(img.alt ?? ''),\n width: Number(img.naturalWidth ?? 0),\n height: Number(img.naturalHeight ?? 0),\n }));\n },\n [selector?.trim() || null, maxImages] as [string | null, number],\n );\n if (!images || images.length === 0) return ok('images', 'No images found on the page.', []);\n const lines = images.map((img: any, i: number) =>\n `${i + 1}. ${img.alt || '(no alt)'} — ${img.width}×${img.height}\\n ${img.src}`);\n return ok('images', `Found ${images.length} image(s):\\n${lines.join('\\n')}`, images);\n } catch (e) {\n return fail('images', 'IMAGES_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst closeAction: BrowserActionHandler = async (ctx, _args) => {\n await ctx.manager.closePage(ctx.taskId);\n return ok('close', 'Browser page closed.');\n};\n\nconst dialogAction: BrowserActionHandler = async (ctx, args) => {\n const action = args.action as string;\n if (action !== 'accept' && action !== 'dismiss') {\n return fail('dialog', 'INVALID_ACTION', 'action must be \"accept\" or \"dismiss\"');\n }\n // Dialog handling relies on the CdpSupervisor event queue; this is a placeholder\n // that signals the supervisor to accept/dismiss the next pending dialog.\n const sup = ctx.supervisor;\n if (!sup) return fail('dialog', 'NO_SUPERVISOR', 'No dialog supervisor available');\n // Forward to supervisor (implementation detail in cdp-supervisor.ts)\n return ok('dialog', `Dialog ${action}ed.`);\n};\n\nconst waitAction: BrowserActionHandler = async (ctx, args) => {\n const selector = args.selector as string | undefined;\n const text = args.text as string | undefined;\n const state = (args.state as 'attached' | 'detached' | 'visible' | 'hidden' | undefined) ?? 'visible';\n const timeoutMs = typeof args.timeout_ms === 'number' ? args.timeout_ms : toMs(ctx);\n try {\n if (selector?.trim()) {\n await ctx.page.locator(selector.trim()).first().waitFor({ state, timeout: timeoutMs });\n } else if (text?.trim()) {\n await ctx.page.getByText(text.trim()).first().waitFor({ state: 'visible', timeout: timeoutMs });\n } else if (args.function || args.expression) {\n await ctx.page.waitForFunction(String(args.function ?? args.expression), null, { timeout: timeoutMs });\n } else {\n const ms = typeof args.ms === 'number' ? args.ms : 1000;\n await ctx.page.waitForTimeout(ms);\n }\n return ok('wait', 'Wait completed.');\n } catch (e) {\n return fail('wait', 'WAIT_TIMEOUT', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst outputAction: BrowserActionHandler = async (ctx, args) => {\n return ok('output', 'Output captured.', valueFromArgs(ctx, args));\n};\n\nconst assertAction: BrowserActionHandler = async (ctx, args) => {\n const actual = valueFromArgs(ctx, args);\n if ('equals' in args && JSON.stringify(actual) !== JSON.stringify(args.equals)) {\n return fail('assert', 'ASSERTION_FAILED', `Expected value to equal ${JSON.stringify(args.equals)}, got ${JSON.stringify(actual)?.slice(0, 500)}`);\n }\n if ('contains' in args && !valueContains(actual, args.contains)) {\n return fail('assert', 'ASSERTION_FAILED', `Expected value to contain ${JSON.stringify(args.contains)}`);\n }\n if ('matches' in args) {\n const pattern = new RegExp(String(args.matches));\n if (!pattern.test(String(actual ?? ''))) {\n return fail('assert', 'ASSERTION_FAILED', `Expected value to match /${pattern.source}/`);\n }\n }\n if (args.truthy === true && !isTruthyValue(actual)) {\n return fail('assert', 'ASSERTION_FAILED', `Expected value to be truthy, got ${JSON.stringify(actual)}`);\n }\n if (args.exists === true && (actual === undefined || actual === null || actual === '')) {\n return fail('assert', 'ASSERTION_FAILED', 'Expected value to exist');\n }\n return ok('assert', 'Assertion passed.');\n};\n\nconst waitForNavigationAction: BrowserActionHandler = async (ctx, args) => {\n const timeout = typeof args.timeout_ms === 'number' ? args.timeout_ms : toMs(ctx);\n const waitUntil = (args.wait_until as string) ?? 'domcontentloaded';\n try {\n await ctx.page.waitForLoadState(waitUntil as any, { timeout });\n return ok('wait_for_navigation', 'Navigation wait completed.');\n } catch (e) {\n return fail('wait_for_navigation', 'WAIT_TIMEOUT', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst waitForTimeoutAction: BrowserActionHandler = async (ctx, args) => {\n const ms = Number(args.ms ?? args.timeout_ms ?? 1000);\n await ctx.page.waitForTimeout(Number.isFinite(ms) ? ms : 1000);\n return ok('wait_for_timeout', `Waited ${ms}ms.`);\n};\n\nconst waitForFunctionAction: BrowserActionHandler = async (ctx, args) => {\n const expression = String(args.expression ?? args.function ?? '');\n if (!expression.trim()) return fail('wait_for_function', 'MISSING_EXPRESSION', 'expression is required');\n const timeout = typeof args.timeout_ms === 'number' ? args.timeout_ms : toMs(ctx);\n try {\n await ctx.page.waitForFunction(expression, null, { timeout });\n return ok('wait_for_function', 'Function wait completed.');\n } catch (e) {\n return fail('wait_for_function', 'WAIT_TIMEOUT', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst waitForNetworkIdleAction: BrowserActionHandler = async (ctx, args) => {\n const timeout = typeof args.timeout_ms === 'number' ? args.timeout_ms : toMs(ctx);\n try {\n await ctx.page.waitForLoadState('networkidle', { timeout });\n return ok('wait_for_network_idle', 'Network idle reached.');\n } catch (e) {\n return fail('wait_for_network_idle', 'WAIT_TIMEOUT', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst elementTextAction: BrowserActionHandler = async (ctx, args) => {\n const selector = String(args.selector ?? '');\n if (!selector) return fail('element_text', 'MISSING_SELECTOR', 'selector is required');\n const timeout = toMs(ctx);\n const loc = ctx.page.locator(selector).first();\n await loc.waitFor({ state: 'attached', timeout });\n const text = await loc.innerText({ timeout }).catch(() => loc.textContent({ timeout }));\n return ok('element_text', String(text ?? ''), text ?? '');\n};\n\nconst elementAttributeAction: BrowserActionHandler = async (ctx, args) => {\n const selector = String(args.selector ?? '');\n const attribute = String(args.attribute ?? '');\n if (!selector || !attribute) return fail('element_attribute', 'INVALID_ARGS', 'selector and attribute are required');\n const timeout = toMs(ctx);\n const loc = ctx.page.locator(selector).first();\n await loc.waitFor({ state: 'attached', timeout });\n const value = await loc.getAttribute(attribute, { timeout });\n return ok('element_attribute', value ?? '', value);\n};\n\nconst boundingBoxAction: BrowserActionHandler = async (ctx, args) => {\n const selector = String(args.selector ?? '');\n if (!selector) return fail('bounding_box', 'MISSING_SELECTOR', 'selector is required');\n const timeout = toMs(ctx);\n const loc = ctx.page.locator(selector).first();\n await loc.waitFor({ state: 'visible', timeout });\n const box = await loc.boundingBox({ timeout });\n return ok('bounding_box', JSON.stringify(box), box);\n};\n\nconst setInputFilesAction: BrowserActionHandler = async (ctx, args) => {\n const selector = String(args.selector ?? '');\n const files = Array.isArray(args.files) ? args.files.map(String) : typeof args.file === 'string' ? [args.file] : [];\n if (!selector || files.length === 0) return fail('set_input_files', 'INVALID_ARGS', 'selector and files are required');\n await ctx.page.locator(selector).first().setInputFiles(files, { timeout: toMs(ctx) });\n return ok('set_input_files', `Attached ${files.length} file(s).`, { files });\n};\n\nconst getCookiesAction: BrowserActionHandler = async (ctx, args) => {\n const urls = Array.isArray(args.urls) ? args.urls.map(String) : undefined;\n const cookies = await ctx.page.context().cookies(urls);\n return ok('cookies', JSON.stringify(cookies, null, 2), cookies);\n};\n\nconst addCookiesAction: BrowserActionHandler = async (ctx, args) => {\n const cookies = Array.isArray(args.cookies) ? args.cookies as any[] : [];\n if (cookies.length === 0) return fail('add_cookies', 'INVALID_ARGS', 'cookies must be a non-empty array');\n await ctx.page.context().addCookies(cookies);\n return ok('add_cookies', `Added ${cookies.length} cookie(s).`);\n};\n\nconst clearCookiesAction: BrowserActionHandler = async (ctx) => {\n await ctx.page.context().clearCookies();\n return ok('clear_cookies', 'Cookies cleared.');\n};\n\nconst listTabsAction: BrowserActionHandler = async (ctx) => {\n const pages = ctx.page.context().pages();\n const tabs = await Promise.all(pages.map(async (page, index) => ({ index, url: page.url(), title: await page.title().catch(() => '') })));\n return ok('tabs', JSON.stringify(tabs, null, 2), tabs);\n};\n\nconst newTabAction: BrowserActionHandler = async (ctx, args) => {\n const page = await ctx.page.context().newPage();\n if (args.url) await page.goto(String(args.url), { waitUntil: 'domcontentloaded', timeout: toMs(ctx) });\n return ok('new_tab', `Opened tab: ${page.url()}`, { url: page.url(), title: await page.title().catch(() => '') });\n};\n\nconst switchTabAction: BrowserActionHandler = async (ctx, args) => {\n const index = Number(args.index ?? args.tab_index ?? 0);\n const pages = ctx.page.context().pages();\n const page = pages[index];\n if (!page) return fail('switch_tab', 'TAB_NOT_FOUND', `No tab at index ${index}`);\n await page.bringToFront();\n return ok('switch_tab', `Switched to tab ${index}.`, { index, url: page.url() });\n};\n\nconst selectAction: BrowserActionHandler = async (ctx, args) => {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n const path = String(args.path ?? args.value ?? '');\n const value = path ? resolvePath(source, path) : source;\n return ok('select', typeof value === 'string' ? value : JSON.stringify(value, null, 2), value);\n};\n\nconst mapAction: BrowserActionHandler = async (ctx, args) => {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n if (!Array.isArray(source)) return fail('map', 'INVALID_INPUT', 'map input must be an array');\n const path = String(args.path ?? '');\n const result = path ? source.map((item) => resolvePath(item, path)) : source;\n return ok('map', JSON.stringify(result, null, 2), result);\n};\n\nconst filterAction: BrowserActionHandler = async (ctx, args) => {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n if (!Array.isArray(source)) return fail('filter', 'INVALID_INPUT', 'filter input must be an array');\n const path = String(args.path ?? '');\n const equals = args.equals;\n const contains = args.contains;\n const truthy = args.truthy === true;\n const result = source.filter((item) => {\n const value = path ? resolvePath(item, path) : item;\n if ('equals' in args) return JSON.stringify(value) === JSON.stringify(equals);\n if ('contains' in args) return valueContains(value, contains);\n if (truthy) return isTruthyValue(value);\n return isTruthyValue(value);\n });\n return ok('filter', JSON.stringify(result, null, 2), result);\n};\n\nconst sortAction: BrowserActionHandler = async (ctx, args) => {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n if (!Array.isArray(source)) return fail('sort', 'INVALID_INPUT', 'sort input must be an array');\n const path = String(args.path ?? '');\n const direction = String(args.direction ?? 'asc');\n const result = [...source].sort((a, b) => {\n const av = path ? resolvePath(a, path) : a;\n const bv = path ? resolvePath(b, path) : b;\n const cmp = compareValues(av, bv);\n return direction === 'desc' ? -cmp : cmp;\n });\n return ok('sort', JSON.stringify(result, null, 2), result);\n};\n\nconst limitAction: BrowserActionHandler = async (ctx, args) => {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n if (!Array.isArray(source)) return fail('limit', 'INVALID_INPUT', 'limit input must be an array');\n const count = Math.max(0, Number(args.count ?? args.limit ?? 10));\n const offset = Math.max(0, Number(args.offset ?? 0));\n const result = source.slice(offset, offset + count);\n return ok('limit', JSON.stringify(result, null, 2), result);\n};\n\nconst fetchAction: BrowserActionHandler = async (ctx, args) => {\n const url = String(args.url ?? '');\n if (!url) return fail('fetch', 'MISSING_URL', 'url is required');\n const method = String(args.method ?? 'GET');\n const headers = asObject(args.headers) as Record<string, string>;\n const body = args.body === undefined ? undefined : typeof args.body === 'string' ? args.body : JSON.stringify(args.body);\n const result = await ctx.page.evaluate(\n async ({ url, method, headers, body }) => {\n const response = await fetch(url, { method, headers, body });\n const text = await response.text();\n const contentType = response.headers.get('content-type') ?? '';\n let parsed: unknown = text;\n if (contentType.includes('application/json')) {\n try { parsed = JSON.parse(text); } catch { parsed = text; }\n }\n return { ok: response.ok, status: response.status, url: response.url, headers: Object.fromEntries(response.headers.entries()), body: parsed };\n },\n { url, method, headers, body },\n );\n return ok('fetch', JSON.stringify(result, null, 2), result);\n};\n\nconst networkStartAction: BrowserActionHandler = async (ctx, args) => {\n networkMonitors.get(ctx.page)?.dispose();\n const includeBody = args.include_body === true || args.includeBody === true;\n const urlPattern = typeof args.url_pattern === 'string' ? args.url_pattern : typeof args.urlPattern === 'string' ? args.urlPattern : undefined;\n const events: NetworkEvent[] = [];\n const onRequest = (request: any) => {\n if (!matchesNetworkPattern(request.url(), urlPattern)) return;\n events.push({ type: 'request', url: request.url(), method: request.method(), resourceType: request.resourceType(), postData: request.postData(), timestamp: Date.now() });\n };\n const onResponse = async (response: any) => {\n if (!matchesNetworkPattern(response.url(), urlPattern)) return;\n const event: NetworkEvent = { type: 'response', url: response.url(), status: response.status(), timestamp: Date.now() };\n if (includeBody) {\n event.body = await response.text().catch(() => undefined);\n }\n events.push(event);\n };\n const onRequestFailed = (request: any) => {\n if (!matchesNetworkPattern(request.url(), urlPattern)) return;\n events.push({ type: 'requestfailed', url: request.url(), method: request.method(), errorText: request.failure()?.errorText, timestamp: Date.now() });\n };\n ctx.page.on('request', onRequest);\n ctx.page.on('response', onResponse);\n ctx.page.on('requestfailed', onRequestFailed);\n networkMonitors.set(ctx.page, {\n events,\n includeBody,\n urlPattern,\n dispose: () => {\n ctx.page.off('request', onRequest);\n ctx.page.off('response', onResponse);\n ctx.page.off('requestfailed', onRequestFailed);\n networkMonitors.delete(ctx.page);\n },\n });\n return ok('network_start', 'Network monitoring started.', { includeBody, urlPattern });\n};\n\nconst networkEventsAction: BrowserActionHandler = async (ctx) => {\n const monitor = networkMonitors.get(ctx.page);\n const events = monitor?.events ?? [];\n return ok('network_events', JSON.stringify(events, null, 2), events);\n};\n\nconst networkStopAction: BrowserActionHandler = async (ctx) => {\n const events = networkMonitors.get(ctx.page)?.events ?? [];\n networkMonitors.get(ctx.page)?.dispose();\n return ok('network_stop', JSON.stringify(events, null, 2), events);\n};\n\nconst collectAction: BrowserActionHandler = async (ctx, args) => {\n const events = networkMonitors.get(ctx.page)?.events ?? [];\n if (args.parse) {\n const parsed = await ctx.page.evaluate(\n ({ events, parse }) => {\n const parseFn = (0, eval)(`(${parse})`);\n return parseFn(events);\n },\n { events, parse: String(args.parse) },\n );\n return ok('collect', JSON.stringify(parsed, null, 2), parsed);\n }\n return ok('collect', JSON.stringify(events, null, 2), events);\n};\n\nconst tapAction: BrowserActionHandler = async (ctx, args) => {\n const pattern = String(args.capture ?? args.url ?? args.pattern ?? '');\n const timeoutMs = Number(args.timeout_ms ?? args.timeoutMs ?? 5000);\n const captured = await ctx.page.evaluate(\n async ({ pattern, timeoutMs }) => {\n let result: unknown = null;\n const g = globalThis as any;\n const originalFetch = g.fetch;\n g.fetch = async (...fetchArgs: any[]) => {\n const response = await originalFetch(...fetchArgs);\n try {\n const url = typeof fetchArgs[0] === 'string' ? fetchArgs[0] : fetchArgs[0]?.url ?? String(fetchArgs[0]);\n if ((!pattern || url.includes(pattern)) && result === null) {\n const clone = response.clone();\n const text = await clone.text();\n try { result = JSON.parse(text); } catch { result = text; }\n }\n } catch {}\n return response;\n };\n try {\n await new Promise((resolve) => setTimeout(resolve, timeoutMs));\n } finally {\n g.fetch = originalFetch;\n }\n return result;\n },\n { pattern, timeoutMs },\n );\n return ok('tap', JSON.stringify(captured, null, 2), captured);\n};\n\n// ─── Registry Construction ──────────────────────────────────────────────────\n\nexport function createBrowserActionRegistry(): BrowserActionRegistry {\n const handlers = new Map<string, BrowserActionHandler>();\n\n // Navigate\n handlers.set('open', navigateAction);\n handlers.set('navigate', navigateAction);\n // State / snapshot\n handlers.set('state', stateAction);\n handlers.set('snapshot', stateAction);\n // Interaction\n handlers.set('click', clickAction);\n handlers.set('type', typeAction);\n handlers.set('input', typeAction);\n handlers.set('scroll', scrollAction);\n handlers.set('back', backAction);\n handlers.set('keys', pressAction);\n handlers.set('press', pressAction);\n // Inspection\n handlers.set('screenshot', screenshotAction);\n handlers.set('images', imagesAction);\n // Eval\n handlers.set('console', evalAction);\n handlers.set('eval', evalAction);\n handlers.set('evaluate', evalAction);\n // Control\n handlers.set('dialog', dialogAction);\n handlers.set('close', closeAction);\n handlers.set('wait', waitAction);\n handlers.set('wait_for_navigation', waitForNavigationAction);\n handlers.set('wait_for_timeout', waitForTimeoutAction);\n handlers.set('wait_for_function', waitForFunctionAction);\n handlers.set('wait_for_network_idle', waitForNetworkIdleAction);\n // Pipeline-specific\n handlers.set('output', outputAction);\n handlers.set('assert', assertAction);\n handlers.set('select', selectAction);\n handlers.set('map', mapAction);\n handlers.set('filter', filterAction);\n handlers.set('sort', sortAction);\n handlers.set('limit', limitAction);\n handlers.set('fetch', fetchAction);\n handlers.set('collect', collectAction);\n handlers.set('tap', tapAction);\n // DOM / browser context\n handlers.set('element_text', elementTextAction);\n handlers.set('element_attribute', elementAttributeAction);\n handlers.set('bounding_box', boundingBoxAction);\n handlers.set('set_input_files', setInputFilesAction);\n handlers.set('cookies', getCookiesAction);\n handlers.set('get_cookies', getCookiesAction);\n handlers.set('add_cookies', addCookiesAction);\n handlers.set('clear_cookies', clearCookiesAction);\n handlers.set('tabs', listTabsAction);\n handlers.set('list_tabs', listTabsAction);\n handlers.set('new_tab', newTabAction);\n handlers.set('switch_tab', switchTabAction);\n // Network\n handlers.set('network_start', networkStartAction);\n handlers.set('network_events', networkEventsAction);\n handlers.set('network_stop', networkStopAction);\n\n return {\n get(name: string) { return handlers.get(name); },\n has(name: string) { return handlers.has(name); },\n names() { return [...handlers.keys()]; },\n async execute(name: string, ctx: BrowserActionContext, args: Record<string, unknown>): Promise<BrowserActionResult> {\n if (ctx.signal?.aborted) {\n return fail(name, 'ABORTED', 'Operation was aborted');\n }\n if (ctx.manager.getExtensionProvider()) {\n const { runExtensionRegistryAction } = await import('./extension-registry-bridge.js');\n return runExtensionRegistryAction(name, ctx, args);\n }\n const handler = handlers.get(name);\n if (!handler) {\n return fail(name, 'UNKNOWN_ACTION', `Unknown browser action: ${name}`);\n }\n if (ctx.signal?.aborted) {\n return fail(name, 'ABORTED', 'Operation was aborted');\n }\n try {\n return await handler(ctx, args);\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n log.error({ err: e, action: name }, `Action failed: ${message}`);\n return fail(name, 'ACTION_ERROR', message);\n }\n },\n };\n}\n"],"mappings":"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"}