@xopcai/xopc 0.0.86 → 0.0.87

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 (380) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/feishu/src/adapters/cli-login.js +3 -3
  3. package/dist/extensions/feishu/src/adapters/cli-login.js.map +1 -1
  4. package/dist/extensions/telegram/src/delivery-chat-id.d.ts +1 -1
  5. package/dist/extensions/telegram/src/delivery-chat-id.js +1 -1
  6. package/dist/extensions/telegram/src/delivery-chat-id.js.map +1 -1
  7. package/dist/extensions/telegram/src/routing-integration.js +1 -0
  8. package/dist/extensions/telegram/src/routing-integration.js.map +1 -1
  9. package/dist/extensions/telegram/xopc.extension.json +1 -1
  10. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js +2 -2
  11. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js.map +1 -1
  12. package/dist/extensions/weixin/src/api/api.js +2 -2
  13. package/dist/extensions/weixin/src/api/api.js.map +1 -1
  14. package/dist/extensions/weixin/src/auth/accounts.js +12 -12
  15. package/dist/extensions/weixin/src/auth/accounts.js.map +1 -1
  16. package/dist/extensions/weixin/src/delivery-to.js +2 -2
  17. package/dist/extensions/weixin/src/delivery-to.js.map +1 -1
  18. package/dist/extensions/weixin/src/messaging/debug-mode.js +5 -5
  19. package/dist/extensions/weixin/src/messaging/debug-mode.js.map +1 -1
  20. package/dist/extensions/weixin/src/messaging/inbound.js +11 -11
  21. package/dist/extensions/weixin/src/messaging/inbound.js.map +1 -1
  22. package/dist/extensions/weixin/src/storage/sync-buf.js +4 -4
  23. package/dist/extensions/weixin/src/storage/sync-buf.js.map +1 -1
  24. package/dist/extensions/weixin/src/workflow-progress.d.ts +1 -1
  25. package/dist/extensions/weixin/src/workflow-progress.js.map +1 -1
  26. package/dist/gateway/static/root/assets/{agents-mS3_HpRI.js → agents-BEAbXpuP.js} +6 -6
  27. package/dist/gateway/static/root/assets/{apps-page-DrfytjOb.js → apps-page-Dg8R-Szf.js} +1 -1
  28. package/dist/gateway/static/root/assets/{channels-settings-BG6b9KrW.js → channels-settings-yohw9YSu.js} +1 -1
  29. package/dist/gateway/static/root/assets/{channels-status-swr-Bs5kMCMI.js → channels-status-swr-BSHqqCF1.js} +1 -1
  30. package/dist/gateway/static/root/assets/{cron-api-BuVcZ5zR.js → cron-api-0h_QT8U3.js} +1 -1
  31. package/dist/gateway/static/root/assets/{cron-page-BMrloeFH.js → cron-page-BkfKFfFk.js} +1 -1
  32. package/dist/gateway/static/root/assets/{dist-CKU1OOTf.js → dist-Cmjp2APP.js} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-debug-page-BdW_46sN.js → extension-debug-page-CFa9z_1N.js} +1 -1
  34. package/dist/gateway/static/root/assets/{extension-page-DW47KI82.js → extension-page-BI8eaTPq.js} +1 -1
  35. package/dist/gateway/static/root/assets/{extension-settings-page-B-W4x2xP.js → extension-settings-page-x4BB7q1X.js} +1 -1
  36. package/dist/gateway/static/root/assets/{fetch-B2MYHbWg.js → fetch-DRqwef_Q.js} +1 -1
  37. package/dist/gateway/static/root/assets/{field-primitives-DPG-oJmx.js → field-primitives-BiNHBo2Y.js} +1 -1
  38. package/dist/gateway/static/root/assets/{heartbeat-config-api-C8dNts9i.js → heartbeat-config-api-ZRb8qhuz.js} +1 -1
  39. package/dist/gateway/static/root/assets/{index-BmVYculr.js → index-Cu7bKuUi.js} +96 -94
  40. package/dist/gateway/static/root/assets/index-a5gWIdZQ.css +1 -0
  41. package/dist/gateway/static/root/assets/{logs-page-sTsVWz0X.js → logs-page-BFZ8GgCv.js} +1 -1
  42. package/dist/gateway/static/root/assets/{sessions-page-FaG_Vlkb.js → sessions-page-CD7AfB-2.js} +1 -1
  43. package/dist/gateway/static/root/assets/{settings-form-section-DuvRQW--.js → settings-form-section-DiqqVs6m.js} +1 -1
  44. package/dist/gateway/static/root/assets/{settings-page-Bet1OerL.js → settings-page-BBOjEQW3.js} +1 -1
  45. package/dist/gateway/static/root/assets/{share-preview-page-BtG2kLDh.js → share-preview-page-n1Gprylk.js} +1 -1
  46. package/dist/gateway/static/root/assets/{skills-page-DhUO235y.js → skills-page-CcN_gj--.js} +1 -1
  47. package/dist/gateway/static/root/assets/{theme-store-DryYl3qD.js → theme-store-CZOh1nT3.js} +1 -1
  48. package/dist/gateway/static/root/assets/url-Dd8Q7kZZ.js +3 -0
  49. package/dist/gateway/static/root/assets/{utils-BY7bU1DT.js → utils-CkWBfxs4.js} +1 -1
  50. package/dist/gateway/static/root/assets/{voice-api-key-field-CGEydndO.js → voice-api-key-field-O6awz9hi.js} +1 -1
  51. package/dist/gateway/static/root/index.html +5 -5
  52. package/dist/package.js +1 -1
  53. package/dist/src/agent/agent-scope.d.ts +4 -0
  54. package/dist/src/agent/agent-scope.js +53 -10
  55. package/dist/src/agent/agent-scope.js.map +1 -1
  56. package/dist/src/agent/bootstrap/filter-bootstrap-files.js +2 -1
  57. package/dist/src/agent/bootstrap/filter-bootstrap-files.js.map +1 -1
  58. package/dist/src/agent/embedded/session-tool-result-guard.js +2 -1
  59. package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
  60. package/dist/src/agent/embedded/tool-result-truncation.js +2 -1
  61. package/dist/src/agent/embedded/tool-result-truncation.js.map +1 -1
  62. package/dist/src/agent/fallback/candidates.js +2 -2
  63. package/dist/src/agent/fallback/candidates.js.map +1 -1
  64. package/dist/src/agent/goals/persistent-goal-apis.d.ts +0 -2
  65. package/dist/src/agent/goals/persistent-goal-service.js +0 -1
  66. package/dist/src/agent/goals/persistent-goal-service.js.map +1 -1
  67. package/dist/src/agent/image/generation/normalization.js +2 -12
  68. package/dist/src/agent/image/generation/normalization.js.map +1 -1
  69. package/dist/src/agent/image/generation/provider-registry.d.ts +4 -8
  70. package/dist/src/agent/image/generation/provider-registry.js.map +1 -1
  71. package/dist/src/agent/image/generation/runtime.d.ts +2 -2
  72. package/dist/src/agent/image/generation/runtime.js.map +1 -1
  73. package/dist/src/agent/image/generation/types.d.ts +0 -18
  74. package/dist/src/agent/image/image-helpers.js +6 -1
  75. package/dist/src/agent/image/image-helpers.js.map +1 -1
  76. package/dist/src/agent/image/index.d.ts +1 -1
  77. package/dist/src/agent/inbound/inbound-loop.d.ts +5 -0
  78. package/dist/src/agent/inbound/inbound-loop.js +41 -10
  79. package/dist/src/agent/inbound/inbound-loop.js.map +1 -1
  80. package/dist/src/agent/inbound/turn-dispatcher.d.ts +4 -0
  81. package/dist/src/agent/inbound/turn-dispatcher.js +6 -4
  82. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
  83. package/dist/src/agent/mcp/bundle-mcp-materialize.js +2 -1
  84. package/dist/src/agent/mcp/bundle-mcp-materialize.js.map +1 -1
  85. package/dist/src/agent/mcp/bundle-mcp-names.js +2 -1
  86. package/dist/src/agent/mcp/bundle-mcp-names.js.map +1 -1
  87. package/dist/src/agent/mcp/bundle-mcp-runtime.js +2 -1
  88. package/dist/src/agent/mcp/bundle-mcp-runtime.js.map +1 -1
  89. package/dist/src/agent/mcp/mcp-transport-config.js +2 -1
  90. package/dist/src/agent/mcp/mcp-transport-config.js.map +1 -1
  91. package/dist/src/agent/mcp/mcp-transport.js +2 -1
  92. package/dist/src/agent/mcp/mcp-transport.js.map +1 -1
  93. package/dist/src/agent/media-generation/runtime-shared.js +2 -9
  94. package/dist/src/agent/media-generation/runtime-shared.js.map +1 -1
  95. package/dist/src/agent/messaging/command-handler.d.ts +6 -0
  96. package/dist/src/agent/messaging/command-handler.js +5 -0
  97. package/dist/src/agent/messaging/command-handler.js.map +1 -1
  98. package/dist/src/agent/prompt/safety.d.ts +0 -7
  99. package/dist/src/agent/prompt/safety.js +1 -20
  100. package/dist/src/agent/prompt/safety.js.map +1 -1
  101. package/dist/src/agent/service/build-direct-message-content.js +1 -1
  102. package/dist/src/agent/service/build-direct-message-content.js.map +1 -1
  103. package/dist/src/agent/service/direct-turn-helpers.d.ts +3 -1
  104. package/dist/src/agent/service/direct-turn-helpers.js +6 -1
  105. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  106. package/dist/src/agent/service/process-direct-one-shot.d.ts +4 -0
  107. package/dist/src/agent/service/process-direct-one-shot.js +15 -2
  108. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  109. package/dist/src/agent/service/process-direct-streaming.d.ts +4 -0
  110. package/dist/src/agent/service/process-direct-streaming.js +34 -4
  111. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  112. package/dist/src/agent/service/webchat-tts.js +1 -1
  113. package/dist/src/agent/service/webchat-tts.js.map +1 -1
  114. package/dist/src/agent/service.d.ts +8 -0
  115. package/dist/src/agent/service.js +21 -1
  116. package/dist/src/agent/service.js.map +1 -1
  117. package/dist/src/agent/tools/create-share-tool.js +27 -20
  118. package/dist/src/agent/tools/create-share-tool.js.map +1 -1
  119. package/dist/src/agent/tools/factory.js +1 -1
  120. package/dist/src/agent/tools/index.d.ts +0 -1
  121. package/dist/src/agent/tools/index.js +4 -5
  122. package/dist/src/agent/tools/shell.js +0 -13
  123. package/dist/src/agent/tools/shell.js.map +1 -1
  124. package/dist/src/agent/tools/workflow-tool.js +7 -1
  125. package/dist/src/agent/tools/workflow-tool.js.map +1 -1
  126. package/dist/src/agent/workflow/channel-capability.d.ts +3 -3
  127. package/dist/src/agent/workflow/lint.d.ts +38 -0
  128. package/dist/src/agent/workflow/lint.js +74 -0
  129. package/dist/src/agent/workflow/lint.js.map +1 -0
  130. package/dist/src/agent/workflow/parser.js +4 -1
  131. package/dist/src/agent/workflow/parser.js.map +1 -1
  132. package/dist/src/agent/workflow/runtime.d.ts +3 -0
  133. package/dist/src/agent/workflow/runtime.js +76 -3
  134. package/dist/src/agent/workflow/runtime.js.map +1 -1
  135. package/dist/src/agent/workflow/types.d.ts +3 -1
  136. package/dist/src/browser/index.js +4 -4
  137. package/dist/src/browser/manager.d.ts +1 -3
  138. package/dist/src/browser/manager.js +0 -6
  139. package/dist/src/browser/manager.js.map +1 -1
  140. package/dist/src/browser/providers/browser-ext-install.d.ts +4 -4
  141. package/dist/src/browser/providers/browser-ext-install.js +38 -85
  142. package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
  143. package/dist/src/browser/providers/cloakbrowser.d.ts +0 -5
  144. package/dist/src/browser/providers/cloakbrowser.js +2 -55
  145. package/dist/src/browser/providers/cloakbrowser.js.map +1 -1
  146. package/dist/src/channels/attachments/voice-stt-webchat.js +10 -8
  147. package/dist/src/channels/attachments/voice-stt-webchat.js.map +1 -1
  148. package/dist/src/channels/pairing/allow-from-file.js +9 -9
  149. package/dist/src/channels/pairing/allow-from-file.js.map +1 -1
  150. package/dist/src/channels/pairing/pairing-store.js +6 -6
  151. package/dist/src/channels/pairing/pairing-store.js.map +1 -1
  152. package/dist/src/chat-commands/builtins/session.js +1 -1
  153. package/dist/src/chat-commands/builtins/session.js.map +1 -1
  154. package/dist/src/chat-commands/builtins/tts.js +2 -2
  155. package/dist/src/chat-commands/builtins/tts.js.map +1 -1
  156. package/dist/src/chat-commands/context.d.ts +3 -0
  157. package/dist/src/chat-commands/context.js +21 -3
  158. package/dist/src/chat-commands/context.js.map +1 -1
  159. package/dist/src/chat-commands/session-key.d.ts +4 -37
  160. package/dist/src/chat-commands/session-key.js +49 -85
  161. package/dist/src/chat-commands/session-key.js.map +1 -1
  162. package/dist/src/chat-commands/types.d.ts +2 -0
  163. package/dist/src/cli/commands/agent/interactive.js +2 -2
  164. package/dist/src/cli/commands/agent/interactive.js.map +1 -1
  165. package/dist/src/cli/commands/agent/sessions.js +2 -2
  166. package/dist/src/cli/commands/agent/sessions.js.map +1 -1
  167. package/dist/src/cli/commands/agent.js +4 -5
  168. package/dist/src/cli/commands/agent.js.map +1 -1
  169. package/dist/src/cli/commands/channels.js +1 -5
  170. package/dist/src/cli/commands/channels.js.map +1 -1
  171. package/dist/src/cli/commands/gateway/lifecycle-core.js +1 -1
  172. package/dist/src/cli/commands/gateway/lifecycle-core.js.map +1 -1
  173. package/dist/src/cli/commands/gateway/logs.d.ts +9 -0
  174. package/dist/src/cli/commands/gateway/logs.js +50 -17
  175. package/dist/src/cli/commands/gateway/logs.js.map +1 -1
  176. package/dist/src/cli/commands/image.js +22 -21
  177. package/dist/src/cli/commands/image.js.map +1 -1
  178. package/dist/src/cli/commands/session/utils.js +2 -2
  179. package/dist/src/cli/commands/session/utils.js.map +1 -1
  180. package/dist/src/cli/commands/update.js +26 -46
  181. package/dist/src/cli/commands/update.js.map +1 -1
  182. package/dist/src/cli/utils/session.d.ts +0 -5
  183. package/dist/src/cli/utils/session.js +1 -6
  184. package/dist/src/cli/utils/session.js.map +1 -1
  185. package/dist/src/commands/agents.config.js +1 -1
  186. package/dist/src/commands/agents.config.js.map +1 -1
  187. package/dist/src/config/agent-profile.js +5 -27
  188. package/dist/src/config/agent-profile.js.map +1 -1
  189. package/dist/src/config/index.js +2 -2
  190. package/dist/src/config/model-input.js +2 -5
  191. package/dist/src/config/model-input.js.map +1 -1
  192. package/dist/src/config/schema.d.ts +201 -217
  193. package/dist/src/config/schema.js +54 -39
  194. package/dist/src/config/schema.js.map +1 -1
  195. package/dist/src/config/workspace-path-helpers.d.ts +1 -2
  196. package/dist/src/config/workspace-path-helpers.js.map +1 -1
  197. package/dist/src/daemon/install-plan.js +25 -1
  198. package/dist/src/daemon/install-plan.js.map +1 -1
  199. package/dist/src/daemon/launchd.d.ts +8 -0
  200. package/dist/src/daemon/launchd.js +5 -12
  201. package/dist/src/daemon/launchd.js.map +1 -1
  202. package/dist/src/daemon/schtasks.d.ts +25 -0
  203. package/dist/src/daemon/schtasks.js +166 -46
  204. package/dist/src/daemon/schtasks.js.map +1 -1
  205. package/dist/src/daemon/service.js +5 -4
  206. package/dist/src/daemon/service.js.map +1 -1
  207. package/dist/src/daemon/systemd.d.ts +6 -0
  208. package/dist/src/daemon/systemd.js +18 -3
  209. package/dist/src/daemon/systemd.js.map +1 -1
  210. package/dist/src/extensions/activation-context.js +0 -1
  211. package/dist/src/extensions/activation-context.js.map +1 -1
  212. package/dist/src/extensions/normalize-manifest.js +0 -1
  213. package/dist/src/extensions/normalize-manifest.js.map +1 -1
  214. package/dist/src/extensions/types/manifest.d.ts +0 -2
  215. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  216. package/dist/src/gateway/agent-builtin-tools.js +1 -0
  217. package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
  218. package/dist/src/gateway/agents-admin.js +10 -2
  219. package/dist/src/gateway/agents-admin.js.map +1 -1
  220. package/dist/src/gateway/heartbeat/service.js +2 -2
  221. package/dist/src/gateway/heartbeat/service.js.map +1 -1
  222. package/dist/src/gateway/hono/app.js +1 -1
  223. package/dist/src/gateway/hono/lib/agent-model.d.ts +18 -10
  224. package/dist/src/gateway/hono/lib/agent-model.js +24 -35
  225. package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
  226. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  227. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  228. package/dist/src/gateway/hono/lib/safe-voice-config.js +14 -53
  229. package/dist/src/gateway/hono/lib/safe-voice-config.js.map +1 -1
  230. package/dist/src/gateway/hono/routes/config-patch/agents.js +17 -5
  231. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
  232. package/dist/src/gateway/hono/routes/config-patch/channels.js +0 -11
  233. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
  234. package/dist/src/gateway/hono/routes/goals.js +1 -1
  235. package/dist/src/gateway/hono/routes/goals.js.map +1 -1
  236. package/dist/src/gateway/hono/routes/sessions.js +28 -7
  237. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  238. package/dist/src/gateway/hono/routes/shares.js +14 -12
  239. package/dist/src/gateway/hono/routes/shares.js.map +1 -1
  240. package/dist/src/gateway/hono/routes/tunnel.js +1 -1
  241. package/dist/src/gateway/hono/routes/update.js +4 -2
  242. package/dist/src/gateway/hono/routes/update.js.map +1 -1
  243. package/dist/src/gateway/hono/sse.js +16 -33
  244. package/dist/src/gateway/hono/sse.js.map +1 -1
  245. package/dist/src/gateway/lock.js +10 -10
  246. package/dist/src/gateway/lock.js.map +1 -1
  247. package/dist/src/gateway/ports.js +6 -6
  248. package/dist/src/gateway/ports.js.map +1 -1
  249. package/dist/src/gateway/resolve-webchat-session-key.d.ts +19 -0
  250. package/dist/src/gateway/resolve-webchat-session-key.js +46 -0
  251. package/dist/src/gateway/resolve-webchat-session-key.js.map +1 -0
  252. package/dist/src/gateway/service/run-gateway-agent.js +27 -11
  253. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  254. package/dist/src/gateway/service/sessions-api.d.ts +3 -0
  255. package/dist/src/gateway/service/sessions-api.js +8 -0
  256. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  257. package/dist/src/gateway/service.d.ts +0 -2
  258. package/dist/src/gateway/service.js +2 -7
  259. package/dist/src/gateway/service.js.map +1 -1
  260. package/dist/src/gateway/session-reset-service.d.ts +20 -0
  261. package/dist/src/gateway/session-reset-service.js +54 -0
  262. package/dist/src/gateway/session-reset-service.js.map +1 -0
  263. package/dist/src/gateway/startup-readiness.d.ts +1 -1
  264. package/dist/src/gateway/startup-readiness.js +1 -0
  265. package/dist/src/gateway/startup-readiness.js.map +1 -1
  266. package/dist/src/heartbeat/index.js +1 -1
  267. package/dist/src/infra/gateway-processes.js +2 -2
  268. package/dist/src/infra/gateway-processes.js.map +1 -1
  269. package/dist/src/infra/run-command.d.ts +16 -0
  270. package/dist/src/infra/run-command.js +67 -0
  271. package/dist/src/infra/run-command.js.map +1 -0
  272. package/dist/src/infra/update-global.d.ts +45 -0
  273. package/dist/src/infra/update-global.js +224 -0
  274. package/dist/src/infra/update-global.js.map +1 -0
  275. package/dist/src/mcp/channel-bridge.js +1 -1
  276. package/dist/src/mcp/channel-shared.js +2 -1
  277. package/dist/src/mcp/channel-shared.js.map +1 -1
  278. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  279. package/dist/src/providers/auth-runtime/auth-profile-store.js.map +1 -1
  280. package/dist/src/providers/auth-runtime/resolve-auth.js +1 -12
  281. package/dist/src/providers/auth-runtime/resolve-auth.js.map +1 -1
  282. package/dist/src/providers/auth-runtime/types.d.ts +6 -12
  283. package/dist/src/routing/agent-session-key.d.ts +58 -0
  284. package/dist/src/routing/agent-session-key.js +164 -0
  285. package/dist/src/routing/agent-session-key.js.map +1 -0
  286. package/dist/src/routing/index.d.ts +1 -1
  287. package/dist/src/routing/index.js +4 -2
  288. package/dist/src/routing/index.js.map +1 -1
  289. package/dist/src/routing/resolve-route.d.ts +15 -0
  290. package/dist/src/routing/resolve-route.js +41 -20
  291. package/dist/src/routing/resolve-route.js.map +1 -1
  292. package/dist/src/routing/resolve-tui-session-key.d.ts +25 -0
  293. package/dist/src/routing/resolve-tui-session-key.js +54 -0
  294. package/dist/src/routing/resolve-tui-session-key.js.map +1 -0
  295. package/dist/src/routing/session-key-utils.d.ts +24 -0
  296. package/dist/src/routing/session-key-utils.js +92 -0
  297. package/dist/src/routing/session-key-utils.js.map +1 -0
  298. package/dist/src/routing/session-key.d.ts +19 -49
  299. package/dist/src/routing/session-key.js +143 -116
  300. package/dist/src/routing/session-key.js.map +1 -1
  301. package/dist/src/session/index.d.ts +6 -0
  302. package/dist/src/session/index.js +7 -1
  303. package/dist/src/session/init-session-turn.d.ts +30 -0
  304. package/dist/src/session/init-session-turn.js +102 -0
  305. package/dist/src/session/init-session-turn.js.map +1 -0
  306. package/dist/src/session/lifecycle-timestamps.d.ts +8 -0
  307. package/dist/src/session/lifecycle-timestamps.js +16 -0
  308. package/dist/src/session/lifecycle-timestamps.js.map +1 -0
  309. package/dist/src/session/manager.d.ts +7 -1
  310. package/dist/src/session/manager.js +8 -1
  311. package/dist/src/session/manager.js.map +1 -1
  312. package/dist/src/session/parity/transcript-paths.js +2 -2
  313. package/dist/src/session/parity/transcript-paths.js.map +1 -1
  314. package/dist/src/session/parity/xopc-session-disk-entry.d.ts +6 -0
  315. package/dist/src/session/reset-policy.d.ts +32 -0
  316. package/dist/src/session/reset-policy.js +65 -0
  317. package/dist/src/session/reset-policy.js.map +1 -0
  318. package/dist/src/session/reset-triggers.d.ts +20 -0
  319. package/dist/src/session/reset-triggers.js +63 -0
  320. package/dist/src/session/reset-triggers.js.map +1 -0
  321. package/dist/src/session/reset-type.d.ts +12 -0
  322. package/dist/src/session/reset-type.js +25 -0
  323. package/dist/src/session/reset-type.js.map +1 -0
  324. package/dist/src/session/resolve-session.d.ts +30 -0
  325. package/dist/src/session/resolve-session.js +93 -0
  326. package/dist/src/session/resolve-session.js.map +1 -0
  327. package/dist/src/session/session-title.js +3 -2
  328. package/dist/src/session/session-title.js.map +1 -1
  329. package/dist/src/session/store.d.ts +11 -4
  330. package/dist/src/session/store.js +57 -6
  331. package/dist/src/session/store.js.map +1 -1
  332. package/dist/src/session/transcript-events.js +2 -1
  333. package/dist/src/session/transcript-events.js.map +1 -1
  334. package/dist/src/share/share-url.d.ts +33 -0
  335. package/dist/src/share/share-url.js +56 -14
  336. package/dist/src/share/share-url.js.map +1 -1
  337. package/dist/src/tui/backends/embedded-backend.js +4 -9
  338. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  339. package/dist/src/tui/backends/gateway-sse-backend.js +1 -1
  340. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  341. package/dist/src/tui/components/chat-log.js +3 -3
  342. package/dist/src/tui/components/chat-log.js.map +1 -1
  343. package/dist/src/tui/theme.d.ts +0 -2
  344. package/dist/src/tui/theme.js +1 -3
  345. package/dist/src/tui/theme.js.map +1 -1
  346. package/dist/src/tui/tui-commands.d.ts +3 -0
  347. package/dist/src/tui/tui-commands.js +45 -10
  348. package/dist/src/tui/tui-commands.js.map +1 -1
  349. package/dist/src/tui/tui-keybindings-file.js +1 -21
  350. package/dist/src/tui/tui-keybindings-file.js.map +1 -1
  351. package/dist/src/tui/tui-session-actions.d.ts +28 -0
  352. package/dist/src/tui/tui-session-actions.js +88 -0
  353. package/dist/src/tui/tui-session-actions.js.map +1 -0
  354. package/dist/src/tui/tui.js +52 -47
  355. package/dist/src/tui/tui.js.map +1 -1
  356. package/dist/src/utils/string-coerce.d.ts +2 -0
  357. package/dist/src/utils/string-coerce.js +10 -1
  358. package/dist/src/utils/string-coerce.js.map +1 -1
  359. package/dist/src/voice/stt/config-slice.d.ts +2 -5
  360. package/dist/src/voice/stt/config-slice.js +5 -26
  361. package/dist/src/voice/stt/config-slice.js.map +1 -1
  362. package/dist/src/voice/stt/types.d.ts +1 -18
  363. package/dist/src/voice/stt/types.js +4 -2
  364. package/dist/src/voice/stt/types.js.map +1 -1
  365. package/dist/src/voice/tts/config-slice.d.ts +3 -7
  366. package/dist/src/voice/tts/config-slice.js +7 -38
  367. package/dist/src/voice/tts/config-slice.js.map +1 -1
  368. package/dist/src/voice/tts/merge-config.js +2 -48
  369. package/dist/src/voice/tts/merge-config.js.map +1 -1
  370. package/dist/src/voice/tts/providers/alibaba-speech.js +1 -1
  371. package/dist/src/voice/tts/providers/alibaba-speech.js.map +1 -1
  372. package/dist/src/voice/tts/types.d.ts +1 -29
  373. package/dist/src/voice/tts/types.js +19 -17
  374. package/dist/src/voice/tts/types.js.map +1 -1
  375. package/package.json +1 -4
  376. package/dist/gateway/static/root/assets/index-ew_2L2We.css +0 -1
  377. package/dist/gateway/static/root/assets/url-BwNL6Rgk.js +0 -3
  378. package/dist/src/agent/tools/browser-legacy-tools.d.ts +0 -17
  379. package/dist/src/agent/tools/browser-legacy-tools.js +0 -766
  380. package/dist/src/agent/tools/browser-legacy-tools.js.map +0 -1
@@ -1,766 +0,0 @@
1
- import { checkWebsiteBlocklist } from "./url-safety.js";
2
- import { resolveImageModelConfigForTool } from "../image/tool-model-config.js";
3
- import { buildImageToolTextResult } from "../image/image-helpers.js";
4
- import { describeImages } from "../image/understanding/runtime.js";
5
- import { runWithImageModelFallback } from "../image/image-model-fallback.js";
6
- import "./image-tool.js";
7
- import { resolveBrowserCommandTimeoutMs } from "../../browser/browser-command-timeout.js";
8
- import { BrowserBackSchema, BrowserCdpSchema, BrowserClickSchema, BrowserCloseSchema, BrowserConsoleSchema, BrowserDialogSchema, BrowserGetImagesSchema, BrowserNavigateSchema, BrowserPressSchema, BrowserScreenshotSchema, BrowserScrollSchema, BrowserSnapshotSchema, BrowserTypeSchema, BrowserVisionSchema } from "../../browser/schemas.js";
9
- import { assertBrowserUrlAllowed, checkPostRedirectUrl, containsApiKeyPattern } from "../../browser/url-policy.js";
10
- import { truncateSnapshotAtBoundary } from "../../browser/snapshot-helpers.js";
11
- //#region src/agent/tools/browser-legacy-tools.ts
12
- const DEFAULT_SNAPSHOT_MAX = 3e4;
13
- /** Compact snapshot attached to navigate results — keep short to avoid bloating tool output. */
14
- const AUTO_SNAPSHOT_MAX = 8e3;
15
- const MAX_SCREENSHOT_BYTES = 6 * 1024 * 1024;
16
- function resolveClickLocator(page, params) {
17
- const hasSel = Boolean(params.selector?.trim());
18
- const hasText = Boolean(params.text?.trim());
19
- const hasRole = Boolean(params.role?.trim());
20
- if ((hasSel ? 1 : 0) + (hasText ? 1 : 0) + (hasRole ? 1 : 0) !== 1) throw new Error("Provide exactly one of: selector, text, role");
21
- if (hasSel) return page.locator(params.selector.trim()).first();
22
- if (hasText) return page.getByText(params.text.trim(), { exact: false }).first();
23
- const raw = params.role.trim();
24
- const idx = raw.indexOf(":");
25
- const role = (idx >= 0 ? raw.slice(0, idx) : raw).trim();
26
- const name = idx >= 0 ? raw.slice(idx + 1).trim() : "";
27
- if (!role) throw new Error("Invalid role: empty ARIA role");
28
- return page.getByRole(role, name ? { name } : void 0).first();
29
- }
30
- function resolveTypeLocator(page, params) {
31
- const hasSel = Boolean(params.selector?.trim());
32
- if (hasSel === Boolean(params.label?.trim())) throw new Error("Provide exactly one of: selector, label");
33
- if (hasSel) return page.locator(params.selector.trim()).first();
34
- return page.getByLabel(params.label.trim()).first();
35
- }
36
- async function ariaSnapshotFor(page, selector, maxLength, actionTimeoutMs) {
37
- const loc = selector?.trim() ? page.locator(selector.trim()).first() : page.locator("body");
38
- await loc.waitFor({
39
- state: "attached",
40
- timeout: actionTimeoutMs
41
- });
42
- let text = await loc.ariaSnapshot({
43
- mode: "ai",
44
- timeout: actionTimeoutMs
45
- });
46
- if (!text || !text.trim()) text = "(empty snapshot)";
47
- if (text.length > maxLength) text = truncateSnapshotAtBoundary(text, maxLength);
48
- return text;
49
- }
50
- function createBrowserTools(deps) {
51
- const pageFor = () => deps.getPageForTask();
52
- const toMs = () => resolveBrowserCommandTimeoutMs(deps.getConfig());
53
- return [
54
- {
55
- name: "browser_navigate",
56
- label: "🌐 Browser Navigate",
57
- description: "Navigate the browser to a URL. The page persists for this chat session.\nCall `browser_snapshot` after navigation to inspect the UI. Only http(s) public URLs; private IPs and localhost are blocked.",
58
- parameters: BrowserNavigateSchema,
59
- async execute(_id, params, signal) {
60
- const p = params;
61
- const cfg = deps.getConfig();
62
- const allowPrivate = cfg?.agents?.defaults?.browser?.allowPrivateUrls === true;
63
- if (containsApiKeyPattern(p.url)) return {
64
- content: [{
65
- type: "text",
66
- text: "Blocked: URL contains what appears to be an API key or token. Secrets must not be sent in URLs."
67
- }],
68
- details: { blocked: true }
69
- };
70
- const block = checkWebsiteBlocklist(p.url, cfg?.tools?.web?.blocklist);
71
- if (block) return {
72
- content: [{
73
- type: "text",
74
- text: block.message
75
- }],
76
- details: {
77
- blocked: true,
78
- rule: block.rule
79
- }
80
- };
81
- assertBrowserUrlAllowed(p.url, { allowPrivateUrls: allowPrivate });
82
- if (signal?.aborted) throw new Error("aborted");
83
- const page = await pageFor();
84
- const navTimeout = toMs();
85
- const waitUntil = p.waitFor ?? "domcontentloaded";
86
- await page.goto(p.url, {
87
- waitUntil,
88
- timeout: navTimeout
89
- });
90
- const title = await page.title();
91
- const finalUrl = page.url();
92
- if (finalUrl && finalUrl !== p.url) {
93
- const redirectBlock = checkPostRedirectUrl(finalUrl, { allowPrivateUrls: allowPrivate });
94
- if (redirectBlock) {
95
- await page.goto("about:blank").catch(() => {});
96
- return {
97
- content: [{
98
- type: "text",
99
- text: redirectBlock
100
- }],
101
- details: {
102
- blocked: true,
103
- originalUrl: p.url,
104
- redirectedTo: finalUrl
105
- }
106
- };
107
- }
108
- const redirectDomainBlock = checkWebsiteBlocklist(finalUrl, cfg?.tools?.web?.blocklist);
109
- if (redirectDomainBlock) {
110
- await page.goto("about:blank").catch(() => {});
111
- return {
112
- content: [{
113
- type: "text",
114
- text: redirectDomainBlock.message
115
- }],
116
- details: {
117
- blocked: true,
118
- originalUrl: p.url,
119
- redirectedTo: finalUrl,
120
- rule: redirectDomainBlock.rule
121
- }
122
- };
123
- }
124
- }
125
- let snapshotText = "";
126
- try {
127
- snapshotText = await ariaSnapshotFor(page, void 0, AUTO_SNAPSHOT_MAX, toMs());
128
- } catch {}
129
- const parts = [`Navigated to: ${title}\nURL: ${finalUrl}`];
130
- if (snapshotText) parts.push(`\n--- Page Snapshot ---\n${snapshotText}`);
131
- return {
132
- content: [{
133
- type: "text",
134
- text: parts.join("")
135
- }],
136
- details: {
137
- url: finalUrl,
138
- title,
139
- snapshotLength: snapshotText.length
140
- }
141
- };
142
- }
143
- },
144
- {
145
- name: "browser_snapshot",
146
- label: "📸 Browser Snapshot",
147
- description: "Capture an AI-oriented ARIA snapshot of the current page (YAML-like tree with element refs).\nUse after `browser_navigate` to see interactive elements before `browser_click` / `browser_type`.",
148
- parameters: BrowserSnapshotSchema,
149
- async execute(_id, params, signal) {
150
- if (signal?.aborted) throw new Error("aborted");
151
- const page = await pageFor();
152
- const p = params;
153
- const maxLength = p.maxLength ?? DEFAULT_SNAPSHOT_MAX;
154
- const actionTimeout = toMs();
155
- try {
156
- const text = await ariaSnapshotFor(page, p.selector, maxLength, actionTimeout);
157
- return {
158
- content: [{
159
- type: "text",
160
- text
161
- }],
162
- details: { length: text.length }
163
- };
164
- } catch (e) {
165
- return {
166
- content: [{
167
- type: "text",
168
- text: `Snapshot failed: ${e instanceof Error ? e.message : String(e)}`
169
- }],
170
- details: { length: 0 }
171
- };
172
- }
173
- }
174
- },
175
- {
176
- name: "browser_click",
177
- label: "🖱️ Browser Click",
178
- description: "Click an element. Provide exactly one targeting mode: `selector` (CSS), `text` (visible text), or `role` (e.g. `button:Submit`).",
179
- parameters: BrowserClickSchema,
180
- async execute(_id, params, signal) {
181
- if (signal?.aborted) throw new Error("aborted");
182
- const page = await pageFor();
183
- const actionTimeout = toMs();
184
- try {
185
- await resolveClickLocator(page, params).click({ timeout: actionTimeout });
186
- return {
187
- content: [{
188
- type: "text",
189
- text: "Click succeeded."
190
- }],
191
- details: { ok: true }
192
- };
193
- } catch (e) {
194
- return {
195
- content: [{
196
- type: "text",
197
- text: `Click failed: ${e instanceof Error ? e.message : String(e)}`
198
- }],
199
- details: { ok: false }
200
- };
201
- }
202
- }
203
- },
204
- {
205
- name: "browser_type",
206
- label: "⌨️ Browser Type",
207
- description: "Type into an input. Provide exactly one of `selector` or `label` (associated label text). Optional `pressEnter` to submit.",
208
- parameters: BrowserTypeSchema,
209
- async execute(_id, params, signal) {
210
- if (signal?.aborted) throw new Error("aborted");
211
- const page = await pageFor();
212
- const actionTimeout = toMs();
213
- try {
214
- const p = params;
215
- const loc = resolveTypeLocator(page, p);
216
- await loc.clear({ timeout: Math.min(5e3, actionTimeout) }).catch(() => {});
217
- await loc.fill(p.text, { timeout: actionTimeout });
218
- if (p.pressEnter) await page.keyboard.press("Enter");
219
- return {
220
- content: [{
221
- type: "text",
222
- text: "Typed into field."
223
- }],
224
- details: { ok: true }
225
- };
226
- } catch (e) {
227
- return {
228
- content: [{
229
- type: "text",
230
- text: `Type failed: ${e instanceof Error ? e.message : String(e)}`
231
- }],
232
- details: { ok: false }
233
- };
234
- }
235
- }
236
- },
237
- {
238
- name: "browser_scroll",
239
- label: "📜 Browser Scroll",
240
- description: "Scroll the page up or down by a pixel amount (default 500).",
241
- parameters: BrowserScrollSchema,
242
- async execute(_id, params, signal) {
243
- if (signal?.aborted) throw new Error("aborted");
244
- const page = await pageFor();
245
- const p = params;
246
- const amount = p.amount ?? 500;
247
- const dy = p.direction === "down" ? amount : -amount;
248
- await page.evaluate(({ deltaY }) => {
249
- globalThis.scrollBy(0, deltaY);
250
- }, { deltaY: dy });
251
- return {
252
- content: [{
253
- type: "text",
254
- text: `Scrolled ${p.direction} by ${amount}px.`
255
- }],
256
- details: { ok: true }
257
- };
258
- }
259
- },
260
- {
261
- name: "browser_screenshot",
262
- label: "🖼️ Browser Screenshot",
263
- description: "Take a PNG screenshot of the viewport or a CSS selector. When `agents.defaults.imageModel` is configured, runs vision on the image using `description` as the prompt (default: short UI summary).",
264
- parameters: BrowserScreenshotSchema,
265
- async execute(_id, params, signal) {
266
- if (signal?.aborted) throw new Error("aborted");
267
- const page = await pageFor();
268
- const cfg = deps.getConfig();
269
- let buf;
270
- const actionTimeout = toMs();
271
- try {
272
- const p = params;
273
- if (p.selector?.trim()) {
274
- const loc = page.locator(p.selector.trim()).first();
275
- await loc.waitFor({
276
- state: "visible",
277
- timeout: actionTimeout
278
- });
279
- buf = await loc.screenshot({
280
- type: "png",
281
- timeout: actionTimeout
282
- });
283
- } else buf = await page.screenshot({
284
- type: "png",
285
- fullPage: false,
286
- timeout: actionTimeout
287
- });
288
- } catch (e) {
289
- const msg = e instanceof Error ? e.message : String(e);
290
- return {
291
- content: [{
292
- type: "text",
293
- text: `Screenshot failed: ${msg}`
294
- }],
295
- details: { error: msg }
296
- };
297
- }
298
- if (buf.length > MAX_SCREENSHOT_BYTES) return {
299
- content: [{
300
- type: "text",
301
- text: `Screenshot too large (${buf.length} bytes, max ${MAX_SCREENSHOT_BYTES}). Try a narrower selector.`
302
- }],
303
- details: {
304
- error: "too_large",
305
- bytes: buf.length
306
- }
307
- };
308
- const imageModelConfig = resolveImageModelConfigForTool({ cfg });
309
- const prompt = params.description?.trim() || "Describe this browser screenshot briefly. Focus on visible text, controls, and actionable UI state.";
310
- if (!imageModelConfig) return {
311
- content: [{
312
- type: "text",
313
- text: `Captured PNG screenshot (${buf.length} bytes). Configure agents.defaults.imageModel for automatic visual description.`
314
- }],
315
- details: {
316
- bytes: buf.length,
317
- vision: false
318
- }
319
- };
320
- try {
321
- const { result: inner, attempts } = await runWithImageModelFallback({
322
- toolConfig: imageModelConfig,
323
- modelOverride: void 0,
324
- run: async (modelRef) => {
325
- const { text, provider, model } = await describeImages({
326
- modelRef,
327
- prompt,
328
- images: [{
329
- buffer: buf,
330
- mimeType: "image/png"
331
- }],
332
- timeoutMs: 6e4,
333
- signal
334
- });
335
- return {
336
- text,
337
- provider,
338
- model
339
- };
340
- }
341
- });
342
- return buildImageToolTextResult({
343
- text: inner.text,
344
- provider: inner.provider,
345
- model: inner.model,
346
- attempts
347
- }, {
348
- bytes: buf.length,
349
- vision: true
350
- });
351
- } catch (e) {
352
- const msg = e instanceof Error ? e.message : String(e);
353
- return {
354
- content: [{
355
- type: "text",
356
- text: `Screenshot captured (${buf.length} bytes) but vision failed: ${msg}`
357
- }],
358
- details: {
359
- bytes: buf.length,
360
- visionError: msg
361
- }
362
- };
363
- }
364
- }
365
- },
366
- {
367
- name: "browser_back",
368
- label: "◀️ Browser Back",
369
- description: "Navigate back in browser history. Returns the new page URL and title.",
370
- parameters: BrowserBackSchema,
371
- async execute(_id, params, signal) {
372
- if (signal?.aborted) throw new Error("aborted");
373
- const page = await pageFor();
374
- const waitUntil = params.waitFor ?? "domcontentloaded";
375
- const navTimeout = toMs();
376
- try {
377
- if (!await page.goBack({
378
- waitUntil,
379
- timeout: navTimeout
380
- })) return {
381
- content: [{
382
- type: "text",
383
- text: "No previous page in history."
384
- }],
385
- details: { ok: false }
386
- };
387
- const title = await page.title();
388
- const url = page.url();
389
- return {
390
- content: [{
391
- type: "text",
392
- text: `Navigated back to: ${title}\nURL: ${url}`
393
- }],
394
- details: {
395
- ok: true,
396
- url,
397
- title
398
- }
399
- };
400
- } catch (e) {
401
- return {
402
- content: [{
403
- type: "text",
404
- text: `Back navigation failed: ${e instanceof Error ? e.message : String(e)}`
405
- }],
406
- details: { ok: false }
407
- };
408
- }
409
- }
410
- },
411
- {
412
- name: "browser_press",
413
- label: "⌨️ Browser Press",
414
- description: "Press a keyboard key or key combination. Examples: \"Enter\", \"Tab\", \"Escape\", \"ArrowDown\", \"Control+A\", \"Shift+Enter\".",
415
- parameters: BrowserPressSchema,
416
- async execute(_id, params, signal) {
417
- if (signal?.aborted) throw new Error("aborted");
418
- const page = await pageFor();
419
- const p = params;
420
- try {
421
- await page.keyboard.press(p.key);
422
- return {
423
- content: [{
424
- type: "text",
425
- text: `Pressed key: ${p.key}`
426
- }],
427
- details: {
428
- ok: true,
429
- key: p.key
430
- }
431
- };
432
- } catch (e) {
433
- return {
434
- content: [{
435
- type: "text",
436
- text: `Key press failed: ${e instanceof Error ? e.message : String(e)}`
437
- }],
438
- details: { ok: false }
439
- };
440
- }
441
- }
442
- },
443
- {
444
- name: "browser_console",
445
- label: "💻 Browser Console",
446
- description: "Execute JavaScript in the page context and return the result. If no `javascript` parameter is provided, returns the last 50 console log entries.",
447
- parameters: BrowserConsoleSchema,
448
- async execute(_id, params, signal) {
449
- if (signal?.aborted) throw new Error("aborted");
450
- const page = await pageFor();
451
- const p = params;
452
- if (!p.javascript?.trim()) try {
453
- const logs = [];
454
- const collectHandler = (msg) => {
455
- logs.push(`[${msg.type()}] ${msg.text()}`);
456
- };
457
- page.on("console", collectHandler);
458
- await page.waitForTimeout(100);
459
- page.off("console", collectHandler);
460
- return {
461
- content: [{
462
- type: "text",
463
- text: logs.length > 0 ? logs.slice(-50).join("\n") : "(no recent console messages)"
464
- }],
465
- details: {
466
- mode: "logs",
467
- count: logs.length
468
- }
469
- };
470
- } catch (e) {
471
- return {
472
- content: [{
473
- type: "text",
474
- text: `Console read failed: ${e instanceof Error ? e.message : String(e)}`
475
- }],
476
- details: { ok: false }
477
- };
478
- }
479
- try {
480
- const result = await page.evaluate(p.javascript);
481
- const serialized = result === void 0 ? "undefined" : JSON.stringify(result, null, 2);
482
- return {
483
- content: [{
484
- type: "text",
485
- text: serialized.length > DEFAULT_SNAPSHOT_MAX ? `${serialized.slice(0, DEFAULT_SNAPSHOT_MAX)}\n... (truncated)` : serialized
486
- }],
487
- details: {
488
- mode: "eval",
489
- resultLength: serialized.length
490
- }
491
- };
492
- } catch (e) {
493
- return {
494
- content: [{
495
- type: "text",
496
- text: `Eval failed: ${e instanceof Error ? e.message : String(e)}`
497
- }],
498
- details: { ok: false }
499
- };
500
- }
501
- }
502
- },
503
- {
504
- name: "browser_get_images",
505
- label: "🖼️ Browser Get Images",
506
- description: "Extract all visible images from the page with their src, alt text, and dimensions. Useful for understanding page content without screenshots.",
507
- parameters: BrowserGetImagesSchema,
508
- async execute(_id, params, signal) {
509
- if (signal?.aborted) throw new Error("aborted");
510
- const page = await pageFor();
511
- const p = params;
512
- const maxImages = p.maxImages ?? 20;
513
- try {
514
- const images = await page.evaluate(([sel, max]) => {
515
- const d = globalThis.document;
516
- const root = sel ? d.querySelector(sel) : d;
517
- if (!root) return [];
518
- return Array.from(root.querySelectorAll("img")).slice(0, max).map((img) => ({
519
- src: String(img.src ?? ""),
520
- alt: String(img.alt ?? ""),
521
- width: Number(img.naturalWidth ?? 0),
522
- height: Number(img.naturalHeight ?? 0),
523
- visible: img.offsetParent !== null
524
- }));
525
- }, [p.selector?.trim() || null, maxImages]);
526
- if (!images || images.length === 0) return {
527
- content: [{
528
- type: "text",
529
- text: "No images found on the page."
530
- }],
531
- details: { count: 0 }
532
- };
533
- const lines = images.map((img, i) => `${i + 1}. ${img.alt || "(no alt)"} — ${img.width}×${img.height} ${img.visible ? "" : "[hidden]"}\n ${img.src}`);
534
- return {
535
- content: [{
536
- type: "text",
537
- text: `Found ${images.length} image(s):\n${lines.join("\n")}`
538
- }],
539
- details: { count: images.length }
540
- };
541
- } catch (e) {
542
- return {
543
- content: [{
544
- type: "text",
545
- text: `Get images failed: ${e instanceof Error ? e.message : String(e)}`
546
- }],
547
- details: { ok: false }
548
- };
549
- }
550
- }
551
- },
552
- {
553
- name: "browser_close",
554
- label: "❌ Browser Close",
555
- description: "Close the browser page for this session, releasing resources. A new page will be created on the next browser tool call.",
556
- parameters: BrowserCloseSchema,
557
- async execute(_id, _params, signal) {
558
- if (signal?.aborted) throw new Error("aborted");
559
- const taskId = deps.getTaskId();
560
- await deps.getManager().closePage(taskId);
561
- deps.notifyBrowserPageClosed?.(taskId);
562
- return {
563
- content: [{
564
- type: "text",
565
- text: "Browser page closed."
566
- }],
567
- details: { ok: true }
568
- };
569
- }
570
- },
571
- {
572
- name: "browser_vision",
573
- label: "👁️ Browser Vision",
574
- description: "Take a screenshot and analyze it with the vision model. Unlike `browser_screenshot`, this tool *always* runs vision analysis. Requires `agents.defaults.imageModel` to be configured.",
575
- parameters: BrowserVisionSchema,
576
- async execute(_id, params, signal) {
577
- if (signal?.aborted) throw new Error("aborted");
578
- const page = await pageFor();
579
- const cfg = deps.getConfig();
580
- const p = params;
581
- const imageModelConfig = resolveImageModelConfigForTool({ cfg });
582
- if (!imageModelConfig) return {
583
- content: [{
584
- type: "text",
585
- text: "Vision model not configured. Set `agents.defaults.imageModel` to use browser_vision."
586
- }],
587
- details: { ok: false }
588
- };
589
- let buf;
590
- const actionTimeout = toMs();
591
- try {
592
- if (p.selector?.trim()) {
593
- const loc = page.locator(p.selector.trim()).first();
594
- await loc.waitFor({
595
- state: "visible",
596
- timeout: actionTimeout
597
- });
598
- buf = await loc.screenshot({
599
- type: "png",
600
- timeout: actionTimeout
601
- });
602
- } else buf = await page.screenshot({
603
- type: "png",
604
- fullPage: false,
605
- timeout: actionTimeout
606
- });
607
- } catch (e) {
608
- return {
609
- content: [{
610
- type: "text",
611
- text: `Screenshot for vision failed: ${e instanceof Error ? e.message : String(e)}`
612
- }],
613
- details: { ok: false }
614
- };
615
- }
616
- if (buf.length > MAX_SCREENSHOT_BYTES) return {
617
- content: [{
618
- type: "text",
619
- text: `Screenshot too large (${buf.length} bytes). Try a narrower selector.`
620
- }],
621
- details: {
622
- ok: false,
623
- bytes: buf.length
624
- }
625
- };
626
- const prompt = p.prompt?.trim() || "Describe this browser screenshot in detail. Focus on visible text, interactive elements, layout, and actionable UI state.";
627
- try {
628
- const { result: inner, attempts } = await runWithImageModelFallback({
629
- toolConfig: imageModelConfig,
630
- modelOverride: void 0,
631
- run: async (modelRef) => {
632
- const { text, provider, model } = await describeImages({
633
- modelRef,
634
- prompt,
635
- images: [{
636
- buffer: buf,
637
- mimeType: "image/png"
638
- }],
639
- timeoutMs: 6e4,
640
- signal
641
- });
642
- return {
643
- text,
644
- provider,
645
- model
646
- };
647
- }
648
- });
649
- return buildImageToolTextResult({
650
- text: inner.text,
651
- provider: inner.provider,
652
- model: inner.model,
653
- attempts
654
- }, {
655
- bytes: buf.length,
656
- vision: true
657
- });
658
- } catch (e) {
659
- const msg = e instanceof Error ? e.message : String(e);
660
- return {
661
- content: [{
662
- type: "text",
663
- text: `Vision analysis failed: ${msg}`
664
- }],
665
- details: {
666
- bytes: buf.length,
667
- visionError: msg
668
- }
669
- };
670
- }
671
- }
672
- },
673
- {
674
- name: "browser_dialog",
675
- label: "💬 Browser Dialog",
676
- description: "Handle a pending JavaScript dialog (alert, confirm, prompt, beforeunload). Requires CDP Supervisor to be active. Lists pending dialogs if none need handling.",
677
- parameters: BrowserDialogSchema,
678
- async execute(_id, params, signal) {
679
- if (signal?.aborted) throw new Error("aborted");
680
- const supervisor = deps.getSupervisor?.();
681
- if (!supervisor) return {
682
- content: [{
683
- type: "text",
684
- text: "CDP Supervisor not active. Dialog handling is not available."
685
- }],
686
- details: { ok: false }
687
- };
688
- const p = params;
689
- if (supervisor.getPendingDialogs().length === 0) return {
690
- content: [{
691
- type: "text",
692
- text: "No pending dialogs."
693
- }],
694
- details: {
695
- ok: true,
696
- pendingCount: 0
697
- }
698
- };
699
- const handled = await supervisor.handleDialog(p.action, { promptText: p.promptText });
700
- if (!handled) return {
701
- content: [{
702
- type: "text",
703
- text: "Dialog already handled or expired."
704
- }],
705
- details: { ok: false }
706
- };
707
- return {
708
- content: [{
709
- type: "text",
710
- text: `Dialog ${handled.response}: [${handled.type}] "${handled.message}"`
711
- }],
712
- details: {
713
- ok: true,
714
- dialogId: handled.id,
715
- type: handled.type
716
- }
717
- };
718
- }
719
- },
720
- {
721
- name: "browser_cdp",
722
- label: "🔧 Browser CDP",
723
- description: "Send a raw Chrome DevTools Protocol command to the browser. Advanced: use only when Playwright high-level APIs are insufficient.",
724
- parameters: BrowserCdpSchema,
725
- async execute(_id, params, signal) {
726
- if (signal?.aborted) throw new Error("aborted");
727
- const page = await pageFor();
728
- const p = params;
729
- try {
730
- const cdpSession = await page.context().newCDPSession(page);
731
- try {
732
- const result = await cdpSession.send(p.method, p.params ?? {});
733
- const serialized = JSON.stringify(result, null, 2);
734
- return {
735
- content: [{
736
- type: "text",
737
- text: serialized.length > DEFAULT_SNAPSHOT_MAX ? `${serialized.slice(0, DEFAULT_SNAPSHOT_MAX)}\n... (truncated)` : serialized
738
- }],
739
- details: {
740
- ok: true,
741
- method: p.method
742
- }
743
- };
744
- } finally {
745
- await cdpSession.detach().catch(() => {});
746
- }
747
- } catch (e) {
748
- return {
749
- content: [{
750
- type: "text",
751
- text: `CDP command failed: ${e instanceof Error ? e.message : String(e)}`
752
- }],
753
- details: {
754
- ok: false,
755
- method: p.method
756
- }
757
- };
758
- }
759
- }
760
- }
761
- ];
762
- }
763
- //#endregion
764
- export { createBrowserTools };
765
-
766
- //# sourceMappingURL=browser-legacy-tools.js.map