@elizaos/plugin-browser 2.0.0-beta.1 → 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.
- package/LICENSE +21 -0
- package/README.md +106 -64
- package/dist/actions/browser-autofill-login.d.ts.map +1 -1
- package/dist/actions/browser-autofill-login.js.map +1 -1
- package/dist/actions/browser.d.ts +5 -6
- package/dist/actions/browser.d.ts.map +1 -1
- package/dist/actions/browser.js +54 -59
- package/dist/actions/browser.js.map +1 -1
- package/dist/actions/manage-browser-bridge.d.ts.map +1 -1
- package/dist/actions/manage-browser-bridge.js +10 -14
- package/dist/actions/manage-browser-bridge.js.map +1 -1
- package/dist/bridge-policy.d.ts +10 -0
- package/dist/bridge-policy.d.ts.map +1 -0
- package/dist/bridge-policy.js +37 -0
- package/dist/bridge-policy.js.map +1 -0
- package/dist/bridge-readiness.d.ts +16 -0
- package/dist/bridge-readiness.d.ts.map +1 -0
- package/dist/bridge-readiness.js +82 -0
- package/dist/bridge-readiness.js.map +1 -0
- package/dist/bridge-records.d.ts +9 -0
- package/dist/bridge-records.d.ts.map +1 -0
- package/dist/bridge-records.js +37 -0
- package/dist/bridge-records.js.map +1 -0
- package/dist/browser-capture-hooks.d.ts +9 -0
- package/dist/browser-capture-hooks.d.ts.map +1 -0
- package/dist/browser-capture-hooks.js +15 -0
- package/dist/browser-capture-hooks.js.map +1 -0
- package/dist/browser-service.d.ts +22 -4
- package/dist/browser-service.d.ts.map +1 -1
- package/dist/browser-service.js +63 -15
- package/dist/browser-service.js.map +1 -1
- package/dist/browser-workspace-hooks.d.ts +14 -0
- package/dist/browser-workspace-hooks.d.ts.map +1 -0
- package/dist/browser-workspace-hooks.js +15 -0
- package/dist/browser-workspace-hooks.js.map +1 -0
- package/dist/companion-auth.d.ts +34 -0
- package/dist/companion-auth.d.ts.map +1 -0
- package/dist/companion-auth.js +98 -0
- package/dist/companion-auth.js.map +1 -0
- package/dist/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +46 -11
- package/dist/index.js.map +1 -1
- package/dist/message-adapter.d.ts +9 -0
- package/dist/message-adapter.d.ts.map +1 -0
- package/dist/message-adapter.js +104 -0
- package/dist/message-adapter.js.map +1 -0
- package/dist/packaging.d.ts.map +1 -1
- package/dist/packaging.js +2 -0
- package/dist/packaging.js.map +1 -1
- package/dist/password-manager-bridge.d.ts +50 -0
- package/dist/password-manager-bridge.d.ts.map +1 -0
- package/dist/password-manager-bridge.js +437 -0
- package/dist/password-manager-bridge.js.map +1 -0
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +8 -4
- package/dist/plugin.js.map +1 -1
- package/dist/providers/workspace.d.ts +1 -1
- package/dist/providers/workspace.js.map +1 -1
- package/dist/routes/bridge.d.ts.map +1 -1
- package/dist/routes/bridge.js +63 -14
- package/dist/routes/bridge.js.map +1 -1
- package/dist/routes/workspace-setup.d.ts.map +1 -1
- package/dist/routes/workspace-setup.js +1 -1
- package/dist/routes/workspace-setup.js.map +1 -1
- package/dist/routes/workspace.d.ts +1 -2
- package/dist/routes/workspace.d.ts.map +1 -1
- package/dist/routes/workspace.js +63 -3
- package/dist/routes/workspace.js.map +1 -1
- package/dist/schema.d.ts +2 -2
- package/dist/schema.js.map +1 -1
- package/dist/service.d.ts +1 -1
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js.map +1 -1
- package/dist/targets/bridge-target.d.ts +1 -1
- package/dist/targets/bridge-target.d.ts.map +1 -1
- package/dist/targets/bridge-target.js.map +1 -1
- package/dist/targets/stagehand-target.d.ts +3 -0
- package/dist/targets/stagehand-target.d.ts.map +1 -0
- package/dist/targets/stagehand-target.js +187 -0
- package/dist/targets/stagehand-target.js.map +1 -0
- package/dist/workspace/browser-capture.d.ts +1 -1
- package/dist/workspace/browser-capture.js.map +1 -1
- package/dist/workspace/browser-workspace-desktop.d.ts +1 -1
- package/dist/workspace/browser-workspace-desktop.d.ts.map +1 -1
- package/dist/workspace/browser-workspace-desktop.js +47 -25
- package/dist/workspace/browser-workspace-desktop.js.map +1 -1
- package/dist/workspace/browser-workspace-forms.d.ts.map +1 -1
- package/dist/workspace/browser-workspace-forms.js +1 -1
- package/dist/workspace/browser-workspace-forms.js.map +1 -1
- package/dist/workspace/browser-workspace-helpers.d.ts +7 -0
- package/dist/workspace/browser-workspace-helpers.d.ts.map +1 -1
- package/dist/workspace/browser-workspace-helpers.js +37 -0
- package/dist/workspace/browser-workspace-helpers.js.map +1 -1
- package/dist/workspace/browser-workspace-network.d.ts +1 -1
- package/dist/workspace/browser-workspace-network.d.ts.map +1 -1
- package/dist/workspace/browser-workspace-types.d.ts +15 -0
- package/dist/workspace/browser-workspace-types.d.ts.map +1 -1
- package/dist/workspace/browser-workspace-types.js.map +1 -1
- package/dist/workspace/browser-workspace-web.d.ts.map +1 -1
- package/dist/workspace/browser-workspace-web.js +15 -88
- package/dist/workspace/browser-workspace-web.js.map +1 -1
- package/dist/workspace/browser-workspace.d.ts +1 -1
- package/dist/workspace/browser-workspace.d.ts.map +1 -1
- package/dist/workspace/browser-workspace.js +9 -4
- package/dist/workspace/browser-workspace.js.map +1 -1
- package/package.json +28 -7
- package/dist/actions/browser-autofill-login.d.js +0 -1
- package/dist/actions/browser-autofill-login.d.js.map +0 -1
- package/dist/actions/browser.d.js +0 -1
- package/dist/actions/browser.d.js.map +0 -1
- package/dist/actions/manage-browser-bridge.d.js +0 -1
- package/dist/actions/manage-browser-bridge.d.js.map +0 -1
- package/dist/ambient-jsdom.d.js +0 -1
- package/dist/ambient-jsdom.d.js.map +0 -1
- package/dist/browser-service.d.js +0 -1
- package/dist/browser-service.d.js.map +0 -1
- package/dist/contracts.d.js +0 -1
- package/dist/contracts.d.js.map +0 -1
- package/dist/index.d.js +0 -21
- package/dist/index.d.js.map +0 -1
- package/dist/lifeops-session-contracts.d.js +0 -1
- package/dist/lifeops-session-contracts.d.js.map +0 -1
- package/dist/packaging.d.js +0 -1
- package/dist/packaging.d.js.map +0 -1
- package/dist/plugin.d.js +0 -1
- package/dist/plugin.d.js.map +0 -1
- package/dist/providers/workspace.d.js +0 -1
- package/dist/providers/workspace.d.js.map +0 -1
- package/dist/routes/bridge.d.js +0 -1
- package/dist/routes/bridge.d.js.map +0 -1
- package/dist/routes/workspace-account-gate.d.js +0 -1
- package/dist/routes/workspace-account-gate.d.js.map +0 -1
- package/dist/routes/workspace-setup.d.js +0 -1
- package/dist/routes/workspace-setup.d.js.map +0 -1
- package/dist/routes/workspace.d.js +0 -1
- package/dist/routes/workspace.d.js.map +0 -1
- package/dist/schema.d.js +0 -1
- package/dist/schema.d.js.map +0 -1
- package/dist/service.d.js +0 -1
- package/dist/service.d.js.map +0 -1
- package/dist/targets/bridge-target.d.js +0 -1
- package/dist/targets/bridge-target.d.js.map +0 -1
- package/dist/workspace/browser-capture.d.js +0 -1
- package/dist/workspace/browser-capture.d.js.map +0 -1
- package/dist/workspace/browser-workspace-desktop.d.js +0 -1
- package/dist/workspace/browser-workspace-desktop.d.js.map +0 -1
- package/dist/workspace/browser-workspace-elements.d.js +0 -1
- package/dist/workspace/browser-workspace-elements.d.js.map +0 -1
- package/dist/workspace/browser-workspace-forms.d.js +0 -1
- package/dist/workspace/browser-workspace-forms.d.js.map +0 -1
- package/dist/workspace/browser-workspace-helpers.d.js +0 -1
- package/dist/workspace/browser-workspace-helpers.d.js.map +0 -1
- package/dist/workspace/browser-workspace-jsdom.d.js +0 -1
- package/dist/workspace/browser-workspace-jsdom.d.js.map +0 -1
- package/dist/workspace/browser-workspace-network.d.js +0 -1
- package/dist/workspace/browser-workspace-network.d.js.map +0 -1
- package/dist/workspace/browser-workspace-snapshots.d.js +0 -1
- package/dist/workspace/browser-workspace-snapshots.d.js.map +0 -1
- package/dist/workspace/browser-workspace-state.d.js +0 -1
- package/dist/workspace/browser-workspace-state.d.js.map +0 -1
- package/dist/workspace/browser-workspace-types.d.js +0 -1
- package/dist/workspace/browser-workspace-types.d.js.map +0 -1
- package/dist/workspace/browser-workspace-web.d.js +0 -1
- package/dist/workspace/browser-workspace-web.d.js.map +0 -1
- package/dist/workspace/browser-workspace.d.js +0 -11
- package/dist/workspace/browser-workspace.d.js.map +0 -1
- package/dist/workspace/index.d.js +0 -3
- package/dist/workspace/index.d.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/routes/workspace.ts"],"sourcesContent":["/**\n * Browser workspace HTTP routes.\n *\n * The runtime mounts these via `Plugin.routes` with `rawPath: true` so the\n * legacy `/api/browser-workspace/*` paths are preserved. Implementation\n * lives in `@elizaos/plugin-browser/workspace`; this is the HTTP edge.\n */\n\nimport type { RouteRequestContext } from \"@elizaos/core\";\nimport type { IAgentRuntime } from \"@elizaos/core\";\nimport {\n type BrowserWorkspaceCommand,\n closeBrowserWorkspaceTab,\n evaluateBrowserWorkspaceTab,\n executeBrowserWorkspaceCommand,\n getBrowserWorkspaceSnapshot,\n getBrowserWorkspaceUnavailableMessage,\n hideBrowserWorkspaceTab,\n listBrowserWorkspaceTabs,\n navigateBrowserWorkspaceTab,\n openBrowserWorkspaceTab,\n showBrowserWorkspaceTab,\n snapshotBrowserWorkspaceTab,\n} from \"../workspace/index.js\";\nimport {\n assertBrowserWorkspaceCommandConnectorAccountGate,\n assertBrowserWorkspaceConnectorAccountGate,\n} from \"./workspace-account-gate.js\";\n\ntype OpenBrowserWorkspaceBody = {\n url?: string;\n title?: string;\n show?: boolean;\n partition?: string;\n connectorProvider?: string;\n connectorAccountId?: string;\n kind?: \"internal\" | \"standard\";\n width?: number;\n height?: number;\n};\n\ntype NavigateBrowserWorkspaceBody = {\n url?: string;\n partition?: string;\n connectorProvider?: string;\n connectorAccountId?: string;\n};\n\ntype EvaluateBrowserWorkspaceBody = {\n script?: string;\n partition?: string;\n connectorProvider?: string;\n connectorAccountId?: string;\n};\n\ntype BrowserWorkspaceCommandBody = BrowserWorkspaceCommand;\ntype BrowserWorkspaceConnectorReference = {\n partition?: string | null;\n connectorProvider?: string | null;\n connectorAccountId?: string | null;\n};\n\nexport interface BrowserWorkspaceRouteContext extends RouteRequestContext {\n url?: URL;\n state?: {\n runtime?: IAgentRuntime | null;\n };\n}\n\nfunction statusFromBrowserWorkspaceError(\n error: unknown,\n message: string,\n): number {\n if (\n error instanceof Error &&\n \"status\" in error &&\n typeof error.status === \"number\"\n ) {\n return error.status;\n }\n if (message.includes(getBrowserWorkspaceUnavailableMessage())) {\n return 503;\n }\n if (message.includes(\"only available in the desktop app\")) {\n return 409;\n }\n if (message.includes(\"failed (404)\")) {\n return 404;\n }\n if (message.includes(\"failed (409)\")) {\n return 409;\n }\n return 500;\n}\n\nfunction connectorReferenceFromSearchParams(\n url: URL | undefined,\n): BrowserWorkspaceConnectorReference {\n return {\n connectorProvider: url?.searchParams.get(\"connectorProvider\"),\n connectorAccountId: url?.searchParams.get(\"connectorAccountId\"),\n partition: url?.searchParams.get(\"partition\"),\n };\n}\n\nasync function assertBrowserWorkspaceTabConnectorAccountGate(\n ctx: BrowserWorkspaceRouteContext,\n tabId: string,\n reference: BrowserWorkspaceConnectorReference,\n operation: string,\n): Promise<void> {\n const tabs = await listBrowserWorkspaceTabs();\n const tab = tabs.find((entry) => entry.id === tabId) ?? null;\n await assertBrowserWorkspaceConnectorAccountGate({\n runtime: ctx.state?.runtime ?? null,\n connectorProvider: reference.connectorProvider,\n connectorAccountId: reference.connectorAccountId,\n partition: tab?.partition ?? reference.partition,\n operation,\n });\n}\n\nexport async function handleBrowserWorkspaceRoutes(\n ctx: BrowserWorkspaceRouteContext,\n): Promise<boolean> {\n const { req, res, method, pathname, readJsonBody, json } = ctx;\n\n if (\n pathname !== \"/api/browser-workspace\" &&\n pathname !== \"/api/browser-workspace/command\" &&\n pathname !== \"/api/browser-workspace/tabs\" &&\n !pathname.startsWith(\"/api/browser-workspace/tabs/\")\n ) {\n return false;\n }\n\n try {\n if (pathname === \"/api/browser-workspace\" && method === \"GET\") {\n json(res, await getBrowserWorkspaceSnapshot());\n return true;\n }\n\n if (pathname === \"/api/browser-workspace/command\" && method === \"POST\") {\n const body =\n (await readJsonBody<BrowserWorkspaceCommandBody>(req, res)) ?? null;\n if (!body?.subaction) {\n json(res, { error: \"subaction is required\" }, 400);\n return true;\n }\n await assertBrowserWorkspaceCommandConnectorAccountGate({\n runtime: ctx.state?.runtime ?? null,\n command: body,\n operation: \"browser workspace command\",\n });\n json(res, await executeBrowserWorkspaceCommand(body));\n return true;\n }\n\n if (pathname === \"/api/browser-workspace/tabs\" && method === \"GET\") {\n json(res, { tabs: await listBrowserWorkspaceTabs() });\n return true;\n }\n\n if (pathname === \"/api/browser-workspace/tabs\" && method === \"POST\") {\n const body =\n (await readJsonBody<OpenBrowserWorkspaceBody>(req, res)) ?? {};\n const connectorGate = await assertBrowserWorkspaceConnectorAccountGate({\n runtime: ctx.state?.runtime ?? null,\n connectorProvider: body.connectorProvider,\n connectorAccountId: body.connectorAccountId,\n partition: body.partition,\n operation: \"open browser workspace tab\",\n });\n json(res, {\n tab: await openBrowserWorkspaceTab({\n ...body,\n partition: connectorGate?.expectedPartition ?? body.partition,\n }),\n });\n return true;\n }\n\n const match = pathname.match(\n /^\\/api\\/browser-workspace\\/tabs\\/([^/]+)(?:\\/(navigate|eval|show|hide|snapshot))?$/,\n );\n if (!match) {\n return false;\n }\n\n const tabId = decodeURIComponent(match[1]).trim();\n const action = match[2] ?? null;\n\n if (!action && method === \"DELETE\") {\n await assertBrowserWorkspaceTabConnectorAccountGate(\n ctx,\n tabId,\n connectorReferenceFromSearchParams(ctx.url),\n \"close browser workspace tab\",\n );\n const closed = await closeBrowserWorkspaceTab(tabId);\n json(\n res,\n closed ? { closed: true } : { closed: false },\n closed ? 200 : 404,\n );\n return true;\n }\n\n if (action === \"show\" && method === \"POST\") {\n await assertBrowserWorkspaceTabConnectorAccountGate(\n ctx,\n tabId,\n connectorReferenceFromSearchParams(ctx.url),\n \"show browser workspace tab\",\n );\n json(res, { tab: await showBrowserWorkspaceTab(tabId) });\n return true;\n }\n\n if (action === \"hide\" && method === \"POST\") {\n await assertBrowserWorkspaceTabConnectorAccountGate(\n ctx,\n tabId,\n connectorReferenceFromSearchParams(ctx.url),\n \"hide browser workspace tab\",\n );\n json(res, { tab: await hideBrowserWorkspaceTab(tabId) });\n return true;\n }\n\n if (action === \"snapshot\" && method === \"GET\") {\n await assertBrowserWorkspaceTabConnectorAccountGate(\n ctx,\n tabId,\n connectorReferenceFromSearchParams(ctx.url),\n \"snapshot browser workspace tab\",\n );\n json(res, await snapshotBrowserWorkspaceTab(tabId));\n return true;\n }\n\n if (action === \"navigate\" && method === \"POST\") {\n const body = await readJsonBody<NavigateBrowserWorkspaceBody>(req, res);\n if (!body?.url?.trim()) {\n json(res, { error: \"url is required\" }, 400);\n return true;\n }\n await assertBrowserWorkspaceTabConnectorAccountGate(\n ctx,\n tabId,\n body,\n \"navigate browser workspace tab\",\n );\n json(res, {\n tab: await navigateBrowserWorkspaceTab({\n id: tabId,\n url: body.url,\n }),\n });\n return true;\n }\n\n if (action === \"eval\" && method === \"POST\") {\n const body = await readJsonBody<EvaluateBrowserWorkspaceBody>(req, res);\n if (!body?.script?.trim()) {\n json(res, { error: \"script is required\" }, 400);\n return true;\n }\n await assertBrowserWorkspaceTabConnectorAccountGate(\n ctx,\n tabId,\n body,\n \"evaluate browser workspace tab\",\n );\n json(res, {\n result: await evaluateBrowserWorkspaceTab({\n id: tabId,\n script: body.script,\n }),\n });\n return true;\n }\n\n return false;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const status = statusFromBrowserWorkspaceError(error, message);\n json(res, { error: message }, status);\n return true;\n }\n}\n\nexport const BROWSER_WORKSPACE_ROUTE_PATHS: Array<{\n type: string;\n path: string;\n}> = [\n { type: \"GET\", path: \"/api/browser-workspace\" },\n { type: \"POST\", path: \"/api/browser-workspace/command\" },\n { type: \"GET\", path: \"/api/browser-workspace/tabs\" },\n { type: \"POST\", path: \"/api/browser-workspace/tabs\" },\n { type: \"DELETE\", path: \"/api/browser-workspace/tabs/:tabId\" },\n { type: \"POST\", path: \"/api/browser-workspace/tabs/:tabId/show\" },\n { type: \"POST\", path: \"/api/browser-workspace/tabs/:tabId/hide\" },\n { type: \"GET\", path: \"/api/browser-workspace/tabs/:tabId/snapshot\" },\n { type: \"POST\", path: \"/api/browser-workspace/tabs/:tabId/navigate\" },\n { type: \"POST\", path: \"/api/browser-workspace/tabs/:tabId/eval\" },\n];\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/routes/workspace.ts"],"sourcesContent":["/**\n * Browser workspace HTTP routes.\n *\n * The runtime mounts these via `Plugin.routes` with `rawPath: true` so the\n * legacy `/api/browser-workspace/*` paths are preserved. Implementation\n * lives in `@elizaos/plugin-browser/workspace`; this is the HTTP edge.\n */\n\nimport type { IAgentRuntime, RouteRequestContext } from \"@elizaos/core\";\nimport { requestBrowserWorkspace } from \"../workspace/browser-workspace-desktop.js\";\nimport { assertBrowserWorkspaceUserScriptAllowed } from \"../workspace/browser-workspace-helpers.js\";\nimport type { BrowserWorkspaceEventLogSnapshot } from \"../workspace/browser-workspace-types.js\";\nimport {\n type BrowserWorkspaceCommand,\n closeBrowserWorkspaceTab,\n evaluateBrowserWorkspaceTab,\n executeBrowserWorkspaceCommand,\n getBrowserWorkspaceSnapshot,\n getBrowserWorkspaceUnavailableMessage,\n hideBrowserWorkspaceTab,\n isBrowserWorkspaceBridgeConfigured,\n listBrowserWorkspaceTabs,\n navigateBrowserWorkspaceTab,\n openBrowserWorkspaceTab,\n showBrowserWorkspaceTab,\n snapshotBrowserWorkspaceTab,\n} from \"../workspace/index.js\";\nimport {\n assertBrowserWorkspaceCommandConnectorAccountGate,\n assertBrowserWorkspaceConnectorAccountGate,\n} from \"./workspace-account-gate.js\";\n\ntype OpenBrowserWorkspaceBody = {\n url?: string;\n title?: string;\n show?: boolean;\n partition?: string;\n connectorProvider?: string;\n connectorAccountId?: string;\n kind?: \"internal\" | \"standard\";\n width?: number;\n height?: number;\n};\n\ntype NavigateBrowserWorkspaceBody = {\n url?: string;\n partition?: string;\n connectorProvider?: string;\n connectorAccountId?: string;\n};\n\ntype EvaluateBrowserWorkspaceBody = {\n script?: string;\n partition?: string;\n connectorProvider?: string;\n connectorAccountId?: string;\n};\n\ntype BrowserWorkspaceCommandBody = BrowserWorkspaceCommand;\ntype BrowserWorkspaceConnectorReference = {\n partition?: string | null;\n connectorProvider?: string | null;\n connectorAccountId?: string | null;\n};\n\nexport interface BrowserWorkspaceRouteContext extends RouteRequestContext {\n url?: URL;\n state?: {\n runtime?: IAgentRuntime | null;\n };\n}\n\nfunction statusFromBrowserWorkspaceError(\n error: unknown,\n message: string,\n): number {\n if (\n error instanceof Error &&\n \"status\" in error &&\n typeof error.status === \"number\"\n ) {\n return error.status;\n }\n if (message.includes(getBrowserWorkspaceUnavailableMessage())) {\n return 503;\n }\n if (message.includes(\"only available in the desktop app\")) {\n return 409;\n }\n if (message.includes(\"failed (404)\")) {\n return 404;\n }\n if (message.includes(\"failed (409)\")) {\n return 409;\n }\n return 500;\n}\n\nfunction connectorReferenceFromSearchParams(\n url: URL | undefined,\n): BrowserWorkspaceConnectorReference {\n return {\n connectorProvider: url?.searchParams.get(\"connectorProvider\"),\n connectorAccountId: url?.searchParams.get(\"connectorAccountId\"),\n partition: url?.searchParams.get(\"partition\"),\n };\n}\n\nfunction buildBrowserWorkspaceEventsBridgePath(url: URL | undefined): string {\n const params = new URLSearchParams();\n for (const key of [\"after\", \"limit\", \"tabId\", \"type\"]) {\n const value = url?.searchParams.get(key)?.trim();\n if (value) {\n params.set(key, value);\n }\n }\n const query = params.toString();\n return query ? `/events?${query}` : \"/events\";\n}\n\nfunction isBrowserWorkspaceRouteBodyObject(\n value: unknown,\n): value is Record<string, unknown> {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\nfunction rejectMalformedBrowserWorkspacePayload(\n ctx: BrowserWorkspaceRouteContext,\n): true {\n ctx.json(ctx.res, { error: \"request body must be a JSON object\" }, 400);\n return true;\n}\n\nfunction decodeBrowserWorkspaceTabId(raw: string | undefined): string | null {\n if (typeof raw !== \"string\") return null;\n try {\n const decoded = decodeURIComponent(raw).trim();\n return decoded ? decoded : null;\n } catch {\n return null;\n }\n}\n\nasync function assertBrowserWorkspaceTabConnectorAccountGate(\n ctx: BrowserWorkspaceRouteContext,\n tabId: string,\n reference: BrowserWorkspaceConnectorReference,\n operation: string,\n): Promise<void> {\n const tabs = await listBrowserWorkspaceTabs();\n const tab = tabs.find((entry) => entry.id === tabId) ?? null;\n await assertBrowserWorkspaceConnectorAccountGate({\n runtime: ctx.state?.runtime ?? null,\n connectorProvider: reference.connectorProvider,\n connectorAccountId: reference.connectorAccountId,\n partition: tab?.partition ?? reference.partition,\n operation,\n });\n}\n\nexport async function handleBrowserWorkspaceRoutes(\n ctx: BrowserWorkspaceRouteContext,\n): Promise<boolean> {\n const { req, res, method, pathname, readJsonBody, json } = ctx;\n\n if (\n pathname !== \"/api/browser-workspace\" &&\n pathname !== \"/api/browser-workspace/command\" &&\n pathname !== \"/api/browser-workspace/events\" &&\n pathname !== \"/api/browser-workspace/tabs\" &&\n !pathname.startsWith(\"/api/browser-workspace/tabs/\")\n ) {\n return false;\n }\n\n try {\n if (pathname === \"/api/browser-workspace\" && method === \"GET\") {\n json(res, await getBrowserWorkspaceSnapshot());\n return true;\n }\n\n if (pathname === \"/api/browser-workspace/events\" && method === \"GET\") {\n if (!isBrowserWorkspaceBridgeConfigured()) {\n throw new Error(getBrowserWorkspaceUnavailableMessage());\n }\n json(\n res,\n await requestBrowserWorkspace<BrowserWorkspaceEventLogSnapshot>(\n buildBrowserWorkspaceEventsBridgePath(ctx.url),\n ),\n );\n return true;\n }\n\n if (pathname === \"/api/browser-workspace/command\" && method === \"POST\") {\n const body =\n (await readJsonBody<BrowserWorkspaceCommandBody>(req, res)) ?? null;\n if (!isBrowserWorkspaceRouteBodyObject(body)) {\n return rejectMalformedBrowserWorkspacePayload(ctx);\n }\n if (!body?.subaction) {\n json(res, { error: \"subaction is required\" }, 400);\n return true;\n }\n await assertBrowserWorkspaceCommandConnectorAccountGate({\n runtime: ctx.state?.runtime ?? null,\n command: body,\n operation: \"browser workspace command\",\n });\n json(res, await executeBrowserWorkspaceCommand(body));\n return true;\n }\n\n if (pathname === \"/api/browser-workspace/tabs\" && method === \"GET\") {\n json(res, { tabs: await listBrowserWorkspaceTabs() });\n return true;\n }\n\n if (pathname === \"/api/browser-workspace/tabs\" && method === \"POST\") {\n const body =\n (await readJsonBody<OpenBrowserWorkspaceBody>(req, res)) ?? null;\n if (!isBrowserWorkspaceRouteBodyObject(body)) {\n return rejectMalformedBrowserWorkspacePayload(ctx);\n }\n const connectorGate = await assertBrowserWorkspaceConnectorAccountGate({\n runtime: ctx.state?.runtime ?? null,\n connectorProvider: body.connectorProvider,\n connectorAccountId: body.connectorAccountId,\n partition: body.partition,\n operation: \"open browser workspace tab\",\n });\n json(res, {\n tab: await openBrowserWorkspaceTab({\n ...body,\n partition: connectorGate?.expectedPartition ?? body.partition,\n }),\n });\n return true;\n }\n\n const match = pathname.match(\n /^\\/api\\/browser-workspace\\/tabs\\/([^/]+)(?:\\/(navigate|eval|show|hide|snapshot))?$/,\n );\n if (!match) {\n return false;\n }\n\n const tabId = decodeBrowserWorkspaceTabId(match[1]);\n if (!tabId) {\n json(res, { error: \"valid tab id is required\" }, 400);\n return true;\n }\n const action = match[2] ?? null;\n\n if (!action && method === \"DELETE\") {\n await assertBrowserWorkspaceTabConnectorAccountGate(\n ctx,\n tabId,\n connectorReferenceFromSearchParams(ctx.url),\n \"close browser workspace tab\",\n );\n const closed = await closeBrowserWorkspaceTab(tabId);\n json(\n res,\n closed ? { closed: true } : { closed: false },\n closed ? 200 : 404,\n );\n return true;\n }\n\n if (action === \"show\" && method === \"POST\") {\n await assertBrowserWorkspaceTabConnectorAccountGate(\n ctx,\n tabId,\n connectorReferenceFromSearchParams(ctx.url),\n \"show browser workspace tab\",\n );\n json(res, { tab: await showBrowserWorkspaceTab(tabId) });\n return true;\n }\n\n if (action === \"hide\" && method === \"POST\") {\n await assertBrowserWorkspaceTabConnectorAccountGate(\n ctx,\n tabId,\n connectorReferenceFromSearchParams(ctx.url),\n \"hide browser workspace tab\",\n );\n json(res, { tab: await hideBrowserWorkspaceTab(tabId) });\n return true;\n }\n\n if (action === \"snapshot\" && method === \"GET\") {\n await assertBrowserWorkspaceTabConnectorAccountGate(\n ctx,\n tabId,\n connectorReferenceFromSearchParams(ctx.url),\n \"snapshot browser workspace tab\",\n );\n json(res, await snapshotBrowserWorkspaceTab(tabId));\n return true;\n }\n\n if (action === \"navigate\" && method === \"POST\") {\n const body = await readJsonBody<NavigateBrowserWorkspaceBody>(req, res);\n if (!isBrowserWorkspaceRouteBodyObject(body)) {\n return rejectMalformedBrowserWorkspacePayload(ctx);\n }\n if (!body?.url?.trim()) {\n json(res, { error: \"url is required\" }, 400);\n return true;\n }\n await assertBrowserWorkspaceTabConnectorAccountGate(\n ctx,\n tabId,\n body,\n \"navigate browser workspace tab\",\n );\n json(res, {\n tab: await navigateBrowserWorkspaceTab({\n id: tabId,\n url: body.url,\n }),\n });\n return true;\n }\n\n if (action === \"eval\" && method === \"POST\") {\n const body = await readJsonBody<EvaluateBrowserWorkspaceBody>(req, res);\n if (!isBrowserWorkspaceRouteBodyObject(body)) {\n return rejectMalformedBrowserWorkspacePayload(ctx);\n }\n if (!body?.script?.trim()) {\n json(res, { error: \"script is required\" }, 400);\n return true;\n }\n await assertBrowserWorkspaceTabConnectorAccountGate(\n ctx,\n tabId,\n body,\n \"evaluate browser workspace tab\",\n );\n assertBrowserWorkspaceUserScriptAllowed(body.script, \"eval\", \"desktop\");\n json(res, {\n result: await evaluateBrowserWorkspaceTab({\n id: tabId,\n script: body.script,\n }),\n });\n return true;\n }\n\n return false;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const status = statusFromBrowserWorkspaceError(error, message);\n json(res, { error: message }, status);\n return true;\n }\n}\n\nexport const BROWSER_WORKSPACE_ROUTE_PATHS: Array<{\n type: string;\n path: string;\n}> = [\n { type: \"GET\", path: \"/api/browser-workspace\" },\n { type: \"POST\", path: \"/api/browser-workspace/command\" },\n { type: \"GET\", path: \"/api/browser-workspace/events\" },\n { type: \"GET\", path: \"/api/browser-workspace/tabs\" },\n { type: \"POST\", path: \"/api/browser-workspace/tabs\" },\n { type: \"DELETE\", path: \"/api/browser-workspace/tabs/:tabId\" },\n { type: \"POST\", path: \"/api/browser-workspace/tabs/:tabId/show\" },\n { type: \"POST\", path: \"/api/browser-workspace/tabs/:tabId/hide\" },\n { type: \"GET\", path: \"/api/browser-workspace/tabs/:tabId/snapshot\" },\n { type: \"POST\", path: \"/api/browser-workspace/tabs/:tabId/navigate\" },\n { type: \"POST\", path: \"/api/browser-workspace/tabs/:tabId/eval\" },\n];\n"],"mappings":"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","names":[]}
|
package/dist/schema.d.ts
CHANGED
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
* Migrations are applied via elizaOS plugin-sql's `runPluginMigrations`
|
|
18
18
|
* when the plugin's `schema` field is populated and an appropriate
|
|
19
19
|
* migration strategy is selected. Renaming the old `life_browser_*`
|
|
20
|
-
* tables to `browser_bridge_*` is a destructive migration
|
|
21
|
-
*
|
|
20
|
+
* tables to `browser_bridge_*` is a destructive migration controlled by
|
|
21
|
+
* plugin-sql's destructive-migration override.
|
|
22
22
|
*/
|
|
23
23
|
export declare const browserPgSchema: import("drizzle-orm/pg-core").PgSchema<"browser">;
|
|
24
24
|
export declare const browserBridgeCompanions: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
package/dist/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schema.ts"],"sourcesContent":["/**\n * Agent Browser Bridge Drizzle schema.\n *\n * The four generic browser tables (`browser_bridge_companions`,\n * `browser_bridge_settings`, `browser_bridge_tabs`,\n * `browser_bridge_page_contexts`) are owned by this plugin. The\n * workflow-bound `life_browser_sessions` table remains in LifeOps because\n * it carries `workflowId` plus LifeOps-only scoping columns.\n *\n * Tables are placed in the `browser` PostgreSQL schema (matches the\n * `deriveSchemaName(\"@elizaos/plugin-browser\")` result used by\n * plugin-sql's runtime migrator) so they no longer trip the\n * \"Plugin table is using public schema\" warning. The runtime migrator\n * issues `CREATE SCHEMA IF NOT EXISTS` automatically before applying\n * migrations.\n *\n * Migrations are applied via elizaOS plugin-sql's `runPluginMigrations`\n * when the plugin's `schema` field is populated and an appropriate\n * migration strategy is selected. Renaming the old `life_browser_*`\n * tables to `browser_bridge_*` is a destructive migration — gate it on\n * `ELIZA_ALLOW_DESTRUCTIVE_MIGRATIONS=true`.\n */\n\nimport {\n boolean,\n index,\n integer,\n pgSchema,\n text,\n unique,\n} from \"drizzle-orm/pg-core\";\n\nexport const browserPgSchema = pgSchema(\"browser\");\n\nexport const browserBridgeCompanions = browserPgSchema.table(\n \"browser_bridge_companions\",\n {\n id: text(\"id\").primaryKey(),\n agentId: text(\"agent_id\").notNull(),\n browser: text(\"browser\").notNull(),\n profileId: text(\"profile_id\").notNull(),\n profileLabel: text(\"profile_label\").notNull().default(\"\"),\n label: text(\"label\").notNull().default(\"\"),\n extensionVersion: text(\"extension_version\"),\n connectionState: text(\"connection_state\").notNull().default(\"disconnected\"),\n permissionsJson: text(\"permissions_json\").notNull().default(\"{}\"),\n pairingTokenHash: text(\"pairing_token_hash\"),\n pairingTokenExpiresAt: text(\"pairing_token_expires_at\"),\n pairingTokenRevokedAt: text(\"pairing_token_revoked_at\"),\n pendingPairingTokenHashesJson: text(\"pending_pairing_token_hashes_json\")\n .notNull()\n .default(\"[]\"),\n lastSeenAt: text(\"last_seen_at\"),\n pairedAt: text(\"paired_at\"),\n metadataJson: text(\"metadata_json\").notNull().default(\"{}\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n },\n (t) => [\n unique().on(t.agentId, t.browser, t.profileId),\n index(\"idx_browser_bridge_companions_agent\").on(\n t.agentId,\n t.browser,\n t.updatedAt,\n ),\n ],\n);\n\nexport const browserBridgeSettings = browserPgSchema.table(\n \"browser_bridge_settings\",\n {\n agentId: text(\"agent_id\").primaryKey(),\n enabled: boolean(\"enabled\").notNull().default(false),\n trackingMode: text(\"tracking_mode\").notNull().default(\"current_tab\"),\n allowBrowserControl: boolean(\"allow_browser_control\")\n .notNull()\n .default(false),\n requireConfirmationForAccountAffecting: boolean(\n \"require_confirmation_for_account_affecting\",\n )\n .notNull()\n .default(true),\n incognitoEnabled: boolean(\"incognito_enabled\").notNull().default(false),\n siteAccessMode: text(\"site_access_mode\")\n .notNull()\n .default(\"current_site_only\"),\n grantedOriginsJson: text(\"granted_origins_json\").notNull().default(\"[]\"),\n blockedOriginsJson: text(\"blocked_origins_json\").notNull().default(\"[]\"),\n maxRememberedTabs: integer(\"max_remembered_tabs\").notNull().default(10),\n pauseUntil: text(\"pause_until\"),\n metadataJson: text(\"metadata_json\").notNull().default(\"{}\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n },\n);\n\nexport const browserBridgeTabs = browserPgSchema.table(\n \"browser_bridge_tabs\",\n {\n id: text(\"id\").primaryKey(),\n agentId: text(\"agent_id\").notNull(),\n companionId: text(\"companion_id\"),\n browser: text(\"browser\").notNull(),\n profileId: text(\"profile_id\").notNull(),\n windowId: text(\"window_id\").notNull(),\n tabId: text(\"tab_id\").notNull(),\n url: text(\"url\").notNull().default(\"\"),\n title: text(\"title\").notNull().default(\"\"),\n activeInWindow: boolean(\"active_in_window\").notNull().default(false),\n focusedWindow: boolean(\"focused_window\").notNull().default(false),\n focusedActive: boolean(\"focused_active\").notNull().default(false),\n incognito: boolean(\"incognito\").notNull().default(false),\n faviconUrl: text(\"favicon_url\"),\n lastSeenAt: text(\"last_seen_at\").notNull(),\n lastFocusedAt: text(\"last_focused_at\"),\n metadataJson: text(\"metadata_json\").notNull().default(\"{}\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n },\n (t) => [\n unique().on(t.agentId, t.browser, t.profileId, t.windowId, t.tabId),\n index(\"idx_browser_bridge_tabs_agent\").on(\n t.agentId,\n t.focusedActive,\n t.activeInWindow,\n t.lastSeenAt,\n ),\n ],\n);\n\nexport const browserBridgePageContexts = browserPgSchema.table(\n \"browser_bridge_page_contexts\",\n {\n id: text(\"id\").primaryKey(),\n agentId: text(\"agent_id\").notNull(),\n browser: text(\"browser\").notNull(),\n profileId: text(\"profile_id\").notNull(),\n windowId: text(\"window_id\").notNull(),\n tabId: text(\"tab_id\").notNull(),\n url: text(\"url\").notNull().default(\"\"),\n title: text(\"title\").notNull().default(\"\"),\n selectionText: text(\"selection_text\"),\n mainText: text(\"main_text\"),\n headingsJson: text(\"headings_json\").notNull().default(\"[]\"),\n linksJson: text(\"links_json\").notNull().default(\"[]\"),\n formsJson: text(\"forms_json\").notNull().default(\"[]\"),\n capturedAt: text(\"captured_at\").notNull(),\n metadataJson: text(\"metadata_json\").notNull().default(\"{}\"),\n },\n (t) => [\n unique().on(t.agentId, t.browser, t.profileId, t.windowId, t.tabId),\n index(\"idx_browser_bridge_page_contexts_agent\").on(t.agentId, t.capturedAt),\n ],\n);\n\nexport const browserBridgeSchema = {\n browserBridgeCompanions,\n browserBridgeSettings,\n browserBridgeTabs,\n browserBridgePageContexts,\n} as const;\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/schema.ts"],"sourcesContent":["/**\n * Agent Browser Bridge Drizzle schema.\n *\n * The four generic browser tables (`browser_bridge_companions`,\n * `browser_bridge_settings`, `browser_bridge_tabs`,\n * `browser_bridge_page_contexts`) are owned by this plugin. The\n * workflow-bound `life_browser_sessions` table remains in LifeOps because\n * it carries `workflowId` plus LifeOps-only scoping columns.\n *\n * Tables are placed in the `browser` PostgreSQL schema (matches the\n * `deriveSchemaName(\"@elizaos/plugin-browser\")` result used by\n * plugin-sql's runtime migrator) so they no longer trip the\n * \"Plugin table is using public schema\" warning. The runtime migrator\n * issues `CREATE SCHEMA IF NOT EXISTS` automatically before applying\n * migrations.\n *\n * Migrations are applied via elizaOS plugin-sql's `runPluginMigrations`\n * when the plugin's `schema` field is populated and an appropriate\n * migration strategy is selected. Renaming the old `life_browser_*`\n * tables to `browser_bridge_*` is a destructive migration controlled by\n * plugin-sql's destructive-migration override.\n */\n\nimport {\n boolean,\n index,\n integer,\n pgSchema,\n text,\n unique,\n} from \"drizzle-orm/pg-core\";\n\nexport const browserPgSchema = pgSchema(\"browser\");\n\nexport const browserBridgeCompanions = browserPgSchema.table(\n \"browser_bridge_companions\",\n {\n id: text(\"id\").primaryKey(),\n agentId: text(\"agent_id\").notNull(),\n browser: text(\"browser\").notNull(),\n profileId: text(\"profile_id\").notNull(),\n profileLabel: text(\"profile_label\").notNull().default(\"\"),\n label: text(\"label\").notNull().default(\"\"),\n extensionVersion: text(\"extension_version\"),\n connectionState: text(\"connection_state\").notNull().default(\"disconnected\"),\n permissionsJson: text(\"permissions_json\").notNull().default(\"{}\"),\n pairingTokenHash: text(\"pairing_token_hash\"),\n pairingTokenExpiresAt: text(\"pairing_token_expires_at\"),\n pairingTokenRevokedAt: text(\"pairing_token_revoked_at\"),\n pendingPairingTokenHashesJson: text(\"pending_pairing_token_hashes_json\")\n .notNull()\n .default(\"[]\"),\n lastSeenAt: text(\"last_seen_at\"),\n pairedAt: text(\"paired_at\"),\n metadataJson: text(\"metadata_json\").notNull().default(\"{}\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n },\n (t) => [\n unique().on(t.agentId, t.browser, t.profileId),\n index(\"idx_browser_bridge_companions_agent\").on(\n t.agentId,\n t.browser,\n t.updatedAt,\n ),\n ],\n);\n\nexport const browserBridgeSettings = browserPgSchema.table(\n \"browser_bridge_settings\",\n {\n agentId: text(\"agent_id\").primaryKey(),\n enabled: boolean(\"enabled\").notNull().default(false),\n trackingMode: text(\"tracking_mode\").notNull().default(\"current_tab\"),\n allowBrowserControl: boolean(\"allow_browser_control\")\n .notNull()\n .default(false),\n requireConfirmationForAccountAffecting: boolean(\n \"require_confirmation_for_account_affecting\",\n )\n .notNull()\n .default(true),\n incognitoEnabled: boolean(\"incognito_enabled\").notNull().default(false),\n siteAccessMode: text(\"site_access_mode\")\n .notNull()\n .default(\"current_site_only\"),\n grantedOriginsJson: text(\"granted_origins_json\").notNull().default(\"[]\"),\n blockedOriginsJson: text(\"blocked_origins_json\").notNull().default(\"[]\"),\n maxRememberedTabs: integer(\"max_remembered_tabs\").notNull().default(10),\n pauseUntil: text(\"pause_until\"),\n metadataJson: text(\"metadata_json\").notNull().default(\"{}\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n },\n);\n\nexport const browserBridgeTabs = browserPgSchema.table(\n \"browser_bridge_tabs\",\n {\n id: text(\"id\").primaryKey(),\n agentId: text(\"agent_id\").notNull(),\n companionId: text(\"companion_id\"),\n browser: text(\"browser\").notNull(),\n profileId: text(\"profile_id\").notNull(),\n windowId: text(\"window_id\").notNull(),\n tabId: text(\"tab_id\").notNull(),\n url: text(\"url\").notNull().default(\"\"),\n title: text(\"title\").notNull().default(\"\"),\n activeInWindow: boolean(\"active_in_window\").notNull().default(false),\n focusedWindow: boolean(\"focused_window\").notNull().default(false),\n focusedActive: boolean(\"focused_active\").notNull().default(false),\n incognito: boolean(\"incognito\").notNull().default(false),\n faviconUrl: text(\"favicon_url\"),\n lastSeenAt: text(\"last_seen_at\").notNull(),\n lastFocusedAt: text(\"last_focused_at\"),\n metadataJson: text(\"metadata_json\").notNull().default(\"{}\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n },\n (t) => [\n unique().on(t.agentId, t.browser, t.profileId, t.windowId, t.tabId),\n index(\"idx_browser_bridge_tabs_agent\").on(\n t.agentId,\n t.focusedActive,\n t.activeInWindow,\n t.lastSeenAt,\n ),\n ],\n);\n\nexport const browserBridgePageContexts = browserPgSchema.table(\n \"browser_bridge_page_contexts\",\n {\n id: text(\"id\").primaryKey(),\n agentId: text(\"agent_id\").notNull(),\n browser: text(\"browser\").notNull(),\n profileId: text(\"profile_id\").notNull(),\n windowId: text(\"window_id\").notNull(),\n tabId: text(\"tab_id\").notNull(),\n url: text(\"url\").notNull().default(\"\"),\n title: text(\"title\").notNull().default(\"\"),\n selectionText: text(\"selection_text\"),\n mainText: text(\"main_text\"),\n headingsJson: text(\"headings_json\").notNull().default(\"[]\"),\n linksJson: text(\"links_json\").notNull().default(\"[]\"),\n formsJson: text(\"forms_json\").notNull().default(\"[]\"),\n capturedAt: text(\"captured_at\").notNull(),\n metadataJson: text(\"metadata_json\").notNull().default(\"{}\"),\n },\n (t) => [\n unique().on(t.agentId, t.browser, t.profileId, t.windowId, t.tabId),\n index(\"idx_browser_bridge_page_contexts_agent\").on(t.agentId, t.capturedAt),\n ],\n);\n\nexport const browserBridgeSchema = {\n browserBridgeCompanions,\n browserBridgeSettings,\n browserBridgeTabs,\n browserBridgePageContexts,\n} as const;\n"],"mappings":"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","names":[]}
|
package/dist/service.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Service, UUID } from "@elizaos/core";
|
|
2
|
-
import type { CompleteLifeOpsBrowserSessionRequest, ConfirmLifeOpsBrowserSessionRequest, CreateLifeOpsBrowserSessionRequest, LifeOpsBrowserSession } from "./lifeops-session-contracts.js";
|
|
3
2
|
import type { BrowserBridgeCompanionAutoPairResponse, BrowserBridgeCompanionPairingResponse, BrowserBridgeCompanionRevokeResponse, BrowserBridgeCompanionStatus, BrowserBridgeCompanionSyncResponse, BrowserBridgePageContext, BrowserBridgeSettings, BrowserBridgeTabSummary, CreateBrowserBridgeCompanionAutoPairRequest, CreateBrowserBridgeCompanionPairingRequest, SyncBrowserBridgeStateRequest, UpdateBrowserBridgeSessionProgressRequest, UpdateBrowserBridgeSettingsRequest } from "./contracts.js";
|
|
3
|
+
import type { CompleteLifeOpsBrowserSessionRequest, ConfirmLifeOpsBrowserSessionRequest, CreateLifeOpsBrowserSessionRequest, LifeOpsBrowserSession } from "./lifeops-session-contracts.js";
|
|
4
4
|
export declare const BROWSER_BRIDGE_ROUTE_SERVICE_TYPE = "lifeops_browser_plugin";
|
|
5
5
|
export interface BrowserBridgeRouteService extends Service {
|
|
6
6
|
getBrowserSettings(ownerEntityId?: UUID | null): Promise<BrowserBridgeSettings>;
|
package/dist/service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EACV,
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|
package/dist/service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/service.ts"],"sourcesContent":["import type { Service, UUID } from \"@elizaos/core\";\nimport type {\n
|
|
1
|
+
{"version":3,"sources":["../src/service.ts"],"sourcesContent":["import type { Service, UUID } from \"@elizaos/core\";\nimport type {\n BrowserBridgeCompanionAutoPairResponse,\n BrowserBridgeCompanionPairingResponse,\n BrowserBridgeCompanionRevokeResponse,\n BrowserBridgeCompanionStatus,\n BrowserBridgeCompanionSyncResponse,\n BrowserBridgePageContext,\n BrowserBridgeSettings,\n BrowserBridgeTabSummary,\n CreateBrowserBridgeCompanionAutoPairRequest,\n CreateBrowserBridgeCompanionPairingRequest,\n SyncBrowserBridgeStateRequest,\n UpdateBrowserBridgeSessionProgressRequest,\n UpdateBrowserBridgeSettingsRequest,\n} from \"./contracts.js\";\nimport type {\n CompleteLifeOpsBrowserSessionRequest,\n ConfirmLifeOpsBrowserSessionRequest,\n CreateLifeOpsBrowserSessionRequest,\n LifeOpsBrowserSession,\n} from \"./lifeops-session-contracts.js\";\n\nexport const BROWSER_BRIDGE_ROUTE_SERVICE_TYPE = \"lifeops_browser_plugin\";\n\nexport interface BrowserBridgeRouteService extends Service {\n getBrowserSettings(\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgeSettings>;\n updateBrowserSettings(\n request: UpdateBrowserBridgeSettingsRequest,\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgeSettings>;\n listBrowserCompanions(\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgeCompanionStatus[]>;\n listBrowserTabs(\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgeTabSummary[]>;\n getCurrentBrowserPage(\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgePageContext | null>;\n syncBrowserState(\n request: SyncBrowserBridgeStateRequest,\n ownerEntityId?: UUID | null,\n ): Promise<{\n companion: BrowserBridgeCompanionStatus;\n tabs: BrowserBridgeTabSummary[];\n currentPage: BrowserBridgePageContext | null;\n }>;\n createBrowserCompanionPairing(\n request: CreateBrowserBridgeCompanionPairingRequest,\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgeCompanionPairingResponse>;\n autoPairBrowserCompanion(\n request: CreateBrowserBridgeCompanionAutoPairRequest,\n apiBaseUrl: string,\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgeCompanionAutoPairResponse>;\n revokeBrowserCompanion(\n companionId: string,\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgeCompanionRevokeResponse>;\n revokeBrowserCompanionFromCompanion(\n companionId: string,\n pairingToken: string,\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgeCompanionRevokeResponse>;\n syncBrowserCompanion(\n companionId: string,\n pairingToken: string,\n request: SyncBrowserBridgeStateRequest,\n ownerEntityId?: UUID | null,\n ): Promise<BrowserBridgeCompanionSyncResponse>;\n listBrowserSessions(\n ownerEntityId?: UUID | null,\n ): Promise<LifeOpsBrowserSession[]>;\n getBrowserSession(\n sessionId: string,\n ownerEntityId?: UUID | null,\n ): Promise<LifeOpsBrowserSession>;\n createBrowserSession(\n request: CreateLifeOpsBrowserSessionRequest,\n ownerEntityId?: UUID | null,\n ): Promise<LifeOpsBrowserSession>;\n confirmBrowserSession(\n sessionId: string,\n request: ConfirmLifeOpsBrowserSessionRequest,\n ownerEntityId?: UUID | null,\n ): Promise<LifeOpsBrowserSession>;\n updateBrowserSessionProgress(\n sessionId: string,\n request: UpdateBrowserBridgeSessionProgressRequest,\n ownerEntityId?: UUID | null,\n ): Promise<LifeOpsBrowserSession>;\n completeBrowserSession(\n sessionId: string,\n request: CompleteLifeOpsBrowserSessionRequest,\n ownerEntityId?: UUID | null,\n ): Promise<LifeOpsBrowserSession>;\n updateBrowserSessionProgressFromCompanion(\n companionId: string,\n pairingToken: string,\n sessionId: string,\n request: UpdateBrowserBridgeSessionProgressRequest,\n ownerEntityId?: UUID | null,\n ): Promise<LifeOpsBrowserSession>;\n completeBrowserSessionFromCompanion(\n companionId: string,\n pairingToken: string,\n sessionId: string,\n request: CompleteLifeOpsBrowserSessionRequest,\n ownerEntityId?: UUID | null,\n ): Promise<LifeOpsBrowserSession>;\n}\n"],"mappings":"AAuBO,MAAM,oCAAoC;","names":[]}
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
* `confirmBrowserSession`, etc.) are LifeOps workflow concerns and live
|
|
26
26
|
* in a dedicated lifeops session action, not here.
|
|
27
27
|
*/
|
|
28
|
-
import type { BrowserWorkspaceCommand, BrowserWorkspaceCommandResult } from "../workspace/browser-workspace-types.js";
|
|
29
28
|
import type { BrowserBridgeRouteService } from "../service.js";
|
|
29
|
+
import type { BrowserWorkspaceCommand, BrowserWorkspaceCommandResult } from "../workspace/browser-workspace-types.js";
|
|
30
30
|
export declare function dispatchBridgeCommand(service: BrowserBridgeRouteService, command: BrowserWorkspaceCommand): Promise<BrowserWorkspaceCommandResult>;
|
|
31
31
|
//# sourceMappingURL=bridge-target.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge-target.d.ts","sourceRoot":"","sources":["../../src/targets/bridge-target.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;
|
|
1
|
+
{"version":3,"file":"bridge-target.d.ts","sourceRoot":"","sources":["../../src/targets/bridge-target.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,KAAK,EACV,uBAAuB,EACvB,6BAA6B,EAE9B,MAAM,yCAAyC,CAAC;AAyCjD,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,yBAAyB,EAClC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,6BAA6B,CAAC,CAsExC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/targets/bridge-target.ts"],"sourcesContent":["/**\n * Bridge target — routes a `BrowserWorkspaceCommand` to the Agent Browser\n * Bridge companion (Chrome / Safari) via `BrowserBridgeRouteService`.\n *\n * The bridge surface is intentionally narrower than the workspace surface.\n * It speaks at the level of paired browser tabs, not of an embedded\n * BrowserView, so subactions like `eval` / `pdf` / `trace` / `profiler`\n * have no clean translation. We translate the read-mostly subset that DOES\n * map cleanly:\n *\n * list → list companion-tracked tabs\n * state → snapshot of current page context\n * open → ask the companion to open a URL in a new tab\n * navigate → ask the companion to navigate the current/named tab\n * close → ask the companion to close a tab\n * show / hide → focus / unfocus a tab in the companion window\n * get → return the current page text/title/url\n * back / forward / reload → companion navigation history nav\n *\n * Anything outside that subset throws a clear error so the caller\n * (typically the BROWSER action) can surface a \"this isn't supported on\n * the bridge target — try the workspace target\" message back to the user.\n *\n * The bridge protocol's session-tracking semantics (`createBrowserSession`,\n * `confirmBrowserSession`, etc.) are LifeOps workflow concerns and live\n * in a dedicated lifeops session action, not here.\n */\n\nimport type {
|
|
1
|
+
{"version":3,"sources":["../../src/targets/bridge-target.ts"],"sourcesContent":["/**\n * Bridge target — routes a `BrowserWorkspaceCommand` to the Agent Browser\n * Bridge companion (Chrome / Safari) via `BrowserBridgeRouteService`.\n *\n * The bridge surface is intentionally narrower than the workspace surface.\n * It speaks at the level of paired browser tabs, not of an embedded\n * BrowserView, so subactions like `eval` / `pdf` / `trace` / `profiler`\n * have no clean translation. We translate the read-mostly subset that DOES\n * map cleanly:\n *\n * list → list companion-tracked tabs\n * state → snapshot of current page context\n * open → ask the companion to open a URL in a new tab\n * navigate → ask the companion to navigate the current/named tab\n * close → ask the companion to close a tab\n * show / hide → focus / unfocus a tab in the companion window\n * get → return the current page text/title/url\n * back / forward / reload → companion navigation history nav\n *\n * Anything outside that subset throws a clear error so the caller\n * (typically the BROWSER action) can surface a \"this isn't supported on\n * the bridge target — try the workspace target\" message back to the user.\n *\n * The bridge protocol's session-tracking semantics (`createBrowserSession`,\n * `confirmBrowserSession`, etc.) are LifeOps workflow concerns and live\n * in a dedicated lifeops session action, not here.\n */\n\nimport type { BrowserBridgeTabSummary } from \"../contracts.js\";\nimport type { BrowserBridgeRouteService } from \"../service.js\";\nimport type {\n BrowserWorkspaceCommand,\n BrowserWorkspaceCommandResult,\n BrowserWorkspaceTab,\n} from \"../workspace/browser-workspace-types.js\";\n\nconst SUPPORTED_SUBACTIONS = new Set<BrowserWorkspaceCommand[\"subaction\"]>([\n \"list\",\n \"state\",\n \"open\",\n \"navigate\",\n \"close\",\n \"show\",\n \"hide\",\n \"tab\",\n \"get\",\n \"back\",\n \"forward\",\n \"reload\",\n]);\n\nfunction bridgeTabToWorkspaceTab(\n tab: BrowserBridgeTabSummary,\n): BrowserWorkspaceTab {\n // The bridge speaks BrowserBridgeTabSummary; the BROWSER action expects\n // BrowserWorkspaceTab. Map the overlapping fields and use defaults for the rest.\n return {\n id: tab.id,\n title: tab.title,\n url: tab.url,\n partition: `bridge:${tab.profileId}`,\n kind: \"standard\",\n visible: tab.activeInWindow,\n createdAt: tab.createdAt,\n updatedAt: tab.updatedAt,\n lastFocusedAt: tab.lastFocusedAt,\n };\n}\n\nfunction unsupported(subaction: BrowserWorkspaceCommand[\"subaction\"]): Error {\n return new Error(\n `Browser bridge target does not support subaction \"${subaction}\". Use the workspace target for embedded-browser features (eval, pdf, snapshot, trace, profiler, etc.).`,\n );\n}\n\nexport async function dispatchBridgeCommand(\n service: BrowserBridgeRouteService,\n command: BrowserWorkspaceCommand,\n): Promise<BrowserWorkspaceCommandResult> {\n if (!SUPPORTED_SUBACTIONS.has(command.subaction)) {\n throw unsupported(command.subaction);\n }\n switch (command.subaction) {\n case \"list\":\n case \"tab\":\n // Bridge `tab` always behaves like list; the bridge has no concept of\n // creating an internal tab via the agent — the user owns the tabs.\n return {\n mode: \"desktop\",\n subaction: command.subaction,\n tabs: (await service.listBrowserTabs()).map(bridgeTabToWorkspaceTab),\n };\n case \"state\": {\n const page = await service.getCurrentBrowserPage();\n return {\n mode: \"desktop\",\n subaction: command.subaction,\n value: page\n ? {\n url: page.url,\n title: page.title,\n browser: page.browser,\n profileId: page.profileId,\n windowId: page.windowId,\n tabId: page.tabId,\n capturedAt: page.capturedAt,\n }\n : null,\n };\n }\n case \"get\": {\n const page = await service.getCurrentBrowserPage();\n if (!page) {\n return {\n mode: \"desktop\",\n subaction: command.subaction,\n value: null,\n };\n }\n const mode = command.getMode ?? \"text\";\n const value =\n mode === \"url\"\n ? page.url\n : mode === \"title\"\n ? page.title\n : (page.mainText ?? \"\");\n return { mode: \"desktop\", subaction: command.subaction, value };\n }\n // open / navigate / close / show / hide / back / forward / reload are\n // session-creating operations on the bridge — they require a\n // LifeOpsBrowserSession to record the action and gate confirmation.\n // The bridge's session APIs aren't appropriate to call from a generic\n // BROWSER target, so we throw a clear error directing the caller to\n // the dedicated lifeops session action.\n case \"open\":\n case \"navigate\":\n case \"close\":\n case \"show\":\n case \"hide\":\n case \"back\":\n case \"forward\":\n case \"reload\":\n throw new Error(\n `Bridge target subaction \"${command.subaction}\" requires a recorded LifeOpsBrowserSession (the bridge gates account-affecting ops behind owner confirmation). Use the lifeops browser-session action to start a session, or pin target=workspace for embedded-browser tabs.`,\n );\n default:\n throw unsupported(command.subaction);\n }\n}\n"],"mappings":"AAoCA,MAAM,uBAAuB,oBAAI,IAA0C;AAAA,EACzE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,wBACP,KACqB;AAGrB,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,OAAO,IAAI;AAAA,IACX,KAAK,IAAI;AAAA,IACT,WAAW,UAAU,IAAI,SAAS;AAAA,IAClC,MAAM;AAAA,IACN,SAAS,IAAI;AAAA,IACb,WAAW,IAAI;AAAA,IACf,WAAW,IAAI;AAAA,IACf,eAAe,IAAI;AAAA,EACrB;AACF;AAEA,SAAS,YAAY,WAAwD;AAC3E,SAAO,IAAI;AAAA,IACT,qDAAqD,SAAS;AAAA,EAChE;AACF;AAEA,eAAsB,sBACpB,SACA,SACwC;AACxC,MAAI,CAAC,qBAAqB,IAAI,QAAQ,SAAS,GAAG;AAChD,UAAM,YAAY,QAAQ,SAAS;AAAA,EACrC;AACA,UAAQ,QAAQ,WAAW;AAAA,IACzB,KAAK;AAAA,IACL,KAAK;AAGH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,QAAQ;AAAA,QACnB,OAAO,MAAM,QAAQ,gBAAgB,GAAG,IAAI,uBAAuB;AAAA,MACrE;AAAA,IACF,KAAK,SAAS;AACZ,YAAM,OAAO,MAAM,QAAQ,sBAAsB;AACjD,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,QAAQ;AAAA,QACnB,OAAO,OACH;AAAA,UACE,KAAK,KAAK;AAAA,UACV,OAAO,KAAK;AAAA,UACZ,SAAS,KAAK;AAAA,UACd,WAAW,KAAK;AAAA,UAChB,UAAU,KAAK;AAAA,UACf,OAAO,KAAK;AAAA,UACZ,YAAY,KAAK;AAAA,QACnB,IACA;AAAA,MACN;AAAA,IACF;AAAA,IACA,KAAK,OAAO;AACV,YAAM,OAAO,MAAM,QAAQ,sBAAsB;AACjD,UAAI,CAAC,MAAM;AACT,eAAO;AAAA,UACL,MAAM;AAAA,UACN,WAAW,QAAQ;AAAA,UACnB,OAAO;AAAA,QACT;AAAA,MACF;AACA,YAAM,OAAO,QAAQ,WAAW;AAChC,YAAM,QACJ,SAAS,QACL,KAAK,MACL,SAAS,UACP,KAAK,QACJ,KAAK,YAAY;AAC1B,aAAO,EAAE,MAAM,WAAW,WAAW,QAAQ,WAAW,MAAM;AAAA,IAChE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,YAAM,IAAI;AAAA,QACR,4BAA4B,QAAQ,SAAS;AAAA,MAC/C;AAAA,IACF;AACE,YAAM,YAAY,QAAQ,SAAS;AAAA,EACvC;AACF;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stagehand-target.d.ts","sourceRoot":"","sources":["../../src/targets/stagehand-target.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAuB3D,wBAAsB,0BAA0B,CAC9C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAkC/B"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { execFileSync, execSync } from "node:child_process";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { logger } from "@elizaos/core";
|
|
6
|
+
const pluginSrcDir = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
const STAGEHAND_COMMAND_URL_ENV = [
|
|
8
|
+
"ELIZA_BROWSER_STAGEHAND_COMMAND_URL",
|
|
9
|
+
"STAGEHAND_BROWSER_COMMAND_URL",
|
|
10
|
+
"ELIZA_STAGEHAND_COMMAND_URL"
|
|
11
|
+
];
|
|
12
|
+
const STAGEHAND_BASE_URL_ENV = [
|
|
13
|
+
"ELIZA_BROWSER_STAGEHAND_URL",
|
|
14
|
+
"STAGEHAND_SERVER_URL",
|
|
15
|
+
"ELIZA_STAGEHAND_SERVER_URL"
|
|
16
|
+
];
|
|
17
|
+
const STAGEHAND_AUTO_SETUP_ENV = "ELIZA_BROWSER_STAGEHAND_AUTO_SETUP";
|
|
18
|
+
const STAGEHAND_ALLOW_MOBILE_ENV = "ELIZA_BROWSER_ALLOW_STAGEHAND_ON_MOBILE";
|
|
19
|
+
async function maybeCreateStagehandTarget(env = process.env) {
|
|
20
|
+
if (isDisabled(env.ELIZA_BROWSER_STAGEHAND_ENABLED)) return null;
|
|
21
|
+
const mobile = isMobileRuntime(env);
|
|
22
|
+
if (mobile && !isEnabled(env[STAGEHAND_ALLOW_MOBILE_ENV])) {
|
|
23
|
+
logger.debug(
|
|
24
|
+
"[BrowserService] stagehand target not registered on mobile; using the app browser surface instead"
|
|
25
|
+
);
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
if (!isDisabled(env[STAGEHAND_AUTO_SETUP_ENV])) {
|
|
29
|
+
ensureLocalStagehandServer(env);
|
|
30
|
+
}
|
|
31
|
+
const commandUrl = resolveStagehandCommandUrl(env);
|
|
32
|
+
if (!commandUrl) {
|
|
33
|
+
logger.debug(
|
|
34
|
+
"[BrowserService] stagehand target not registered; set ELIZA_BROWSER_STAGEHAND_COMMAND_URL or STAGEHAND_SERVER_URL to enable it"
|
|
35
|
+
);
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
id: "stagehand",
|
|
40
|
+
name: "Stagehand Browser",
|
|
41
|
+
description: "Fallback Stagehand/Playwright browser backend reached through a local or remote stagehand command endpoint.",
|
|
42
|
+
kind: "stagehand",
|
|
43
|
+
priority: 10,
|
|
44
|
+
score: ({ mobile: mobileContext }) => mobileContext ? null : 10,
|
|
45
|
+
available: async () => probeStagehand(commandUrl, env),
|
|
46
|
+
execute: async (command) => executeStagehandCommand(commandUrl, command)
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function resolveStagehandCommandUrl(env) {
|
|
50
|
+
for (const key of STAGEHAND_COMMAND_URL_ENV) {
|
|
51
|
+
const value = normalizeUrl(env[key]);
|
|
52
|
+
if (value) return value;
|
|
53
|
+
}
|
|
54
|
+
for (const key of STAGEHAND_BASE_URL_ENV) {
|
|
55
|
+
const value = normalizeUrl(env[key]);
|
|
56
|
+
if (value) return new URL("/api/browser-command", value).toString();
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
async function probeStagehand(_commandUrl, env) {
|
|
61
|
+
const healthUrl = normalizeUrl(env.ELIZA_BROWSER_STAGEHAND_HEALTH_URL);
|
|
62
|
+
if (!healthUrl) return true;
|
|
63
|
+
try {
|
|
64
|
+
const response = await fetch(healthUrl, { method: "GET" });
|
|
65
|
+
return response.ok;
|
|
66
|
+
} catch {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async function executeStagehandCommand(commandUrl, command) {
|
|
71
|
+
const response = await fetch(commandUrl, {
|
|
72
|
+
method: "POST",
|
|
73
|
+
headers: { "content-type": "application/json" },
|
|
74
|
+
body: JSON.stringify({ command })
|
|
75
|
+
});
|
|
76
|
+
const body = await response.json().catch(() => null);
|
|
77
|
+
if (!response.ok) {
|
|
78
|
+
const message = body && typeof body === "object" && "error" in body ? String(body.error) : `Stagehand command endpoint returned HTTP ${response.status}`;
|
|
79
|
+
throw new Error(message);
|
|
80
|
+
}
|
|
81
|
+
return normalizeStagehandResult(command, body);
|
|
82
|
+
}
|
|
83
|
+
function normalizeStagehandResult(command, body) {
|
|
84
|
+
if (body && typeof body === "object") {
|
|
85
|
+
const record = body;
|
|
86
|
+
const result = record.result && typeof record.result === "object" ? record.result : record;
|
|
87
|
+
return {
|
|
88
|
+
...result,
|
|
89
|
+
mode: "cloud",
|
|
90
|
+
subaction: command.subaction
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
mode: "cloud",
|
|
95
|
+
subaction: command.subaction,
|
|
96
|
+
value: body
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function ensureLocalStagehandServer(env) {
|
|
100
|
+
const stagehandDir = findStagehandDir(env);
|
|
101
|
+
if (!stagehandDir) return false;
|
|
102
|
+
const stagehandIndex = path.join(stagehandDir, "dist", "index.js");
|
|
103
|
+
if (fs.existsSync(stagehandIndex)) return true;
|
|
104
|
+
const stagehandSrc = path.join(stagehandDir, "src", "index.ts");
|
|
105
|
+
if (!fs.existsSync(stagehandSrc)) return false;
|
|
106
|
+
try {
|
|
107
|
+
if (!fs.existsSync(path.join(stagehandDir, "node_modules"))) {
|
|
108
|
+
execSync("bun install --ignore-scripts", {
|
|
109
|
+
cwd: stagehandDir,
|
|
110
|
+
stdio: "ignore",
|
|
111
|
+
timeout: 6e4
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
const localTsc = path.join(stagehandDir, "node_modules", ".bin", "tsc");
|
|
115
|
+
if (fs.existsSync(localTsc)) {
|
|
116
|
+
execFileSync(localTsc, [], {
|
|
117
|
+
cwd: stagehandDir,
|
|
118
|
+
stdio: "ignore",
|
|
119
|
+
timeout: 6e4
|
|
120
|
+
});
|
|
121
|
+
} else {
|
|
122
|
+
execFileSync("bunx", ["tsc"], {
|
|
123
|
+
cwd: stagehandDir,
|
|
124
|
+
stdio: "ignore",
|
|
125
|
+
timeout: 6e4
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
logger.info("[BrowserService] stagehand-server built successfully");
|
|
129
|
+
return fs.existsSync(stagehandIndex);
|
|
130
|
+
} catch (err) {
|
|
131
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
132
|
+
logger.debug(
|
|
133
|
+
`[BrowserService] stagehand-server auto-setup failed: ${message}`
|
|
134
|
+
);
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
function findStagehandDir(env) {
|
|
139
|
+
const configured = env.ELIZA_BROWSER_STAGEHAND_DIR?.trim();
|
|
140
|
+
const candidates = [
|
|
141
|
+
configured,
|
|
142
|
+
...ancestorPaths(pluginSrcDir).flatMap((root) => [
|
|
143
|
+
path.join(root, "stagehand-server"),
|
|
144
|
+
path.join(root, "plugins", "plugin-browser", "stagehand-server"),
|
|
145
|
+
path.join(root, "eliza", "plugins", "plugin-browser", "stagehand-server")
|
|
146
|
+
])
|
|
147
|
+
].filter((candidate) => Boolean(candidate));
|
|
148
|
+
for (const candidate of candidates) {
|
|
149
|
+
const dir = path.resolve(candidate);
|
|
150
|
+
if (fs.existsSync(path.join(dir, "dist", "index.js")) || fs.existsSync(path.join(dir, "src", "index.ts"))) {
|
|
151
|
+
return dir;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
function ancestorPaths(start) {
|
|
157
|
+
const ancestors = [];
|
|
158
|
+
let current = path.resolve(start);
|
|
159
|
+
while (true) {
|
|
160
|
+
ancestors.push(current);
|
|
161
|
+
const parent = path.dirname(current);
|
|
162
|
+
if (parent === current) return ancestors;
|
|
163
|
+
current = parent;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
function normalizeUrl(value) {
|
|
167
|
+
if (!value?.trim()) return null;
|
|
168
|
+
try {
|
|
169
|
+
return new URL(value.trim()).toString();
|
|
170
|
+
} catch {
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function isEnabled(value) {
|
|
175
|
+
return value === "1" || value?.toLowerCase() === "true";
|
|
176
|
+
}
|
|
177
|
+
function isDisabled(value) {
|
|
178
|
+
return value === "0" || value?.toLowerCase() === "false";
|
|
179
|
+
}
|
|
180
|
+
function isMobileRuntime(env) {
|
|
181
|
+
const platform = (env.ELIZA_MOBILE_PLATFORM ?? env.ELIZA_PLATFORM ?? env.CAPACITOR_PLATFORM ?? "").toLowerCase();
|
|
182
|
+
return platform === "ios" || platform === "android" || platform === "mobile";
|
|
183
|
+
}
|
|
184
|
+
export {
|
|
185
|
+
maybeCreateStagehandTarget
|
|
186
|
+
};
|
|
187
|
+
//# sourceMappingURL=stagehand-target.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/targets/stagehand-target.ts"],"sourcesContent":["import { execFileSync, execSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { logger } from \"@elizaos/core\";\nimport type { BrowserTarget } from \"../browser-service.js\";\nimport type {\n BrowserWorkspaceCommand,\n BrowserWorkspaceCommandResult,\n} from \"../workspace/browser-workspace-types.js\";\n\nconst pluginSrcDir = path.dirname(fileURLToPath(import.meta.url));\n\nconst STAGEHAND_COMMAND_URL_ENV = [\n \"ELIZA_BROWSER_STAGEHAND_COMMAND_URL\",\n \"STAGEHAND_BROWSER_COMMAND_URL\",\n \"ELIZA_STAGEHAND_COMMAND_URL\",\n] as const;\n\nconst STAGEHAND_BASE_URL_ENV = [\n \"ELIZA_BROWSER_STAGEHAND_URL\",\n \"STAGEHAND_SERVER_URL\",\n \"ELIZA_STAGEHAND_SERVER_URL\",\n] as const;\n\nconst STAGEHAND_AUTO_SETUP_ENV = \"ELIZA_BROWSER_STAGEHAND_AUTO_SETUP\";\nconst STAGEHAND_ALLOW_MOBILE_ENV = \"ELIZA_BROWSER_ALLOW_STAGEHAND_ON_MOBILE\";\n\nexport async function maybeCreateStagehandTarget(\n env: NodeJS.ProcessEnv = process.env,\n): Promise<BrowserTarget | null> {\n if (isDisabled(env.ELIZA_BROWSER_STAGEHAND_ENABLED)) return null;\n\n const mobile = isMobileRuntime(env);\n if (mobile && !isEnabled(env[STAGEHAND_ALLOW_MOBILE_ENV])) {\n logger.debug(\n \"[BrowserService] stagehand target not registered on mobile; using the app browser surface instead\",\n );\n return null;\n }\n\n if (!isDisabled(env[STAGEHAND_AUTO_SETUP_ENV])) {\n ensureLocalStagehandServer(env);\n }\n\n const commandUrl = resolveStagehandCommandUrl(env);\n if (!commandUrl) {\n logger.debug(\n \"[BrowserService] stagehand target not registered; set ELIZA_BROWSER_STAGEHAND_COMMAND_URL or STAGEHAND_SERVER_URL to enable it\",\n );\n return null;\n }\n\n return {\n id: \"stagehand\",\n name: \"Stagehand Browser\",\n description:\n \"Fallback Stagehand/Playwright browser backend reached through a local or remote stagehand command endpoint.\",\n kind: \"stagehand\",\n priority: 10,\n score: ({ mobile: mobileContext }) => (mobileContext ? null : 10),\n available: async () => probeStagehand(commandUrl, env),\n execute: async (command) => executeStagehandCommand(commandUrl, command),\n };\n}\n\nfunction resolveStagehandCommandUrl(env: NodeJS.ProcessEnv): string | null {\n for (const key of STAGEHAND_COMMAND_URL_ENV) {\n const value = normalizeUrl(env[key]);\n if (value) return value;\n }\n for (const key of STAGEHAND_BASE_URL_ENV) {\n const value = normalizeUrl(env[key]);\n if (value) return new URL(\"/api/browser-command\", value).toString();\n }\n return null;\n}\n\nasync function probeStagehand(\n _commandUrl: string,\n env: NodeJS.ProcessEnv,\n): Promise<boolean> {\n const healthUrl = normalizeUrl(env.ELIZA_BROWSER_STAGEHAND_HEALTH_URL);\n if (!healthUrl) return true;\n try {\n const response = await fetch(healthUrl, { method: \"GET\" });\n return response.ok;\n } catch {\n return false;\n }\n}\n\nasync function executeStagehandCommand(\n commandUrl: string,\n command: BrowserWorkspaceCommand,\n): Promise<BrowserWorkspaceCommandResult> {\n const response = await fetch(commandUrl, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ command }),\n });\n const body = await response.json().catch(() => null);\n if (!response.ok) {\n const message =\n body && typeof body === \"object\" && \"error\" in body\n ? String((body as { error?: unknown }).error)\n : `Stagehand command endpoint returned HTTP ${response.status}`;\n throw new Error(message);\n }\n return normalizeStagehandResult(command, body);\n}\n\nfunction normalizeStagehandResult(\n command: BrowserWorkspaceCommand,\n body: unknown,\n): BrowserWorkspaceCommandResult {\n if (body && typeof body === \"object\") {\n const record = body as {\n result?: unknown;\n mode?: unknown;\n subaction?: unknown;\n value?: unknown;\n };\n const result =\n record.result && typeof record.result === \"object\"\n ? (record.result as BrowserWorkspaceCommandResult)\n : (record as BrowserWorkspaceCommandResult);\n return {\n ...result,\n mode: \"cloud\",\n subaction: command.subaction,\n };\n }\n return {\n mode: \"cloud\",\n subaction: command.subaction,\n value: body,\n };\n}\n\nfunction ensureLocalStagehandServer(env: NodeJS.ProcessEnv): boolean {\n const stagehandDir = findStagehandDir(env);\n if (!stagehandDir) return false;\n\n const stagehandIndex = path.join(stagehandDir, \"dist\", \"index.js\");\n if (fs.existsSync(stagehandIndex)) return true;\n\n const stagehandSrc = path.join(stagehandDir, \"src\", \"index.ts\");\n if (!fs.existsSync(stagehandSrc)) return false;\n\n try {\n if (!fs.existsSync(path.join(stagehandDir, \"node_modules\"))) {\n execSync(\"bun install --ignore-scripts\", {\n cwd: stagehandDir,\n stdio: \"ignore\",\n timeout: 60_000,\n });\n }\n const localTsc = path.join(stagehandDir, \"node_modules\", \".bin\", \"tsc\");\n if (fs.existsSync(localTsc)) {\n execFileSync(localTsc, [], {\n cwd: stagehandDir,\n stdio: \"ignore\",\n timeout: 60_000,\n });\n } else {\n execFileSync(\"bunx\", [\"tsc\"], {\n cwd: stagehandDir,\n stdio: \"ignore\",\n timeout: 60_000,\n });\n }\n logger.info(\"[BrowserService] stagehand-server built successfully\");\n return fs.existsSync(stagehandIndex);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n logger.debug(\n `[BrowserService] stagehand-server auto-setup failed: ${message}`,\n );\n return false;\n }\n}\n\nfunction findStagehandDir(env: NodeJS.ProcessEnv): string | null {\n const configured = env.ELIZA_BROWSER_STAGEHAND_DIR?.trim();\n const candidates = [\n configured,\n ...ancestorPaths(pluginSrcDir).flatMap((root) => [\n path.join(root, \"stagehand-server\"),\n path.join(root, \"plugins\", \"plugin-browser\", \"stagehand-server\"),\n path.join(root, \"eliza\", \"plugins\", \"plugin-browser\", \"stagehand-server\"),\n ]),\n ].filter((candidate): candidate is string => Boolean(candidate));\n\n for (const candidate of candidates) {\n const dir = path.resolve(candidate);\n if (\n fs.existsSync(path.join(dir, \"dist\", \"index.js\")) ||\n fs.existsSync(path.join(dir, \"src\", \"index.ts\"))\n ) {\n return dir;\n }\n }\n return null;\n}\n\nfunction ancestorPaths(start: string): string[] {\n const ancestors: string[] = [];\n let current = path.resolve(start);\n while (true) {\n ancestors.push(current);\n const parent = path.dirname(current);\n if (parent === current) return ancestors;\n current = parent;\n }\n}\n\nfunction normalizeUrl(value: string | undefined): string | null {\n if (!value?.trim()) return null;\n try {\n return new URL(value.trim()).toString();\n } catch {\n return null;\n }\n}\n\nfunction isEnabled(value: string | undefined): boolean {\n return value === \"1\" || value?.toLowerCase() === \"true\";\n}\n\nfunction isDisabled(value: string | undefined): boolean {\n return value === \"0\" || value?.toLowerCase() === \"false\";\n}\n\nfunction isMobileRuntime(env: NodeJS.ProcessEnv): boolean {\n const platform = (\n env.ELIZA_MOBILE_PLATFORM ??\n env.ELIZA_PLATFORM ??\n env.CAPACITOR_PLATFORM ??\n \"\"\n ).toLowerCase();\n return platform === \"ios\" || platform === \"android\" || platform === \"mobile\";\n}\n"],"mappings":"AAAA,SAAS,cAAc,gBAAgB;AACvC,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAC9B,SAAS,cAAc;AAOvB,MAAM,eAAe,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAEhE,MAAM,4BAA4B;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AACF;AAEA,MAAM,yBAAyB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AACF;AAEA,MAAM,2BAA2B;AACjC,MAAM,6BAA6B;AAEnC,eAAsB,2BACpB,MAAyB,QAAQ,KACF;AAC/B,MAAI,WAAW,IAAI,+BAA+B,EAAG,QAAO;AAE5D,QAAM,SAAS,gBAAgB,GAAG;AAClC,MAAI,UAAU,CAAC,UAAU,IAAI,0BAA0B,CAAC,GAAG;AACzD,WAAO;AAAA,MACL;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,WAAW,IAAI,wBAAwB,CAAC,GAAG;AAC9C,+BAA2B,GAAG;AAAA,EAChC;AAEA,QAAM,aAAa,2BAA2B,GAAG;AACjD,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,MACL;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,IACF,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO,CAAC,EAAE,QAAQ,cAAc,MAAO,gBAAgB,OAAO;AAAA,IAC9D,WAAW,YAAY,eAAe,YAAY,GAAG;AAAA,IACrD,SAAS,OAAO,YAAY,wBAAwB,YAAY,OAAO;AAAA,EACzE;AACF;AAEA,SAAS,2BAA2B,KAAuC;AACzE,aAAW,OAAO,2BAA2B;AAC3C,UAAM,QAAQ,aAAa,IAAI,GAAG,CAAC;AACnC,QAAI,MAAO,QAAO;AAAA,EACpB;AACA,aAAW,OAAO,wBAAwB;AACxC,UAAM,QAAQ,aAAa,IAAI,GAAG,CAAC;AACnC,QAAI,MAAO,QAAO,IAAI,IAAI,wBAAwB,KAAK,EAAE,SAAS;AAAA,EACpE;AACA,SAAO;AACT;AAEA,eAAe,eACb,aACA,KACkB;AAClB,QAAM,YAAY,aAAa,IAAI,kCAAkC;AACrE,MAAI,CAAC,UAAW,QAAO;AACvB,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,WAAW,EAAE,QAAQ,MAAM,CAAC;AACzD,WAAO,SAAS;AAAA,EAClB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,wBACb,YACA,SACwC;AACxC,QAAM,WAAW,MAAM,MAAM,YAAY;AAAA,IACvC,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,EAAE,QAAQ,CAAC;AAAA,EAClC,CAAC;AACD,QAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,IAAI;AACnD,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,UACJ,QAAQ,OAAO,SAAS,YAAY,WAAW,OAC3C,OAAQ,KAA6B,KAAK,IAC1C,4CAA4C,SAAS,MAAM;AACjE,UAAM,IAAI,MAAM,OAAO;AAAA,EACzB;AACA,SAAO,yBAAyB,SAAS,IAAI;AAC/C;AAEA,SAAS,yBACP,SACA,MAC+B;AAC/B,MAAI,QAAQ,OAAO,SAAS,UAAU;AACpC,UAAM,SAAS;AAMf,UAAM,SACJ,OAAO,UAAU,OAAO,OAAO,WAAW,WACrC,OAAO,SACP;AACP,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM;AAAA,MACN,WAAW,QAAQ;AAAA,IACrB;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,WAAW,QAAQ;AAAA,IACnB,OAAO;AAAA,EACT;AACF;AAEA,SAAS,2BAA2B,KAAiC;AACnE,QAAM,eAAe,iBAAiB,GAAG;AACzC,MAAI,CAAC,aAAc,QAAO;AAE1B,QAAM,iBAAiB,KAAK,KAAK,cAAc,QAAQ,UAAU;AACjE,MAAI,GAAG,WAAW,cAAc,EAAG,QAAO;AAE1C,QAAM,eAAe,KAAK,KAAK,cAAc,OAAO,UAAU;AAC9D,MAAI,CAAC,GAAG,WAAW,YAAY,EAAG,QAAO;AAEzC,MAAI;AACF,QAAI,CAAC,GAAG,WAAW,KAAK,KAAK,cAAc,cAAc,CAAC,GAAG;AAC3D,eAAS,gCAAgC;AAAA,QACvC,KAAK;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,UAAM,WAAW,KAAK,KAAK,cAAc,gBAAgB,QAAQ,KAAK;AACtE,QAAI,GAAG,WAAW,QAAQ,GAAG;AAC3B,mBAAa,UAAU,CAAC,GAAG;AAAA,QACzB,KAAK;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,MACX,CAAC;AAAA,IACH,OAAO;AACL,mBAAa,QAAQ,CAAC,KAAK,GAAG;AAAA,QAC5B,KAAK;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,WAAO,KAAK,sDAAsD;AAClE,WAAO,GAAG,WAAW,cAAc;AAAA,EACrC,SAAS,KAAK;AACZ,UAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,WAAO;AAAA,MACL,wDAAwD,OAAO;AAAA,IACjE;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,iBAAiB,KAAuC;AAC/D,QAAM,aAAa,IAAI,6BAA6B,KAAK;AACzD,QAAM,aAAa;AAAA,IACjB;AAAA,IACA,GAAG,cAAc,YAAY,EAAE,QAAQ,CAAC,SAAS;AAAA,MAC/C,KAAK,KAAK,MAAM,kBAAkB;AAAA,MAClC,KAAK,KAAK,MAAM,WAAW,kBAAkB,kBAAkB;AAAA,MAC/D,KAAK,KAAK,MAAM,SAAS,WAAW,kBAAkB,kBAAkB;AAAA,IAC1E,CAAC;AAAA,EACH,EAAE,OAAO,CAAC,cAAmC,QAAQ,SAAS,CAAC;AAE/D,aAAW,aAAa,YAAY;AAClC,UAAM,MAAM,KAAK,QAAQ,SAAS;AAClC,QACE,GAAG,WAAW,KAAK,KAAK,KAAK,QAAQ,UAAU,CAAC,KAChD,GAAG,WAAW,KAAK,KAAK,KAAK,OAAO,UAAU,CAAC,GAC/C;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,cAAc,OAAyB;AAC9C,QAAM,YAAsB,CAAC;AAC7B,MAAI,UAAU,KAAK,QAAQ,KAAK;AAChC,SAAO,MAAM;AACX,cAAU,KAAK,OAAO;AACtB,UAAM,SAAS,KAAK,QAAQ,OAAO;AACnC,QAAI,WAAW,QAAS,QAAO;AAC/B,cAAU;AAAA,EACZ;AACF;AAEA,SAAS,aAAa,OAA0C;AAC9D,MAAI,CAAC,OAAO,KAAK,EAAG,QAAO;AAC3B,MAAI;AACF,WAAO,IAAI,IAAI,MAAM,KAAK,CAAC,EAAE,SAAS;AAAA,EACxC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,UAAU,OAAoC;AACrD,SAAO,UAAU,OAAO,OAAO,YAAY,MAAM;AACnD;AAEA,SAAS,WAAW,OAAoC;AACtD,SAAO,UAAU,OAAO,OAAO,YAAY,MAAM;AACnD;AAEA,SAAS,gBAAgB,KAAiC;AACxD,QAAM,YACJ,IAAI,yBACJ,IAAI,kBACJ,IAAI,sBACJ,IACA,YAAY;AACd,SAAO,aAAa,SAAS,aAAa,aAAa,aAAa;AACtE;","names":[]}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*
|
|
9
9
|
* Visual parity with the desktop shell:
|
|
10
10
|
* - Appends `?popout` to the URL so the app renders StreamView directly
|
|
11
|
-
* (
|
|
11
|
+
* (without onboarding, auth gates, or navigation chrome).
|
|
12
12
|
* - Enables SwiftShader for WebGL so VRM avatar renders identically.
|
|
13
13
|
* - Seeds localStorage with overlay layout, theme, and avatar index so
|
|
14
14
|
* the first rendered frame matches the configured appearance.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/workspace/browser-capture.ts"],"sourcesContent":["/**\n * Headless browser capture — opens the StreamView in headless Chrome and\n * saves screenshots to a temp file. FFmpeg reads the temp file using\n * -loop 1 to continuously re-read the latest frame.\n *\n * This approach avoids the pipe bottleneck — FFmpeg reads at its own\n * pace while the browser updates the file independently.\n *\n * Visual parity with the desktop shell:\n * - Appends `?popout` to the URL so the app renders StreamView directly\n * (skips onboarding, auth gates, navigation chrome).\n * - Enables SwiftShader for WebGL so VRM avatar renders identically.\n * - Seeds localStorage with overlay layout, theme, and avatar index so\n * the first rendered frame matches the configured appearance.\n * - Uses `waitUntil: \"networkidle0\"` to ensure all assets load before capture.\n * - Keeps CSS animations/transitions enabled for visual parity.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { setTimeout as sleep } from \"node:timers/promises\";\nimport { logger } from \"@elizaos/core\";\n\nconst CHROME_PATH =\n process.platform === \"darwin\"\n ? \"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\"\n : process.platform === \"win32\"\n ? \"C:\\\\Program Files\\\\Google Chrome\\\\Application\\\\chrome.exe\"\n : \"/usr/bin/google-chrome-stable\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet activeBrowser: any | null = null;\nlet activeCaptureLoop: Promise<void> | null = null;\nlet stopSignal = false;\n\n/** Path to the temp frame file that FFmpeg reads */\nexport const FRAME_FILE = join(tmpdir(), \"eliza-stream-frame.jpg\");\n\nexport interface BrowserCaptureConfig {\n url: string;\n width?: number;\n height?: number;\n fps?: number;\n quality?: number;\n /** Optional overlay layout JSON to seed into localStorage before page load. */\n overlayLayout?: string;\n /** Theme name to apply (e.g. \"eliza\", \"haxor\", \"psycho\"). */\n theme?: string;\n /** Avatar VRM index (1–8). */\n avatarIndex?: number;\n /** Destination ID — seeds the destination-specific localStorage key. */\n destinationId?: string;\n}\n\nexport function getBrowserCaptureExecutablePath(): string {\n return CHROME_PATH;\n}\n\nexport function isBrowserCaptureSupported(): boolean {\n return existsSync(CHROME_PATH);\n}\n\n/**\n * Ensure the URL includes the `?popout` parameter so the app renders only\n * StreamView, skipping startup gates and navigation chrome.\n */\nfunction ensurePopoutUrl(raw: string): string {\n try {\n const u = new URL(raw);\n // Handle both query and hash-based routing\n if (u.hash?.includes(\"?\")) {\n if (!u.hash.includes(\"popout\")) {\n u.hash = `${u.hash}&popout`;\n }\n } else if (u.hash) {\n u.hash = `${u.hash}?popout`;\n } else if (!u.searchParams.has(\"popout\")) {\n u.searchParams.set(\"popout\", \"\");\n }\n return u.toString();\n } catch {\n // Fallback: just append\n const sep = raw.includes(\"?\") ? \"&\" : \"?\";\n return `${raw}${sep}popout`;\n }\n}\n\nexport async function startBrowserCapture(config: BrowserCaptureConfig) {\n if (activeBrowser) {\n logger.info(\"[browser-capture] Already running\");\n return;\n }\n\n if (!isBrowserCaptureSupported()) {\n throw new Error(\n `Google Chrome not found at ${CHROME_PATH}. Install Chrome or update browser-capture before enabling screen capture.`,\n );\n }\n\n const { url, width = 1280, height = 720, fps = 4, quality = 70 } = config;\n const captureUrl = ensurePopoutUrl(url);\n\n stopSignal = false;\n logger.info(`[browser-capture] Launching headless Chrome to ${captureUrl}`);\n\n const { default: puppeteer } = await import(\"puppeteer-core\");\n const browser = await puppeteer.launch({\n executablePath: CHROME_PATH,\n headless: true,\n args: [\n `--window-size=${width},${height}`,\n \"--no-sandbox\",\n \"--disable-dev-shm-usage\",\n \"--disable-extensions\",\n \"--mute-audio\",\n // WebGL / SwiftShader — required for VRM avatar rendering parity\n \"--use-gl=swiftshader\",\n \"--enable-webgl\",\n \"--ignore-gpu-blocklist\",\n ],\n });\n\n activeBrowser = browser;\n\n const page = await browser.newPage();\n await page.setViewport({ width, height, deviceScaleFactor: 1 });\n\n // Seed localStorage before navigation so the first render matches the desktop shell.\n // Keys must match exactly what the React app reads:\n // - \"eliza:theme\" → ThemeName\n // - \"eliza_avatar_index\" → VRM index (1–8)\n // - \"eliza.stream.overlay-layout.v1[.destId]\" → OverlayLayout JSON\n await page.evaluateOnNewDocument(\n (\n overlayLayout: string | undefined,\n theme: string | undefined,\n avatarIndex: number | undefined,\n destinationId: string | undefined,\n ) => {\n if (overlayLayout) {\n // Seed both global and destination-specific keys so the hook\n // resolves correctly regardless of when activeDestination loads.\n localStorage.setItem(\"eliza.stream.overlay-layout.v1\", overlayLayout);\n if (destinationId) {\n localStorage.setItem(\n `eliza.stream.overlay-layout.v1.${destinationId}`,\n overlayLayout,\n );\n }\n }\n if (theme) {\n localStorage.setItem(\"eliza:theme\", theme);\n }\n if (avatarIndex != null) {\n localStorage.setItem(\"eliza_avatar_index\", String(avatarIndex));\n }\n },\n config.overlayLayout,\n config.theme,\n config.avatarIndex,\n config.destinationId,\n );\n\n // Use networkidle0 so fonts, VRM models, and preview images finish loading\n await page.goto(captureUrl, {\n waitUntil: \"networkidle0\",\n timeout: 60_000,\n });\n\n logger.info(`[browser-capture] Page loaded, writing frames to ${FRAME_FILE}`);\n\n let frameCount = 0;\n const frameIntervalMs = Math.max(100, Math.round(1000 / Math.max(1, fps)));\n activeCaptureLoop = (async () => {\n while (!stopSignal) {\n try {\n await page.screenshot({\n path: FRAME_FILE,\n quality,\n type: \"jpeg\",\n });\n frameCount += 1;\n if (frameCount % 20 === 0) {\n logger.debug(`[browser-capture] ${frameCount} frames written`);\n }\n } catch (error) {\n if (!stopSignal) {\n logger.warn(\n `[browser-capture] frame capture failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n if (!stopSignal) {\n await sleep(frameIntervalMs);\n }\n }\n })();\n\n logger.info(\n `[browser-capture] Screenshot loop active (${fps} fps), saving to ${FRAME_FILE}`,\n );\n}\n\nexport async function stopBrowserCapture() {\n stopSignal = true;\n if (activeCaptureLoop) {\n try {\n await activeCaptureLoop;\n } catch {}\n activeCaptureLoop = null;\n }\n if (activeBrowser) {\n try {\n await activeBrowser.close();\n } catch {}\n activeBrowser = null;\n }\n logger.info(\"[browser-capture] Stopped\");\n}\n\nexport function isBrowserCaptureRunning(): boolean {\n return activeBrowser !== null;\n}\n\nexport function hasFrameFile(): boolean {\n return existsSync(FRAME_FILE);\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/workspace/browser-capture.ts"],"sourcesContent":["/**\n * Headless browser capture — opens the StreamView in headless Chrome and\n * saves screenshots to a temp file. FFmpeg reads the temp file using\n * -loop 1 to continuously re-read the latest frame.\n *\n * This approach avoids the pipe bottleneck — FFmpeg reads at its own\n * pace while the browser updates the file independently.\n *\n * Visual parity with the desktop shell:\n * - Appends `?popout` to the URL so the app renders StreamView directly\n * (without onboarding, auth gates, or navigation chrome).\n * - Enables SwiftShader for WebGL so VRM avatar renders identically.\n * - Seeds localStorage with overlay layout, theme, and avatar index so\n * the first rendered frame matches the configured appearance.\n * - Uses `waitUntil: \"networkidle0\"` to ensure all assets load before capture.\n * - Keeps CSS animations/transitions enabled for visual parity.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { setTimeout as sleep } from \"node:timers/promises\";\nimport { logger } from \"@elizaos/core\";\nimport type { Browser } from \"puppeteer-core\";\n\nconst CHROME_PATH =\n process.platform === \"darwin\"\n ? \"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\"\n : process.platform === \"win32\"\n ? \"C:\\\\Program Files\\\\Google Chrome\\\\Application\\\\chrome.exe\"\n : \"/usr/bin/google-chrome-stable\";\n\nlet activeBrowser: Browser | null = null;\nlet activeCaptureLoop: Promise<void> | null = null;\nlet stopSignal = false;\n\n/** Path to the temp frame file that FFmpeg reads */\nexport const FRAME_FILE = join(tmpdir(), \"eliza-stream-frame.jpg\");\n\nexport interface BrowserCaptureConfig {\n url: string;\n width?: number;\n height?: number;\n fps?: number;\n quality?: number;\n /** Optional overlay layout JSON to seed into localStorage before page load. */\n overlayLayout?: string;\n /** Theme name to apply (e.g. \"eliza\", \"haxor\", \"psycho\"). */\n theme?: string;\n /** Avatar VRM index (1–8). */\n avatarIndex?: number;\n /** Destination ID — seeds the destination-specific localStorage key. */\n destinationId?: string;\n}\n\nexport function getBrowserCaptureExecutablePath(): string {\n return CHROME_PATH;\n}\n\nexport function isBrowserCaptureSupported(): boolean {\n return existsSync(CHROME_PATH);\n}\n\n/**\n * Ensure the URL includes the `?popout` parameter so the app renders only\n * StreamView without startup gates or navigation chrome.\n */\nfunction ensurePopoutUrl(raw: string): string {\n try {\n const u = new URL(raw);\n // Handle both query and hash-based routing\n if (u.hash?.includes(\"?\")) {\n if (!u.hash.includes(\"popout\")) {\n u.hash = `${u.hash}&popout`;\n }\n } else if (u.hash) {\n u.hash = `${u.hash}?popout`;\n } else if (!u.searchParams.has(\"popout\")) {\n u.searchParams.set(\"popout\", \"\");\n }\n return u.toString();\n } catch {\n // Fallback: just append\n const sep = raw.includes(\"?\") ? \"&\" : \"?\";\n return `${raw}${sep}popout`;\n }\n}\n\nexport async function startBrowserCapture(config: BrowserCaptureConfig) {\n if (activeBrowser) {\n logger.info(\"[browser-capture] Already running\");\n return;\n }\n\n if (!isBrowserCaptureSupported()) {\n throw new Error(\n `Google Chrome not found at ${CHROME_PATH}. Install Chrome or update browser-capture before enabling screen capture.`,\n );\n }\n\n const { url, width = 1280, height = 720, fps = 4, quality = 70 } = config;\n const captureUrl = ensurePopoutUrl(url);\n\n stopSignal = false;\n logger.info(`[browser-capture] Launching headless Chrome to ${captureUrl}`);\n\n const { default: puppeteer } = await import(\"puppeteer-core\");\n const browser = await puppeteer.launch({\n executablePath: CHROME_PATH,\n headless: true,\n args: [\n `--window-size=${width},${height}`,\n \"--no-sandbox\",\n \"--disable-dev-shm-usage\",\n \"--disable-extensions\",\n \"--mute-audio\",\n // WebGL / SwiftShader — required for VRM avatar rendering parity\n \"--use-gl=swiftshader\",\n \"--enable-webgl\",\n \"--ignore-gpu-blocklist\",\n ],\n });\n\n activeBrowser = browser;\n\n const page = await browser.newPage();\n await page.setViewport({ width, height, deviceScaleFactor: 1 });\n\n // Seed localStorage before navigation so the first render matches the desktop shell.\n // Keys must match exactly what the React app reads:\n // - \"eliza:theme\" → ThemeName\n // - \"eliza_avatar_index\" → VRM index (1–8)\n // - \"eliza.stream.overlay-layout.v1[.destId]\" → OverlayLayout JSON\n await page.evaluateOnNewDocument(\n (\n overlayLayout: string | undefined,\n theme: string | undefined,\n avatarIndex: number | undefined,\n destinationId: string | undefined,\n ) => {\n if (overlayLayout) {\n // Seed both global and destination-specific keys so the hook\n // resolves correctly regardless of when activeDestination loads.\n localStorage.setItem(\"eliza.stream.overlay-layout.v1\", overlayLayout);\n if (destinationId) {\n localStorage.setItem(\n `eliza.stream.overlay-layout.v1.${destinationId}`,\n overlayLayout,\n );\n }\n }\n if (theme) {\n localStorage.setItem(\"eliza:theme\", theme);\n }\n if (avatarIndex != null) {\n localStorage.setItem(\"eliza_avatar_index\", String(avatarIndex));\n }\n },\n config.overlayLayout,\n config.theme,\n config.avatarIndex,\n config.destinationId,\n );\n\n // Use networkidle0 so fonts, VRM models, and preview images finish loading\n await page.goto(captureUrl, {\n waitUntil: \"networkidle0\",\n timeout: 60_000,\n });\n\n logger.info(`[browser-capture] Page loaded, writing frames to ${FRAME_FILE}`);\n\n let frameCount = 0;\n const frameIntervalMs = Math.max(100, Math.round(1000 / Math.max(1, fps)));\n activeCaptureLoop = (async () => {\n while (!stopSignal) {\n try {\n await page.screenshot({\n path: FRAME_FILE,\n quality,\n type: \"jpeg\",\n });\n frameCount += 1;\n if (frameCount % 20 === 0) {\n logger.debug(`[browser-capture] ${frameCount} frames written`);\n }\n } catch (error) {\n if (!stopSignal) {\n logger.warn(\n `[browser-capture] frame capture failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n if (!stopSignal) {\n await sleep(frameIntervalMs);\n }\n }\n })();\n\n logger.info(\n `[browser-capture] Screenshot loop active (${fps} fps), saving to ${FRAME_FILE}`,\n );\n}\n\nexport async function stopBrowserCapture() {\n stopSignal = true;\n if (activeCaptureLoop) {\n try {\n await activeCaptureLoop;\n } catch {}\n activeCaptureLoop = null;\n }\n if (activeBrowser) {\n try {\n await activeBrowser.close();\n } catch {}\n activeBrowser = null;\n }\n logger.info(\"[browser-capture] Stopped\");\n}\n\nexport function isBrowserCaptureRunning(): boolean {\n return activeBrowser !== null;\n}\n\nexport function hasFrameFile(): boolean {\n return existsSync(FRAME_FILE);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -7,7 +7,7 @@ export declare function evaluateBrowserWorkspaceTab(request: EvaluateBrowserWork
|
|
|
7
7
|
export declare function snapshotBrowserWorkspaceTab(id: string, env?: NodeJS.ProcessEnv): Promise<{
|
|
8
8
|
data: string;
|
|
9
9
|
}>;
|
|
10
|
-
export declare function createDesktopBrowserWorkspaceCommandScript(command: BrowserWorkspaceCommand): string;
|
|
10
|
+
export declare function createDesktopBrowserWorkspaceCommandScript(command: BrowserWorkspaceCommand, env?: NodeJS.ProcessEnv): string;
|
|
11
11
|
export declare function createDesktopBrowserWorkspaceUtilityScript(command: BrowserWorkspaceCommand): string;
|
|
12
12
|
export declare function executeDesktopBrowserWorkspaceUtilityCommand(command: BrowserWorkspaceCommand, env: NodeJS.ProcessEnv): Promise<BrowserWorkspaceCommandResult>;
|
|
13
13
|
export declare function getDesktopBrowserWorkspaceSnapshotRecord(command: BrowserWorkspaceCommand, env: NodeJS.ProcessEnv): Promise<BrowserWorkspaceSnapshotRecord>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-workspace-desktop.d.ts","sourceRoot":"","sources":["../../src/workspace/browser-workspace-desktop.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"browser-workspace-desktop.d.ts","sourceRoot":"","sources":["../../src/workspace/browser-workspace-desktop.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EACV,4BAA4B,EAC5B,uBAAuB,EACvB,6BAA6B,EAE7B,8BAA8B,EAC9B,mBAAmB,EACnB,kCAAkC,EACnC,MAAM,8BAA8B,CAAC;AAsBtC,wBAAgB,mCAAmC,CACjD,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,4BAA4B,GAAG,IAAI,CAUrC;AAED,wBAAgB,kCAAkC,CAChD,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAET;AAED,wBAAgB,qCAAqC,IAAI,MAAM,CAE9D;AAED,wBAAsB,uBAAuB,CAAC,CAAC,EAC7C,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,WAAW,EAClB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAAC,CAAC,CAAC,CA6BZ;AAED,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,kCAAkC,EAC3C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAAC,OAAO,CAAC,CAuBlB;AAED,wBAAsB,2BAA2B,CAC/C,EAAE,EAAE,MAAM,EACV,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAY3B;AAsBD,wBAAgB,0CAA0C,CACxD,OAAO,EAAE,uBAAuB,EAChC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CA0wBR;AAED,wBAAgB,0CAA0C,CACxD,OAAO,EAAE,uBAAuB,GAC/B,MAAM,CAibR;AAED,wBAAsB,4CAA4C,CAChE,OAAO,EAAE,uBAAuB,EAChC,GAAG,EAAE,MAAM,CAAC,UAAU,GACrB,OAAO,CAAC,6BAA6B,CAAC,CAwCxC;AAED,wBAAsB,wCAAwC,CAC5D,OAAO,EAAE,uBAAuB,EAChC,GAAG,EAAE,MAAM,CAAC,UAAU,GACrB,OAAO,CAAC,8BAA8B,CAAC,CA0CzC;AAED,wBAAsB,sCAAsC,CAC1D,OAAO,EAAE,uBAAuB,EAChC,GAAG,EAAE,MAAM,CAAC,UAAU,GACrB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAwClC;AAED,wBAAsB,uCAAuC,CAC3D,OAAO,EAAE,uBAAuB,EAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,GAAG,EAAE,MAAM,CAAC,UAAU,GACrB,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAED,wBAAsB,wCAAwC,CAC5D,OAAO,EAAE,uBAAuB,EAChC,GAAG,EAAE,MAAM,CAAC,UAAU,GACrB,OAAO,CAAC,6BAA6B,CAAC,CA+DxC;AAID,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,mBAAmB,EAAE,GAC1B,mBAAmB,GAAG,IAAI,CAgB5B;AAED,wBAAsB,yCAAyC,CAC7D,OAAO,EAAE,uBAAuB,EAChC,GAAG,EAAE,MAAM,CAAC,UAAU,GACrB,OAAO,CAAC,MAAM,CAAC,CAoBjB"}
|