@elizaos/plugin-browser 2.0.0-alpha.9 → 2.0.11-beta.7
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 +98 -83
- package/auto-enable.ts +24 -0
- package/dist/actions/browser-autofill-login.d.ts +43 -0
- package/dist/actions/browser-autofill-login.d.ts.map +1 -0
- package/dist/actions/browser-autofill-login.js +278 -0
- package/dist/actions/browser-autofill-login.js.map +1 -0
- package/dist/actions/browser.d.ts +11 -0
- package/dist/actions/browser.d.ts.map +1 -0
- package/dist/actions/browser.js +412 -0
- package/dist/actions/browser.js.map +1 -0
- package/dist/actions/manage-browser-bridge.d.ts +34 -0
- package/dist/actions/manage-browser-bridge.d.ts.map +1 -0
- package/dist/actions/manage-browser-bridge.js +572 -0
- package/dist/actions/manage-browser-bridge.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 +103 -0
- package/dist/browser-service.d.ts.map +1 -0
- package/dist/browser-service.js +186 -0
- package/dist/browser-service.js.map +1 -0
- 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/contracts.d.ts +284 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +56 -0
- package/dist/contracts.js.map +1 -0
- package/dist/index.d.ts +30 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +76 -90
- package/dist/index.js.map +1 -1
- package/dist/lifeops-session-contracts.d.ts +46 -0
- package/dist/lifeops-session-contracts.d.ts.map +1 -0
- package/dist/lifeops-session-contracts.js +1 -0
- package/dist/lifeops-session-contracts.js.map +1 -0
- 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 +27 -0
- package/dist/packaging.d.ts.map +1 -0
- package/dist/packaging.js +571 -0
- package/dist/packaging.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 +10 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +168 -0
- package/dist/plugin.js.map +1 -0
- package/dist/providers/workspace.d.ts +13 -0
- package/dist/providers/workspace.d.ts.map +1 -0
- package/dist/providers/workspace.js +64 -0
- package/dist/providers/workspace.js.map +1 -0
- package/dist/routes/bridge.d.ts +37 -0
- package/dist/routes/bridge.d.ts.map +1 -0
- package/dist/routes/bridge.js +844 -0
- package/dist/routes/bridge.js.map +1 -0
- package/dist/routes/workspace-account-gate.d.ts +29 -0
- package/dist/routes/workspace-account-gate.d.ts.map +1 -0
- package/dist/routes/workspace-account-gate.js +147 -0
- package/dist/routes/workspace-account-gate.js.map +1 -0
- package/dist/routes/workspace-setup.d.ts +10 -0
- package/dist/routes/workspace-setup.d.ts.map +1 -0
- package/dist/routes/workspace-setup.js +65 -0
- package/dist/routes/workspace-setup.js.map +1 -0
- package/dist/routes/workspace.d.ts +20 -0
- package/dist/routes/workspace.d.ts.map +1 -0
- package/dist/routes/workspace.js +276 -0
- package/dist/routes/workspace.js.map +1 -0
- package/dist/schema.d.ts +2326 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +133 -0
- package/dist/schema.js.map +1 -0
- package/dist/service.d.ts +30 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +5 -0
- package/dist/service.js.map +1 -0
- package/dist/targets/bridge-target.d.ts +31 -0
- package/dist/targets/bridge-target.d.ts.map +1 -0
- package/dist/targets/bridge-target.js +98 -0
- package/dist/targets/bridge-target.js.map +1 -0
- 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 +41 -0
- package/dist/workspace/browser-capture.d.ts.map +1 -0
- package/dist/workspace/browser-capture.js +159 -0
- package/dist/workspace/browser-capture.js.map +1 -0
- package/dist/workspace/browser-workspace-desktop.d.ts +19 -0
- package/dist/workspace/browser-workspace-desktop.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-desktop.js +1578 -0
- package/dist/workspace/browser-workspace-desktop.js.map +1 -0
- package/dist/workspace/browser-workspace-elements.d.ts +42 -0
- package/dist/workspace/browser-workspace-elements.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-elements.js +547 -0
- package/dist/workspace/browser-workspace-elements.js.map +1 -0
- package/dist/workspace/browser-workspace-forms.d.ts +19 -0
- package/dist/workspace/browser-workspace-forms.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-forms.js +277 -0
- package/dist/workspace/browser-workspace-forms.js.map +1 -0
- package/dist/workspace/browser-workspace-helpers.d.ts +32 -0
- package/dist/workspace/browser-workspace-helpers.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-helpers.js +232 -0
- package/dist/workspace/browser-workspace-helpers.js.map +1 -0
- package/dist/workspace/browser-workspace-jsdom.d.ts +16 -0
- package/dist/workspace/browser-workspace-jsdom.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-jsdom.js +233 -0
- package/dist/workspace/browser-workspace-jsdom.js.map +1 -0
- package/dist/workspace/browser-workspace-network.d.ts +7 -0
- package/dist/workspace/browser-workspace-network.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-network.js +145 -0
- package/dist/workspace/browser-workspace-network.js.map +1 -0
- package/dist/workspace/browser-workspace-snapshots.d.ts +14 -0
- package/dist/workspace/browser-workspace-snapshots.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-snapshots.js +144 -0
- package/dist/workspace/browser-workspace-snapshots.js.map +1 -0
- package/dist/workspace/browser-workspace-state.d.ts +24 -0
- package/dist/workspace/browser-workspace-state.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-state.js +155 -0
- package/dist/workspace/browser-workspace-state.js.map +1 -0
- package/dist/workspace/browser-workspace-types.d.ts +345 -0
- package/dist/workspace/browser-workspace-types.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-types.js +11 -0
- package/dist/workspace/browser-workspace-types.js.map +1 -0
- package/dist/workspace/browser-workspace-web.d.ts +8 -0
- package/dist/workspace/browser-workspace-web.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-web.js +1342 -0
- package/dist/workspace/browser-workspace-web.js.map +1 -0
- package/dist/workspace/browser-workspace.d.ts +39 -0
- package/dist/workspace/browser-workspace.d.ts.map +1 -0
- package/dist/workspace/browser-workspace.js +958 -0
- package/dist/workspace/browser-workspace.js.map +1 -0
- package/dist/workspace/index.d.ts +26 -0
- package/dist/workspace/index.d.ts.map +1 -0
- package/dist/workspace/index.js +3 -0
- package/dist/workspace/index.js.map +1 -0
- package/dist/workspace.d.ts +2 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +2 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +71 -110
- package/dist/actions/click.d.ts +0 -3
- package/dist/actions/click.d.ts.map +0 -1
- package/dist/actions/click.js +0 -158
- package/dist/actions/click.js.map +0 -1
- package/dist/actions/extract.d.ts +0 -3
- package/dist/actions/extract.d.ts.map +0 -1
- package/dist/actions/extract.js +0 -168
- package/dist/actions/extract.js.map +0 -1
- package/dist/actions/index.d.ts +0 -7
- package/dist/actions/index.d.ts.map +0 -1
- package/dist/actions/index.js +0 -7
- package/dist/actions/index.js.map +0 -1
- package/dist/actions/navigate.d.ts +0 -3
- package/dist/actions/navigate.d.ts.map +0 -1
- package/dist/actions/navigate.js +0 -187
- package/dist/actions/navigate.js.map +0 -1
- package/dist/actions/screenshot.d.ts +0 -3
- package/dist/actions/screenshot.d.ts.map +0 -1
- package/dist/actions/screenshot.js +0 -167
- package/dist/actions/screenshot.js.map +0 -1
- package/dist/actions/select.d.ts +0 -3
- package/dist/actions/select.d.ts.map +0 -1
- package/dist/actions/select.js +0 -167
- package/dist/actions/select.js.map +0 -1
- package/dist/actions/type.d.ts +0 -3
- package/dist/actions/type.d.ts.map +0 -1
- package/dist/actions/type.js +0 -167
- package/dist/actions/type.js.map +0 -1
- package/dist/cli/index.d.ts +0 -8
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js +0 -13
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/register.d.ts +0 -20
- package/dist/cli/register.d.ts.map +0 -1
- package/dist/cli/register.js +0 -403
- package/dist/cli/register.js.map +0 -1
- package/dist/providerRelevance.d.ts +0 -4
- package/dist/providerRelevance.d.ts.map +0 -1
- package/dist/providerRelevance.js +0 -33
- package/dist/providerRelevance.js.map +0 -1
- package/dist/providers/browser-state.d.ts +0 -3
- package/dist/providers/browser-state.d.ts.map +0 -1
- package/dist/providers/browser-state.js +0 -72
- package/dist/providers/browser-state.js.map +0 -1
- package/dist/providers/index.d.ts +0 -2
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js +0 -2
- package/dist/providers/index.js.map +0 -1
- package/dist/services/browser-service.d.ts +0 -32
- package/dist/services/browser-service.d.ts.map +0 -1
- package/dist/services/browser-service.js +0 -213
- package/dist/services/browser-service.js.map +0 -1
- package/dist/services/index.d.ts +0 -4
- package/dist/services/index.d.ts.map +0 -1
- package/dist/services/index.js +0 -4
- package/dist/services/index.js.map +0 -1
- package/dist/services/process-manager.d.ts +0 -24
- package/dist/services/process-manager.d.ts.map +0 -1
- package/dist/services/process-manager.js +0 -270
- package/dist/services/process-manager.js.map +0 -1
- package/dist/services/websocket-client.d.ts +0 -35
- package/dist/services/websocket-client.d.ts.map +0 -1
- package/dist/services/websocket-client.js +0 -221
- package/dist/services/websocket-client.js.map +0 -1
- package/dist/types.d.ts +0 -101
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/utils/captcha.d.ts +0 -33
- package/dist/utils/captcha.d.ts.map +0 -1
- package/dist/utils/captcha.js +0 -219
- package/dist/utils/captcha.js.map +0 -1
- package/dist/utils/errors.d.ts +0 -37
- package/dist/utils/errors.d.ts.map +0 -1
- package/dist/utils/errors.js +0 -81
- package/dist/utils/errors.js.map +0 -1
- package/dist/utils/index.d.ts +0 -5
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -5
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/retry.d.ts +0 -26
- package/dist/utils/retry.d.ts.map +0 -1
- package/dist/utils/retry.js +0 -55
- package/dist/utils/retry.js.map +0 -1
- package/dist/utils/security.d.ts +0 -27
- package/dist/utils/security.d.ts.map +0 -1
- package/dist/utils/security.js +0 -139
- package/dist/utils/security.js.map +0 -1
- package/dist/utils/url.d.ts +0 -12
- package/dist/utils/url.d.ts.map +0 -1
- package/dist/utils/url.js +0 -39
- package/dist/utils/url.js.map +0 -1
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
import { logger } from "@elizaos/core";
|
|
2
|
+
import {
|
|
3
|
+
BROWSER_SERVICE_TYPE
|
|
4
|
+
} from "../browser-service.js";
|
|
5
|
+
import {
|
|
6
|
+
executeBrowserWorkspaceCommand,
|
|
7
|
+
getBrowserWorkspaceMode
|
|
8
|
+
} from "../workspace/browser-workspace.js";
|
|
9
|
+
function getMessageText(message) {
|
|
10
|
+
const content = message?.content;
|
|
11
|
+
if (typeof content === "string") {
|
|
12
|
+
return content;
|
|
13
|
+
}
|
|
14
|
+
return typeof content?.text === "string" ? content.text : "";
|
|
15
|
+
}
|
|
16
|
+
function extractFirstUrl(value) {
|
|
17
|
+
const match = value.match(/https?:\/\/[^\s<>"'`]+/i);
|
|
18
|
+
return match?.[0] ?? null;
|
|
19
|
+
}
|
|
20
|
+
function inferBrowserSubaction(params, messageText) {
|
|
21
|
+
const normalizedAction = normalizeBrowserAction(params?.action);
|
|
22
|
+
if (normalizedAction === "autofill-login" || params?.subaction === "autofill-login") {
|
|
23
|
+
return "autofill-login";
|
|
24
|
+
}
|
|
25
|
+
const legacySubaction = normalizeLegacyBrowserAction(normalizedAction);
|
|
26
|
+
if (legacySubaction) {
|
|
27
|
+
return legacySubaction;
|
|
28
|
+
}
|
|
29
|
+
if (params?.subaction) {
|
|
30
|
+
return params.subaction;
|
|
31
|
+
}
|
|
32
|
+
if (params?.tabAction) {
|
|
33
|
+
return "tab";
|
|
34
|
+
}
|
|
35
|
+
const watchMode = params?.watchMode === true;
|
|
36
|
+
if (params?.selector && params?.text) {
|
|
37
|
+
return watchMode ? "realistic-fill" : "type";
|
|
38
|
+
}
|
|
39
|
+
if (params?.selector) {
|
|
40
|
+
return watchMode ? "realistic-click" : "click";
|
|
41
|
+
}
|
|
42
|
+
if (params?.url?.trim() || extractFirstUrl(messageText)) {
|
|
43
|
+
return params?.id ? "navigate" : "open";
|
|
44
|
+
}
|
|
45
|
+
return "state";
|
|
46
|
+
}
|
|
47
|
+
function normalizeBrowserAction(action) {
|
|
48
|
+
switch (action) {
|
|
49
|
+
case "realistic_click":
|
|
50
|
+
return "realistic-click";
|
|
51
|
+
case "realistic_fill":
|
|
52
|
+
return "realistic-fill";
|
|
53
|
+
case "realistic_type":
|
|
54
|
+
return "realistic-type";
|
|
55
|
+
case "realistic_press":
|
|
56
|
+
return "realistic-press";
|
|
57
|
+
case "cursor_move":
|
|
58
|
+
return "cursor-move";
|
|
59
|
+
case "cursor_hide":
|
|
60
|
+
return "cursor-hide";
|
|
61
|
+
case "autofill_login":
|
|
62
|
+
return "autofill-login";
|
|
63
|
+
default:
|
|
64
|
+
return action;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function normalizeLegacyBrowserAction(action) {
|
|
68
|
+
const normalizedAction = normalizeBrowserAction(action);
|
|
69
|
+
switch (normalizedAction) {
|
|
70
|
+
case "info":
|
|
71
|
+
case "context":
|
|
72
|
+
case "get_context":
|
|
73
|
+
return "state";
|
|
74
|
+
case "list_tabs":
|
|
75
|
+
case "open_tab":
|
|
76
|
+
case "close_tab":
|
|
77
|
+
case "switch_tab":
|
|
78
|
+
return "tab";
|
|
79
|
+
case "autofill-login":
|
|
80
|
+
return void 0;
|
|
81
|
+
case void 0:
|
|
82
|
+
return void 0;
|
|
83
|
+
default:
|
|
84
|
+
return isWorkspaceSubaction(normalizedAction) ? normalizedAction : void 0;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function isWorkspaceSubaction(action) {
|
|
88
|
+
return action === "back" || action === "click" || action === "close" || action === "forward" || action === "get" || action === "hide" || action === "navigate" || action === "open" || action === "press" || action === "reload" || action === "screenshot" || action === "show" || action === "snapshot" || action === "state" || action === "tab" || action === "type" || action === "wait" || action === "realistic-click" || action === "realistic-fill" || action === "realistic-type" || action === "realistic-press" || action === "cursor-move" || action === "cursor-hide";
|
|
89
|
+
}
|
|
90
|
+
function normalizeLegacyTabAction(action) {
|
|
91
|
+
switch (normalizeBrowserAction(action)) {
|
|
92
|
+
case "list_tabs":
|
|
93
|
+
return "list";
|
|
94
|
+
case "open_tab":
|
|
95
|
+
return "new";
|
|
96
|
+
case "close_tab":
|
|
97
|
+
return "close";
|
|
98
|
+
case "switch_tab":
|
|
99
|
+
return "switch";
|
|
100
|
+
default:
|
|
101
|
+
return void 0;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function formatBrowserSessionResult(command, result) {
|
|
105
|
+
if (result.tabs) {
|
|
106
|
+
const labels = result.tabs.map((tab) => `- ${tab.title} (${tab.url})`).join("\n");
|
|
107
|
+
return labels ? `Browser tabs (${result.mode}):
|
|
108
|
+
${labels}` : `No browser session tabs are open (${result.mode}).`;
|
|
109
|
+
}
|
|
110
|
+
if (result.closed) {
|
|
111
|
+
return `Browser closed (${result.mode}).`;
|
|
112
|
+
}
|
|
113
|
+
if (result.tab) {
|
|
114
|
+
return `${command.subaction} completed in ${result.mode} mode.
|
|
115
|
+
${result.tab.title}
|
|
116
|
+
${result.tab.url}`;
|
|
117
|
+
}
|
|
118
|
+
if (result.value !== void 0) {
|
|
119
|
+
if (command.subaction === "cursor-move" && result.value !== null && typeof result.value === "object" && "x" in result.value && "y" in result.value) {
|
|
120
|
+
const cursor = result.value;
|
|
121
|
+
return `Cursor moved to (${Math.round(cursor.x)}, ${Math.round(cursor.y)}) in ${result.mode} mode.`;
|
|
122
|
+
}
|
|
123
|
+
const serialized = typeof result.value === "string" ? result.value : JSON.stringify(result.value, null, 2);
|
|
124
|
+
return `Browser ${command.subaction} result (${result.mode}):
|
|
125
|
+
${serialized}`;
|
|
126
|
+
}
|
|
127
|
+
if (result.snapshot?.data) {
|
|
128
|
+
return `Browser ${command.subaction} captured a preview in ${result.mode} mode.`;
|
|
129
|
+
}
|
|
130
|
+
return `Browser ${command.subaction} completed in ${result.mode} mode.`;
|
|
131
|
+
}
|
|
132
|
+
const browserAction = {
|
|
133
|
+
name: "BROWSER",
|
|
134
|
+
contexts: ["browser", "web", "automation", "secrets"],
|
|
135
|
+
roleGate: { minRole: "OWNER" },
|
|
136
|
+
similes: [
|
|
137
|
+
"BROWSE_SITE",
|
|
138
|
+
"BROWSER_SESSION",
|
|
139
|
+
"CONTROL_BROWSER",
|
|
140
|
+
"CONTROL_BROWSER_SESSION",
|
|
141
|
+
"MANAGE_ELIZA_BROWSER_WORKSPACE",
|
|
142
|
+
"NAVIGATE_SITE",
|
|
143
|
+
"OPEN_SITE",
|
|
144
|
+
"USE_BROWSER",
|
|
145
|
+
"BROWSER_ACTION",
|
|
146
|
+
"BROWSER_AUTOFILL_LOGIN",
|
|
147
|
+
"AGENT_AUTOFILL",
|
|
148
|
+
"AUTOFILL_BROWSER_LOGIN",
|
|
149
|
+
"AUTOFILL_LOGIN",
|
|
150
|
+
"FILL_BROWSER_CREDENTIALS",
|
|
151
|
+
"LOG_INTO_SITE",
|
|
152
|
+
"SIGN_IN_TO_SITE"
|
|
153
|
+
],
|
|
154
|
+
description: "BROWSER action. Control registered browser target: app workspace, bridge Chrome/Safari companion, computeruse Chromium, or Stagehand fallback. BrowserService picks target if omitted. action=autofill_login + domain vault-gated autofills open workspace tab.",
|
|
155
|
+
descriptionCompressed: "Browser open|navigate|click|type|screenshot|state|autofill_login; bridge status elsewhere",
|
|
156
|
+
validate: async () => true,
|
|
157
|
+
handler: async (runtime, message, _state, options) => {
|
|
158
|
+
const params = options?.parameters;
|
|
159
|
+
const messageText = getMessageText(message);
|
|
160
|
+
const subaction = inferBrowserSubaction(params, messageText);
|
|
161
|
+
if (subaction === "autofill-login") {
|
|
162
|
+
const { executeBrowserAutofillLogin } = await import("./browser-autofill-login.js");
|
|
163
|
+
return executeBrowserAutofillLogin(runtime, message, options);
|
|
164
|
+
}
|
|
165
|
+
const url = params?.url?.trim() || extractFirstUrl(messageText) || void 0;
|
|
166
|
+
const command = {
|
|
167
|
+
id: params?.id?.trim(),
|
|
168
|
+
key: params?.key?.trim(),
|
|
169
|
+
pixels: params?.pixels,
|
|
170
|
+
script: params?.script,
|
|
171
|
+
selector: params?.selector?.trim(),
|
|
172
|
+
subaction,
|
|
173
|
+
tabAction: params?.tabAction ?? normalizeLegacyTabAction(params?.action),
|
|
174
|
+
text: params?.text,
|
|
175
|
+
value: params?.text,
|
|
176
|
+
timeoutMs: params?.timeoutMs,
|
|
177
|
+
url,
|
|
178
|
+
cursorDurationMs: params?.cursorDurationMs,
|
|
179
|
+
perCharDelayMs: params?.perCharDelayMs,
|
|
180
|
+
replace: params?.replace,
|
|
181
|
+
x: params?.x,
|
|
182
|
+
y: params?.y
|
|
183
|
+
};
|
|
184
|
+
const browserService = runtime.getService(BROWSER_SERVICE_TYPE);
|
|
185
|
+
try {
|
|
186
|
+
logger.info(
|
|
187
|
+
`[BROWSER] ${command.subaction} via target=${params?.target ?? "auto"} (workspace mode=${getBrowserWorkspaceMode(process.env)})`
|
|
188
|
+
);
|
|
189
|
+
const result = browserService ? await browserService.execute(command, params?.target) : await executeBrowserWorkspaceCommand(command);
|
|
190
|
+
return {
|
|
191
|
+
text: formatBrowserSessionResult(command, result),
|
|
192
|
+
success: true,
|
|
193
|
+
values: {
|
|
194
|
+
success: true,
|
|
195
|
+
mode: result.mode,
|
|
196
|
+
subaction: result.subaction
|
|
197
|
+
},
|
|
198
|
+
data: {
|
|
199
|
+
actionName: "BROWSER",
|
|
200
|
+
command,
|
|
201
|
+
result
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
} catch (error) {
|
|
205
|
+
const messageText2 = error instanceof Error ? error.message : "Browser action failed";
|
|
206
|
+
logger.warn(`[BROWSER] Failed: ${messageText2}`);
|
|
207
|
+
return {
|
|
208
|
+
text: `Browser action failed: ${messageText2}`,
|
|
209
|
+
success: false,
|
|
210
|
+
values: { success: false, error: "BROWSER_FAILED" },
|
|
211
|
+
data: {
|
|
212
|
+
actionName: "BROWSER",
|
|
213
|
+
command
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
},
|
|
218
|
+
parameters: [
|
|
219
|
+
{
|
|
220
|
+
name: "target",
|
|
221
|
+
description: "Optional browser target id. Common values: workspace, bridge, computeruse, stagehand.",
|
|
222
|
+
required: false,
|
|
223
|
+
schema: { type: "string" }
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
name: "action",
|
|
227
|
+
description: "Browser action. Snake_case canonical; legacy kebab-case and subaction accepted.",
|
|
228
|
+
required: false,
|
|
229
|
+
schema: {
|
|
230
|
+
type: "string",
|
|
231
|
+
enum: [
|
|
232
|
+
"back",
|
|
233
|
+
"click",
|
|
234
|
+
"close",
|
|
235
|
+
"context",
|
|
236
|
+
"forward",
|
|
237
|
+
"get",
|
|
238
|
+
"get_context",
|
|
239
|
+
"hide",
|
|
240
|
+
"info",
|
|
241
|
+
"list_tabs",
|
|
242
|
+
"navigate",
|
|
243
|
+
"open",
|
|
244
|
+
"open_tab",
|
|
245
|
+
"press",
|
|
246
|
+
"reload",
|
|
247
|
+
"screenshot",
|
|
248
|
+
"show",
|
|
249
|
+
"snapshot",
|
|
250
|
+
"state",
|
|
251
|
+
"tab",
|
|
252
|
+
"type",
|
|
253
|
+
"wait",
|
|
254
|
+
"close_tab",
|
|
255
|
+
"switch_tab",
|
|
256
|
+
"realistic_click",
|
|
257
|
+
"realistic_fill",
|
|
258
|
+
"realistic_type",
|
|
259
|
+
"realistic_press",
|
|
260
|
+
"cursor_move",
|
|
261
|
+
"cursor_hide",
|
|
262
|
+
"autofill_login"
|
|
263
|
+
]
|
|
264
|
+
}
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
name: "tabAction",
|
|
268
|
+
description: "Tab operation when subaction is tab",
|
|
269
|
+
required: false,
|
|
270
|
+
schema: {
|
|
271
|
+
type: "string",
|
|
272
|
+
enum: ["close", "list", "new", "switch"]
|
|
273
|
+
}
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
name: "domain",
|
|
277
|
+
description: "Required for action=autofill_login: registrable hostname, e.g. github.com.",
|
|
278
|
+
required: false,
|
|
279
|
+
schema: { type: "string" }
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
name: "username",
|
|
283
|
+
description: "For autofill-login: saved login username; omit for latest.",
|
|
284
|
+
required: false,
|
|
285
|
+
schema: { type: "string" }
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
name: "submit",
|
|
289
|
+
description: "For autofill-login: submit after filling. Default false.",
|
|
290
|
+
required: false,
|
|
291
|
+
schema: { type: "boolean" }
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
name: "id",
|
|
295
|
+
description: "Session or tab id to target",
|
|
296
|
+
required: false,
|
|
297
|
+
schema: { type: "string" }
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
name: "url",
|
|
301
|
+
description: "URL for open or navigate",
|
|
302
|
+
required: false,
|
|
303
|
+
schema: { type: "string" }
|
|
304
|
+
},
|
|
305
|
+
{
|
|
306
|
+
name: "selector",
|
|
307
|
+
description: "Selector for click, type, or wait",
|
|
308
|
+
required: false,
|
|
309
|
+
schema: { type: "string" }
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
name: "text",
|
|
313
|
+
description: "Text for type",
|
|
314
|
+
required: false,
|
|
315
|
+
schema: { type: "string" }
|
|
316
|
+
},
|
|
317
|
+
{
|
|
318
|
+
name: "key",
|
|
319
|
+
description: "Keyboard key for press",
|
|
320
|
+
required: false,
|
|
321
|
+
schema: { type: "string" }
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
name: "pixels",
|
|
325
|
+
description: "Scroll distance in pixels",
|
|
326
|
+
required: false,
|
|
327
|
+
schema: { type: "number" }
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
name: "timeoutMs",
|
|
331
|
+
description: "Command timeout in milliseconds",
|
|
332
|
+
required: false,
|
|
333
|
+
schema: { type: "number" }
|
|
334
|
+
},
|
|
335
|
+
{
|
|
336
|
+
name: "script",
|
|
337
|
+
description: "Script for eval",
|
|
338
|
+
required: false,
|
|
339
|
+
schema: { type: "string" }
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
name: "watchMode",
|
|
343
|
+
description: "User watching hint; prefer realistic-* click/fill, visible cursor, pointer events.",
|
|
344
|
+
required: false,
|
|
345
|
+
schema: { type: "boolean" }
|
|
346
|
+
},
|
|
347
|
+
{
|
|
348
|
+
name: "cursorDurationMs",
|
|
349
|
+
description: "Cursor animation duration (ms) for realistic-* subactions",
|
|
350
|
+
required: false,
|
|
351
|
+
schema: { type: "number" }
|
|
352
|
+
},
|
|
353
|
+
{
|
|
354
|
+
name: "perCharDelayMs",
|
|
355
|
+
description: "Per-character delay for realistic-type/realistic-fill (ms)",
|
|
356
|
+
required: false,
|
|
357
|
+
schema: { type: "number" }
|
|
358
|
+
},
|
|
359
|
+
{
|
|
360
|
+
name: "replace",
|
|
361
|
+
description: "For realistic-fill: replace existing input, not append.",
|
|
362
|
+
required: false,
|
|
363
|
+
schema: { type: "boolean" }
|
|
364
|
+
},
|
|
365
|
+
{
|
|
366
|
+
name: "x",
|
|
367
|
+
description: "Cursor target X (CSS pixels) for cursor-move",
|
|
368
|
+
required: false,
|
|
369
|
+
schema: { type: "number" }
|
|
370
|
+
},
|
|
371
|
+
{
|
|
372
|
+
name: "y",
|
|
373
|
+
description: "Cursor target Y (CSS pixels) for cursor-move",
|
|
374
|
+
required: false,
|
|
375
|
+
schema: { type: "number" }
|
|
376
|
+
}
|
|
377
|
+
],
|
|
378
|
+
examples: [
|
|
379
|
+
[
|
|
380
|
+
{
|
|
381
|
+
name: "{{name1}}",
|
|
382
|
+
content: {
|
|
383
|
+
text: "Open elizaos.ai in a new browser tab."
|
|
384
|
+
}
|
|
385
|
+
},
|
|
386
|
+
{
|
|
387
|
+
name: "{{agentName}}",
|
|
388
|
+
content: {
|
|
389
|
+
text: "open completed in desktop mode.\nelizaOS\nhttps://elizaos.ai"
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
],
|
|
393
|
+
[
|
|
394
|
+
{
|
|
395
|
+
name: "{{name1}}",
|
|
396
|
+
content: {
|
|
397
|
+
text: "Click the sign-in button on that page."
|
|
398
|
+
}
|
|
399
|
+
},
|
|
400
|
+
{
|
|
401
|
+
name: "{{agentName}}",
|
|
402
|
+
content: {
|
|
403
|
+
text: "click completed in desktop mode."
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
]
|
|
407
|
+
]
|
|
408
|
+
};
|
|
409
|
+
export {
|
|
410
|
+
browserAction
|
|
411
|
+
};
|
|
412
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/actions/browser.ts"],"sourcesContent":["import type {\n Action,\n ActionExample,\n HandlerOptions,\n Memory,\n} from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport {\n BROWSER_SERVICE_TYPE,\n type BrowserService,\n} from \"../browser-service.js\";\nimport {\n type BrowserWorkspaceCommand,\n executeBrowserWorkspaceCommand,\n getBrowserWorkspaceMode,\n} from \"../workspace/browser-workspace.js\";\n\n/**\n * Targets are the registered browser backends. The agent uses what is\n * available; specifying a target overrides automatic routing. `workspace`\n * is the app-owned browser surface, `bridge` is the paired Chrome/Safari\n * companion, `stagehand` is the Playwright/Stagehand fallback, and other\n * plugins may register additional target ids.\n */\nexport type BrowserTarget = string;\n\ntype BrowserWorkspaceSubaction =\n | \"back\"\n | \"click\"\n | \"close\"\n | \"forward\"\n | \"get\"\n | \"hide\"\n | \"navigate\"\n | \"open\"\n | \"press\"\n | \"reload\"\n | \"screenshot\"\n | \"show\"\n | \"snapshot\"\n | \"state\"\n | \"tab\"\n | \"type\"\n | \"wait\"\n | \"realistic-click\"\n | \"realistic-fill\"\n | \"realistic-type\"\n | \"realistic-press\"\n | \"cursor-move\"\n | \"cursor-hide\";\n\ntype BrowserWorkspaceAction =\n | BrowserWorkspaceSubaction\n | \"realistic_click\"\n | \"realistic_fill\"\n | \"realistic_type\"\n | \"realistic_press\"\n | \"cursor_move\"\n | \"cursor_hide\";\n\ntype BrowserActionSubaction = BrowserWorkspaceSubaction | \"autofill-login\";\ntype BrowserActionValue =\n | BrowserWorkspaceAction\n | \"autofill_login\"\n | \"autofill-login\";\ntype NormalizedBrowserAction =\n | BrowserWorkspaceSubaction\n | \"autofill-login\"\n | \"info\"\n | \"context\"\n | \"get_context\"\n | \"list_tabs\"\n | \"open_tab\"\n | \"close_tab\"\n | \"switch_tab\";\n\ntype BrowserActionParameters = {\n /**\n * Optional target override. Default: the BrowserService active target\n * selected from registered targets. Forces a specific backend when set.\n */\n target?: BrowserTarget;\n id?: string;\n key?: string;\n pixels?: number;\n script?: string;\n selector?: string;\n /**\n * Canonical browser action. Legacy `subaction` remains accepted.\n */\n action?:\n | BrowserActionValue\n | \"info\"\n | \"context\"\n | \"get_context\"\n | \"list_tabs\"\n | \"open_tab\"\n | \"close_tab\"\n | \"switch_tab\";\n subaction?: BrowserActionSubaction;\n /** Registrable hostname for `action: \"autofill_login\"`. */\n domain?: string;\n /** Saved login username for autofill-login (optional). */\n username?: string;\n /** When true with autofill-login, submit after filling. */\n submit?: boolean;\n tabAction?: \"close\" | \"list\" | \"new\" | \"switch\";\n text?: string;\n timeoutMs?: number;\n url?: string;\n /** Cursor animation duration (ms) for realistic-* + cursor-* subactions. */\n cursorDurationMs?: number;\n /** Per-character delay for realistic-type / realistic-fill (ms). */\n perCharDelayMs?: number;\n /** Replace existing input value when filling (vs append). */\n replace?: boolean;\n /** Cursor target X (CSS pixels) for cursor-move. */\n x?: number;\n /** Cursor target Y (CSS pixels) for cursor-move. */\n y?: number;\n /** Hint that the agent is operating in a watch-mode (page-browser) scope. */\n watchMode?: boolean;\n};\n\nfunction getMessageText(message: Memory | undefined): string {\n const content = message?.content;\n if (typeof content === \"string\") {\n return content;\n }\n return typeof content?.text === \"string\" ? content.text : \"\";\n}\n\nfunction extractFirstUrl(value: string): string | null {\n const match = value.match(/https?:\\/\\/[^\\s<>\"'`]+/i);\n return match?.[0] ?? null;\n}\n\nfunction inferBrowserSubaction(\n params: BrowserActionParameters | undefined,\n messageText: string,\n): BrowserWorkspaceCommand[\"subaction\"] | \"autofill-login\" {\n const normalizedAction = normalizeBrowserAction(params?.action);\n if (\n normalizedAction === \"autofill-login\" ||\n params?.subaction === \"autofill-login\"\n ) {\n return \"autofill-login\";\n }\n\n const legacySubaction = normalizeLegacyBrowserAction(normalizedAction);\n if (legacySubaction) {\n return legacySubaction;\n }\n if (params?.subaction) {\n return params.subaction;\n }\n\n if (params?.tabAction) {\n return \"tab\";\n }\n\n // In watch mode the user is observing the agent drive the browser; prefer\n // the realistic-* subactions so the cursor moves and pointer events fire\n // faithfully. Default-mode (no watcher) keeps the leaner click()/value=\n // path for speed.\n const watchMode = params?.watchMode === true;\n\n if (params?.selector && params?.text) {\n return watchMode ? \"realistic-fill\" : \"type\";\n }\n\n if (params?.selector) {\n return watchMode ? \"realistic-click\" : \"click\";\n }\n\n if (params?.url?.trim() || extractFirstUrl(messageText)) {\n return params?.id ? \"navigate\" : \"open\";\n }\n\n return \"state\";\n}\n\nfunction normalizeBrowserAction(\n action: BrowserActionParameters[\"action\"] | undefined,\n): NormalizedBrowserAction | undefined {\n switch (action) {\n case \"realistic_click\":\n return \"realistic-click\";\n case \"realistic_fill\":\n return \"realistic-fill\";\n case \"realistic_type\":\n return \"realistic-type\";\n case \"realistic_press\":\n return \"realistic-press\";\n case \"cursor_move\":\n return \"cursor-move\";\n case \"cursor_hide\":\n return \"cursor-hide\";\n case \"autofill_login\":\n return \"autofill-login\";\n default:\n return action as NormalizedBrowserAction | undefined;\n }\n}\n\nfunction normalizeLegacyBrowserAction(\n action: BrowserActionParameters[\"action\"] | undefined,\n): BrowserWorkspaceCommand[\"subaction\"] | undefined {\n const normalizedAction = normalizeBrowserAction(action);\n switch (normalizedAction) {\n case \"info\":\n case \"context\":\n case \"get_context\":\n return \"state\";\n case \"list_tabs\":\n case \"open_tab\":\n case \"close_tab\":\n case \"switch_tab\":\n return \"tab\";\n case \"autofill-login\":\n return undefined;\n case undefined:\n return undefined;\n default:\n return isWorkspaceSubaction(normalizedAction)\n ? normalizedAction\n : undefined;\n }\n}\n\nfunction isWorkspaceSubaction(\n action: unknown,\n): action is BrowserWorkspaceCommand[\"subaction\"] {\n return (\n action === \"back\" ||\n action === \"click\" ||\n action === \"close\" ||\n action === \"forward\" ||\n action === \"get\" ||\n action === \"hide\" ||\n action === \"navigate\" ||\n action === \"open\" ||\n action === \"press\" ||\n action === \"reload\" ||\n action === \"screenshot\" ||\n action === \"show\" ||\n action === \"snapshot\" ||\n action === \"state\" ||\n action === \"tab\" ||\n action === \"type\" ||\n action === \"wait\" ||\n action === \"realistic-click\" ||\n action === \"realistic-fill\" ||\n action === \"realistic-type\" ||\n action === \"realistic-press\" ||\n action === \"cursor-move\" ||\n action === \"cursor-hide\"\n );\n}\n\nfunction normalizeLegacyTabAction(\n action: BrowserActionParameters[\"action\"] | undefined,\n): BrowserActionParameters[\"tabAction\"] | undefined {\n switch (normalizeBrowserAction(action)) {\n case \"list_tabs\":\n return \"list\";\n case \"open_tab\":\n return \"new\";\n case \"close_tab\":\n return \"close\";\n case \"switch_tab\":\n return \"switch\";\n default:\n return undefined;\n }\n}\n\nfunction formatBrowserSessionResult(\n command: BrowserWorkspaceCommand,\n result: Awaited<ReturnType<typeof executeBrowserWorkspaceCommand>>,\n): string {\n if (result.tabs) {\n const labels = result.tabs\n .map((tab) => `- ${tab.title} (${tab.url})`)\n .join(\"\\n\");\n return labels\n ? `Browser tabs (${result.mode}):\\n${labels}`\n : `No browser session tabs are open (${result.mode}).`;\n }\n\n if (result.closed) {\n return `Browser closed (${result.mode}).`;\n }\n\n if (result.tab) {\n return `${command.subaction} completed in ${result.mode} mode.\\n${result.tab.title}\\n${result.tab.url}`;\n }\n\n if (result.value !== undefined) {\n if (\n command.subaction === \"cursor-move\" &&\n result.value !== null &&\n typeof result.value === \"object\" &&\n \"x\" in result.value &&\n \"y\" in result.value\n ) {\n const cursor = result.value as { x: number; y: number };\n return `Cursor moved to (${Math.round(cursor.x)}, ${Math.round(cursor.y)}) in ${result.mode} mode.`;\n }\n const serialized =\n typeof result.value === \"string\"\n ? result.value\n : JSON.stringify(result.value, null, 2);\n return `Browser ${command.subaction} result (${result.mode}):\\n${serialized}`;\n }\n\n if (result.snapshot?.data) {\n return `Browser ${command.subaction} captured a preview in ${result.mode} mode.`;\n }\n\n return `Browser ${command.subaction} completed in ${result.mode} mode.`;\n}\n\nexport const browserAction: Action = {\n name: \"BROWSER\",\n contexts: [\"browser\", \"web\", \"automation\", \"secrets\"],\n roleGate: { minRole: \"OWNER\" },\n similes: [\n \"BROWSE_SITE\",\n \"BROWSER_SESSION\",\n \"CONTROL_BROWSER\",\n \"CONTROL_BROWSER_SESSION\",\n \"MANAGE_ELIZA_BROWSER_WORKSPACE\",\n \"NAVIGATE_SITE\",\n \"OPEN_SITE\",\n \"USE_BROWSER\",\n \"BROWSER_ACTION\",\n \"BROWSER_AUTOFILL_LOGIN\",\n \"AGENT_AUTOFILL\",\n \"AUTOFILL_BROWSER_LOGIN\",\n \"AUTOFILL_LOGIN\",\n \"FILL_BROWSER_CREDENTIALS\",\n \"LOG_INTO_SITE\",\n \"SIGN_IN_TO_SITE\",\n ],\n description:\n \"BROWSER action. Control registered browser target: app workspace, bridge Chrome/Safari companion, computeruse Chromium, or Stagehand fallback. BrowserService picks target if omitted. action=autofill_login + domain vault-gated autofills open workspace tab.\",\n descriptionCompressed:\n \"Browser open|navigate|click|type|screenshot|state|autofill_login; bridge status elsewhere\",\n validate: async () => true,\n handler: async (runtime, message, _state, options) => {\n const params = (options as HandlerOptions | undefined)?.parameters as\n | BrowserActionParameters\n | undefined;\n const messageText = getMessageText(message);\n const subaction = inferBrowserSubaction(params, messageText);\n\n if (subaction === \"autofill-login\") {\n const { executeBrowserAutofillLogin } = await import(\n \"./browser-autofill-login.js\"\n );\n return executeBrowserAutofillLogin(runtime, message, options);\n }\n\n const url =\n params?.url?.trim() || extractFirstUrl(messageText) || undefined;\n\n const command: BrowserWorkspaceCommand = {\n id: params?.id?.trim(),\n key: params?.key?.trim(),\n pixels: params?.pixels,\n script: params?.script,\n selector: params?.selector?.trim(),\n subaction,\n tabAction: params?.tabAction ?? normalizeLegacyTabAction(params?.action),\n text: params?.text,\n value: params?.text,\n timeoutMs: params?.timeoutMs,\n url,\n cursorDurationMs: params?.cursorDurationMs,\n perCharDelayMs: params?.perCharDelayMs,\n replace: params?.replace,\n x: params?.x,\n y: params?.y,\n };\n\n const browserService =\n runtime.getService<BrowserService>(BROWSER_SERVICE_TYPE);\n\n try {\n logger.info(\n `[BROWSER] ${command.subaction} via target=${params?.target ?? \"auto\"} (workspace mode=${getBrowserWorkspaceMode(process.env)})`,\n );\n const result = browserService\n ? await browserService.execute(command, params?.target)\n : await executeBrowserWorkspaceCommand(command);\n\n return {\n text: formatBrowserSessionResult(command, result),\n success: true,\n values: {\n success: true,\n mode: result.mode,\n subaction: result.subaction,\n },\n data: {\n actionName: \"BROWSER\",\n command,\n result,\n },\n };\n } catch (error) {\n const messageText =\n error instanceof Error ? error.message : \"Browser action failed\";\n logger.warn(`[BROWSER] Failed: ${messageText}`);\n return {\n text: `Browser action failed: ${messageText}`,\n success: false,\n values: { success: false, error: \"BROWSER_FAILED\" },\n data: {\n actionName: \"BROWSER\",\n command,\n },\n };\n }\n },\n parameters: [\n {\n name: \"target\",\n description:\n \"Optional browser target id. Common values: workspace, bridge, computeruse, stagehand.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"action\",\n description:\n \"Browser action. Snake_case canonical; legacy kebab-case and subaction accepted.\",\n required: false,\n schema: {\n type: \"string\" as const,\n enum: [\n \"back\",\n \"click\",\n \"close\",\n \"context\",\n \"forward\",\n \"get\",\n \"get_context\",\n \"hide\",\n \"info\",\n \"list_tabs\",\n \"navigate\",\n \"open\",\n \"open_tab\",\n \"press\",\n \"reload\",\n \"screenshot\",\n \"show\",\n \"snapshot\",\n \"state\",\n \"tab\",\n \"type\",\n \"wait\",\n \"close_tab\",\n \"switch_tab\",\n \"realistic_click\",\n \"realistic_fill\",\n \"realistic_type\",\n \"realistic_press\",\n \"cursor_move\",\n \"cursor_hide\",\n \"autofill_login\",\n ],\n },\n },\n {\n name: \"tabAction\",\n description: \"Tab operation when subaction is tab\",\n required: false,\n schema: {\n type: \"string\" as const,\n enum: [\"close\", \"list\", \"new\", \"switch\"],\n },\n },\n {\n name: \"domain\",\n description:\n \"Required for action=autofill_login: registrable hostname, e.g. github.com.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"username\",\n description: \"For autofill-login: saved login username; omit for latest.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"submit\",\n description: \"For autofill-login: submit after filling. Default false.\",\n required: false,\n schema: { type: \"boolean\" as const },\n },\n {\n name: \"id\",\n description: \"Session or tab id to target\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"url\",\n description: \"URL for open or navigate\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"selector\",\n description: \"Selector for click, type, or wait\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"text\",\n description: \"Text for type\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"key\",\n description: \"Keyboard key for press\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"pixels\",\n description: \"Scroll distance in pixels\",\n required: false,\n schema: { type: \"number\" as const },\n },\n {\n name: \"timeoutMs\",\n description: \"Command timeout in milliseconds\",\n required: false,\n schema: { type: \"number\" as const },\n },\n {\n name: \"script\",\n description: \"Script for eval\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"watchMode\",\n description:\n \"User watching hint; prefer realistic-* click/fill, visible cursor, pointer events.\",\n required: false,\n schema: { type: \"boolean\" as const },\n },\n {\n name: \"cursorDurationMs\",\n description: \"Cursor animation duration (ms) for realistic-* subactions\",\n required: false,\n schema: { type: \"number\" as const },\n },\n {\n name: \"perCharDelayMs\",\n description: \"Per-character delay for realistic-type/realistic-fill (ms)\",\n required: false,\n schema: { type: \"number\" as const },\n },\n {\n name: \"replace\",\n description: \"For realistic-fill: replace existing input, not append.\",\n required: false,\n schema: { type: \"boolean\" as const },\n },\n {\n name: \"x\",\n description: \"Cursor target X (CSS pixels) for cursor-move\",\n required: false,\n schema: { type: \"number\" as const },\n },\n {\n name: \"y\",\n description: \"Cursor target Y (CSS pixels) for cursor-move\",\n required: false,\n schema: { type: \"number\" as const },\n },\n ],\n examples: [\n [\n {\n name: \"{{name1}}\",\n content: {\n text: \"Open elizaos.ai in a new browser tab.\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"open completed in desktop mode.\\nelizaOS\\nhttps://elizaos.ai\",\n },\n },\n ],\n [\n {\n name: \"{{name1}}\",\n content: {\n text: \"Click the sign-in button on that page.\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"click completed in desktop mode.\",\n },\n },\n ],\n ] as ActionExample[][],\n};\n"],"mappings":"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","names":["messageText"]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MANAGE_BROWSER_BRIDGE — single action that covers the bridge-extension
|
|
3
|
+
* management surface (Install, Reveal Folder, Open Manager, Refresh) that the
|
|
4
|
+
* `BrowserWorkspaceView` UI exposes.
|
|
5
|
+
*
|
|
6
|
+
* This replaces the four previously-separate actions
|
|
7
|
+
* (`BROWSER_BRIDGE_INSTALL`, `BROWSER_BRIDGE_REVEAL_FOLDER`,
|
|
8
|
+
* `BROWSER_BRIDGE_OPEN_MANAGER`, `BROWSER_BRIDGE_REFRESH`) — folded into one
|
|
9
|
+
* because each one took zero parameters and only differed in which packaging
|
|
10
|
+
* helper it called. One action with an `action` parameter is the right agent
|
|
11
|
+
* surface; the LLM picks the child action.
|
|
12
|
+
*
|
|
13
|
+
* Calls directly into the local packaging helpers (the same code path the
|
|
14
|
+
* route layer uses) rather than going back through HTTP, so the action runs
|
|
15
|
+
* inside the runtime process without an HTTP round trip.
|
|
16
|
+
*
|
|
17
|
+
* Authorization: OWNER only. The bridge is local-machine plumbing —
|
|
18
|
+
* installing a browser extension, opening Chrome's extensions page,
|
|
19
|
+
* inspecting paired companions — that should never be triggered by a
|
|
20
|
+
* non-owner user.
|
|
21
|
+
*
|
|
22
|
+
* Validation: keyword-based on the message (and recent messages) using a
|
|
23
|
+
* deliberately liberal multilingual set covering "browser", "bridge",
|
|
24
|
+
* "chrome / safari / firefox / brave / edge / arc / opera / vivaldi",
|
|
25
|
+
* "extension", "companion", "install", "manager", "reveal", "refresh",
|
|
26
|
+
* "connection", "pair", and Spanish / French / German / Italian / Japanese /
|
|
27
|
+
* Chinese / Korean / Portuguese / Russian / Arabic / Hindi / Turkish /
|
|
28
|
+
* Vietnamese / Thai / Polish / Dutch / Indonesian / Hebrew variants.
|
|
29
|
+
*/
|
|
30
|
+
import type { Action } from "@elizaos/core";
|
|
31
|
+
export declare const BROWSER_BRIDGE_SUBACTIONS: readonly ["install", "reveal_folder", "open_manager", "refresh"];
|
|
32
|
+
export type BrowserBridgeSubaction = (typeof BROWSER_BRIDGE_SUBACTIONS)[number];
|
|
33
|
+
export declare const manageBrowserBridgeAction: Action;
|
|
34
|
+
//# sourceMappingURL=manage-browser-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manage-browser-bridge.d.ts","sourceRoot":"","sources":["../../src/actions/manage-browser-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EACV,MAAM,EAKP,MAAM,eAAe,CAAC;AAqBvB,eAAO,MAAM,yBAAyB,kEAK5B,CAAC;AACX,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAC;AAudhF,eAAO,MAAM,yBAAyB,EAAE,MA2JvC,CAAC"}
|