@elizaos/plugin-browser 2.0.0-alpha.9 → 2.0.3-beta.2

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 (256) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +98 -83
  3. package/auto-enable.ts +24 -0
  4. package/dist/actions/browser-autofill-login.d.ts +43 -0
  5. package/dist/actions/browser-autofill-login.d.ts.map +1 -0
  6. package/dist/actions/browser-autofill-login.js +278 -0
  7. package/dist/actions/browser-autofill-login.js.map +1 -0
  8. package/dist/actions/browser.d.ts +11 -0
  9. package/dist/actions/browser.d.ts.map +1 -0
  10. package/dist/actions/browser.js +412 -0
  11. package/dist/actions/browser.js.map +1 -0
  12. package/dist/actions/manage-browser-bridge.d.ts +34 -0
  13. package/dist/actions/manage-browser-bridge.d.ts.map +1 -0
  14. package/dist/actions/manage-browser-bridge.js +572 -0
  15. package/dist/actions/manage-browser-bridge.js.map +1 -0
  16. package/dist/bridge-policy.d.ts +10 -0
  17. package/dist/bridge-policy.d.ts.map +1 -0
  18. package/dist/bridge-policy.js +37 -0
  19. package/dist/bridge-policy.js.map +1 -0
  20. package/dist/bridge-readiness.d.ts +16 -0
  21. package/dist/bridge-readiness.d.ts.map +1 -0
  22. package/dist/bridge-readiness.js +82 -0
  23. package/dist/bridge-readiness.js.map +1 -0
  24. package/dist/bridge-records.d.ts +9 -0
  25. package/dist/bridge-records.d.ts.map +1 -0
  26. package/dist/bridge-records.js +37 -0
  27. package/dist/bridge-records.js.map +1 -0
  28. package/dist/browser-capture-hooks.d.ts +9 -0
  29. package/dist/browser-capture-hooks.d.ts.map +1 -0
  30. package/dist/browser-capture-hooks.js +15 -0
  31. package/dist/browser-capture-hooks.js.map +1 -0
  32. package/dist/browser-service.d.ts +103 -0
  33. package/dist/browser-service.d.ts.map +1 -0
  34. package/dist/browser-service.js +186 -0
  35. package/dist/browser-service.js.map +1 -0
  36. package/dist/browser-workspace-hooks.d.ts +14 -0
  37. package/dist/browser-workspace-hooks.d.ts.map +1 -0
  38. package/dist/browser-workspace-hooks.js +15 -0
  39. package/dist/browser-workspace-hooks.js.map +1 -0
  40. package/dist/companion-auth.d.ts +34 -0
  41. package/dist/companion-auth.d.ts.map +1 -0
  42. package/dist/companion-auth.js +98 -0
  43. package/dist/companion-auth.js.map +1 -0
  44. package/dist/contracts.d.ts +284 -0
  45. package/dist/contracts.d.ts.map +1 -0
  46. package/dist/contracts.js +56 -0
  47. package/dist/contracts.js.map +1 -0
  48. package/dist/index.d.ts +30 -16
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +76 -90
  51. package/dist/index.js.map +1 -1
  52. package/dist/lifeops-session-contracts.d.ts +46 -0
  53. package/dist/lifeops-session-contracts.d.ts.map +1 -0
  54. package/dist/lifeops-session-contracts.js +1 -0
  55. package/dist/lifeops-session-contracts.js.map +1 -0
  56. package/dist/message-adapter.d.ts +9 -0
  57. package/dist/message-adapter.d.ts.map +1 -0
  58. package/dist/message-adapter.js +104 -0
  59. package/dist/message-adapter.js.map +1 -0
  60. package/dist/packaging.d.ts +27 -0
  61. package/dist/packaging.d.ts.map +1 -0
  62. package/dist/packaging.js +571 -0
  63. package/dist/packaging.js.map +1 -0
  64. package/dist/password-manager-bridge.d.ts +50 -0
  65. package/dist/password-manager-bridge.d.ts.map +1 -0
  66. package/dist/password-manager-bridge.js +437 -0
  67. package/dist/password-manager-bridge.js.map +1 -0
  68. package/dist/plugin.d.ts +10 -0
  69. package/dist/plugin.d.ts.map +1 -0
  70. package/dist/plugin.js +168 -0
  71. package/dist/plugin.js.map +1 -0
  72. package/dist/providers/workspace.d.ts +13 -0
  73. package/dist/providers/workspace.d.ts.map +1 -0
  74. package/dist/providers/workspace.js +64 -0
  75. package/dist/providers/workspace.js.map +1 -0
  76. package/dist/routes/bridge.d.ts +37 -0
  77. package/dist/routes/bridge.d.ts.map +1 -0
  78. package/dist/routes/bridge.js +844 -0
  79. package/dist/routes/bridge.js.map +1 -0
  80. package/dist/routes/workspace-account-gate.d.ts +29 -0
  81. package/dist/routes/workspace-account-gate.d.ts.map +1 -0
  82. package/dist/routes/workspace-account-gate.js +147 -0
  83. package/dist/routes/workspace-account-gate.js.map +1 -0
  84. package/dist/routes/workspace-setup.d.ts +10 -0
  85. package/dist/routes/workspace-setup.d.ts.map +1 -0
  86. package/dist/routes/workspace-setup.js +65 -0
  87. package/dist/routes/workspace-setup.js.map +1 -0
  88. package/dist/routes/workspace.d.ts +20 -0
  89. package/dist/routes/workspace.d.ts.map +1 -0
  90. package/dist/routes/workspace.js +276 -0
  91. package/dist/routes/workspace.js.map +1 -0
  92. package/dist/schema.d.ts +2326 -0
  93. package/dist/schema.d.ts.map +1 -0
  94. package/dist/schema.js +133 -0
  95. package/dist/schema.js.map +1 -0
  96. package/dist/service.d.ts +30 -0
  97. package/dist/service.d.ts.map +1 -0
  98. package/dist/service.js +5 -0
  99. package/dist/service.js.map +1 -0
  100. package/dist/targets/bridge-target.d.ts +31 -0
  101. package/dist/targets/bridge-target.d.ts.map +1 -0
  102. package/dist/targets/bridge-target.js +98 -0
  103. package/dist/targets/bridge-target.js.map +1 -0
  104. package/dist/targets/stagehand-target.d.ts +3 -0
  105. package/dist/targets/stagehand-target.d.ts.map +1 -0
  106. package/dist/targets/stagehand-target.js +187 -0
  107. package/dist/targets/stagehand-target.js.map +1 -0
  108. package/dist/workspace/browser-capture.d.ts +41 -0
  109. package/dist/workspace/browser-capture.d.ts.map +1 -0
  110. package/dist/workspace/browser-capture.js +159 -0
  111. package/dist/workspace/browser-capture.js.map +1 -0
  112. package/dist/workspace/browser-workspace-desktop.d.ts +19 -0
  113. package/dist/workspace/browser-workspace-desktop.d.ts.map +1 -0
  114. package/dist/workspace/browser-workspace-desktop.js +1578 -0
  115. package/dist/workspace/browser-workspace-desktop.js.map +1 -0
  116. package/dist/workspace/browser-workspace-elements.d.ts +42 -0
  117. package/dist/workspace/browser-workspace-elements.d.ts.map +1 -0
  118. package/dist/workspace/browser-workspace-elements.js +547 -0
  119. package/dist/workspace/browser-workspace-elements.js.map +1 -0
  120. package/dist/workspace/browser-workspace-forms.d.ts +19 -0
  121. package/dist/workspace/browser-workspace-forms.d.ts.map +1 -0
  122. package/dist/workspace/browser-workspace-forms.js +277 -0
  123. package/dist/workspace/browser-workspace-forms.js.map +1 -0
  124. package/dist/workspace/browser-workspace-helpers.d.ts +32 -0
  125. package/dist/workspace/browser-workspace-helpers.d.ts.map +1 -0
  126. package/dist/workspace/browser-workspace-helpers.js +232 -0
  127. package/dist/workspace/browser-workspace-helpers.js.map +1 -0
  128. package/dist/workspace/browser-workspace-jsdom.d.ts +16 -0
  129. package/dist/workspace/browser-workspace-jsdom.d.ts.map +1 -0
  130. package/dist/workspace/browser-workspace-jsdom.js +233 -0
  131. package/dist/workspace/browser-workspace-jsdom.js.map +1 -0
  132. package/dist/workspace/browser-workspace-network.d.ts +7 -0
  133. package/dist/workspace/browser-workspace-network.d.ts.map +1 -0
  134. package/dist/workspace/browser-workspace-network.js +145 -0
  135. package/dist/workspace/browser-workspace-network.js.map +1 -0
  136. package/dist/workspace/browser-workspace-snapshots.d.ts +14 -0
  137. package/dist/workspace/browser-workspace-snapshots.d.ts.map +1 -0
  138. package/dist/workspace/browser-workspace-snapshots.js +144 -0
  139. package/dist/workspace/browser-workspace-snapshots.js.map +1 -0
  140. package/dist/workspace/browser-workspace-state.d.ts +24 -0
  141. package/dist/workspace/browser-workspace-state.d.ts.map +1 -0
  142. package/dist/workspace/browser-workspace-state.js +155 -0
  143. package/dist/workspace/browser-workspace-state.js.map +1 -0
  144. package/dist/workspace/browser-workspace-types.d.ts +345 -0
  145. package/dist/workspace/browser-workspace-types.d.ts.map +1 -0
  146. package/dist/workspace/browser-workspace-types.js +11 -0
  147. package/dist/workspace/browser-workspace-types.js.map +1 -0
  148. package/dist/workspace/browser-workspace-web.d.ts +8 -0
  149. package/dist/workspace/browser-workspace-web.d.ts.map +1 -0
  150. package/dist/workspace/browser-workspace-web.js +1342 -0
  151. package/dist/workspace/browser-workspace-web.js.map +1 -0
  152. package/dist/workspace/browser-workspace.d.ts +39 -0
  153. package/dist/workspace/browser-workspace.d.ts.map +1 -0
  154. package/dist/workspace/browser-workspace.js +958 -0
  155. package/dist/workspace/browser-workspace.js.map +1 -0
  156. package/dist/workspace/index.d.ts +26 -0
  157. package/dist/workspace/index.d.ts.map +1 -0
  158. package/dist/workspace/index.js +3 -0
  159. package/dist/workspace/index.js.map +1 -0
  160. package/dist/workspace.d.ts +2 -0
  161. package/dist/workspace.d.ts.map +1 -0
  162. package/dist/workspace.js +2 -0
  163. package/dist/workspace.js.map +1 -0
  164. package/package.json +71 -110
  165. package/dist/actions/click.d.ts +0 -3
  166. package/dist/actions/click.d.ts.map +0 -1
  167. package/dist/actions/click.js +0 -158
  168. package/dist/actions/click.js.map +0 -1
  169. package/dist/actions/extract.d.ts +0 -3
  170. package/dist/actions/extract.d.ts.map +0 -1
  171. package/dist/actions/extract.js +0 -168
  172. package/dist/actions/extract.js.map +0 -1
  173. package/dist/actions/index.d.ts +0 -7
  174. package/dist/actions/index.d.ts.map +0 -1
  175. package/dist/actions/index.js +0 -7
  176. package/dist/actions/index.js.map +0 -1
  177. package/dist/actions/navigate.d.ts +0 -3
  178. package/dist/actions/navigate.d.ts.map +0 -1
  179. package/dist/actions/navigate.js +0 -187
  180. package/dist/actions/navigate.js.map +0 -1
  181. package/dist/actions/screenshot.d.ts +0 -3
  182. package/dist/actions/screenshot.d.ts.map +0 -1
  183. package/dist/actions/screenshot.js +0 -167
  184. package/dist/actions/screenshot.js.map +0 -1
  185. package/dist/actions/select.d.ts +0 -3
  186. package/dist/actions/select.d.ts.map +0 -1
  187. package/dist/actions/select.js +0 -167
  188. package/dist/actions/select.js.map +0 -1
  189. package/dist/actions/type.d.ts +0 -3
  190. package/dist/actions/type.d.ts.map +0 -1
  191. package/dist/actions/type.js +0 -167
  192. package/dist/actions/type.js.map +0 -1
  193. package/dist/cli/index.d.ts +0 -8
  194. package/dist/cli/index.d.ts.map +0 -1
  195. package/dist/cli/index.js +0 -13
  196. package/dist/cli/index.js.map +0 -1
  197. package/dist/cli/register.d.ts +0 -20
  198. package/dist/cli/register.d.ts.map +0 -1
  199. package/dist/cli/register.js +0 -403
  200. package/dist/cli/register.js.map +0 -1
  201. package/dist/providerRelevance.d.ts +0 -4
  202. package/dist/providerRelevance.d.ts.map +0 -1
  203. package/dist/providerRelevance.js +0 -33
  204. package/dist/providerRelevance.js.map +0 -1
  205. package/dist/providers/browser-state.d.ts +0 -3
  206. package/dist/providers/browser-state.d.ts.map +0 -1
  207. package/dist/providers/browser-state.js +0 -72
  208. package/dist/providers/browser-state.js.map +0 -1
  209. package/dist/providers/index.d.ts +0 -2
  210. package/dist/providers/index.d.ts.map +0 -1
  211. package/dist/providers/index.js +0 -2
  212. package/dist/providers/index.js.map +0 -1
  213. package/dist/services/browser-service.d.ts +0 -32
  214. package/dist/services/browser-service.d.ts.map +0 -1
  215. package/dist/services/browser-service.js +0 -213
  216. package/dist/services/browser-service.js.map +0 -1
  217. package/dist/services/index.d.ts +0 -4
  218. package/dist/services/index.d.ts.map +0 -1
  219. package/dist/services/index.js +0 -4
  220. package/dist/services/index.js.map +0 -1
  221. package/dist/services/process-manager.d.ts +0 -24
  222. package/dist/services/process-manager.d.ts.map +0 -1
  223. package/dist/services/process-manager.js +0 -270
  224. package/dist/services/process-manager.js.map +0 -1
  225. package/dist/services/websocket-client.d.ts +0 -35
  226. package/dist/services/websocket-client.d.ts.map +0 -1
  227. package/dist/services/websocket-client.js +0 -221
  228. package/dist/services/websocket-client.js.map +0 -1
  229. package/dist/types.d.ts +0 -101
  230. package/dist/types.d.ts.map +0 -1
  231. package/dist/types.js +0 -2
  232. package/dist/types.js.map +0 -1
  233. package/dist/utils/captcha.d.ts +0 -33
  234. package/dist/utils/captcha.d.ts.map +0 -1
  235. package/dist/utils/captcha.js +0 -219
  236. package/dist/utils/captcha.js.map +0 -1
  237. package/dist/utils/errors.d.ts +0 -37
  238. package/dist/utils/errors.d.ts.map +0 -1
  239. package/dist/utils/errors.js +0 -81
  240. package/dist/utils/errors.js.map +0 -1
  241. package/dist/utils/index.d.ts +0 -5
  242. package/dist/utils/index.d.ts.map +0 -1
  243. package/dist/utils/index.js +0 -5
  244. package/dist/utils/index.js.map +0 -1
  245. package/dist/utils/retry.d.ts +0 -26
  246. package/dist/utils/retry.d.ts.map +0 -1
  247. package/dist/utils/retry.js +0 -55
  248. package/dist/utils/retry.js.map +0 -1
  249. package/dist/utils/security.d.ts +0 -27
  250. package/dist/utils/security.d.ts.map +0 -1
  251. package/dist/utils/security.js +0 -139
  252. package/dist/utils/security.js.map +0 -1
  253. package/dist/utils/url.d.ts +0 -12
  254. package/dist/utils/url.d.ts.map +0 -1
  255. package/dist/utils/url.js +0 -39
  256. package/dist/utils/url.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/workspace/browser-workspace.ts"],"sourcesContent":["/**\n * Browser workspace — public API surface.\n *\n * Implementation is split across sibling modules:\n * browser-workspace-types.ts — all exported types and interfaces\n * browser-workspace-state.ts — global mutable state and CRUD helpers\n * browser-workspace-helpers.ts — small utilities, error factories, command normalization\n * browser-workspace-jsdom.ts — JSDOM loading, DOM creation, runtime setup\n * browser-workspace-elements.ts — element finding, selector parsing, inspection\n * browser-workspace-network.ts — network interception, HAR, tracked fetch\n * browser-workspace-forms.ts — form control interaction, activation, scrolling\n * browser-workspace-snapshots.ts — document snapshots, diff, PDF/screenshot\n * browser-workspace-desktop.ts — desktop bridge HTTP client and script generators\n * browser-workspace-web.ts — web-mode command execution\n *\n * This file re-exports every public symbol so external consumers are unaffected.\n */\n\nimport * as fsp from \"node:fs/promises\";\nimport * as path from \"node:path\";\n\nexport type {\n AcquireBrowserWorkspaceConnectorSessionRequest,\n BrowserWorkspaceBridgeConfig,\n BrowserWorkspaceClipboardAction,\n BrowserWorkspaceCommand,\n BrowserWorkspaceCommandResult,\n BrowserWorkspaceConnectorAuthState,\n BrowserWorkspaceConnectorCompanionRef,\n BrowserWorkspaceConnectorSessionHandle,\n BrowserWorkspaceConnectorSessionKind,\n BrowserWorkspaceConnectorSessionRef,\n BrowserWorkspaceConsoleAction,\n BrowserWorkspaceCookieAction,\n BrowserWorkspaceDialogAction,\n BrowserWorkspaceDiffAction,\n BrowserWorkspaceDomElementSummary,\n BrowserWorkspaceFindAction,\n BrowserWorkspaceFindBy,\n BrowserWorkspaceFrameAction,\n BrowserWorkspaceGetMode,\n BrowserWorkspaceMode,\n BrowserWorkspaceMouseAction,\n BrowserWorkspaceMouseButton,\n BrowserWorkspaceNetworkAction,\n BrowserWorkspaceOperation,\n BrowserWorkspaceProfilerAction,\n BrowserWorkspaceScrollDirection,\n BrowserWorkspaceSetAction,\n BrowserWorkspaceSnapshot,\n BrowserWorkspaceStateAction,\n BrowserWorkspaceStorageAction,\n BrowserWorkspaceStorageArea,\n BrowserWorkspaceSubaction,\n BrowserWorkspaceTab,\n BrowserWorkspaceTabAction,\n BrowserWorkspaceTabKind,\n BrowserWorkspaceTraceAction,\n BrowserWorkspaceWaitState,\n BrowserWorkspaceWindowAction,\n EvaluateBrowserWorkspaceTabRequest,\n NavigateBrowserWorkspaceTabRequest,\n OpenBrowserWorkspaceTabRequest,\n} from \"./browser-workspace-types.js\";\n// ── Re-export types ──────────────────────────────────────────────────\nexport { BROWSER_WORKSPACE_CONNECTOR_AUTH_STATES } from \"./browser-workspace-types.js\";\n\nimport type {\n AcquireBrowserWorkspaceConnectorSessionRequest,\n BrowserWorkspaceCommand,\n BrowserWorkspaceCommandResult,\n BrowserWorkspaceConnectorAuthState,\n BrowserWorkspaceConnectorCompanionRef,\n BrowserWorkspaceConnectorSessionHandle,\n BrowserWorkspaceConnectorSessionRef,\n BrowserWorkspaceMode,\n BrowserWorkspaceSnapshot,\n BrowserWorkspaceTab,\n BrowserWorkspaceTabKind,\n EvaluateBrowserWorkspaceTabRequest,\n NavigateBrowserWorkspaceTabRequest,\n OpenBrowserWorkspaceTabRequest,\n} from \"./browser-workspace-types.js\";\n\n// ── Re-export state ──────────────────────────────────────────────────\nexport { __resetBrowserWorkspaceStateForTests } from \"./browser-workspace-state.js\";\n\n// ── Re-export desktop bridge ─────────────────────────────────────────\nimport {\n evaluateBrowserWorkspaceTab as evaluateBrowserWorkspaceTabDesktop,\n executeDesktopBrowserWorkspaceDomCommand,\n executeDesktopBrowserWorkspaceUtilityCommand,\n getBrowserWorkspaceUnavailableMessage,\n getDesktopBrowserWorkspaceSessionState,\n getDesktopBrowserWorkspaceSnapshotRecord,\n isBrowserWorkspaceBridgeConfigured,\n loadDesktopBrowserWorkspaceSessionState,\n requestBrowserWorkspace,\n resolveBrowserWorkspaceBridgeConfig,\n resolveDesktopBrowserWorkspaceTargetTabId,\n snapshotBrowserWorkspaceTab as snapshotBrowserWorkspaceTabDesktop,\n} from \"./browser-workspace-desktop.js\";\n// ── Re-export helpers ────────────────────────────────────────────────\nimport {\n assertBrowserWorkspaceConnectorSecretsNotExported,\n assertBrowserWorkspaceUrl,\n assertBrowserWorkspaceUserScriptAllowed,\n createBrowserWorkspaceNotFoundError,\n DEFAULT_WEB_PARTITION,\n inferBrowserWorkspaceTitle,\n normalizeBrowserWorkspaceCommand,\n resolveBrowserWorkspaceCommandPartition,\n resolveConnectorBrowserWorkspacePartition,\n sleep,\n writeBrowserWorkspaceFile,\n} from \"./browser-workspace-helpers.js\";\n\nexport {\n getBrowserWorkspaceUnavailableMessage,\n isBrowserWorkspaceBridgeConfigured,\n resolveBrowserWorkspaceBridgeConfig,\n};\n\n// ── Re-export forms ─────────────────────────────────────────────────\nimport {\n clearWebBrowserWorkspaceTabElementRefs,\n cloneWebBrowserWorkspaceTabState,\n loadWebBrowserWorkspaceTabDocument,\n pushWebBrowserWorkspaceHistory,\n} from \"./browser-workspace-forms.js\";\n// ── Re-export network ────────────────────────────────────────────────\nimport { browserWorkspacePageFetch } from \"./browser-workspace-helpers.js\";\n// ── Re-export jsdom ──────────────────────────────────────────────────\nimport {\n createEmptyWebBrowserWorkspaceDom,\n installBrowserWorkspaceWebRuntime,\n} from \"./browser-workspace-jsdom.js\";\n// ── Re-export snapshots ──────────────────────────────────────────────\nimport {\n createBrowserWorkspacePdfBuffer,\n createBrowserWorkspaceSnapshotRecord,\n diffBrowserWorkspaceSnapshots,\n} from \"./browser-workspace-snapshots.js\";\n// ── Imports for state ────────────────────────────────────────────────\nimport {\n clearBrowserWorkspaceElementRefs,\n clearBrowserWorkspaceRuntimeState,\n getBrowserWorkspaceRuntimeState,\n getBrowserWorkspaceTimestamp,\n resetBrowserWorkspaceRuntimeNavigationState,\n webWorkspaceState,\n withWebStateLock,\n} from \"./browser-workspace-state.js\";\n// ── Re-export web ────────────────────────────────────────────────────\nimport {\n executeWebBrowserWorkspaceDomCommand,\n executeWebBrowserWorkspaceUtilityCommand,\n findWebBrowserWorkspaceTargetTabId,\n getWebBrowserWorkspaceTabIndex,\n getWebBrowserWorkspaceTabState,\n} from \"./browser-workspace-web.js\";\n\nconst AGENT_BROWSER_WORKSPACE_PARTITION = \"persist:eliza-browser-agent\";\nconst CONNECTOR_MANUAL_STATES = new Set<BrowserWorkspaceConnectorAuthState>([\n \"auth_pending\",\n \"needs_reauth\",\n \"manual_handoff\",\n]);\n\n// ────────────────────────────────────────────────────────────────────\n// Public API functions\n// ────────────────────────────────────────────────────────────────────\n\nexport function getBrowserWorkspaceMode(\n env: NodeJS.ProcessEnv = process.env,\n): BrowserWorkspaceMode {\n return isBrowserWorkspaceBridgeConfigured(env) ? \"desktop\" : \"web\";\n}\n\nexport function resolveBrowserWorkspaceConnectorPartition(\n provider: string,\n accountId: string,\n): string {\n return resolveConnectorBrowserWorkspacePartition(provider, accountId);\n}\n\nfunction normalizeConnectorAuthState(\n value: BrowserWorkspaceConnectorAuthState | undefined,\n fallback: BrowserWorkspaceConnectorAuthState,\n): BrowserWorkspaceConnectorAuthState {\n switch (value) {\n case \"unknown\":\n case \"ready\":\n case \"auth_pending\":\n case \"needs_reauth\":\n case \"manual_handoff\":\n return value;\n default:\n return fallback;\n }\n}\n\nfunction connectorSessionRequiresManualHandoff(\n state: BrowserWorkspaceConnectorAuthState,\n): boolean {\n return CONNECTOR_MANUAL_STATES.has(state);\n}\n\nfunction createConnectorSessionRef(\n ref: BrowserWorkspaceConnectorSessionRef,\n): BrowserWorkspaceConnectorSessionRef {\n return {\n kind: ref.kind,\n handleId: ref.handleId,\n partition: ref.partition,\n tabId: ref.tabId,\n browser: ref.browser,\n companionId: ref.companionId,\n profileId: ref.profileId,\n profileLabel: ref.profileLabel,\n };\n}\n\nfunction createConnectorSessionHandle(args: {\n provider: string;\n accountId: string;\n authState: BrowserWorkspaceConnectorAuthState;\n ref: BrowserWorkspaceConnectorSessionRef;\n created: boolean;\n message?: string | null;\n}): BrowserWorkspaceConnectorSessionHandle {\n const sessionRef = createConnectorSessionRef(args.ref);\n return {\n provider: args.provider,\n accountId: args.accountId,\n authState: args.authState,\n requiresManualHandoff: connectorSessionRequiresManualHandoff(\n args.authState,\n ),\n sessionRef,\n partition: sessionRef.partition,\n tabId: sessionRef.tabId,\n companionId: sessionRef.companionId,\n browser: sessionRef.browser,\n profileId: sessionRef.profileId,\n profileLabel: sessionRef.profileLabel,\n created: args.created,\n message: args.message ?? null,\n };\n}\n\nfunction createBrowserBridgeConnectorSessionHandle(args: {\n provider: string;\n accountId: string;\n companion: BrowserWorkspaceConnectorCompanionRef;\n authState: BrowserWorkspaceConnectorAuthState;\n message?: string | null;\n}): BrowserWorkspaceConnectorSessionHandle {\n const browser = args.companion.browser?.trim() || null;\n const companionId = args.companion.companionId?.trim() || null;\n const profileId = args.companion.profileId?.trim() || null;\n const profileLabel = args.companion.profileLabel?.trim() || null;\n return createConnectorSessionHandle({\n provider: args.provider,\n accountId: args.accountId,\n authState: args.authState,\n created: false,\n message: args.message,\n ref: {\n kind: \"browser-bridge-companion\",\n handleId: [\n \"browser-bridge\",\n browser ?? \"browser\",\n companionId ?? profileId ?? \"profile\",\n args.provider,\n args.accountId,\n ].join(\":\"),\n partition: null,\n tabId: null,\n browser,\n companionId,\n profileId,\n profileLabel,\n },\n });\n}\n\nasync function assertDesktopBrowserWorkspaceCanAccessProfileSecrets(\n command: BrowserWorkspaceCommand,\n env: NodeJS.ProcessEnv,\n operation: string,\n): Promise<void> {\n const id = await resolveDesktopBrowserWorkspaceTargetTabId(command, env);\n const tabs = await listBrowserWorkspaceTabs(env);\n const tab = tabs.find((entry) => entry.id === id) ?? null;\n assertBrowserWorkspaceConnectorSecretsNotExported(tab?.partition, operation);\n}\n\nexport async function acquireBrowserWorkspaceConnectorSession(\n request: AcquireBrowserWorkspaceConnectorSessionRequest,\n env: NodeJS.ProcessEnv = process.env,\n): Promise<BrowserWorkspaceConnectorSessionHandle> {\n const provider = request.provider.trim();\n const accountId = request.accountId.trim();\n if (!provider) {\n throw new Error(\"Eliza browser connector session requires provider.\");\n }\n if (!accountId) {\n throw new Error(\"Eliza browser connector session requires accountId.\");\n }\n\n const companion = request.companion ?? null;\n if (companion?.profileId || companion?.companionId) {\n const authState = normalizeConnectorAuthState(\n request.authState,\n \"manual_handoff\",\n );\n return createBrowserBridgeConnectorSessionHandle({\n provider,\n accountId,\n companion,\n authState,\n message:\n request.manualHandoffReason ??\n \"Use the paired browser companion profile to finish login, MFA, or CAPTCHA if required.\",\n });\n }\n\n if (isBrowserWorkspaceBridgeConfigured(env)) {\n const payload = await requestBrowserWorkspace<{\n session: BrowserWorkspaceConnectorSessionHandle;\n }>(\n \"/sessions/acquire\",\n {\n method: \"POST\",\n body: JSON.stringify({\n accountId,\n authState: request.authState,\n manualHandoffReason: request.manualHandoffReason,\n provider,\n reuse: request.reuse,\n show: request.show,\n title: request.title,\n url: request.url,\n }),\n },\n env,\n );\n return payload.session;\n }\n\n const partition = resolveBrowserWorkspaceConnectorPartition(\n provider,\n accountId,\n );\n const reuse = request.reuse !== false;\n const tabs = reuse ? await listBrowserWorkspaceTabs(env) : [];\n const existing = tabs.find((tab) => tab.partition === partition) ?? null;\n let tab = existing;\n let created = false;\n\n if (!tab) {\n tab = await openBrowserWorkspaceTab(\n {\n kind: \"internal\",\n partition,\n show: request.show ?? true,\n title: request.title,\n url: request.url,\n },\n env,\n );\n created = true;\n } else if (request.show === true) {\n tab = await showBrowserWorkspaceTab(tab.id, env);\n }\n\n const authState = normalizeConnectorAuthState(\n request.authState,\n created ? \"auth_pending\" : \"ready\",\n );\n return createConnectorSessionHandle({\n provider,\n accountId,\n authState,\n created,\n message:\n request.manualHandoffReason ??\n (connectorSessionRequiresManualHandoff(authState)\n ? \"Manual login, MFA, or CAPTCHA may be required in this isolated connector browser session.\"\n : null),\n ref: {\n kind: \"internal-browser\",\n handleId: `internal-browser:${partition}`,\n partition,\n tabId: tab.id,\n browser: null,\n companionId: null,\n profileId: null,\n profileLabel: null,\n },\n });\n}\n\nexport async function getBrowserWorkspaceSnapshot(\n env: NodeJS.ProcessEnv = process.env,\n): Promise<BrowserWorkspaceSnapshot> {\n return {\n mode: getBrowserWorkspaceMode(env),\n tabs: await listBrowserWorkspaceTabs(env),\n };\n}\n\nexport async function listBrowserWorkspaceTabs(\n env: NodeJS.ProcessEnv = process.env,\n): Promise<BrowserWorkspaceTab[]> {\n if (!isBrowserWorkspaceBridgeConfigured(env)) {\n return webWorkspaceState.tabs.map((tab) => ({\n id: tab.id,\n title: tab.title,\n url: tab.url,\n partition: tab.partition,\n kind: tab.kind,\n visible: tab.visible,\n createdAt: tab.createdAt,\n updatedAt: tab.updatedAt,\n lastFocusedAt: tab.lastFocusedAt,\n }));\n }\n\n const payload = await requestBrowserWorkspace<{\n tabs?: BrowserWorkspaceTab[];\n }>(\"/tabs\", undefined, env);\n return Array.isArray(payload.tabs) ? payload.tabs : [];\n}\n\nexport async function openBrowserWorkspaceTab(\n request: OpenBrowserWorkspaceTabRequest,\n env: NodeJS.ProcessEnv = process.env,\n): Promise<BrowserWorkspaceTab> {\n if (!isBrowserWorkspaceBridgeConfigured(env)) {\n return withWebStateLock(() => {\n const kind: BrowserWorkspaceTabKind =\n request.kind === \"internal\" ? \"internal\" : \"standard\";\n const now = getBrowserWorkspaceTimestamp();\n const url = assertBrowserWorkspaceUrl(\n request.url?.trim() || \"about:blank\",\n );\n const visible = request.show === true;\n const id = `btab_${webWorkspaceState.nextId++}`;\n const dom =\n url === \"about:blank\" ? createEmptyWebBrowserWorkspaceDom(url) : null;\n const tab = {\n id,\n title: request.title?.trim() || inferBrowserWorkspaceTitle(url),\n url,\n partition: request.partition?.trim() || DEFAULT_WEB_PARTITION,\n kind,\n visible,\n createdAt: now,\n updatedAt: now,\n lastFocusedAt: visible ? now : null,\n dom,\n history: [url],\n historyIndex: 0,\n loadedUrl: url === \"about:blank\" ? url : null,\n };\n if (dom) {\n installBrowserWorkspaceWebRuntime(tab, dom);\n }\n getBrowserWorkspaceRuntimeState(\"web\", tab.id);\n clearWebBrowserWorkspaceTabElementRefs(tab.id);\n if (tab.visible) {\n webWorkspaceState.tabs = webWorkspaceState.tabs.map((entry) => ({\n ...entry,\n visible: false,\n }));\n }\n webWorkspaceState.tabs = [...webWorkspaceState.tabs, tab];\n return cloneWebBrowserWorkspaceTabState(tab);\n });\n }\n\n const payload = await requestBrowserWorkspace<{ tab: BrowserWorkspaceTab }>(\n \"/tabs\",\n {\n method: \"POST\",\n body: JSON.stringify(request),\n },\n env,\n );\n return payload.tab;\n}\n\nexport async function navigateBrowserWorkspaceTab(\n request: NavigateBrowserWorkspaceTabRequest,\n env: NodeJS.ProcessEnv = process.env,\n): Promise<BrowserWorkspaceTab> {\n const nextUrl = assertBrowserWorkspaceUrl(request.url);\n\n if (!isBrowserWorkspaceBridgeConfigured(env)) {\n return withWebStateLock(() => {\n const index = getWebBrowserWorkspaceTabIndex(request.id);\n if (index < 0) {\n throw createBrowserWorkspaceNotFoundError(request.id);\n }\n\n const existing = webWorkspaceState.tabs[index];\n const updatedAt = getBrowserWorkspaceTimestamp();\n const state = getBrowserWorkspaceRuntimeState(\"web\", existing.id);\n clearWebBrowserWorkspaceTabElementRefs(existing.id);\n pushWebBrowserWorkspaceHistory(existing, nextUrl);\n const nextDom =\n nextUrl === \"about:blank\"\n ? createEmptyWebBrowserWorkspaceDom(nextUrl)\n : null;\n const nextTab = {\n ...existing,\n title: inferBrowserWorkspaceTitle(nextUrl),\n url: nextUrl,\n updatedAt,\n dom: nextDom,\n loadedUrl: nextUrl === \"about:blank\" ? nextUrl : null,\n };\n if (nextDom) {\n installBrowserWorkspaceWebRuntime(nextTab, nextDom);\n }\n resetBrowserWorkspaceRuntimeNavigationState(state);\n webWorkspaceState.tabs[index] = nextTab;\n return cloneWebBrowserWorkspaceTabState(nextTab);\n });\n }\n\n const navigateBody: { url: string; partition?: string } = { url: nextUrl };\n if (request.partition !== undefined) {\n navigateBody.partition = request.partition;\n }\n\n const payload = await requestBrowserWorkspace<{ tab: BrowserWorkspaceTab }>(\n `/tabs/${encodeURIComponent(request.id)}/navigate`,\n {\n method: \"POST\",\n body: JSON.stringify(navigateBody),\n },\n env,\n );\n return payload.tab;\n}\n\nexport async function showBrowserWorkspaceTab(\n id: string,\n env: NodeJS.ProcessEnv = process.env,\n): Promise<BrowserWorkspaceTab> {\n if (!isBrowserWorkspaceBridgeConfigured(env)) {\n return withWebStateLock(() => {\n getWebBrowserWorkspaceTabState(id);\n const lastFocusedAt = getBrowserWorkspaceTimestamp();\n webWorkspaceState.tabs = webWorkspaceState.tabs.map((tab) => ({\n ...tab,\n visible: tab.id === id,\n lastFocusedAt: tab.id === id ? lastFocusedAt : tab.lastFocusedAt,\n updatedAt: tab.id === id ? lastFocusedAt : tab.updatedAt,\n }));\n return cloneWebBrowserWorkspaceTabState(\n getWebBrowserWorkspaceTabState(id),\n );\n });\n }\n\n const payload = await requestBrowserWorkspace<{ tab: BrowserWorkspaceTab }>(\n `/tabs/${encodeURIComponent(id)}/show`,\n { method: \"POST\" },\n env,\n );\n return payload.tab;\n}\n\nexport async function hideBrowserWorkspaceTab(\n id: string,\n env: NodeJS.ProcessEnv = process.env,\n): Promise<BrowserWorkspaceTab> {\n if (!isBrowserWorkspaceBridgeConfigured(env)) {\n return withWebStateLock(() => {\n const index = getWebBrowserWorkspaceTabIndex(id);\n if (index < 0) {\n throw createBrowserWorkspaceNotFoundError(id);\n }\n\n const updatedAt = getBrowserWorkspaceTimestamp();\n const nextTab = {\n ...webWorkspaceState.tabs[index],\n visible: false,\n updatedAt,\n };\n webWorkspaceState.tabs[index] = nextTab;\n return cloneWebBrowserWorkspaceTabState(nextTab);\n });\n }\n\n const payload = await requestBrowserWorkspace<{ tab: BrowserWorkspaceTab }>(\n `/tabs/${encodeURIComponent(id)}/hide`,\n { method: \"POST\" },\n env,\n );\n return payload.tab;\n}\n\nexport async function closeBrowserWorkspaceTab(\n id: string,\n env: NodeJS.ProcessEnv = process.env,\n): Promise<boolean> {\n if (!isBrowserWorkspaceBridgeConfigured(env)) {\n return withWebStateLock(() => {\n const initialLength = webWorkspaceState.tabs.length;\n clearWebBrowserWorkspaceTabElementRefs(id);\n clearBrowserWorkspaceRuntimeState(\"web\", id);\n webWorkspaceState.tabs = webWorkspaceState.tabs.filter(\n (tab) => tab.id !== id,\n );\n return webWorkspaceState.tabs.length !== initialLength;\n });\n }\n\n const payload = await requestBrowserWorkspace<{ closed?: boolean }>(\n `/tabs/${encodeURIComponent(id)}`,\n { method: \"DELETE\" },\n env,\n );\n return payload.closed === true;\n}\n\nexport async function evaluateBrowserWorkspaceTab(\n request: EvaluateBrowserWorkspaceTabRequest,\n env: NodeJS.ProcessEnv = process.env,\n): Promise<unknown> {\n return evaluateBrowserWorkspaceTabDesktop(request, env);\n}\n\nexport async function snapshotBrowserWorkspaceTab(\n id: string,\n env: NodeJS.ProcessEnv = process.env,\n): Promise<{ data: string }> {\n return snapshotBrowserWorkspaceTabDesktop(id, env);\n}\n\n// ────────────────────────────────────────────────────────────────────\n// Main command router\n// ────────────────────────────────────────────────────────────────────\n\nexport async function executeBrowserWorkspaceCommand(\n command: BrowserWorkspaceCommand,\n env: NodeJS.ProcessEnv = process.env,\n): Promise<BrowserWorkspaceCommandResult> {\n command = normalizeBrowserWorkspaceCommand(command);\n switch (command.subaction) {\n case \"batch\": {\n const steps = Array.isArray(command.steps) ? command.steps : [];\n if (steps.length === 0) {\n throw new Error(\n \"Eliza browser workspace batch requires at least one step.\",\n );\n }\n const results: BrowserWorkspaceCommandResult[] = [];\n for (const step of steps) {\n results.push(await executeBrowserWorkspaceCommand(step, env));\n }\n return {\n mode: getBrowserWorkspaceMode(env),\n subaction: command.subaction,\n steps: results,\n value: results.at(-1)?.value,\n };\n }\n case \"list\":\n return {\n mode: getBrowserWorkspaceMode(env),\n subaction: command.subaction,\n tabs: await listBrowserWorkspaceTabs(env),\n };\n case \"open\": {\n const tab = await openBrowserWorkspaceTab(\n {\n partition: resolveBrowserWorkspaceCommandPartition(\n command,\n AGENT_BROWSER_WORKSPACE_PARTITION,\n ),\n show: command.show,\n title: command.title,\n url: command.url,\n },\n env,\n );\n clearBrowserWorkspaceElementRefs(getBrowserWorkspaceMode(env), tab.id);\n return {\n mode: getBrowserWorkspaceMode(env),\n subaction: command.subaction,\n tab,\n };\n }\n case \"navigate\": {\n const id = isBrowserWorkspaceBridgeConfigured(env)\n ? await resolveDesktopBrowserWorkspaceTargetTabId(command, env)\n : findWebBrowserWorkspaceTargetTabId(command);\n clearBrowserWorkspaceElementRefs(getBrowserWorkspaceMode(env), id);\n return {\n mode: getBrowserWorkspaceMode(env),\n subaction: command.subaction,\n tab: await navigateBrowserWorkspaceTab(\n {\n id,\n url: command.url ?? \"\",\n },\n env,\n ),\n };\n }\n case \"show\": {\n const id = isBrowserWorkspaceBridgeConfigured(env)\n ? await resolveDesktopBrowserWorkspaceTargetTabId(command, env)\n : findWebBrowserWorkspaceTargetTabId(command);\n return {\n mode: getBrowserWorkspaceMode(env),\n subaction: command.subaction,\n tab: await showBrowserWorkspaceTab(id, env),\n };\n }\n case \"hide\": {\n const id = isBrowserWorkspaceBridgeConfigured(env)\n ? await resolveDesktopBrowserWorkspaceTargetTabId(command, env)\n : findWebBrowserWorkspaceTargetTabId(command);\n return {\n mode: getBrowserWorkspaceMode(env),\n subaction: command.subaction,\n tab: await hideBrowserWorkspaceTab(id, env),\n };\n }\n case \"close\": {\n const id = isBrowserWorkspaceBridgeConfigured(env)\n ? await resolveDesktopBrowserWorkspaceTargetTabId(command, env)\n : findWebBrowserWorkspaceTargetTabId(command);\n clearBrowserWorkspaceElementRefs(getBrowserWorkspaceMode(env), id);\n clearBrowserWorkspaceRuntimeState(getBrowserWorkspaceMode(env), id);\n return {\n mode: getBrowserWorkspaceMode(env),\n subaction: command.subaction,\n closed: await closeBrowserWorkspaceTab(id, env),\n };\n }\n case \"eval\": {\n if (!isBrowserWorkspaceBridgeConfigured(env)) {\n return (await executeWebBrowserWorkspaceUtilityCommand(\n command,\n )) as BrowserWorkspaceCommandResult;\n }\n assertBrowserWorkspaceUserScriptAllowed(\n command.script,\n \"eval\",\n \"desktop\",\n env,\n );\n const id = await resolveDesktopBrowserWorkspaceTargetTabId(command, env);\n return {\n mode: \"desktop\",\n subaction: command.subaction,\n value: await evaluateBrowserWorkspaceTab(\n {\n id,\n script: command.script ?? \"\",\n },\n env,\n ),\n };\n }\n case \"screenshot\": {\n if (!isBrowserWorkspaceBridgeConfigured(env)) {\n return (await executeWebBrowserWorkspaceUtilityCommand(\n command,\n )) as BrowserWorkspaceCommandResult;\n }\n const id = await resolveDesktopBrowserWorkspaceTargetTabId(command, env);\n return {\n mode: \"desktop\",\n subaction: command.subaction,\n snapshot: await snapshotBrowserWorkspaceTab(id, env),\n };\n }\n case \"clipboard\":\n case \"console\":\n case \"cookies\":\n case \"dialog\":\n case \"drag\":\n case \"errors\":\n case \"frame\":\n case \"highlight\":\n case \"mouse\":\n case \"network\":\n case \"set\":\n case \"storage\":\n case \"upload\": {\n if (!isBrowserWorkspaceBridgeConfigured(env)) {\n return (await executeWebBrowserWorkspaceUtilityCommand(\n command,\n )) as BrowserWorkspaceCommandResult;\n }\n return executeDesktopBrowserWorkspaceUtilityCommand(command, env);\n }\n case \"diff\": {\n if (!isBrowserWorkspaceBridgeConfigured(env)) {\n return (await executeWebBrowserWorkspaceUtilityCommand(\n command,\n )) as BrowserWorkspaceCommandResult;\n }\n const id = await resolveDesktopBrowserWorkspaceTargetTabId(command, env);\n const runtime = getBrowserWorkspaceRuntimeState(\"desktop\", id);\n const snapshot = await getDesktopBrowserWorkspaceSnapshotRecord(\n command,\n env,\n );\n if (command.diffAction === \"screenshot\") {\n const screenshot = await snapshotBrowserWorkspaceTab(id, env);\n const currentData = screenshot.data;\n const baseline = command.baselinePath?.trim()\n ? await fsp.readFile(\n path.resolve(command.baselinePath.trim()),\n \"base64\",\n )\n : runtime.lastScreenshotData;\n runtime.lastScreenshotData = currentData;\n return {\n mode: \"desktop\",\n subaction: command.subaction,\n value: {\n baselineLength: baseline?.length ?? 0,\n changed: baseline !== currentData,\n currentLength: currentData.length,\n },\n };\n }\n if (command.diffAction === \"url\") {\n const leftUrl = command.url?.trim() || snapshot.url;\n const rightUrl = command.secondaryUrl?.trim();\n if (!rightUrl) {\n throw new Error(\n \"Eliza browser workspace diff url requires secondaryUrl.\",\n );\n }\n const left = await browserWorkspacePageFetch(leftUrl);\n const right = await browserWorkspacePageFetch(rightUrl);\n return {\n mode: \"desktop\",\n subaction: command.subaction,\n value: diffBrowserWorkspaceSnapshots(\n createBrowserWorkspaceSnapshotRecord(\n leftUrl,\n left.url || leftUrl,\n await left.text(),\n ),\n createBrowserWorkspaceSnapshotRecord(\n rightUrl,\n right.url || rightUrl,\n await right.text(),\n ),\n ),\n };\n }\n const baseline = command.baselinePath?.trim()\n ? (JSON.parse(\n await fsp.readFile(\n path.resolve(command.baselinePath.trim()),\n \"utf8\",\n ),\n ) as import(\"./browser-workspace-types.js\").BrowserWorkspaceSnapshotRecord)\n : runtime.lastSnapshot;\n const diff = diffBrowserWorkspaceSnapshots(baseline, snapshot);\n runtime.lastSnapshot = snapshot;\n return { mode: \"desktop\", subaction: command.subaction, value: diff };\n }\n case \"trace\":\n case \"profiler\": {\n if (!isBrowserWorkspaceBridgeConfigured(env)) {\n return (await executeWebBrowserWorkspaceUtilityCommand(\n command,\n )) as BrowserWorkspaceCommandResult;\n }\n const id = await resolveDesktopBrowserWorkspaceTargetTabId(command, env);\n const runtime = getBrowserWorkspaceRuntimeState(\"desktop\", id);\n const target =\n command.subaction === \"trace\" ? runtime.trace : runtime.profiler;\n const stop =\n command.subaction === \"trace\"\n ? command.traceAction === \"stop\"\n : command.profilerAction === \"stop\";\n if (stop) {\n target.active = false;\n const payload = { entries: target.entries };\n const filePath = command.filePath?.trim() || command.outputPath?.trim();\n if (filePath) {\n await writeBrowserWorkspaceFile(\n filePath,\n JSON.stringify(payload, null, 2),\n );\n return {\n mode: \"desktop\",\n subaction: command.subaction,\n value: { path: path.resolve(filePath), ...payload },\n };\n }\n return {\n mode: \"desktop\",\n subaction: command.subaction,\n value: payload,\n };\n }\n target.active = true;\n target.entries = [\n {\n command: `${command.subaction}:start`,\n timestamp: getBrowserWorkspaceTimestamp(),\n },\n ];\n return {\n mode: \"desktop\",\n subaction: command.subaction,\n value: { active: true },\n };\n }\n case \"state\": {\n if (!isBrowserWorkspaceBridgeConfigured(env)) {\n return (await executeWebBrowserWorkspaceUtilityCommand(\n command,\n )) as BrowserWorkspaceCommandResult;\n }\n await assertDesktopBrowserWorkspaceCanAccessProfileSecrets(\n command,\n env,\n \"state\",\n );\n if (command.stateAction === \"load\") {\n const filePath = command.filePath?.trim() || command.outputPath?.trim();\n if (!filePath) {\n throw new Error(\n \"Eliza browser workspace state load requires filePath.\",\n );\n }\n const payload = JSON.parse(\n await fsp.readFile(path.resolve(filePath), \"utf8\"),\n ) as Record<string, unknown>;\n await loadDesktopBrowserWorkspaceSessionState(command, payload, env);\n return {\n mode: \"desktop\",\n subaction: command.subaction,\n value: { loaded: true },\n };\n }\n const payload = await getDesktopBrowserWorkspaceSessionState(\n command,\n env,\n );\n const filePath = command.filePath?.trim() || command.outputPath?.trim();\n if (filePath) {\n await writeBrowserWorkspaceFile(\n filePath,\n JSON.stringify(payload, null, 2),\n );\n return {\n mode: \"desktop\",\n subaction: command.subaction,\n value: { path: path.resolve(filePath), ...payload },\n };\n }\n return { mode: \"desktop\", subaction: command.subaction, value: payload };\n }\n case \"pdf\": {\n if (!isBrowserWorkspaceBridgeConfigured(env)) {\n return (await executeWebBrowserWorkspaceUtilityCommand(\n command,\n )) as BrowserWorkspaceCommandResult;\n }\n const filePath = command.filePath?.trim() || command.outputPath?.trim();\n if (!filePath) {\n throw new Error(\"Eliza browser workspace pdf requires filePath.\");\n }\n const snapshot = await getDesktopBrowserWorkspaceSnapshotRecord(\n command,\n env,\n );\n const pdf = createBrowserWorkspacePdfBuffer(\n snapshot.title,\n snapshot.bodyText,\n );\n const resolved = await writeBrowserWorkspaceFile(filePath, pdf);\n return {\n mode: \"desktop\",\n subaction: command.subaction,\n value: { path: resolved, size: pdf.byteLength },\n };\n }\n case \"tab\": {\n const action = command.tabAction ?? \"list\";\n if (action === \"list\") {\n return {\n mode: getBrowserWorkspaceMode(env),\n subaction: command.subaction,\n tabs: await listBrowserWorkspaceTabs(env),\n };\n }\n if (action === \"new\") {\n return {\n mode: getBrowserWorkspaceMode(env),\n subaction: command.subaction,\n tab: await openBrowserWorkspaceTab(\n {\n partition: resolveBrowserWorkspaceCommandPartition(\n command,\n AGENT_BROWSER_WORKSPACE_PARTITION,\n ),\n show: command.show ?? true,\n title: command.title,\n url: command.url,\n width: command.width,\n height: command.height,\n },\n env,\n ),\n };\n }\n if (action === \"switch\") {\n const tabs = await listBrowserWorkspaceTabs(env);\n const target = command.id?.trim()\n ? tabs.find((tab) => tab.id === command.id?.trim())\n : typeof command.index === \"number\"\n ? (tabs[command.index] ?? null)\n : null;\n if (!target) {\n throw new Error(\n \"Eliza browser workspace tab switch requires a valid id or index.\",\n );\n }\n return {\n mode: getBrowserWorkspaceMode(env),\n subaction: command.subaction,\n tab: await showBrowserWorkspaceTab(target.id, env),\n };\n }\n const targetId =\n command.id?.trim() ||\n (await listBrowserWorkspaceTabs(env))[command.index ?? -1]?.id;\n if (!targetId) {\n throw new Error(\n \"Eliza browser workspace tab close requires a valid id or index.\",\n );\n }\n return {\n mode: getBrowserWorkspaceMode(env),\n subaction: command.subaction,\n closed: await closeBrowserWorkspaceTab(targetId, env),\n };\n }\n case \"window\":\n return {\n mode: getBrowserWorkspaceMode(env),\n subaction: command.subaction,\n tab: await openBrowserWorkspaceTab(\n {\n partition: resolveBrowserWorkspaceCommandPartition(\n command,\n AGENT_BROWSER_WORKSPACE_PARTITION,\n ),\n show: true,\n title: command.title,\n url: command.url,\n width: command.width,\n height: command.height,\n },\n env,\n ),\n };\n case \"back\":\n case \"forward\":\n case \"reload\": {\n if (isBrowserWorkspaceBridgeConfigured(env)) {\n const id = await resolveDesktopBrowserWorkspaceTargetTabId(\n command,\n env,\n );\n clearBrowserWorkspaceElementRefs(\"desktop\", id);\n return executeDesktopBrowserWorkspaceDomCommand(command, env);\n }\n\n return withWebStateLock(async () => {\n const id = findWebBrowserWorkspaceTargetTabId(command);\n const tab = getWebBrowserWorkspaceTabState(id);\n\n if (command.subaction === \"reload\") {\n clearWebBrowserWorkspaceTabElementRefs(tab.id);\n tab.dom = null;\n tab.loadedUrl = null;\n await loadWebBrowserWorkspaceTabDocument(tab);\n return {\n mode: \"web\",\n subaction: command.subaction,\n tab: cloneWebBrowserWorkspaceTabState(tab),\n value: { url: tab.url, title: tab.title },\n };\n }\n\n const delta = command.subaction === \"back\" ? -1 : 1;\n const nextIndex = tab.historyIndex + delta;\n if (nextIndex < 0 || nextIndex >= tab.history.length) {\n return {\n mode: \"web\",\n subaction: command.subaction,\n tab: cloneWebBrowserWorkspaceTabState(tab),\n value: { url: tab.url, title: tab.title, changed: false },\n };\n }\n\n tab.historyIndex = nextIndex;\n tab.url = tab.history[nextIndex] ?? tab.url;\n tab.title = inferBrowserWorkspaceTitle(tab.url);\n clearWebBrowserWorkspaceTabElementRefs(tab.id);\n tab.dom = null;\n tab.loadedUrl = null;\n await loadWebBrowserWorkspaceTabDocument(tab);\n return {\n mode: \"web\",\n subaction: command.subaction,\n tab: cloneWebBrowserWorkspaceTabState(tab),\n value: { url: tab.url, title: tab.title, changed: true },\n };\n });\n }\n case \"inspect\":\n case \"snapshot\":\n case \"check\":\n case \"click\":\n case \"dblclick\":\n case \"find\":\n case \"fill\":\n case \"focus\":\n case \"get\":\n case \"hover\":\n case \"keydown\":\n case \"keyup\":\n case \"keyboardinserttext\":\n case \"keyboardtype\":\n case \"press\":\n case \"scroll\":\n case \"scrollinto\":\n case \"select\":\n case \"type\":\n case \"uncheck\":\n case \"wait\":\n case \"realistic-click\":\n case \"realistic-fill\":\n case \"realistic-type\":\n case \"realistic-press\":\n case \"realistic-upload\":\n case \"cursor-move\":\n case \"cursor-hide\":\n if (\n command.subaction === \"wait\" &&\n !command.selector &&\n !command.findBy &&\n !command.text &&\n !command.url &&\n !command.script &&\n typeof command.timeoutMs === \"number\" &&\n Number.isFinite(command.timeoutMs)\n ) {\n const waitedMs = Math.max(0, command.timeoutMs);\n await sleep(waitedMs);\n return {\n mode: getBrowserWorkspaceMode(env),\n subaction: command.subaction,\n value: { waitedMs },\n };\n }\n if (isBrowserWorkspaceBridgeConfigured(env)) {\n return executeDesktopBrowserWorkspaceDomCommand(command, env);\n }\n return executeWebBrowserWorkspaceDomCommand(command);\n default: {\n const exhaustive: never = command.subaction;\n throw new Error(`Unsupported browser workspace subaction: ${exhaustive}`);\n }\n }\n}\n"],"mappings":"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","names":["authState","tab","baseline","filePath","payload"]}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Workspace browser command router — public barrel.
3
+ *
4
+ * This is the multi-backend workspace browser surface (formerly
5
+ * `packages/agent/src/services/browser-workspace.ts` and friends). It owns:
6
+ *
7
+ * - `browser-workspace.ts` — public functions and the main command
8
+ * router `executeBrowserWorkspaceCommand`
9
+ * - `browser-workspace-types.ts` — exported types and interfaces
10
+ * - `browser-workspace-state.ts` — global mutable state
11
+ * - `browser-workspace-helpers.ts` — small utilities and command normalization
12
+ * - `browser-workspace-jsdom.ts` — JSDOM loading and runtime install
13
+ * - `browser-workspace-elements.ts` — element finding, selector parsing
14
+ * - `browser-workspace-network.ts` — HAR, network interception
15
+ * - `browser-workspace-forms.ts` — form control interaction
16
+ * - `browser-workspace-snapshots.ts` — document snapshots, diff, PDF
17
+ * - `browser-workspace-desktop.ts` — desktop bridge HTTP client
18
+ * - `browser-workspace-web.ts` — web-mode (JSDOM-backed) command exec
19
+ * - `browser-capture.ts` — frame-capture helpers for streaming
20
+ *
21
+ * Importers should prefer `@elizaos/plugin-browser/workspace` over the
22
+ * specific `browser-workspace*` subpaths.
23
+ */
24
+ export * from "./browser-capture.js";
25
+ export * from "./browser-workspace.js";
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workspace/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./browser-capture.js";
2
+ export * from "./browser-workspace.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/workspace/index.ts"],"sourcesContent":["/**\n * Workspace browser command router — public barrel.\n *\n * This is the multi-backend workspace browser surface (formerly\n * `packages/agent/src/services/browser-workspace.ts` and friends). It owns:\n *\n * - `browser-workspace.ts` — public functions and the main command\n * router `executeBrowserWorkspaceCommand`\n * - `browser-workspace-types.ts` — exported types and interfaces\n * - `browser-workspace-state.ts` — global mutable state\n * - `browser-workspace-helpers.ts` — small utilities and command normalization\n * - `browser-workspace-jsdom.ts` — JSDOM loading and runtime install\n * - `browser-workspace-elements.ts` — element finding, selector parsing\n * - `browser-workspace-network.ts` — HAR, network interception\n * - `browser-workspace-forms.ts` — form control interaction\n * - `browser-workspace-snapshots.ts` — document snapshots, diff, PDF\n * - `browser-workspace-desktop.ts` — desktop bridge HTTP client\n * - `browser-workspace-web.ts` — web-mode (JSDOM-backed) command exec\n * - `browser-capture.ts` — frame-capture helpers for streaming\n *\n * Importers should prefer `@elizaos/plugin-browser/workspace` over the\n * specific `browser-workspace*` subpaths.\n */\n\nexport * from \"./browser-capture.js\";\nexport * from \"./browser-workspace.js\";\n"],"mappings":"AAwBA,cAAc;AACd,cAAc;","names":[]}
@@ -0,0 +1,2 @@
1
+ export * from "./workspace/index.js";
2
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./workspace/index.js";
2
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/workspace.ts"],"sourcesContent":["export * from \"./workspace/index.js\";\n"],"mappings":"AAAA,cAAc;","names":[]}
package/package.json CHANGED
@@ -1,112 +1,73 @@
1
1
  {
2
- "name": "@elizaos/plugin-browser",
3
- "description": "Browser automation plugin for ElizaOS - enables AI agents to browse websites, interact with elements, and extract data",
4
- "version": "2.0.0-alpha.9",
5
- "type": "module",
6
- "main": "dist/index.js",
7
- "module": "dist/index.js",
8
- "types": "dist/index.d.ts",
9
- "packageType": "plugin",
10
- "platform": "node",
11
- "license": "MIT",
12
- "keywords": [
13
- "plugin",
14
- "elizaos",
15
- "browser",
16
- "automation",
17
- "stagehand",
18
- "playwright"
19
- ],
20
- "repository": {
21
- "type": "git",
22
- "url": "https://github.com/elizaos/eliza"
23
- },
24
- "homepage": "https://elizaos.ai",
25
- "exports": {
26
- "./package.json": "./package.json",
27
- ".": {
28
- "import": {
29
- "types": "./dist/index.d.ts",
30
- "default": "./dist/index.js"
31
- }
32
- }
33
- },
34
- "files": [
35
- "dist",
36
- "README.md",
37
- "package.json"
38
- ],
39
- "dependencies": {
40
- "@elizaos/plugin-cli": "2.0.0-alpha.3",
41
- "axios": "^1.7.7",
42
- "ws": "^8.18.0",
43
- "zod": "^4.3.6"
44
- },
45
- "peerDependencies": {
46
- "@elizaos/core": "2.0.0-alpha.3"
47
- },
48
- "devDependencies": {
49
- "@biomejs/biome": "^2.3.11",
50
- "@types/ws": "^8.5.10",
51
- "typescript": "^5.9.3"
52
- },
53
- "scripts": {
54
- "dev": "bun --hot build.ts",
55
- "test": "vitest run --passWithNoTests",
56
- "lint": "bunx @biomejs/biome check --write --unsafe .",
57
- "typecheck": "tsc --noEmit",
58
- "clean": "rm -rf dist .turbo",
59
- "lint:check": "bunx @biomejs/biome check .",
60
- "build": "bun run build.ts",
61
- "build:ts": "bun run build.ts",
62
- "format": "bunx @biomejs/biome format --write .",
63
- "format:check": "bunx @biomejs/biome format ."
64
- },
65
- "agentConfig": {
66
- "pluginType": "elizaos:plugin:1.0.0",
67
- "pluginParameters": {
68
- "BROWSERBASE_API_KEY": {
69
- "type": "string",
70
- "description": "API key for Browserbase cloud browser service",
71
- "required": false
72
- },
73
- "BROWSERBASE_PROJECT_ID": {
74
- "type": "string",
75
- "description": "Project ID for Browserbase",
76
- "required": false
77
- },
78
- "OPENAI_API_KEY": {
79
- "type": "string",
80
- "description": "OpenAI API key for AI-powered browser interactions",
81
- "required": false
82
- },
83
- "ANTHROPIC_API_KEY": {
84
- "type": "string",
85
- "description": "Anthropic API key for Claude-powered interactions",
86
- "required": false
87
- },
88
- "BROWSER_HEADLESS": {
89
- "type": "boolean",
90
- "description": "Run browser in headless mode (default: true)",
91
- "required": false
92
- },
93
- "CAPSOLVER_API_KEY": {
94
- "type": "string",
95
- "description": "CapSolver API key for automated CAPTCHA solving",
96
- "required": false
97
- }
98
- }
99
- },
100
- "publishConfig": {
101
- "access": "public"
102
- },
103
- "milady": {
104
- "platforms": [
105
- "node"
106
- ],
107
- "runtime": "node",
108
- "platformDetails": {
109
- "node": "Node.js only (platform: node)"
110
- }
111
- }
2
+ "name": "@elizaos/plugin-browser",
3
+ "version": "2.0.3-beta.2",
4
+ "type": "module",
5
+ "description": "Browser plugin: BROWSER action and MANAGE_BROWSER_BRIDGE management action. Owns the workspace browser (electrobun-embedded + jsdom fallback) and the Chrome/Safari companion bridge. Targets are registered with the BrowserService; the agent uses what is available.",
6
+ "main": "./dist/index.js",
7
+ "exports": {
8
+ "./package.json": "./package.json",
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "eliza-source": {
12
+ "types": "./src/index.ts",
13
+ "import": "./src/index.ts",
14
+ "default": "./src/index.ts"
15
+ },
16
+ "import": "./dist/index.js",
17
+ "default": "./dist/index.js"
18
+ },
19
+ "./*.css": "./dist/*.css",
20
+ "./*": {
21
+ "types": "./dist/*.d.ts",
22
+ "eliza-source": {
23
+ "types": "./src/*.ts",
24
+ "import": "./src/*.ts",
25
+ "default": "./src/*.ts"
26
+ },
27
+ "import": "./dist/*.js",
28
+ "default": "./dist/*.js"
29
+ }
30
+ },
31
+ "scripts": {
32
+ "typecheck": "tsgo --noEmit -p tsconfig.json",
33
+ "test": "vitest run",
34
+ "build": "bun run build:js && bun run build:types",
35
+ "clean": "rm -rf dist",
36
+ "build:js": "tsup --config ../tsup.plugin-packages.shared.ts",
37
+ "build:types": "tsc --noCheck -p tsconfig.build.json"
38
+ },
39
+ "dependencies": {
40
+ "@elizaos/core": "2.0.3-beta.2",
41
+ "@elizaos/vault": "2.0.3-beta.2",
42
+ "drizzle-orm": "0.45.2"
43
+ },
44
+ "devDependencies": {
45
+ "bun-types": "^1.3.12",
46
+ "jsdom": "^29.0.0",
47
+ "puppeteer-core": "^24.37.5",
48
+ "tsup": "^8.5.1",
49
+ "typescript": "^6.0.3",
50
+ "vitest": "^4.0.17"
51
+ },
52
+ "agentConfig": {
53
+ "pluginType": "elizaos:plugin:1.0.0",
54
+ "pluginParameters": {}
55
+ },
56
+ "elizaos": {
57
+ "plugin": {
58
+ "autoEnableModule": "./auto-enable.ts",
59
+ "capabilities": [
60
+ "browser-automation"
61
+ ]
62
+ }
63
+ },
64
+ "publishConfig": {
65
+ "access": "public"
66
+ },
67
+ "types": "./dist/index.d.ts",
68
+ "files": [
69
+ "dist",
70
+ "auto-enable.ts"
71
+ ],
72
+ "gitHead": "82fe0f44215954c2417328203f5bd6510985c1fc"
112
73
  }
@@ -1,3 +0,0 @@
1
- import type { Action } from "@elizaos/core";
2
- export declare const browserClickAction: Action;
3
- //# sourceMappingURL=click.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"click.d.ts","sourceRoot":"","sources":["../../src/actions/click.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,MAAM,EAQN,MAAM,eAAe,CAAC;AAUvB,eAAO,MAAM,kBAAkB,EAAE,MAoOhC,CAAC"}
@@ -1,158 +0,0 @@
1
- import { ServiceType } from "@elizaos/core";
2
- import { ActionError, handleBrowserError, ServiceNotAvailableError, SessionError, } from "../utils/errors.js";
3
- export const browserClickAction = {
4
- name: "BROWSER_CLICK",
5
- similes: ["CLICK_ELEMENT", "TAP", "PRESS_BUTTON"],
6
- description: "Click on an element on the webpage",
7
- validate: async (runtime, message, state, options) => {
8
- const __avTextRaw = typeof message?.content?.text === "string" ? message.content.text : "";
9
- const __avText = __avTextRaw.toLowerCase();
10
- const __avKeywords = ["browser", "click"];
11
- const __avKeywordOk = __avKeywords.length > 0 &&
12
- __avKeywords.some((word) => word.length > 0 && __avText.includes(word));
13
- const __avRegex = /\b(?:browser|click)\b/i;
14
- const __avRegexOk = __avRegex.test(__avText);
15
- const __avSource = String(message?.content?.source ?? message?.source ?? "");
16
- const __avExpectedSource = "";
17
- const __avSourceOk = __avExpectedSource
18
- ? __avSource === __avExpectedSource
19
- : Boolean(__avSource ||
20
- state ||
21
- runtime?.agentId ||
22
- runtime?.getService ||
23
- runtime?.getSetting);
24
- const __avOptions = options && typeof options === "object" ? options : {};
25
- const __avInputOk = __avText.trim().length > 0 ||
26
- Object.keys(__avOptions).length > 0 ||
27
- Boolean(message?.content && typeof message.content === "object");
28
- if (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {
29
- return false;
30
- }
31
- const __avLegacyValidate = async (runtime, message, state, options) => {
32
- const __avTextRaw = typeof message?.content?.text === "string" ? message.content.text : "";
33
- const __avText = __avTextRaw.toLowerCase();
34
- const __avKeywords = ["browser", "click"];
35
- const __avKeywordOk = __avKeywords.length > 0 &&
36
- __avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));
37
- const __avRegex = /\b(?:browser|click)\b/i;
38
- const __avRegexOk = __avRegex.test(__avText);
39
- const __avSource = String(message?.content?.source ?? message?.source ?? "");
40
- const __avExpectedSource = "";
41
- const __avSourceOk = __avExpectedSource
42
- ? __avSource === __avExpectedSource
43
- : Boolean(__avSource || state || runtime?.agentId || runtime?.getService);
44
- const __avOptions = options && typeof options === "object" ? options : {};
45
- const __avInputOk = __avText.trim().length > 0 ||
46
- Object.keys(__avOptions).length > 0 ||
47
- Boolean(message?.content && typeof message.content === "object");
48
- if (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {
49
- return false;
50
- }
51
- const __avLegacyValidate = async (runtime, message, _state) => {
52
- const browserEnabled = runtime.getSetting("ENABLE_BROWSER") === "true" ||
53
- runtime.getSetting("BROWSER_ENABLED") === "true";
54
- if (!browserEnabled) {
55
- return false;
56
- }
57
- const service = runtime.getService(ServiceType.BROWSER);
58
- if (!service) {
59
- return false;
60
- }
61
- const text = message.content?.text?.toLowerCase() ?? "";
62
- return (text.includes("click") ||
63
- text.includes("tap") ||
64
- text.includes("press"));
65
- };
66
- try {
67
- return Boolean(await __avLegacyValidate(runtime, message, state, options));
68
- }
69
- catch {
70
- return false;
71
- }
72
- };
73
- try {
74
- return Boolean(await __avLegacyValidate(runtime, message, state, options));
75
- }
76
- catch {
77
- return false;
78
- }
79
- },
80
- handler: async (runtime, message, _state, _options, callback, _responses) => {
81
- const service = runtime.getService(ServiceType.BROWSER);
82
- if (!service) {
83
- const error = new ServiceNotAvailableError();
84
- handleBrowserError(error, callback, "click on element");
85
- return {
86
- text: "Browser service is not available",
87
- success: false,
88
- data: {
89
- actionName: "BROWSER_CLICK",
90
- error: "service_not_available",
91
- },
92
- values: {
93
- success: false,
94
- errorType: "service_not_available",
95
- },
96
- };
97
- }
98
- const session = await service.getOrCreateSession();
99
- if (!session) {
100
- const error = new SessionError("No active browser session");
101
- handleBrowserError(error, callback, "click on element");
102
- return {
103
- text: "No active browser session",
104
- success: false,
105
- data: {
106
- actionName: "BROWSER_CLICK",
107
- error: "no_session",
108
- },
109
- values: {
110
- success: false,
111
- errorType: "no_session",
112
- },
113
- };
114
- }
115
- const text = message.content?.text ?? "";
116
- const match = text.match(/click (?:on |the )?(.+)$/i);
117
- const description = match ? match[1] : "element";
118
- const result = await service.getClient().click(session.id, description);
119
- if (!result.success) {
120
- throw new ActionError("click", description, new Error(result.error ?? "Click failed"));
121
- }
122
- const responseContent = {
123
- text: `I've successfully clicked on "${description}"`,
124
- actions: ["BROWSER_CLICK"],
125
- source: message.content?.source ?? "action",
126
- };
127
- await callback?.(responseContent);
128
- return {
129
- text: responseContent.text ?? "",
130
- success: true,
131
- data: {
132
- actionName: "BROWSER_CLICK",
133
- element: description,
134
- sessionId: session.id,
135
- },
136
- values: {
137
- success: true,
138
- element: description,
139
- },
140
- };
141
- },
142
- examples: [
143
- [
144
- {
145
- name: "{{user}}",
146
- content: { text: "Click on the search button" },
147
- },
148
- {
149
- name: "{{agent}}",
150
- content: {
151
- text: "I've clicked on the search button.",
152
- actions: ["BROWSER_CLICK"],
153
- },
154
- },
155
- ],
156
- ],
157
- };
158
- //# sourceMappingURL=click.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"click.js","sourceRoot":"","sources":["../../src/actions/click.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tAction,\n\tActionResult,\n\tContent,\n\tHandlerCallback,\n\tHandlerOptions,\n\tIAgentRuntime,\n\tMemory,\n\tState,\n} from \"@elizaos/core\";\nimport { ServiceType } from \"@elizaos/core\";\nimport type { BrowserService } from \"../services/browser-service.js\";\nimport {\n\tActionError,\n\thandleBrowserError,\n\tServiceNotAvailableError,\n\tSessionError,\n} from \"../utils/errors.js\";\n\nexport const browserClickAction: Action = {\n\tname: \"BROWSER_CLICK\",\n\tsimiles: [\"CLICK_ELEMENT\", \"TAP\", \"PRESS_BUTTON\"],\n\tdescription: \"Click on an element on the webpage\",\n\n\tvalidate: async (\n\t\truntime: any,\n\t\tmessage: any,\n\t\tstate?: any,\n\t\toptions?: any,\n\t): Promise<boolean> => {\n\t\tconst __avTextRaw =\n\t\t\ttypeof message?.content?.text === \"string\" ? message.content.text : \"\";\n\t\tconst __avText = __avTextRaw.toLowerCase();\n\t\tconst __avKeywords = [\"browser\", \"click\"];\n\t\tconst __avKeywordOk =\n\t\t\t__avKeywords.length > 0 &&\n\t\t\t__avKeywords.some((word) => word.length > 0 && __avText.includes(word));\n\t\tconst __avRegex = /\\b(?:browser|click)\\b/i;\n\t\tconst __avRegexOk = __avRegex.test(__avText);\n\t\tconst __avSource = String(\n\t\t\tmessage?.content?.source ?? message?.source ?? \"\",\n\t\t);\n\t\tconst __avExpectedSource = \"\";\n\t\tconst __avSourceOk = __avExpectedSource\n\t\t\t? __avSource === __avExpectedSource\n\t\t\t: Boolean(\n\t\t\t\t\t__avSource ||\n\t\t\t\t\t\tstate ||\n\t\t\t\t\t\truntime?.agentId ||\n\t\t\t\t\t\truntime?.getService ||\n\t\t\t\t\t\truntime?.getSetting,\n\t\t\t\t);\n\t\tconst __avOptions = options && typeof options === \"object\" ? options : {};\n\t\tconst __avInputOk =\n\t\t\t__avText.trim().length > 0 ||\n\t\t\tObject.keys(__avOptions as Record<string, unknown>).length > 0 ||\n\t\t\tBoolean(message?.content && typeof message.content === \"object\");\n\n\t\tif (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst __avLegacyValidate = async (\n\t\t\truntime: any,\n\t\t\tmessage: any,\n\t\t\tstate?: any,\n\t\t\toptions?: any,\n\t\t): Promise<boolean> => {\n\t\t\tconst __avTextRaw =\n\t\t\t\ttypeof message?.content?.text === \"string\" ? message.content.text : \"\";\n\t\t\tconst __avText = __avTextRaw.toLowerCase();\n\t\t\tconst __avKeywords = [\"browser\", \"click\"];\n\t\t\tconst __avKeywordOk =\n\t\t\t\t__avKeywords.length > 0 &&\n\t\t\t\t__avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n\t\t\tconst __avRegex = /\\b(?:browser|click)\\b/i;\n\t\t\tconst __avRegexOk = __avRegex.test(__avText);\n\t\t\tconst __avSource = String(\n\t\t\t\tmessage?.content?.source ?? message?.source ?? \"\",\n\t\t\t);\n\t\t\tconst __avExpectedSource = \"\";\n\t\t\tconst __avSourceOk = __avExpectedSource\n\t\t\t\t? __avSource === __avExpectedSource\n\t\t\t\t: Boolean(\n\t\t\t\t\t\t__avSource || state || runtime?.agentId || runtime?.getService,\n\t\t\t\t\t);\n\t\t\tconst __avOptions = options && typeof options === \"object\" ? options : {};\n\t\t\tconst __avInputOk =\n\t\t\t\t__avText.trim().length > 0 ||\n\t\t\t\tObject.keys(__avOptions as Record<string, unknown>).length > 0 ||\n\t\t\t\tBoolean(message?.content && typeof message.content === \"object\");\n\n\t\t\tif (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst __avLegacyValidate = async (\n\t\t\t\truntime: IAgentRuntime,\n\t\t\t\tmessage: Memory,\n\t\t\t\t_state?: State,\n\t\t\t): Promise<boolean> => {\n\t\t\t\tconst browserEnabled =\n\t\t\t\t\truntime.getSetting(\"ENABLE_BROWSER\") === \"true\" ||\n\t\t\t\t\truntime.getSetting(\"BROWSER_ENABLED\") === \"true\";\n\n\t\t\t\tif (!browserEnabled) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst service = runtime.getService<BrowserService>(ServiceType.BROWSER);\n\t\t\t\tif (!service) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst text = message.content?.text?.toLowerCase() ?? \"\";\n\t\t\t\treturn (\n\t\t\t\t\ttext.includes(\"click\") ||\n\t\t\t\t\ttext.includes(\"tap\") ||\n\t\t\t\t\ttext.includes(\"press\")\n\t\t\t\t);\n\t\t\t};\n\t\t\ttry {\n\t\t\t\treturn Boolean(\n\t\t\t\t\tawait (__avLegacyValidate as any)(runtime, message, state, options),\n\t\t\t\t);\n\t\t\t} catch {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t};\n\t\ttry {\n\t\t\treturn Boolean(\n\t\t\t\tawait (__avLegacyValidate as any)(runtime, message, state, options),\n\t\t\t);\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t},\n\n\thandler: async (\n\t\truntime: IAgentRuntime,\n\t\tmessage: Memory,\n\t\t_state?: State,\n\t\t_options?: HandlerOptions,\n\t\tcallback?: HandlerCallback,\n\t\t_responses?: Memory[],\n\t): Promise<ActionResult | undefined> => {\n\t\tconst service = runtime.getService<BrowserService>(ServiceType.BROWSER);\n\t\tif (!service) {\n\t\t\tconst error = new ServiceNotAvailableError();\n\t\t\thandleBrowserError(\n\t\t\t\terror,\n\t\t\t\tcallback as (content: {\n\t\t\t\t\ttext: string;\n\t\t\t\t\terror?: boolean;\n\t\t\t\t}) => Promise<unknown>,\n\t\t\t\t\"click on element\",\n\t\t\t);\n\t\t\treturn {\n\t\t\t\ttext: \"Browser service is not available\",\n\t\t\t\tsuccess: false,\n\t\t\t\tdata: {\n\t\t\t\t\tactionName: \"BROWSER_CLICK\",\n\t\t\t\t\terror: \"service_not_available\",\n\t\t\t\t},\n\t\t\t\tvalues: {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terrorType: \"service_not_available\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tconst session = await service.getOrCreateSession();\n\t\tif (!session) {\n\t\t\tconst error = new SessionError(\"No active browser session\");\n\t\t\thandleBrowserError(\n\t\t\t\terror,\n\t\t\t\tcallback as (content: {\n\t\t\t\t\ttext: string;\n\t\t\t\t\terror?: boolean;\n\t\t\t\t}) => Promise<unknown>,\n\t\t\t\t\"click on element\",\n\t\t\t);\n\t\t\treturn {\n\t\t\t\ttext: \"No active browser session\",\n\t\t\t\tsuccess: false,\n\t\t\t\tdata: {\n\t\t\t\t\tactionName: \"BROWSER_CLICK\",\n\t\t\t\t\terror: \"no_session\",\n\t\t\t\t},\n\t\t\t\tvalues: {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terrorType: \"no_session\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tconst text = message.content?.text ?? \"\";\n\t\tconst match = text.match(/click (?:on |the )?(.+)$/i);\n\t\tconst description = match ? match[1] : \"element\";\n\n\t\tconst result = await service.getClient().click(session.id, description);\n\t\tif (!result.success) {\n\t\t\tthrow new ActionError(\n\t\t\t\t\"click\",\n\t\t\t\tdescription,\n\t\t\t\tnew Error(result.error ?? \"Click failed\"),\n\t\t\t);\n\t\t}\n\n\t\tconst responseContent: Content = {\n\t\t\ttext: `I've successfully clicked on \"${description}\"`,\n\t\t\tactions: [\"BROWSER_CLICK\"],\n\t\t\tsource: message.content?.source ?? \"action\",\n\t\t};\n\n\t\tawait callback?.(responseContent);\n\n\t\treturn {\n\t\t\ttext: responseContent.text ?? \"\",\n\t\t\tsuccess: true,\n\t\t\tdata: {\n\t\t\t\tactionName: \"BROWSER_CLICK\",\n\t\t\t\telement: description,\n\t\t\t\tsessionId: session.id,\n\t\t\t},\n\t\t\tvalues: {\n\t\t\t\tsuccess: true,\n\t\t\t\telement: description,\n\t\t\t},\n\t\t};\n\t},\n\n\texamples: [\n\t\t[\n\t\t\t{\n\t\t\t\tname: \"{{user}}\",\n\t\t\t\tcontent: { text: \"Click on the search button\" },\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"{{agent}}\",\n\t\t\t\tcontent: {\n\t\t\t\t\ttext: \"I've clicked on the search button.\",\n\t\t\t\t\tactions: [\"BROWSER_CLICK\"],\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t],\n};\n"]}
@@ -1,3 +0,0 @@
1
- import type { Action } from "@elizaos/core";
2
- export declare const browserExtractAction: Action;
3
- //# sourceMappingURL=extract.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/actions/extract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,MAAM,EAQN,MAAM,eAAe,CAAC;AAUvB,eAAO,MAAM,oBAAoB,EAAE,MAmPlC,CAAC"}