@elizaos/plugin-browser 2.0.0-beta.1 → 2.0.3-beta.3
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 +312 -60
- 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/actions/wait-for-url-predicate.d.ts +34 -0
- package/dist/actions/wait-for-url-predicate.d.ts.map +1 -0
- package/dist/actions/wait-for-url-predicate.js +33 -0
- package/dist/actions/wait-for-url-predicate.js.map +1 -0
- package/dist/actions/wait-for-url.d.ts +64 -0
- package/dist/actions/wait-for-url.d.ts.map +1 -0
- package/dist/actions/wait-for-url.js +89 -0
- package/dist/actions/wait-for-url.js.map +1 -0
- 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 +12 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +66 -12
- 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/parity/browser-matrix.d.ts +45 -0
- package/dist/parity/browser-matrix.d.ts.map +1 -0
- package/dist/parity/browser-matrix.js +361 -0
- package/dist/parity/browser-matrix.js.map +1 -0
- package/dist/parity/index.d.ts +5 -0
- package/dist/parity/index.d.ts.map +1 -0
- package/dist/parity/index.js +13 -0
- package/dist/parity/index.js.map +1 -0
- 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 +104 -4
- 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.d.ts.map +1 -1
- package/dist/workspace/browser-capture.js +33 -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 +66 -30
- package/dist/workspace/browser-workspace-desktop.js.map +1 -1
- package/dist/workspace/browser-workspace-errors.d.ts +62 -0
- package/dist/workspace/browser-workspace-errors.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-errors.js +69 -0
- package/dist/workspace/browser-workspace-errors.js.map +1 -0
- 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 +64 -6
- 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 +34 -93
- 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/dist/workspace/index.d.ts +1 -0
- package/dist/workspace/index.d.ts.map +1 -1
- package/dist/workspace/index.js +1 -0
- package/dist/workspace/index.js.map +1 -1
- package/package.json +29 -7
- package/registry-entry.json +75 -0
- 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
package/dist/routes/workspace.js
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
import { requestBrowserWorkspace } from "../workspace/browser-workspace-desktop.js";
|
|
2
|
+
import {
|
|
3
|
+
createBrowserWorkspaceError,
|
|
4
|
+
isBrowserWorkspaceError
|
|
5
|
+
} from "../workspace/browser-workspace-errors.js";
|
|
6
|
+
import { assertBrowserWorkspaceUserScriptAllowed } from "../workspace/browser-workspace-helpers.js";
|
|
1
7
|
import {
|
|
2
8
|
closeBrowserWorkspaceTab,
|
|
3
9
|
evaluateBrowserWorkspaceTab,
|
|
@@ -5,6 +11,7 @@ import {
|
|
|
5
11
|
getBrowserWorkspaceSnapshot,
|
|
6
12
|
getBrowserWorkspaceUnavailableMessage,
|
|
7
13
|
hideBrowserWorkspaceTab,
|
|
14
|
+
isBrowserWorkspaceBridgeConfigured,
|
|
8
15
|
listBrowserWorkspaceTabs,
|
|
9
16
|
navigateBrowserWorkspaceTab,
|
|
10
17
|
openBrowserWorkspaceTab,
|
|
@@ -15,10 +22,36 @@ import {
|
|
|
15
22
|
assertBrowserWorkspaceCommandConnectorAccountGate,
|
|
16
23
|
assertBrowserWorkspaceConnectorAccountGate
|
|
17
24
|
} from "./workspace-account-gate.js";
|
|
25
|
+
function statusFromBrowserWorkspaceErrorCode(code, message) {
|
|
26
|
+
switch (code) {
|
|
27
|
+
case "invalid_url":
|
|
28
|
+
case "unknown_element_ref":
|
|
29
|
+
return 400;
|
|
30
|
+
case "tab_not_found":
|
|
31
|
+
return 404;
|
|
32
|
+
case "target_missing":
|
|
33
|
+
return 409;
|
|
34
|
+
case "desktop_only":
|
|
35
|
+
return message.includes(getBrowserWorkspaceUnavailableMessage()) ? 503 : 409;
|
|
36
|
+
case "script_forbidden":
|
|
37
|
+
case "connector_secret_export_forbidden":
|
|
38
|
+
return 403;
|
|
39
|
+
case "timeout":
|
|
40
|
+
return 504;
|
|
41
|
+
case "command_failed":
|
|
42
|
+
return 500;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
18
45
|
function statusFromBrowserWorkspaceError(error, message) {
|
|
19
46
|
if (error instanceof Error && "status" in error && typeof error.status === "number") {
|
|
20
47
|
return error.status;
|
|
21
48
|
}
|
|
49
|
+
if (isBrowserWorkspaceError(error)) {
|
|
50
|
+
return statusFromBrowserWorkspaceErrorCode(
|
|
51
|
+
error.browserWorkspaceErrorCode,
|
|
52
|
+
message
|
|
53
|
+
);
|
|
54
|
+
}
|
|
22
55
|
if (message.includes(getBrowserWorkspaceUnavailableMessage())) {
|
|
23
56
|
return 503;
|
|
24
57
|
}
|
|
@@ -40,6 +73,33 @@ function connectorReferenceFromSearchParams(url) {
|
|
|
40
73
|
partition: url?.searchParams.get("partition")
|
|
41
74
|
};
|
|
42
75
|
}
|
|
76
|
+
function buildBrowserWorkspaceEventsBridgePath(url) {
|
|
77
|
+
const params = new URLSearchParams();
|
|
78
|
+
for (const key of ["after", "limit", "tabId", "type"]) {
|
|
79
|
+
const value = url?.searchParams.get(key)?.trim();
|
|
80
|
+
if (value) {
|
|
81
|
+
params.set(key, value);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const query = params.toString();
|
|
85
|
+
return query ? `/events?${query}` : "/events";
|
|
86
|
+
}
|
|
87
|
+
function isBrowserWorkspaceRouteBodyObject(value) {
|
|
88
|
+
return Boolean(value && typeof value === "object" && !Array.isArray(value));
|
|
89
|
+
}
|
|
90
|
+
function rejectMalformedBrowserWorkspacePayload(ctx) {
|
|
91
|
+
ctx.json(ctx.res, { error: "request body must be a JSON object" }, 400);
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
function decodeBrowserWorkspaceTabId(raw) {
|
|
95
|
+
if (typeof raw !== "string") return null;
|
|
96
|
+
try {
|
|
97
|
+
const decoded = decodeURIComponent(raw).trim();
|
|
98
|
+
return decoded ? decoded : null;
|
|
99
|
+
} catch {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
43
103
|
async function assertBrowserWorkspaceTabConnectorAccountGate(ctx, tabId, reference, operation) {
|
|
44
104
|
const tabs = await listBrowserWorkspaceTabs();
|
|
45
105
|
const tab = tabs.find((entry) => entry.id === tabId) ?? null;
|
|
@@ -53,7 +113,7 @@ async function assertBrowserWorkspaceTabConnectorAccountGate(ctx, tabId, referen
|
|
|
53
113
|
}
|
|
54
114
|
async function handleBrowserWorkspaceRoutes(ctx) {
|
|
55
115
|
const { req, res, method, pathname, readJsonBody, json } = ctx;
|
|
56
|
-
if (pathname !== "/api/browser-workspace" && pathname !== "/api/browser-workspace/command" && pathname !== "/api/browser-workspace/tabs" && !pathname.startsWith("/api/browser-workspace/tabs/")) {
|
|
116
|
+
if (pathname !== "/api/browser-workspace" && pathname !== "/api/browser-workspace/command" && pathname !== "/api/browser-workspace/events" && pathname !== "/api/browser-workspace/tabs" && !pathname.startsWith("/api/browser-workspace/tabs/")) {
|
|
57
117
|
return false;
|
|
58
118
|
}
|
|
59
119
|
try {
|
|
@@ -61,8 +121,27 @@ async function handleBrowserWorkspaceRoutes(ctx) {
|
|
|
61
121
|
json(res, await getBrowserWorkspaceSnapshot());
|
|
62
122
|
return true;
|
|
63
123
|
}
|
|
124
|
+
if (pathname === "/api/browser-workspace/events" && method === "GET") {
|
|
125
|
+
if (!isBrowserWorkspaceBridgeConfigured()) {
|
|
126
|
+
throw createBrowserWorkspaceError(
|
|
127
|
+
"desktop_only",
|
|
128
|
+
"events",
|
|
129
|
+
getBrowserWorkspaceUnavailableMessage()
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
json(
|
|
133
|
+
res,
|
|
134
|
+
await requestBrowserWorkspace(
|
|
135
|
+
buildBrowserWorkspaceEventsBridgePath(ctx.url)
|
|
136
|
+
)
|
|
137
|
+
);
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
64
140
|
if (pathname === "/api/browser-workspace/command" && method === "POST") {
|
|
65
141
|
const body = await readJsonBody(req, res) ?? null;
|
|
142
|
+
if (!isBrowserWorkspaceRouteBodyObject(body)) {
|
|
143
|
+
return rejectMalformedBrowserWorkspacePayload(ctx);
|
|
144
|
+
}
|
|
66
145
|
if (!body?.subaction) {
|
|
67
146
|
json(res, { error: "subaction is required" }, 400);
|
|
68
147
|
return true;
|
|
@@ -80,7 +159,10 @@ async function handleBrowserWorkspaceRoutes(ctx) {
|
|
|
80
159
|
return true;
|
|
81
160
|
}
|
|
82
161
|
if (pathname === "/api/browser-workspace/tabs" && method === "POST") {
|
|
83
|
-
const body = await readJsonBody(req, res) ??
|
|
162
|
+
const body = await readJsonBody(req, res) ?? null;
|
|
163
|
+
if (!isBrowserWorkspaceRouteBodyObject(body)) {
|
|
164
|
+
return rejectMalformedBrowserWorkspacePayload(ctx);
|
|
165
|
+
}
|
|
84
166
|
const connectorGate = await assertBrowserWorkspaceConnectorAccountGate({
|
|
85
167
|
runtime: ctx.state?.runtime ?? null,
|
|
86
168
|
connectorProvider: body.connectorProvider,
|
|
@@ -102,7 +184,11 @@ async function handleBrowserWorkspaceRoutes(ctx) {
|
|
|
102
184
|
if (!match) {
|
|
103
185
|
return false;
|
|
104
186
|
}
|
|
105
|
-
const tabId =
|
|
187
|
+
const tabId = decodeBrowserWorkspaceTabId(match[1]);
|
|
188
|
+
if (!tabId) {
|
|
189
|
+
json(res, { error: "valid tab id is required" }, 400);
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
106
192
|
const action = match[2] ?? null;
|
|
107
193
|
if (!action && method === "DELETE") {
|
|
108
194
|
await assertBrowserWorkspaceTabConnectorAccountGate(
|
|
@@ -151,6 +237,9 @@ async function handleBrowserWorkspaceRoutes(ctx) {
|
|
|
151
237
|
}
|
|
152
238
|
if (action === "navigate" && method === "POST") {
|
|
153
239
|
const body = await readJsonBody(req, res);
|
|
240
|
+
if (!isBrowserWorkspaceRouteBodyObject(body)) {
|
|
241
|
+
return rejectMalformedBrowserWorkspacePayload(ctx);
|
|
242
|
+
}
|
|
154
243
|
if (!body?.url?.trim()) {
|
|
155
244
|
json(res, { error: "url is required" }, 400);
|
|
156
245
|
return true;
|
|
@@ -171,6 +260,9 @@ async function handleBrowserWorkspaceRoutes(ctx) {
|
|
|
171
260
|
}
|
|
172
261
|
if (action === "eval" && method === "POST") {
|
|
173
262
|
const body = await readJsonBody(req, res);
|
|
263
|
+
if (!isBrowserWorkspaceRouteBodyObject(body)) {
|
|
264
|
+
return rejectMalformedBrowserWorkspacePayload(ctx);
|
|
265
|
+
}
|
|
174
266
|
if (!body?.script?.trim()) {
|
|
175
267
|
json(res, { error: "script is required" }, 400);
|
|
176
268
|
return true;
|
|
@@ -181,6 +273,7 @@ async function handleBrowserWorkspaceRoutes(ctx) {
|
|
|
181
273
|
body,
|
|
182
274
|
"evaluate browser workspace tab"
|
|
183
275
|
);
|
|
276
|
+
assertBrowserWorkspaceUserScriptAllowed(body.script, "eval", "desktop");
|
|
184
277
|
json(res, {
|
|
185
278
|
result: await evaluateBrowserWorkspaceTab({
|
|
186
279
|
id: tabId,
|
|
@@ -193,13 +286,20 @@ async function handleBrowserWorkspaceRoutes(ctx) {
|
|
|
193
286
|
} catch (error) {
|
|
194
287
|
const message = error instanceof Error ? error.message : String(error);
|
|
195
288
|
const status = statusFromBrowserWorkspaceError(error, message);
|
|
196
|
-
|
|
289
|
+
const body = {
|
|
290
|
+
error: message
|
|
291
|
+
};
|
|
292
|
+
if (isBrowserWorkspaceError(error)) {
|
|
293
|
+
body.code = error.browserWorkspaceErrorCode;
|
|
294
|
+
}
|
|
295
|
+
json(res, body, status);
|
|
197
296
|
return true;
|
|
198
297
|
}
|
|
199
298
|
}
|
|
200
299
|
const BROWSER_WORKSPACE_ROUTE_PATHS = [
|
|
201
300
|
{ type: "GET", path: "/api/browser-workspace" },
|
|
202
301
|
{ type: "POST", path: "/api/browser-workspace/command" },
|
|
302
|
+
{ type: "GET", path: "/api/browser-workspace/events" },
|
|
203
303
|
{ type: "GET", path: "/api/browser-workspace/tabs" },
|
|
204
304
|
{ type: "POST", path: "/api/browser-workspace/tabs" },
|
|
205
305
|
{ type: "DELETE", path: "/api/browser-workspace/tabs/:tabId" },
|
|
@@ -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 {\n type BrowserWorkspaceErrorCode,\n createBrowserWorkspaceError,\n isBrowserWorkspaceError,\n} from \"../workspace/browser-workspace-errors.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 statusFromBrowserWorkspaceErrorCode(\n code: BrowserWorkspaceErrorCode,\n message: string,\n): number {\n switch (code) {\n case \"invalid_url\":\n case \"unknown_element_ref\":\n return 400;\n case \"tab_not_found\":\n return 404;\n case \"target_missing\":\n return 409;\n case \"desktop_only\":\n return message.includes(getBrowserWorkspaceUnavailableMessage())\n ? 503\n : 409;\n case \"script_forbidden\":\n case \"connector_secret_export_forbidden\":\n return 403;\n case \"timeout\":\n return 504;\n case \"command_failed\":\n return 500;\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 (isBrowserWorkspaceError(error)) {\n return statusFromBrowserWorkspaceErrorCode(\n error.browserWorkspaceErrorCode,\n message,\n );\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 createBrowserWorkspaceError(\n \"desktop_only\",\n \"events\",\n getBrowserWorkspaceUnavailableMessage(),\n );\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 const body: { code?: BrowserWorkspaceErrorCode; error: string } = {\n error: message,\n };\n if (isBrowserWorkspaceError(error)) {\n body.code = error.browserWorkspaceErrorCode;\n }\n json(res, body, 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"}
|