@elizaos/plugin-browser 2.0.3-beta.2 → 2.0.3-beta.4
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/dist/actions/browser.d.ts.map +1 -1
- package/dist/actions/browser.js +264 -7
- package/dist/actions/browser.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/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -8
- package/dist/index.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/routes/workspace.d.ts.map +1 -1
- package/dist/routes/workspace.js +42 -2
- package/dist/routes/workspace.js.map +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.map +1 -1
- package/dist/workspace/browser-workspace-desktop.js +19 -5
- 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-helpers.d.ts.map +1 -1
- package/dist/workspace/browser-workspace-helpers.js +29 -8
- package/dist/workspace/browser-workspace-helpers.js.map +1 -1
- package/dist/workspace/browser-workspace-web.d.ts.map +1 -1
- package/dist/workspace/browser-workspace-web.js +20 -6
- package/dist/workspace/browser-workspace-web.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 +5 -4
- package/registry-entry.json +75 -0
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
import { listSubactionsFromParameters } from "@elizaos/core";
|
|
2
|
+
import { browserAction } from "../actions/browser.js";
|
|
3
|
+
const WORKSPACE = "workspace";
|
|
4
|
+
const BROWSER_PARITY_MATRIX = [
|
|
5
|
+
{
|
|
6
|
+
id: "open",
|
|
7
|
+
actionValue: "open",
|
|
8
|
+
elizaVerb: "BROWSER_OPEN",
|
|
9
|
+
dispatchesTo: "open",
|
|
10
|
+
status: "have",
|
|
11
|
+
surface: WORKSPACE
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
id: "navigate",
|
|
15
|
+
actionValue: "navigate",
|
|
16
|
+
elizaVerb: "BROWSER_NAVIGATE",
|
|
17
|
+
dispatchesTo: "navigate",
|
|
18
|
+
status: "have",
|
|
19
|
+
surface: WORKSPACE
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
id: "click",
|
|
23
|
+
actionValue: "click",
|
|
24
|
+
elizaVerb: "BROWSER_CLICK",
|
|
25
|
+
dispatchesTo: "click",
|
|
26
|
+
status: "have",
|
|
27
|
+
surface: WORKSPACE
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: "type",
|
|
31
|
+
actionValue: "type",
|
|
32
|
+
elizaVerb: "BROWSER_TYPE",
|
|
33
|
+
dispatchesTo: "type",
|
|
34
|
+
status: "have",
|
|
35
|
+
surface: WORKSPACE
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
id: "press",
|
|
39
|
+
actionValue: "press",
|
|
40
|
+
elizaVerb: "BROWSER_PRESS",
|
|
41
|
+
dispatchesTo: "press",
|
|
42
|
+
status: "have",
|
|
43
|
+
surface: WORKSPACE
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
id: "get",
|
|
47
|
+
actionValue: "get",
|
|
48
|
+
elizaVerb: "BROWSER_GET",
|
|
49
|
+
dispatchesTo: "get",
|
|
50
|
+
status: "have",
|
|
51
|
+
surface: WORKSPACE
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
id: "state",
|
|
55
|
+
actionValue: "state",
|
|
56
|
+
elizaVerb: "BROWSER_STATE",
|
|
57
|
+
dispatchesTo: "state",
|
|
58
|
+
status: "have",
|
|
59
|
+
surface: WORKSPACE
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
id: "snapshot",
|
|
63
|
+
actionValue: "snapshot",
|
|
64
|
+
elizaVerb: "BROWSER_SNAPSHOT",
|
|
65
|
+
dispatchesTo: "snapshot",
|
|
66
|
+
status: "have",
|
|
67
|
+
surface: WORKSPACE
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
id: "screenshot",
|
|
71
|
+
actionValue: "screenshot",
|
|
72
|
+
elizaVerb: "BROWSER_SCREENSHOT",
|
|
73
|
+
dispatchesTo: "screenshot",
|
|
74
|
+
status: "have",
|
|
75
|
+
surface: WORKSPACE
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
id: "reload",
|
|
79
|
+
actionValue: "reload",
|
|
80
|
+
elizaVerb: "BROWSER_RELOAD",
|
|
81
|
+
dispatchesTo: "reload",
|
|
82
|
+
status: "have",
|
|
83
|
+
surface: WORKSPACE
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
id: "back",
|
|
87
|
+
actionValue: "back",
|
|
88
|
+
elizaVerb: "BROWSER_BACK",
|
|
89
|
+
dispatchesTo: "back",
|
|
90
|
+
status: "have",
|
|
91
|
+
surface: WORKSPACE
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
id: "forward",
|
|
95
|
+
actionValue: "forward",
|
|
96
|
+
elizaVerb: "BROWSER_FORWARD",
|
|
97
|
+
dispatchesTo: "forward",
|
|
98
|
+
status: "have",
|
|
99
|
+
surface: WORKSPACE
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
id: "close",
|
|
103
|
+
actionValue: "close",
|
|
104
|
+
elizaVerb: "BROWSER_CLOSE",
|
|
105
|
+
dispatchesTo: "close",
|
|
106
|
+
status: "have",
|
|
107
|
+
surface: WORKSPACE
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
id: "show",
|
|
111
|
+
actionValue: "show",
|
|
112
|
+
elizaVerb: "BROWSER_SHOW",
|
|
113
|
+
dispatchesTo: "show",
|
|
114
|
+
status: "have",
|
|
115
|
+
surface: WORKSPACE
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
id: "hide",
|
|
119
|
+
actionValue: "hide",
|
|
120
|
+
elizaVerb: "BROWSER_HIDE",
|
|
121
|
+
dispatchesTo: "hide",
|
|
122
|
+
status: "have",
|
|
123
|
+
surface: WORKSPACE
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
id: "wait",
|
|
127
|
+
actionValue: "wait",
|
|
128
|
+
elizaVerb: "BROWSER_WAIT",
|
|
129
|
+
dispatchesTo: "wait",
|
|
130
|
+
status: "have",
|
|
131
|
+
surface: WORKSPACE
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
id: "tab",
|
|
135
|
+
actionValue: "tab",
|
|
136
|
+
elizaVerb: "BROWSER_TAB",
|
|
137
|
+
dispatchesTo: "tab",
|
|
138
|
+
status: "have",
|
|
139
|
+
surface: WORKSPACE
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
id: "realistic-click",
|
|
143
|
+
actionValue: "realistic_click",
|
|
144
|
+
elizaVerb: "BROWSER_REALISTIC_CLICK",
|
|
145
|
+
dispatchesTo: "realistic-click",
|
|
146
|
+
status: "have",
|
|
147
|
+
surface: WORKSPACE
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
id: "realistic-fill",
|
|
151
|
+
actionValue: "realistic_fill",
|
|
152
|
+
elizaVerb: "BROWSER_REALISTIC_FILL",
|
|
153
|
+
dispatchesTo: "realistic-fill",
|
|
154
|
+
status: "have",
|
|
155
|
+
surface: WORKSPACE
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
id: "realistic-type",
|
|
159
|
+
actionValue: "realistic_type",
|
|
160
|
+
elizaVerb: "BROWSER_REALISTIC_TYPE",
|
|
161
|
+
dispatchesTo: "realistic-type",
|
|
162
|
+
status: "have",
|
|
163
|
+
surface: WORKSPACE
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
id: "realistic-press",
|
|
167
|
+
actionValue: "realistic_press",
|
|
168
|
+
elizaVerb: "BROWSER_REALISTIC_PRESS",
|
|
169
|
+
dispatchesTo: "realistic-press",
|
|
170
|
+
status: "have",
|
|
171
|
+
surface: WORKSPACE
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
id: "cursor-move",
|
|
175
|
+
actionValue: "cursor_move",
|
|
176
|
+
elizaVerb: "BROWSER_CURSOR_MOVE",
|
|
177
|
+
dispatchesTo: "cursor-move",
|
|
178
|
+
status: "have",
|
|
179
|
+
surface: WORKSPACE
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
id: "cursor-hide",
|
|
183
|
+
actionValue: "cursor_hide",
|
|
184
|
+
elizaVerb: "BROWSER_CURSOR_HIDE",
|
|
185
|
+
dispatchesTo: "cursor-hide",
|
|
186
|
+
status: "have",
|
|
187
|
+
surface: WORKSPACE
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
id: "autofill-login",
|
|
191
|
+
actionValue: "autofill_login",
|
|
192
|
+
elizaVerb: "BROWSER_AUTOFILL_LOGIN",
|
|
193
|
+
dispatchesTo: "autofill-login",
|
|
194
|
+
status: "have",
|
|
195
|
+
surface: "credential",
|
|
196
|
+
note: "Vault-gated credential autofill over the active workspace tab."
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
id: "wait-for-url",
|
|
200
|
+
actionValue: "wait_for_url",
|
|
201
|
+
elizaVerb: "BROWSER_WAIT_FOR_URL",
|
|
202
|
+
dispatchesTo: "wait-for-url",
|
|
203
|
+
status: "have",
|
|
204
|
+
surface: "waiter",
|
|
205
|
+
note: "Polls current tab URL against a substring or /regex/ pattern."
|
|
206
|
+
},
|
|
207
|
+
// Legacy aliases remain promoted because they are still declared in the
|
|
208
|
+
// BROWSER action schema. Keep them explicit so removing one is deliberate.
|
|
209
|
+
{
|
|
210
|
+
id: "info",
|
|
211
|
+
actionValue: "info",
|
|
212
|
+
elizaVerb: "BROWSER_INFO",
|
|
213
|
+
dispatchesTo: "state",
|
|
214
|
+
status: "have",
|
|
215
|
+
surface: "legacy-alias"
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
id: "context",
|
|
219
|
+
actionValue: "context",
|
|
220
|
+
elizaVerb: "BROWSER_CONTEXT",
|
|
221
|
+
dispatchesTo: "state",
|
|
222
|
+
status: "have",
|
|
223
|
+
surface: "legacy-alias"
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
id: "get-context",
|
|
227
|
+
actionValue: "get_context",
|
|
228
|
+
elizaVerb: "BROWSER_GET_CONTEXT",
|
|
229
|
+
dispatchesTo: "state",
|
|
230
|
+
status: "have",
|
|
231
|
+
surface: "legacy-alias"
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
id: "list-tabs",
|
|
235
|
+
actionValue: "list_tabs",
|
|
236
|
+
elizaVerb: "BROWSER_LIST_TABS",
|
|
237
|
+
dispatchesTo: "tab:list",
|
|
238
|
+
status: "have",
|
|
239
|
+
surface: "legacy-alias"
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
id: "open-tab",
|
|
243
|
+
actionValue: "open_tab",
|
|
244
|
+
elizaVerb: "BROWSER_OPEN_TAB",
|
|
245
|
+
dispatchesTo: "tab:new",
|
|
246
|
+
status: "have",
|
|
247
|
+
surface: "legacy-alias"
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
id: "close-tab",
|
|
251
|
+
actionValue: "close_tab",
|
|
252
|
+
elizaVerb: "BROWSER_CLOSE_TAB",
|
|
253
|
+
dispatchesTo: "tab:close",
|
|
254
|
+
status: "have",
|
|
255
|
+
surface: "legacy-alias"
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
id: "switch-tab",
|
|
259
|
+
actionValue: "switch_tab",
|
|
260
|
+
elizaVerb: "BROWSER_SWITCH_TAB",
|
|
261
|
+
dispatchesTo: "tab:switch",
|
|
262
|
+
status: "have",
|
|
263
|
+
surface: "legacy-alias"
|
|
264
|
+
}
|
|
265
|
+
];
|
|
266
|
+
function liveBrowserActionValues() {
|
|
267
|
+
return listSubactionsFromParameters(browserAction.parameters);
|
|
268
|
+
}
|
|
269
|
+
function browserParitySummary() {
|
|
270
|
+
let have = 0;
|
|
271
|
+
let partial = 0;
|
|
272
|
+
let planned = 0;
|
|
273
|
+
let na = 0;
|
|
274
|
+
for (const cap of BROWSER_PARITY_MATRIX) {
|
|
275
|
+
if (cap.status === "have") have += 1;
|
|
276
|
+
else if (cap.status === "partial") partial += 1;
|
|
277
|
+
else if (cap.status === "planned") planned += 1;
|
|
278
|
+
else na += 1;
|
|
279
|
+
}
|
|
280
|
+
return { have, partial, planned, na, total: BROWSER_PARITY_MATRIX.length };
|
|
281
|
+
}
|
|
282
|
+
function validateBrowserParityMatrix(actionNames, actionValues = liveBrowserActionValues()) {
|
|
283
|
+
const registered = new Set(actionNames);
|
|
284
|
+
const schemaValues = new Set(actionValues);
|
|
285
|
+
const matrixByVerb = /* @__PURE__ */ new Map();
|
|
286
|
+
const matrixByActionValue = /* @__PURE__ */ new Map();
|
|
287
|
+
const problems = [];
|
|
288
|
+
let confirmed = 0;
|
|
289
|
+
for (const cap of BROWSER_PARITY_MATRIX) {
|
|
290
|
+
if (cap.elizaVerb) {
|
|
291
|
+
const existing = matrixByVerb.get(cap.elizaVerb);
|
|
292
|
+
if (existing) {
|
|
293
|
+
problems.push({
|
|
294
|
+
capability: cap.id,
|
|
295
|
+
problem: `duplicates elizaVerb ${cap.elizaVerb} from ${existing.id}`
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
matrixByVerb.set(cap.elizaVerb, cap);
|
|
299
|
+
}
|
|
300
|
+
if (cap.actionValue) {
|
|
301
|
+
const existing = matrixByActionValue.get(cap.actionValue);
|
|
302
|
+
if (existing) {
|
|
303
|
+
problems.push({
|
|
304
|
+
capability: cap.id,
|
|
305
|
+
problem: `duplicates action value ${cap.actionValue} from ${existing.id}`
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
matrixByActionValue.set(cap.actionValue, cap);
|
|
309
|
+
}
|
|
310
|
+
if (cap.status === "na") {
|
|
311
|
+
if (cap.elizaVerb) {
|
|
312
|
+
problems.push({
|
|
313
|
+
capability: cap.id,
|
|
314
|
+
problem: `status "na" must not declare elizaVerb ${cap.elizaVerb}`
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
if (cap.elizaVerb && !registered.has(cap.elizaVerb)) {
|
|
320
|
+
problems.push({
|
|
321
|
+
capability: cap.id,
|
|
322
|
+
problem: `verb ${cap.elizaVerb} is marked "${cap.status}" but is NOT registered`
|
|
323
|
+
});
|
|
324
|
+
} else if (cap.elizaVerb) {
|
|
325
|
+
confirmed += 1;
|
|
326
|
+
}
|
|
327
|
+
if (cap.actionValue && !schemaValues.has(cap.actionValue)) {
|
|
328
|
+
problems.push({
|
|
329
|
+
capability: cap.id,
|
|
330
|
+
problem: `action value ${cap.actionValue} is not declared by the BROWSER action schema`
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
for (const actionValue of schemaValues) {
|
|
335
|
+
if (!matrixByActionValue.has(actionValue)) {
|
|
336
|
+
problems.push({
|
|
337
|
+
capability: actionValue,
|
|
338
|
+
problem: "BROWSER action schema value is missing from BROWSER_PARITY_MATRIX"
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
for (const actionName of registered) {
|
|
343
|
+
if (actionName.startsWith("BROWSER_") && !matrixByVerb.has(actionName)) {
|
|
344
|
+
problems.push({
|
|
345
|
+
capability: actionName,
|
|
346
|
+
problem: "registered promoted BROWSER action is missing from BROWSER_PARITY_MATRIX"
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
return { ok: problems.length === 0, problems, confirmed };
|
|
351
|
+
}
|
|
352
|
+
function browserActionNames(actions) {
|
|
353
|
+
return actions.map((action) => action.name);
|
|
354
|
+
}
|
|
355
|
+
export {
|
|
356
|
+
BROWSER_PARITY_MATRIX,
|
|
357
|
+
browserActionNames,
|
|
358
|
+
browserParitySummary,
|
|
359
|
+
validateBrowserParityMatrix
|
|
360
|
+
};
|
|
361
|
+
//# sourceMappingURL=browser-matrix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/parity/browser-matrix.ts"],"sourcesContent":["/**\n * Machine-checkable browser action parity matrix (#9476).\n *\n * This is the browser equivalent of plugin-computeruse's parity guard: the\n * matrix is data, and the validator cross-checks it against the live registered\n * action surface plus the BROWSER action schema. That keeps browser capability\n * coverage from drifting silently while real-driver and benchmark lanes are\n * added.\n */\n\nimport type { Action } from \"@elizaos/core\";\nimport { listSubactionsFromParameters } from \"@elizaos/core\";\nimport { browserAction } from \"../actions/browser.js\";\n\nexport type BrowserParityStatus = \"have\" | \"partial\" | \"planned\" | \"na\";\nexport type BrowserParitySurface =\n | \"workspace\"\n | \"legacy-alias\"\n | \"credential\"\n | \"waiter\";\n\nexport interface BrowserParityCapability {\n /** Canonical capability id. Usually the exposed BROWSER action value. */\n id: string;\n /** Value declared in the BROWSER action schema. */\n actionValue?: string;\n /** Registered promoted action name for this capability. */\n elizaVerb?: string;\n /** Runtime command/subaction this capability dispatches to. */\n dispatchesTo?: string;\n status: BrowserParityStatus;\n surface: BrowserParitySurface;\n note?: string;\n}\n\nconst WORKSPACE = \"workspace\" as const;\n\nexport const BROWSER_PARITY_MATRIX: readonly BrowserParityCapability[] = [\n {\n id: \"open\",\n actionValue: \"open\",\n elizaVerb: \"BROWSER_OPEN\",\n dispatchesTo: \"open\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"navigate\",\n actionValue: \"navigate\",\n elizaVerb: \"BROWSER_NAVIGATE\",\n dispatchesTo: \"navigate\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"click\",\n actionValue: \"click\",\n elizaVerb: \"BROWSER_CLICK\",\n dispatchesTo: \"click\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"type\",\n actionValue: \"type\",\n elizaVerb: \"BROWSER_TYPE\",\n dispatchesTo: \"type\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"press\",\n actionValue: \"press\",\n elizaVerb: \"BROWSER_PRESS\",\n dispatchesTo: \"press\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"get\",\n actionValue: \"get\",\n elizaVerb: \"BROWSER_GET\",\n dispatchesTo: \"get\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"state\",\n actionValue: \"state\",\n elizaVerb: \"BROWSER_STATE\",\n dispatchesTo: \"state\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"snapshot\",\n actionValue: \"snapshot\",\n elizaVerb: \"BROWSER_SNAPSHOT\",\n dispatchesTo: \"snapshot\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"screenshot\",\n actionValue: \"screenshot\",\n elizaVerb: \"BROWSER_SCREENSHOT\",\n dispatchesTo: \"screenshot\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"reload\",\n actionValue: \"reload\",\n elizaVerb: \"BROWSER_RELOAD\",\n dispatchesTo: \"reload\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"back\",\n actionValue: \"back\",\n elizaVerb: \"BROWSER_BACK\",\n dispatchesTo: \"back\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"forward\",\n actionValue: \"forward\",\n elizaVerb: \"BROWSER_FORWARD\",\n dispatchesTo: \"forward\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"close\",\n actionValue: \"close\",\n elizaVerb: \"BROWSER_CLOSE\",\n dispatchesTo: \"close\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"show\",\n actionValue: \"show\",\n elizaVerb: \"BROWSER_SHOW\",\n dispatchesTo: \"show\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"hide\",\n actionValue: \"hide\",\n elizaVerb: \"BROWSER_HIDE\",\n dispatchesTo: \"hide\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"wait\",\n actionValue: \"wait\",\n elizaVerb: \"BROWSER_WAIT\",\n dispatchesTo: \"wait\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"tab\",\n actionValue: \"tab\",\n elizaVerb: \"BROWSER_TAB\",\n dispatchesTo: \"tab\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"realistic-click\",\n actionValue: \"realistic_click\",\n elizaVerb: \"BROWSER_REALISTIC_CLICK\",\n dispatchesTo: \"realistic-click\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"realistic-fill\",\n actionValue: \"realistic_fill\",\n elizaVerb: \"BROWSER_REALISTIC_FILL\",\n dispatchesTo: \"realistic-fill\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"realistic-type\",\n actionValue: \"realistic_type\",\n elizaVerb: \"BROWSER_REALISTIC_TYPE\",\n dispatchesTo: \"realistic-type\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"realistic-press\",\n actionValue: \"realistic_press\",\n elizaVerb: \"BROWSER_REALISTIC_PRESS\",\n dispatchesTo: \"realistic-press\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"cursor-move\",\n actionValue: \"cursor_move\",\n elizaVerb: \"BROWSER_CURSOR_MOVE\",\n dispatchesTo: \"cursor-move\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"cursor-hide\",\n actionValue: \"cursor_hide\",\n elizaVerb: \"BROWSER_CURSOR_HIDE\",\n dispatchesTo: \"cursor-hide\",\n status: \"have\",\n surface: WORKSPACE,\n },\n {\n id: \"autofill-login\",\n actionValue: \"autofill_login\",\n elizaVerb: \"BROWSER_AUTOFILL_LOGIN\",\n dispatchesTo: \"autofill-login\",\n status: \"have\",\n surface: \"credential\",\n note: \"Vault-gated credential autofill over the active workspace tab.\",\n },\n {\n id: \"wait-for-url\",\n actionValue: \"wait_for_url\",\n elizaVerb: \"BROWSER_WAIT_FOR_URL\",\n dispatchesTo: \"wait-for-url\",\n status: \"have\",\n surface: \"waiter\",\n note: \"Polls current tab URL against a substring or /regex/ pattern.\",\n },\n\n // Legacy aliases remain promoted because they are still declared in the\n // BROWSER action schema. Keep them explicit so removing one is deliberate.\n {\n id: \"info\",\n actionValue: \"info\",\n elizaVerb: \"BROWSER_INFO\",\n dispatchesTo: \"state\",\n status: \"have\",\n surface: \"legacy-alias\",\n },\n {\n id: \"context\",\n actionValue: \"context\",\n elizaVerb: \"BROWSER_CONTEXT\",\n dispatchesTo: \"state\",\n status: \"have\",\n surface: \"legacy-alias\",\n },\n {\n id: \"get-context\",\n actionValue: \"get_context\",\n elizaVerb: \"BROWSER_GET_CONTEXT\",\n dispatchesTo: \"state\",\n status: \"have\",\n surface: \"legacy-alias\",\n },\n {\n id: \"list-tabs\",\n actionValue: \"list_tabs\",\n elizaVerb: \"BROWSER_LIST_TABS\",\n dispatchesTo: \"tab:list\",\n status: \"have\",\n surface: \"legacy-alias\",\n },\n {\n id: \"open-tab\",\n actionValue: \"open_tab\",\n elizaVerb: \"BROWSER_OPEN_TAB\",\n dispatchesTo: \"tab:new\",\n status: \"have\",\n surface: \"legacy-alias\",\n },\n {\n id: \"close-tab\",\n actionValue: \"close_tab\",\n elizaVerb: \"BROWSER_CLOSE_TAB\",\n dispatchesTo: \"tab:close\",\n status: \"have\",\n surface: \"legacy-alias\",\n },\n {\n id: \"switch-tab\",\n actionValue: \"switch_tab\",\n elizaVerb: \"BROWSER_SWITCH_TAB\",\n dispatchesTo: \"tab:switch\",\n status: \"have\",\n surface: \"legacy-alias\",\n },\n];\n\nexport interface BrowserParityValidationProblem {\n capability: string;\n problem: string;\n}\n\nexport interface BrowserParityValidationResult {\n ok: boolean;\n problems: BrowserParityValidationProblem[];\n confirmed: number;\n}\n\nfunction liveBrowserActionValues(): readonly string[] {\n return listSubactionsFromParameters(browserAction.parameters);\n}\n\nexport function browserParitySummary(): {\n have: number;\n partial: number;\n planned: number;\n na: number;\n total: number;\n} {\n let have = 0;\n let partial = 0;\n let planned = 0;\n let na = 0;\n for (const cap of BROWSER_PARITY_MATRIX) {\n if (cap.status === \"have\") have += 1;\n else if (cap.status === \"partial\") partial += 1;\n else if (cap.status === \"planned\") planned += 1;\n else na += 1;\n }\n return { have, partial, planned, na, total: BROWSER_PARITY_MATRIX.length };\n}\n\nexport function validateBrowserParityMatrix(\n actionNames: readonly string[],\n actionValues: readonly string[] = liveBrowserActionValues(),\n): BrowserParityValidationResult {\n const registered = new Set(actionNames);\n const schemaValues = new Set(actionValues);\n const matrixByVerb = new Map<string, BrowserParityCapability>();\n const matrixByActionValue = new Map<string, BrowserParityCapability>();\n const problems: BrowserParityValidationProblem[] = [];\n let confirmed = 0;\n\n for (const cap of BROWSER_PARITY_MATRIX) {\n if (cap.elizaVerb) {\n const existing = matrixByVerb.get(cap.elizaVerb);\n if (existing) {\n problems.push({\n capability: cap.id,\n problem: `duplicates elizaVerb ${cap.elizaVerb} from ${existing.id}`,\n });\n }\n matrixByVerb.set(cap.elizaVerb, cap);\n }\n if (cap.actionValue) {\n const existing = matrixByActionValue.get(cap.actionValue);\n if (existing) {\n problems.push({\n capability: cap.id,\n problem: `duplicates action value ${cap.actionValue} from ${existing.id}`,\n });\n }\n matrixByActionValue.set(cap.actionValue, cap);\n }\n\n if (cap.status === \"na\") {\n if (cap.elizaVerb) {\n problems.push({\n capability: cap.id,\n problem: `status \"na\" must not declare elizaVerb ${cap.elizaVerb}`,\n });\n }\n continue;\n }\n\n if (cap.elizaVerb && !registered.has(cap.elizaVerb)) {\n problems.push({\n capability: cap.id,\n problem: `verb ${cap.elizaVerb} is marked \"${cap.status}\" but is NOT registered`,\n });\n } else if (cap.elizaVerb) {\n confirmed += 1;\n }\n\n if (cap.actionValue && !schemaValues.has(cap.actionValue)) {\n problems.push({\n capability: cap.id,\n problem: `action value ${cap.actionValue} is not declared by the BROWSER action schema`,\n });\n }\n }\n\n for (const actionValue of schemaValues) {\n if (!matrixByActionValue.has(actionValue)) {\n problems.push({\n capability: actionValue,\n problem:\n \"BROWSER action schema value is missing from BROWSER_PARITY_MATRIX\",\n });\n }\n }\n\n for (const actionName of registered) {\n if (actionName.startsWith(\"BROWSER_\") && !matrixByVerb.has(actionName)) {\n problems.push({\n capability: actionName,\n problem:\n \"registered promoted BROWSER action is missing from BROWSER_PARITY_MATRIX\",\n });\n }\n }\n\n return { ok: problems.length === 0, problems, confirmed };\n}\n\nexport function browserActionNames(\n actions: readonly Action[],\n): readonly string[] {\n return actions.map((action) => action.name);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser parity tooling (#9476) - public surface.
|
|
3
|
+
*/
|
|
4
|
+
export { BROWSER_PARITY_MATRIX, type BrowserParityCapability, type BrowserParityStatus, type BrowserParitySurface, type BrowserParityValidationProblem, type BrowserParityValidationResult, browserActionNames, browserParitySummary, validateBrowserParityMatrix, } from "./browser-matrix.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parity/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,qBAAqB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,8BAA8B,EACnC,KAAK,6BAA6B,EAClC,kBAAkB,EAClB,oBAAoB,EACpB,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BROWSER_PARITY_MATRIX,
|
|
3
|
+
browserActionNames,
|
|
4
|
+
browserParitySummary,
|
|
5
|
+
validateBrowserParityMatrix
|
|
6
|
+
} from "./browser-matrix.js";
|
|
7
|
+
export {
|
|
8
|
+
BROWSER_PARITY_MATRIX,
|
|
9
|
+
browserActionNames,
|
|
10
|
+
browserParitySummary,
|
|
11
|
+
validateBrowserParityMatrix
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/parity/index.ts"],"sourcesContent":["/**\n * Browser parity tooling (#9476) - public surface.\n */\n\nexport {\n BROWSER_PARITY_MATRIX,\n type BrowserParityCapability,\n type BrowserParityStatus,\n type BrowserParitySurface,\n type BrowserParityValidationProblem,\n type BrowserParityValidationResult,\n browserActionNames,\n browserParitySummary,\n validateBrowserParityMatrix,\n} from \"./browser-matrix.js\";\n"],"mappings":"AAIA;AAAA,EACE;AAAA,EAMA;AAAA,EACA;AAAA,EACA;AAAA,OACK;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/routes/workspace.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/routes/workspace.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AA8DxE,MAAM,WAAW,4BAA6B,SAAQ,mBAAmB;IACvE,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,KAAK,CAAC,EAAE;QACN,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;KAChC,CAAC;CACH;AA0HD,wBAAsB,4BAA4B,CAChD,GAAG,EAAE,4BAA4B,GAChC,OAAO,CAAC,OAAO,CAAC,CA+MlB;AAED,eAAO,MAAM,6BAA6B,EAAE,KAAK,CAAC;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAYA,CAAC"}
|
package/dist/routes/workspace.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { requestBrowserWorkspace } from "../workspace/browser-workspace-desktop.js";
|
|
2
|
+
import {
|
|
3
|
+
createBrowserWorkspaceError,
|
|
4
|
+
isBrowserWorkspaceError
|
|
5
|
+
} from "../workspace/browser-workspace-errors.js";
|
|
2
6
|
import { assertBrowserWorkspaceUserScriptAllowed } from "../workspace/browser-workspace-helpers.js";
|
|
3
7
|
import {
|
|
4
8
|
closeBrowserWorkspaceTab,
|
|
@@ -18,10 +22,36 @@ import {
|
|
|
18
22
|
assertBrowserWorkspaceCommandConnectorAccountGate,
|
|
19
23
|
assertBrowserWorkspaceConnectorAccountGate
|
|
20
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
|
+
}
|
|
21
45
|
function statusFromBrowserWorkspaceError(error, message) {
|
|
22
46
|
if (error instanceof Error && "status" in error && typeof error.status === "number") {
|
|
23
47
|
return error.status;
|
|
24
48
|
}
|
|
49
|
+
if (isBrowserWorkspaceError(error)) {
|
|
50
|
+
return statusFromBrowserWorkspaceErrorCode(
|
|
51
|
+
error.browserWorkspaceErrorCode,
|
|
52
|
+
message
|
|
53
|
+
);
|
|
54
|
+
}
|
|
25
55
|
if (message.includes(getBrowserWorkspaceUnavailableMessage())) {
|
|
26
56
|
return 503;
|
|
27
57
|
}
|
|
@@ -93,7 +123,11 @@ async function handleBrowserWorkspaceRoutes(ctx) {
|
|
|
93
123
|
}
|
|
94
124
|
if (pathname === "/api/browser-workspace/events" && method === "GET") {
|
|
95
125
|
if (!isBrowserWorkspaceBridgeConfigured()) {
|
|
96
|
-
throw
|
|
126
|
+
throw createBrowserWorkspaceError(
|
|
127
|
+
"desktop_only",
|
|
128
|
+
"events",
|
|
129
|
+
getBrowserWorkspaceUnavailableMessage()
|
|
130
|
+
);
|
|
97
131
|
}
|
|
98
132
|
json(
|
|
99
133
|
res,
|
|
@@ -252,7 +286,13 @@ async function handleBrowserWorkspaceRoutes(ctx) {
|
|
|
252
286
|
} catch (error) {
|
|
253
287
|
const message = error instanceof Error ? error.message : String(error);
|
|
254
288
|
const status = statusFromBrowserWorkspaceError(error, message);
|
|
255
|
-
|
|
289
|
+
const body = {
|
|
290
|
+
error: message
|
|
291
|
+
};
|
|
292
|
+
if (isBrowserWorkspaceError(error)) {
|
|
293
|
+
body.code = error.browserWorkspaceErrorCode;
|
|
294
|
+
}
|
|
295
|
+
json(res, body, status);
|
|
256
296
|
return true;
|
|
257
297
|
}
|
|
258
298
|
}
|
|
@@ -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 { 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":[]}
|
|
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":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-capture.d.ts","sourceRoot":"","sources":["../../src/workspace/browser-capture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"browser-capture.d.ts","sourceRoot":"","sources":["../../src/workspace/browser-capture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAoDH,oDAAoD;AACpD,eAAO,MAAM,UAAU,QAA2C,CAAC;AAEnE,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,+BAA+B,IAAI,MAAM,CAExD;AAED,wBAAgB,yBAAyB,IAAI,OAAO,CAEnD;AA2BD,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,oBAAoB,iBAoHrE;AAED,wBAAsB,kBAAkB,kBAevC;AAED,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD;AAED,wBAAgB,YAAY,IAAI,OAAO,CAEtC"}
|
|
@@ -3,7 +3,39 @@ import { tmpdir } from "node:os";
|
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import { setTimeout as sleep } from "node:timers/promises";
|
|
5
5
|
import { logger } from "@elizaos/core";
|
|
6
|
-
|
|
6
|
+
function resolveChromePath() {
|
|
7
|
+
if (process.platform === "darwin") {
|
|
8
|
+
return "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome";
|
|
9
|
+
}
|
|
10
|
+
if (process.platform === "win32") {
|
|
11
|
+
const candidates = [
|
|
12
|
+
join(
|
|
13
|
+
process.env.PROGRAMFILES ?? "C:/Program Files",
|
|
14
|
+
"Google",
|
|
15
|
+
"Chrome",
|
|
16
|
+
"Application",
|
|
17
|
+
"chrome.exe"
|
|
18
|
+
),
|
|
19
|
+
join(
|
|
20
|
+
process.env["PROGRAMFILES(X86)"] ?? "C:/Program Files (x86)",
|
|
21
|
+
"Google",
|
|
22
|
+
"Chrome",
|
|
23
|
+
"Application",
|
|
24
|
+
"chrome.exe"
|
|
25
|
+
),
|
|
26
|
+
join(
|
|
27
|
+
process.env.LOCALAPPDATA ?? "",
|
|
28
|
+
"Google",
|
|
29
|
+
"Chrome",
|
|
30
|
+
"Application",
|
|
31
|
+
"chrome.exe"
|
|
32
|
+
)
|
|
33
|
+
];
|
|
34
|
+
return candidates.find((p) => existsSync(p)) ?? candidates[0];
|
|
35
|
+
}
|
|
36
|
+
return "/usr/bin/google-chrome-stable";
|
|
37
|
+
}
|
|
38
|
+
const CHROME_PATH = resolveChromePath();
|
|
7
39
|
let activeBrowser = null;
|
|
8
40
|
let activeCaptureLoop = null;
|
|
9
41
|
let stopSignal = false;
|