@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,572 @@
|
|
|
1
|
+
import { logger } from "@elizaos/core";
|
|
2
|
+
import {
|
|
3
|
+
buildBrowserBridgeCompanionPackage,
|
|
4
|
+
getBrowserBridgeCompanionPackageStatus,
|
|
5
|
+
openBrowserBridgeCompanionManager,
|
|
6
|
+
openBrowserBridgeCompanionPackagePath
|
|
7
|
+
} from "../packaging.js";
|
|
8
|
+
import {
|
|
9
|
+
BROWSER_BRIDGE_ROUTE_SERVICE_TYPE
|
|
10
|
+
} from "../service.js";
|
|
11
|
+
const ACTION_NAME = "MANAGE_BROWSER_BRIDGE";
|
|
12
|
+
const MAX_BROWSER_BRIDGE_TEXT_LENGTH = 3e3;
|
|
13
|
+
const BROWSER_BRIDGE_TIMEOUT_MS = 3e4;
|
|
14
|
+
const BROWSER_BRIDGE_SUBACTIONS = [
|
|
15
|
+
"install",
|
|
16
|
+
"reveal_folder",
|
|
17
|
+
"open_manager",
|
|
18
|
+
"refresh"
|
|
19
|
+
];
|
|
20
|
+
const BROWSER_BRIDGE_KEYWORDS = [
|
|
21
|
+
// English — concept
|
|
22
|
+
"browser",
|
|
23
|
+
"browsers",
|
|
24
|
+
"browser bridge",
|
|
25
|
+
"agent browser bridge",
|
|
26
|
+
"bridge",
|
|
27
|
+
"extension",
|
|
28
|
+
"extensions",
|
|
29
|
+
"companion",
|
|
30
|
+
"companions",
|
|
31
|
+
"connection",
|
|
32
|
+
"pair",
|
|
33
|
+
"paired",
|
|
34
|
+
"pairing",
|
|
35
|
+
// English — browser brands
|
|
36
|
+
"chrome",
|
|
37
|
+
"safari",
|
|
38
|
+
"firefox",
|
|
39
|
+
"brave",
|
|
40
|
+
"edge",
|
|
41
|
+
"arc",
|
|
42
|
+
"opera",
|
|
43
|
+
"vivaldi",
|
|
44
|
+
// English — actions
|
|
45
|
+
"install",
|
|
46
|
+
"installer",
|
|
47
|
+
"installed",
|
|
48
|
+
"uninstall",
|
|
49
|
+
"reveal",
|
|
50
|
+
"show folder",
|
|
51
|
+
"open folder",
|
|
52
|
+
"open manager",
|
|
53
|
+
"manager",
|
|
54
|
+
"refresh",
|
|
55
|
+
"reload",
|
|
56
|
+
"reconnect",
|
|
57
|
+
"connect",
|
|
58
|
+
"disconnect",
|
|
59
|
+
"status",
|
|
60
|
+
"settings",
|
|
61
|
+
"setting",
|
|
62
|
+
"configuration",
|
|
63
|
+
"config",
|
|
64
|
+
"folder",
|
|
65
|
+
"load unpacked",
|
|
66
|
+
"chrome://extensions",
|
|
67
|
+
// Spanish
|
|
68
|
+
"navegador",
|
|
69
|
+
"navegadores",
|
|
70
|
+
"extensi\xF3n",
|
|
71
|
+
"extensiones",
|
|
72
|
+
"instalar",
|
|
73
|
+
"instalador",
|
|
74
|
+
"desinstalar",
|
|
75
|
+
"carpeta",
|
|
76
|
+
"actualizar",
|
|
77
|
+
"conectar",
|
|
78
|
+
"conexi\xF3n",
|
|
79
|
+
"puente",
|
|
80
|
+
// French
|
|
81
|
+
"navigateur",
|
|
82
|
+
"navigateurs",
|
|
83
|
+
"installer",
|
|
84
|
+
"d\xE9sinstaller",
|
|
85
|
+
"dossier",
|
|
86
|
+
"actualiser",
|
|
87
|
+
"rafra\xEEchir",
|
|
88
|
+
"connexion",
|
|
89
|
+
"pont",
|
|
90
|
+
// German
|
|
91
|
+
"browser",
|
|
92
|
+
"erweiterung",
|
|
93
|
+
"erweiterungen",
|
|
94
|
+
"installieren",
|
|
95
|
+
"deinstallieren",
|
|
96
|
+
"ordner",
|
|
97
|
+
"aktualisieren",
|
|
98
|
+
"verbindung",
|
|
99
|
+
"br\xFCcke",
|
|
100
|
+
// Italian
|
|
101
|
+
"navigatore",
|
|
102
|
+
"estensione",
|
|
103
|
+
"estensioni",
|
|
104
|
+
"installare",
|
|
105
|
+
"disinstallare",
|
|
106
|
+
"cartella",
|
|
107
|
+
"aggiornare",
|
|
108
|
+
"collegamento",
|
|
109
|
+
"ponte",
|
|
110
|
+
// Portuguese
|
|
111
|
+
"navegador",
|
|
112
|
+
"extens\xE3o",
|
|
113
|
+
"extens\xF5es",
|
|
114
|
+
"instalar",
|
|
115
|
+
"pasta",
|
|
116
|
+
"atualizar",
|
|
117
|
+
"conex\xE3o",
|
|
118
|
+
"ponte",
|
|
119
|
+
// Russian
|
|
120
|
+
"\u0431\u0440\u0430\u0443\u0437\u0435\u0440",
|
|
121
|
+
"\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0435",
|
|
122
|
+
"\u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C",
|
|
123
|
+
"\u043E\u0431\u043D\u043E\u0432\u0438\u0442\u044C",
|
|
124
|
+
"\u043F\u0430\u043F\u043A\u0430",
|
|
125
|
+
"\u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435",
|
|
126
|
+
"\u043C\u043E\u0441\u0442",
|
|
127
|
+
// Japanese
|
|
128
|
+
"\u30D6\u30E9\u30A6\u30B6",
|
|
129
|
+
"\u62E1\u5F35\u6A5F\u80FD",
|
|
130
|
+
"\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB",
|
|
131
|
+
"\u30D5\u30A9\u30EB\u30C0",
|
|
132
|
+
"\u66F4\u65B0",
|
|
133
|
+
"\u63A5\u7D9A",
|
|
134
|
+
"\u30D6\u30EA\u30C3\u30B8",
|
|
135
|
+
// Chinese (simplified + traditional)
|
|
136
|
+
"\u6D4F\u89C8\u5668",
|
|
137
|
+
"\u700F\u89BD\u5668",
|
|
138
|
+
"\u6269\u5C55",
|
|
139
|
+
"\u64F4\u5145",
|
|
140
|
+
"\u5B89\u88C5",
|
|
141
|
+
"\u5B89\u88DD",
|
|
142
|
+
"\u6587\u4EF6\u5939",
|
|
143
|
+
"\u8CC7\u6599\u593E",
|
|
144
|
+
"\u5237\u65B0",
|
|
145
|
+
"\u91CD\u65B0\u6574\u7406",
|
|
146
|
+
"\u8FDE\u63A5",
|
|
147
|
+
"\u9023\u7DDA",
|
|
148
|
+
"\u6865",
|
|
149
|
+
"\u6A4B",
|
|
150
|
+
// Korean
|
|
151
|
+
"\uBE0C\uB77C\uC6B0\uC800",
|
|
152
|
+
"\uD655\uC7A5",
|
|
153
|
+
"\uC124\uCE58",
|
|
154
|
+
"\uD3F4\uB354",
|
|
155
|
+
"\uC0C8\uB85C\uACE0\uCE68",
|
|
156
|
+
"\uC5F0\uACB0",
|
|
157
|
+
"\uBE0C\uB9AC\uC9C0",
|
|
158
|
+
// Arabic
|
|
159
|
+
"\u0645\u062A\u0635\u0641\u062D",
|
|
160
|
+
"\u0625\u0636\u0627\u0641\u0629",
|
|
161
|
+
"\u062A\u062B\u0628\u064A\u062A",
|
|
162
|
+
"\u0645\u062C\u0644\u062F",
|
|
163
|
+
"\u062A\u062D\u062F\u064A\u062B",
|
|
164
|
+
"\u0627\u062A\u0635\u0627\u0644",
|
|
165
|
+
"\u062C\u0633\u0631",
|
|
166
|
+
// Hindi
|
|
167
|
+
"\u092C\u094D\u0930\u093E\u0909\u091C\u093C\u0930",
|
|
168
|
+
"\u090F\u0915\u094D\u0938\u091F\u0947\u0902\u0936\u0928",
|
|
169
|
+
"\u0907\u0902\u0938\u094D\u091F\u0949\u0932",
|
|
170
|
+
"\u092B\u093C\u094B\u0932\u094D\u0921\u0930",
|
|
171
|
+
"\u0930\u093F\u092B\u094D\u0930\u0947\u0936",
|
|
172
|
+
"\u0915\u0928\u0947\u0915\u094D\u0936\u0928",
|
|
173
|
+
// Turkish
|
|
174
|
+
"taray\u0131c\u0131",
|
|
175
|
+
"uzant\u0131",
|
|
176
|
+
"y\xFCkle",
|
|
177
|
+
"klas\xF6r",
|
|
178
|
+
"yenile",
|
|
179
|
+
"ba\u011Flant\u0131",
|
|
180
|
+
"k\xF6pr\xFC",
|
|
181
|
+
// Vietnamese
|
|
182
|
+
"tr\xECnh duy\u1EC7t",
|
|
183
|
+
"ti\u1EC7n \xEDch",
|
|
184
|
+
"c\xE0i \u0111\u1EB7t",
|
|
185
|
+
"th\u01B0 m\u1EE5c",
|
|
186
|
+
"l\xE0m m\u1EDBi",
|
|
187
|
+
"k\u1EBFt n\u1ED1i",
|
|
188
|
+
"c\u1EA7u n\u1ED1i",
|
|
189
|
+
// Thai
|
|
190
|
+
"\u0E40\u0E1A\u0E23\u0E32\u0E27\u0E4C\u0E40\u0E0B\u0E2D\u0E23\u0E4C",
|
|
191
|
+
"\u0E2A\u0E48\u0E27\u0E19\u0E02\u0E22\u0E32\u0E22",
|
|
192
|
+
"\u0E15\u0E34\u0E14\u0E15\u0E31\u0E49\u0E07",
|
|
193
|
+
"\u0E42\u0E1F\u0E25\u0E40\u0E14\u0E2D\u0E23\u0E4C",
|
|
194
|
+
"\u0E23\u0E35\u0E40\u0E1F\u0E23\u0E0A",
|
|
195
|
+
"\u0E40\u0E0A\u0E37\u0E48\u0E2D\u0E21\u0E15\u0E48\u0E2D",
|
|
196
|
+
// Polish
|
|
197
|
+
"przegl\u0105darka",
|
|
198
|
+
"rozszerzenie",
|
|
199
|
+
"zainstaluj",
|
|
200
|
+
"folder",
|
|
201
|
+
"od\u015Bwie\u017C",
|
|
202
|
+
"po\u0142\u0105czenie",
|
|
203
|
+
"most",
|
|
204
|
+
// Dutch
|
|
205
|
+
"browser",
|
|
206
|
+
"extensie",
|
|
207
|
+
"installeer",
|
|
208
|
+
"map",
|
|
209
|
+
"vernieuw",
|
|
210
|
+
"verbinding",
|
|
211
|
+
"brug",
|
|
212
|
+
// Indonesian / Malay
|
|
213
|
+
"peramban",
|
|
214
|
+
"penjelajah",
|
|
215
|
+
"ekstensi",
|
|
216
|
+
"pasang",
|
|
217
|
+
"folder",
|
|
218
|
+
"muat ulang",
|
|
219
|
+
"koneksi",
|
|
220
|
+
"jembatan",
|
|
221
|
+
// Hebrew
|
|
222
|
+
"\u05D3\u05E4\u05D3\u05E4\u05DF",
|
|
223
|
+
"\u05D4\u05E8\u05D7\u05D1\u05D4",
|
|
224
|
+
"\u05D4\u05EA\u05E7\u05E0\u05D4",
|
|
225
|
+
"\u05EA\u05D9\u05E7\u05D9\u05D9\u05D4",
|
|
226
|
+
"\u05E8\u05E2\u05E0\u05D5\u05DF",
|
|
227
|
+
"\u05D7\u05D9\u05D1\u05D5\u05E8"
|
|
228
|
+
];
|
|
229
|
+
function describeError(err) {
|
|
230
|
+
return err instanceof Error ? err.message : String(err);
|
|
231
|
+
}
|
|
232
|
+
function withBrowserBridgeTimeout(promise, label) {
|
|
233
|
+
return Promise.race([
|
|
234
|
+
promise,
|
|
235
|
+
new Promise(
|
|
236
|
+
(_, reject) => setTimeout(
|
|
237
|
+
() => reject(new Error(`${label} timed out`)),
|
|
238
|
+
BROWSER_BRIDGE_TIMEOUT_MS
|
|
239
|
+
)
|
|
240
|
+
)
|
|
241
|
+
]);
|
|
242
|
+
}
|
|
243
|
+
const SELECTED_CONTEXT_KEYS = [
|
|
244
|
+
"browser",
|
|
245
|
+
"files",
|
|
246
|
+
"connectors",
|
|
247
|
+
"settings",
|
|
248
|
+
"automation",
|
|
249
|
+
"admin"
|
|
250
|
+
];
|
|
251
|
+
function hasSelectedContext(state) {
|
|
252
|
+
const selected = /* @__PURE__ */ new Set();
|
|
253
|
+
const collect = (value) => {
|
|
254
|
+
if (!Array.isArray(value)) return;
|
|
255
|
+
for (const item of value) {
|
|
256
|
+
if (typeof item === "string") selected.add(item);
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
collect(
|
|
260
|
+
state?.values?.selectedContexts
|
|
261
|
+
);
|
|
262
|
+
collect(
|
|
263
|
+
state?.data?.selectedContexts
|
|
264
|
+
);
|
|
265
|
+
const contextObject = state?.data?.contextObject;
|
|
266
|
+
collect(contextObject?.trajectoryPrefix?.selectedContexts);
|
|
267
|
+
collect(contextObject?.metadata?.selectedContexts);
|
|
268
|
+
return SELECTED_CONTEXT_KEYS.some((context) => selected.has(context));
|
|
269
|
+
}
|
|
270
|
+
function hasBrowserBridgeIntent(message, state) {
|
|
271
|
+
const text = [
|
|
272
|
+
typeof message.content?.text === "string" ? message.content.text : "",
|
|
273
|
+
typeof state?.values?.recentMessages === "string" ? state.values.recentMessages : ""
|
|
274
|
+
].join("\n").toLowerCase();
|
|
275
|
+
return BROWSER_BRIDGE_KEYWORDS.some(
|
|
276
|
+
(keyword) => text.includes(keyword.toLowerCase())
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
function normalizeSubaction(raw) {
|
|
280
|
+
if (!raw) return null;
|
|
281
|
+
const trimmed = raw.trim().toLowerCase().replace(/[\s-]+/g, "_");
|
|
282
|
+
return BROWSER_BRIDGE_SUBACTIONS.includes(trimmed) ? trimmed : null;
|
|
283
|
+
}
|
|
284
|
+
function inferSubactionFromMessage(text) {
|
|
285
|
+
const normalized = text.toLowerCase();
|
|
286
|
+
if (/\b(reveal|show|open).{0,12}(folder|build folder|directory)\b/.test(
|
|
287
|
+
normalized
|
|
288
|
+
) && !/\bextension manager\b/.test(normalized)) {
|
|
289
|
+
return "reveal_folder";
|
|
290
|
+
}
|
|
291
|
+
if (/\bopen.{0,8}(extensions?|extension manager|chrome:\/\/extensions)\b/.test(
|
|
292
|
+
normalized
|
|
293
|
+
)) {
|
|
294
|
+
return "open_manager";
|
|
295
|
+
}
|
|
296
|
+
if (/\b(refresh|reload|reconnect|status|settings?|config(?:uration)?|update|sync|update status|connection state)\b/.test(
|
|
297
|
+
normalized
|
|
298
|
+
)) {
|
|
299
|
+
return "refresh";
|
|
300
|
+
}
|
|
301
|
+
return "install";
|
|
302
|
+
}
|
|
303
|
+
async function runInstall() {
|
|
304
|
+
let status = getBrowserBridgeCompanionPackageStatus();
|
|
305
|
+
if (!status.chromeBuildPath) {
|
|
306
|
+
status = await withBrowserBridgeTimeout(
|
|
307
|
+
buildBrowserBridgeCompanionPackage("chrome"),
|
|
308
|
+
"browser bridge package build"
|
|
309
|
+
);
|
|
310
|
+
}
|
|
311
|
+
const reveal = await withBrowserBridgeTimeout(
|
|
312
|
+
openBrowserBridgeCompanionPackagePath("chrome_build", { revealOnly: true }),
|
|
313
|
+
"browser bridge reveal"
|
|
314
|
+
);
|
|
315
|
+
let openedManager = true;
|
|
316
|
+
try {
|
|
317
|
+
await withBrowserBridgeTimeout(
|
|
318
|
+
openBrowserBridgeCompanionManager("chrome"),
|
|
319
|
+
"browser bridge manager open"
|
|
320
|
+
);
|
|
321
|
+
} catch (err) {
|
|
322
|
+
openedManager = false;
|
|
323
|
+
logger.warn(
|
|
324
|
+
`[${ACTION_NAME}] could not open chrome://extensions: ${describeError(err)}`
|
|
325
|
+
);
|
|
326
|
+
}
|
|
327
|
+
const text = (openedManager ? `Chrome is ready. Click Load unpacked and choose ${reveal.path}.` : `The Agent Browser Bridge folder is ready at ${reveal.path}. Open chrome://extensions, click Load unpacked, and choose that folder.`).slice(0, MAX_BROWSER_BRIDGE_TEXT_LENGTH);
|
|
328
|
+
return {
|
|
329
|
+
text,
|
|
330
|
+
success: true,
|
|
331
|
+
values: { success: true, subaction: "install", openedManager },
|
|
332
|
+
data: {
|
|
333
|
+
actionName: ACTION_NAME,
|
|
334
|
+
subaction: "install",
|
|
335
|
+
path: reveal.path,
|
|
336
|
+
openedManager,
|
|
337
|
+
status
|
|
338
|
+
}
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
async function runRevealFolder() {
|
|
342
|
+
const reveal = await withBrowserBridgeTimeout(
|
|
343
|
+
openBrowserBridgeCompanionPackagePath("chrome_build", { revealOnly: true }),
|
|
344
|
+
"browser bridge reveal"
|
|
345
|
+
);
|
|
346
|
+
const text = `Revealed the Agent Browser Bridge folder at ${reveal.path}.`.slice(
|
|
347
|
+
0,
|
|
348
|
+
MAX_BROWSER_BRIDGE_TEXT_LENGTH
|
|
349
|
+
);
|
|
350
|
+
return {
|
|
351
|
+
text,
|
|
352
|
+
success: true,
|
|
353
|
+
values: { success: true, subaction: "reveal_folder" },
|
|
354
|
+
data: {
|
|
355
|
+
actionName: ACTION_NAME,
|
|
356
|
+
subaction: "reveal_folder",
|
|
357
|
+
path: reveal.path
|
|
358
|
+
}
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
async function runOpenManager() {
|
|
362
|
+
await withBrowserBridgeTimeout(
|
|
363
|
+
openBrowserBridgeCompanionManager("chrome"),
|
|
364
|
+
"browser bridge manager open"
|
|
365
|
+
);
|
|
366
|
+
const text = "Opened Chrome extensions. Click Load unpacked and choose the Agent Browser Bridge folder.".slice(
|
|
367
|
+
0,
|
|
368
|
+
MAX_BROWSER_BRIDGE_TEXT_LENGTH
|
|
369
|
+
);
|
|
370
|
+
return {
|
|
371
|
+
text,
|
|
372
|
+
success: true,
|
|
373
|
+
values: { success: true, subaction: "open_manager" },
|
|
374
|
+
data: { actionName: ACTION_NAME, subaction: "open_manager" }
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
async function runRefresh(runtime) {
|
|
378
|
+
const status = getBrowserBridgeCompanionPackageStatus();
|
|
379
|
+
let settings = null;
|
|
380
|
+
let companions = [];
|
|
381
|
+
const service = runtime.getService(
|
|
382
|
+
BROWSER_BRIDGE_ROUTE_SERVICE_TYPE
|
|
383
|
+
);
|
|
384
|
+
if (!service) {
|
|
385
|
+
return {
|
|
386
|
+
text: "Agent Browser Bridge package status is available, but companion status cannot be read because the Browser Bridge service is not registered.",
|
|
387
|
+
success: false,
|
|
388
|
+
values: {
|
|
389
|
+
success: false,
|
|
390
|
+
subaction: "refresh",
|
|
391
|
+
error: "BROWSER_BRIDGE_SERVICE_UNAVAILABLE"
|
|
392
|
+
},
|
|
393
|
+
data: {
|
|
394
|
+
actionName: ACTION_NAME,
|
|
395
|
+
subaction: "refresh",
|
|
396
|
+
status,
|
|
397
|
+
settings,
|
|
398
|
+
companions
|
|
399
|
+
}
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
settings = await service.getBrowserSettings();
|
|
403
|
+
companions = (await service.listBrowserCompanions()).slice(0, 25);
|
|
404
|
+
const connected = companions.length > 0;
|
|
405
|
+
const text = [
|
|
406
|
+
"Refreshed Agent Browser Bridge settings.",
|
|
407
|
+
`Tracking: ${settings.trackingMode}.`,
|
|
408
|
+
`Browser control: ${settings.allowBrowserControl ? "on" : "off"}.`,
|
|
409
|
+
connected ? `Companions: ${companions.length} paired.` : "Companions: none paired."
|
|
410
|
+
].join(" ");
|
|
411
|
+
return {
|
|
412
|
+
text,
|
|
413
|
+
success: true,
|
|
414
|
+
values: {
|
|
415
|
+
success: true,
|
|
416
|
+
subaction: "refresh",
|
|
417
|
+
connected,
|
|
418
|
+
trackingMode: settings.trackingMode,
|
|
419
|
+
allowBrowserControl: settings.allowBrowserControl,
|
|
420
|
+
companionCount: companions.length
|
|
421
|
+
},
|
|
422
|
+
data: {
|
|
423
|
+
actionName: ACTION_NAME,
|
|
424
|
+
subaction: "refresh",
|
|
425
|
+
status,
|
|
426
|
+
settings,
|
|
427
|
+
companions
|
|
428
|
+
}
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
const manageBrowserBridgeAction = {
|
|
432
|
+
name: ACTION_NAME,
|
|
433
|
+
contexts: ["browser", "files", "connectors", "settings"],
|
|
434
|
+
contextGate: { anyOf: ["browser", "files", "connectors", "settings"] },
|
|
435
|
+
roleGate: { minRole: "OWNER" },
|
|
436
|
+
similes: [
|
|
437
|
+
// Install / setup synonyms
|
|
438
|
+
"INSTALL_BROWSER_BRIDGE",
|
|
439
|
+
"SETUP_BROWSER_BRIDGE",
|
|
440
|
+
"PAIR_BROWSER",
|
|
441
|
+
"CONNECT_BROWSER",
|
|
442
|
+
"ADD_BROWSER_EXTENSION",
|
|
443
|
+
// Reveal folder synonyms
|
|
444
|
+
"REVEAL_BROWSER_BRIDGE_FOLDER",
|
|
445
|
+
"OPEN_BROWSER_BRIDGE_FOLDER",
|
|
446
|
+
"SHOW_BROWSER_EXTENSION_FOLDER",
|
|
447
|
+
// Open manager synonyms
|
|
448
|
+
"OPEN_CHROME_EXTENSIONS",
|
|
449
|
+
"OPEN_BROWSER_BRIDGE_MANAGER",
|
|
450
|
+
"OPEN_EXTENSION_MANAGER",
|
|
451
|
+
// Refresh synonyms
|
|
452
|
+
"REFRESH_BROWSER_BRIDGE",
|
|
453
|
+
"REFRESH_BROWSER_BRIDGE_CONNECTION",
|
|
454
|
+
"RELOAD_BROWSER_BRIDGE_STATUS",
|
|
455
|
+
"RECONNECT_BROWSER",
|
|
456
|
+
// Generic
|
|
457
|
+
"MANAGE_CHROME_EXTENSION",
|
|
458
|
+
"MANAGE_SAFARI_EXTENSION",
|
|
459
|
+
"BROWSER_BRIDGE_INSTALL",
|
|
460
|
+
"BROWSER_BRIDGE_REVEAL_FOLDER",
|
|
461
|
+
"BROWSER_BRIDGE_OPEN_MANAGER",
|
|
462
|
+
"BROWSER_BRIDGE_REFRESH"
|
|
463
|
+
],
|
|
464
|
+
description: "Owner-only Agent Browser Bridge management for Chrome/Safari. Actions: refresh status/settings/connection, install build+reveal setup, reveal_folder open build folder, open_manager chrome://extensions only on explicit ask. Infer action if omitted.",
|
|
465
|
+
descriptionCompressed: "Browser Bridge: refresh|install|reveal_folder|open_manager chrome://extensions",
|
|
466
|
+
validate: async (_runtime, message, state) => {
|
|
467
|
+
return hasSelectedContext(state) || hasBrowserBridgeIntent(message, state);
|
|
468
|
+
},
|
|
469
|
+
handler: async (runtime, message, _state, options) => {
|
|
470
|
+
const params = options?.parameters;
|
|
471
|
+
const subaction = normalizeSubaction(params?.action) ?? normalizeSubaction(params?.subaction) ?? inferSubactionFromMessage(
|
|
472
|
+
typeof message.content?.text === "string" ? message.content.text : ""
|
|
473
|
+
);
|
|
474
|
+
try {
|
|
475
|
+
switch (subaction) {
|
|
476
|
+
case "install":
|
|
477
|
+
return await runInstall();
|
|
478
|
+
case "reveal_folder":
|
|
479
|
+
return await runRevealFolder();
|
|
480
|
+
case "open_manager":
|
|
481
|
+
return await runOpenManager();
|
|
482
|
+
case "refresh":
|
|
483
|
+
return await runRefresh(runtime);
|
|
484
|
+
default: {
|
|
485
|
+
const exhaustive = subaction;
|
|
486
|
+
throw new Error(
|
|
487
|
+
`Unsupported MANAGE_BROWSER_BRIDGE subaction: ${exhaustive}`
|
|
488
|
+
);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
} catch (err) {
|
|
492
|
+
const text = `Failed MANAGE_BROWSER_BRIDGE ${subaction}: ${describeError(err)}`.slice(
|
|
493
|
+
0,
|
|
494
|
+
MAX_BROWSER_BRIDGE_TEXT_LENGTH
|
|
495
|
+
);
|
|
496
|
+
logger.warn(`[${ACTION_NAME}] ${text}`);
|
|
497
|
+
return {
|
|
498
|
+
text,
|
|
499
|
+
success: false,
|
|
500
|
+
values: {
|
|
501
|
+
success: false,
|
|
502
|
+
subaction,
|
|
503
|
+
error: `MANAGE_BROWSER_BRIDGE_${subaction.toUpperCase()}_FAILED`
|
|
504
|
+
},
|
|
505
|
+
data: { actionName: ACTION_NAME, subaction }
|
|
506
|
+
};
|
|
507
|
+
}
|
|
508
|
+
},
|
|
509
|
+
parameters: [
|
|
510
|
+
{
|
|
511
|
+
name: "action",
|
|
512
|
+
description: "Bridge action. refresh=status/settings; open_manager only explicit chrome://extensions; install setup; reveal_folder build folder. Infer if omitted.",
|
|
513
|
+
required: false,
|
|
514
|
+
schema: {
|
|
515
|
+
type: "string",
|
|
516
|
+
enum: [...BROWSER_BRIDGE_SUBACTIONS]
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
],
|
|
520
|
+
examples: [
|
|
521
|
+
[
|
|
522
|
+
{
|
|
523
|
+
name: "{{name1}}",
|
|
524
|
+
content: { text: "Show the browser bridge status.", source: "chat" }
|
|
525
|
+
},
|
|
526
|
+
{
|
|
527
|
+
name: "{{agentName}}",
|
|
528
|
+
content: {
|
|
529
|
+
text: "Refreshing the browser bridge status.",
|
|
530
|
+
actions: ["MANAGE_BROWSER_BRIDGE"],
|
|
531
|
+
thought: "Show/status request maps to MANAGE_BROWSER_BRIDGE action=refresh."
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
],
|
|
535
|
+
[
|
|
536
|
+
{
|
|
537
|
+
name: "{{name1}}",
|
|
538
|
+
content: {
|
|
539
|
+
text: "Install the agent browser bridge extension.",
|
|
540
|
+
source: "chat"
|
|
541
|
+
}
|
|
542
|
+
},
|
|
543
|
+
{
|
|
544
|
+
name: "{{agentName}}",
|
|
545
|
+
content: {
|
|
546
|
+
text: "Building and revealing the bridge extension.",
|
|
547
|
+
actions: ["MANAGE_BROWSER_BRIDGE"],
|
|
548
|
+
thought: "Setup intent maps to MANAGE_BROWSER_BRIDGE action=install."
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
],
|
|
552
|
+
[
|
|
553
|
+
{
|
|
554
|
+
name: "{{name1}}",
|
|
555
|
+
content: { text: "Open chrome://extensions for me.", source: "chat" }
|
|
556
|
+
},
|
|
557
|
+
{
|
|
558
|
+
name: "{{agentName}}",
|
|
559
|
+
content: {
|
|
560
|
+
text: "Opening the extension manager.",
|
|
561
|
+
actions: ["MANAGE_BROWSER_BRIDGE"],
|
|
562
|
+
thought: "Explicit chrome://extensions request maps to MANAGE_BROWSER_BRIDGE action=open_manager."
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
]
|
|
566
|
+
]
|
|
567
|
+
};
|
|
568
|
+
export {
|
|
569
|
+
BROWSER_BRIDGE_SUBACTIONS,
|
|
570
|
+
manageBrowserBridgeAction
|
|
571
|
+
};
|
|
572
|
+
//# sourceMappingURL=manage-browser-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/actions/manage-browser-bridge.ts"],"sourcesContent":["/**\n * MANAGE_BROWSER_BRIDGE — single action that covers the bridge-extension\n * management surface (Install, Reveal Folder, Open Manager, Refresh) that the\n * `BrowserWorkspaceView` UI exposes.\n *\n * This replaces the four previously-separate actions\n * (`BROWSER_BRIDGE_INSTALL`, `BROWSER_BRIDGE_REVEAL_FOLDER`,\n * `BROWSER_BRIDGE_OPEN_MANAGER`, `BROWSER_BRIDGE_REFRESH`) — folded into one\n * because each one took zero parameters and only differed in which packaging\n * helper it called. One action with an `action` parameter is the right agent\n * surface; the LLM picks the child action.\n *\n * Calls directly into the local packaging helpers (the same code path the\n * route layer uses) rather than going back through HTTP, so the action runs\n * inside the runtime process without an HTTP round trip.\n *\n * Authorization: OWNER only. The bridge is local-machine plumbing —\n * installing a browser extension, opening Chrome's extensions page,\n * inspecting paired companions — that should never be triggered by a\n * non-owner user.\n *\n * Validation: keyword-based on the message (and recent messages) using a\n * deliberately liberal multilingual set covering \"browser\", \"bridge\",\n * \"chrome / safari / firefox / brave / edge / arc / opera / vivaldi\",\n * \"extension\", \"companion\", \"install\", \"manager\", \"reveal\", \"refresh\",\n * \"connection\", \"pair\", and Spanish / French / German / Italian / Japanese /\n * Chinese / Korean / Portuguese / Russian / Arabic / Hindi / Turkish /\n * Vietnamese / Thai / Polish / Dutch / Indonesian / Hebrew variants.\n */\n\nimport type {\n Action,\n ActionResult,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport type {\n BrowserBridgeCompanionPackageStatus,\n BrowserBridgeCompanionStatus,\n} from \"../contracts.js\";\nimport {\n buildBrowserBridgeCompanionPackage,\n getBrowserBridgeCompanionPackageStatus,\n openBrowserBridgeCompanionManager,\n openBrowserBridgeCompanionPackagePath,\n} from \"../packaging.js\";\nimport {\n BROWSER_BRIDGE_ROUTE_SERVICE_TYPE,\n type BrowserBridgeRouteService,\n} from \"../service.js\";\n\nconst ACTION_NAME = \"MANAGE_BROWSER_BRIDGE\";\nconst MAX_BROWSER_BRIDGE_TEXT_LENGTH = 3000;\nconst BROWSER_BRIDGE_TIMEOUT_MS = 30_000;\n\nexport const BROWSER_BRIDGE_SUBACTIONS = [\n \"install\",\n \"reveal_folder\",\n \"open_manager\",\n \"refresh\",\n] as const;\nexport type BrowserBridgeSubaction = (typeof BROWSER_BRIDGE_SUBACTIONS)[number];\n\nconst BROWSER_BRIDGE_KEYWORDS = [\n // English — concept\n \"browser\",\n \"browsers\",\n \"browser bridge\",\n \"agent browser bridge\",\n \"bridge\",\n \"extension\",\n \"extensions\",\n \"companion\",\n \"companions\",\n \"connection\",\n \"pair\",\n \"paired\",\n \"pairing\",\n // English — browser brands\n \"chrome\",\n \"safari\",\n \"firefox\",\n \"brave\",\n \"edge\",\n \"arc\",\n \"opera\",\n \"vivaldi\",\n // English — actions\n \"install\",\n \"installer\",\n \"installed\",\n \"uninstall\",\n \"reveal\",\n \"show folder\",\n \"open folder\",\n \"open manager\",\n \"manager\",\n \"refresh\",\n \"reload\",\n \"reconnect\",\n \"connect\",\n \"disconnect\",\n \"status\",\n \"settings\",\n \"setting\",\n \"configuration\",\n \"config\",\n \"folder\",\n \"load unpacked\",\n \"chrome://extensions\",\n // Spanish\n \"navegador\",\n \"navegadores\",\n \"extensión\",\n \"extensiones\",\n \"instalar\",\n \"instalador\",\n \"desinstalar\",\n \"carpeta\",\n \"actualizar\",\n \"conectar\",\n \"conexión\",\n \"puente\",\n // French\n \"navigateur\",\n \"navigateurs\",\n \"installer\",\n \"désinstaller\",\n \"dossier\",\n \"actualiser\",\n \"rafraîchir\",\n \"connexion\",\n \"pont\",\n // German\n \"browser\",\n \"erweiterung\",\n \"erweiterungen\",\n \"installieren\",\n \"deinstallieren\",\n \"ordner\",\n \"aktualisieren\",\n \"verbindung\",\n \"brücke\",\n // Italian\n \"navigatore\",\n \"estensione\",\n \"estensioni\",\n \"installare\",\n \"disinstallare\",\n \"cartella\",\n \"aggiornare\",\n \"collegamento\",\n \"ponte\",\n // Portuguese\n \"navegador\",\n \"extensão\",\n \"extensões\",\n \"instalar\",\n \"pasta\",\n \"atualizar\",\n \"conexão\",\n \"ponte\",\n // Russian\n \"браузер\",\n \"расширение\",\n \"установить\",\n \"обновить\",\n \"папка\",\n \"соединение\",\n \"мост\",\n // Japanese\n \"ブラウザ\",\n \"拡張機能\",\n \"インストール\",\n \"フォルダ\",\n \"更新\",\n \"接続\",\n \"ブリッジ\",\n // Chinese (simplified + traditional)\n \"浏览器\",\n \"瀏覽器\",\n \"扩展\",\n \"擴充\",\n \"安装\",\n \"安裝\",\n \"文件夹\",\n \"資料夾\",\n \"刷新\",\n \"重新整理\",\n \"连接\",\n \"連線\",\n \"桥\",\n \"橋\",\n // Korean\n \"브라우저\",\n \"확장\",\n \"설치\",\n \"폴더\",\n \"새로고침\",\n \"연결\",\n \"브리지\",\n // Arabic\n \"متصفح\",\n \"إضافة\",\n \"تثبيت\",\n \"مجلد\",\n \"تحديث\",\n \"اتصال\",\n \"جسر\",\n // Hindi\n \"ब्राउज़र\",\n \"एक्सटेंशन\",\n \"इंस्टॉल\",\n \"फ़ोल्डर\",\n \"रिफ्रेश\",\n \"कनेक्शन\",\n // Turkish\n \"tarayıcı\",\n \"uzantı\",\n \"yükle\",\n \"klasör\",\n \"yenile\",\n \"bağlantı\",\n \"köprü\",\n // Vietnamese\n \"trình duyệt\",\n \"tiện ích\",\n \"cài đặt\",\n \"thư mục\",\n \"làm mới\",\n \"kết nối\",\n \"cầu nối\",\n // Thai\n \"เบราว์เซอร์\",\n \"ส่วนขยาย\",\n \"ติดตั้ง\",\n \"โฟลเดอร์\",\n \"รีเฟรช\",\n \"เชื่อมต่อ\",\n // Polish\n \"przeglądarka\",\n \"rozszerzenie\",\n \"zainstaluj\",\n \"folder\",\n \"odśwież\",\n \"połączenie\",\n \"most\",\n // Dutch\n \"browser\",\n \"extensie\",\n \"installeer\",\n \"map\",\n \"vernieuw\",\n \"verbinding\",\n \"brug\",\n // Indonesian / Malay\n \"peramban\",\n \"penjelajah\",\n \"ekstensi\",\n \"pasang\",\n \"folder\",\n \"muat ulang\",\n \"koneksi\",\n \"jembatan\",\n // Hebrew\n \"דפדפן\",\n \"הרחבה\",\n \"התקנה\",\n \"תיקייה\",\n \"רענון\",\n \"חיבור\",\n] as const;\n\nfunction describeError(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\nfunction withBrowserBridgeTimeout<T>(\n promise: Promise<T>,\n label: string,\n): Promise<T> {\n return Promise.race([\n promise,\n new Promise<never>((_, reject) =>\n setTimeout(\n () => reject(new Error(`${label} timed out`)),\n BROWSER_BRIDGE_TIMEOUT_MS,\n ),\n ),\n ]);\n}\n\nconst SELECTED_CONTEXT_KEYS = [\n \"browser\",\n \"files\",\n \"connectors\",\n \"settings\",\n \"automation\",\n \"admin\",\n] as const;\n\nfunction hasSelectedContext(state: State | undefined): boolean {\n const selected = new Set<string>();\n const collect = (value: unknown) => {\n if (!Array.isArray(value)) return;\n for (const item of value) {\n if (typeof item === \"string\") selected.add(item);\n }\n };\n collect(\n (state?.values as Record<string, unknown> | undefined)?.selectedContexts,\n );\n collect(\n (state?.data as Record<string, unknown> | undefined)?.selectedContexts,\n );\n const contextObject = (state?.data as Record<string, unknown> | undefined)\n ?.contextObject as\n | {\n trajectoryPrefix?: { selectedContexts?: unknown };\n metadata?: { selectedContexts?: unknown };\n }\n | undefined;\n collect(contextObject?.trajectoryPrefix?.selectedContexts);\n collect(contextObject?.metadata?.selectedContexts);\n return SELECTED_CONTEXT_KEYS.some((context) => selected.has(context));\n}\n\nfunction hasBrowserBridgeIntent(\n message: Memory,\n state: State | undefined,\n): boolean {\n const text = [\n typeof message.content?.text === \"string\" ? message.content.text : \"\",\n typeof state?.values?.recentMessages === \"string\"\n ? state.values.recentMessages\n : \"\",\n ]\n .join(\"\\n\")\n .toLowerCase();\n return BROWSER_BRIDGE_KEYWORDS.some((keyword) =>\n text.includes(keyword.toLowerCase()),\n );\n}\n\ntype ManageBrowserBridgeParameters = {\n action?: BrowserBridgeSubaction;\n subaction?: BrowserBridgeSubaction;\n};\n\nfunction normalizeSubaction(\n raw: string | undefined,\n): BrowserBridgeSubaction | null {\n if (!raw) return null;\n const trimmed = raw\n .trim()\n .toLowerCase()\n .replace(/[\\s-]+/g, \"_\");\n return (BROWSER_BRIDGE_SUBACTIONS as readonly string[]).includes(trimmed)\n ? (trimmed as BrowserBridgeSubaction)\n : null;\n}\n\nfunction inferSubactionFromMessage(text: string): BrowserBridgeSubaction {\n const normalized = text.toLowerCase();\n if (\n /\\b(reveal|show|open).{0,12}(folder|build folder|directory)\\b/.test(\n normalized,\n ) &&\n !/\\bextension manager\\b/.test(normalized)\n ) {\n return \"reveal_folder\";\n }\n if (\n /\\bopen.{0,8}(extensions?|extension manager|chrome:\\/\\/extensions)\\b/.test(\n normalized,\n )\n ) {\n return \"open_manager\";\n }\n if (\n /\\b(refresh|reload|reconnect|status|settings?|config(?:uration)?|update|sync|update status|connection state)\\b/.test(\n normalized,\n )\n ) {\n return \"refresh\";\n }\n return \"install\";\n}\n\nasync function runInstall(): Promise<ActionResult> {\n let status: BrowserBridgeCompanionPackageStatus =\n getBrowserBridgeCompanionPackageStatus();\n if (!status.chromeBuildPath) {\n status = await withBrowserBridgeTimeout(\n buildBrowserBridgeCompanionPackage(\"chrome\"),\n \"browser bridge package build\",\n );\n }\n const reveal = await withBrowserBridgeTimeout(\n openBrowserBridgeCompanionPackagePath(\"chrome_build\", { revealOnly: true }),\n \"browser bridge reveal\",\n );\n let openedManager = true;\n try {\n await withBrowserBridgeTimeout(\n openBrowserBridgeCompanionManager(\"chrome\"),\n \"browser bridge manager open\",\n );\n } catch (err) {\n openedManager = false;\n logger.warn(\n `[${ACTION_NAME}] could not open chrome://extensions: ${describeError(err)}`,\n );\n }\n const text = (\n openedManager\n ? `Chrome is ready. Click Load unpacked and choose ${reveal.path}.`\n : `The Agent Browser Bridge folder is ready at ${reveal.path}. Open chrome://extensions, click Load unpacked, and choose that folder.`\n ).slice(0, MAX_BROWSER_BRIDGE_TEXT_LENGTH);\n return {\n text,\n success: true,\n values: { success: true, subaction: \"install\", openedManager },\n data: {\n actionName: ACTION_NAME,\n subaction: \"install\",\n path: reveal.path,\n openedManager,\n status,\n },\n };\n}\n\nasync function runRevealFolder(): Promise<ActionResult> {\n const reveal = await withBrowserBridgeTimeout(\n openBrowserBridgeCompanionPackagePath(\"chrome_build\", { revealOnly: true }),\n \"browser bridge reveal\",\n );\n const text =\n `Revealed the Agent Browser Bridge folder at ${reveal.path}.`.slice(\n 0,\n MAX_BROWSER_BRIDGE_TEXT_LENGTH,\n );\n return {\n text,\n success: true,\n values: { success: true, subaction: \"reveal_folder\" },\n data: {\n actionName: ACTION_NAME,\n subaction: \"reveal_folder\",\n path: reveal.path,\n },\n };\n}\n\nasync function runOpenManager(): Promise<ActionResult> {\n await withBrowserBridgeTimeout(\n openBrowserBridgeCompanionManager(\"chrome\"),\n \"browser bridge manager open\",\n );\n const text =\n \"Opened Chrome extensions. Click Load unpacked and choose the Agent Browser Bridge folder.\".slice(\n 0,\n MAX_BROWSER_BRIDGE_TEXT_LENGTH,\n );\n return {\n text,\n success: true,\n values: { success: true, subaction: \"open_manager\" },\n data: { actionName: ACTION_NAME, subaction: \"open_manager\" },\n };\n}\n\nasync function runRefresh(runtime: IAgentRuntime): Promise<ActionResult> {\n const status = getBrowserBridgeCompanionPackageStatus();\n let settings: Awaited<\n ReturnType<BrowserBridgeRouteService[\"getBrowserSettings\"]>\n > | null = null;\n let companions: BrowserBridgeCompanionStatus[] = [];\n const service = runtime.getService<BrowserBridgeRouteService>(\n BROWSER_BRIDGE_ROUTE_SERVICE_TYPE,\n );\n if (!service) {\n return {\n text: \"Agent Browser Bridge package status is available, but companion status cannot be read because the Browser Bridge service is not registered.\",\n success: false,\n values: {\n success: false,\n subaction: \"refresh\",\n error: \"BROWSER_BRIDGE_SERVICE_UNAVAILABLE\",\n },\n data: {\n actionName: ACTION_NAME,\n subaction: \"refresh\",\n status,\n settings,\n companions,\n },\n };\n }\n settings = await service.getBrowserSettings();\n companions = (await service.listBrowserCompanions()).slice(0, 25);\n const connected = companions.length > 0;\n const text = [\n \"Refreshed Agent Browser Bridge settings.\",\n `Tracking: ${settings.trackingMode}.`,\n `Browser control: ${settings.allowBrowserControl ? \"on\" : \"off\"}.`,\n connected\n ? `Companions: ${companions.length} paired.`\n : \"Companions: none paired.\",\n ].join(\" \");\n return {\n text,\n success: true,\n values: {\n success: true,\n subaction: \"refresh\",\n connected,\n trackingMode: settings.trackingMode,\n allowBrowserControl: settings.allowBrowserControl,\n companionCount: companions.length,\n },\n data: {\n actionName: ACTION_NAME,\n subaction: \"refresh\",\n status,\n settings,\n companions,\n },\n };\n}\n\nexport const manageBrowserBridgeAction: Action = {\n name: ACTION_NAME,\n contexts: [\"browser\", \"files\", \"connectors\", \"settings\"],\n contextGate: { anyOf: [\"browser\", \"files\", \"connectors\", \"settings\"] },\n roleGate: { minRole: \"OWNER\" },\n similes: [\n // Install / setup synonyms\n \"INSTALL_BROWSER_BRIDGE\",\n \"SETUP_BROWSER_BRIDGE\",\n \"PAIR_BROWSER\",\n \"CONNECT_BROWSER\",\n \"ADD_BROWSER_EXTENSION\",\n // Reveal folder synonyms\n \"REVEAL_BROWSER_BRIDGE_FOLDER\",\n \"OPEN_BROWSER_BRIDGE_FOLDER\",\n \"SHOW_BROWSER_EXTENSION_FOLDER\",\n // Open manager synonyms\n \"OPEN_CHROME_EXTENSIONS\",\n \"OPEN_BROWSER_BRIDGE_MANAGER\",\n \"OPEN_EXTENSION_MANAGER\",\n // Refresh synonyms\n \"REFRESH_BROWSER_BRIDGE\",\n \"REFRESH_BROWSER_BRIDGE_CONNECTION\",\n \"RELOAD_BROWSER_BRIDGE_STATUS\",\n \"RECONNECT_BROWSER\",\n // Generic\n \"MANAGE_CHROME_EXTENSION\",\n \"MANAGE_SAFARI_EXTENSION\",\n \"BROWSER_BRIDGE_INSTALL\",\n \"BROWSER_BRIDGE_REVEAL_FOLDER\",\n \"BROWSER_BRIDGE_OPEN_MANAGER\",\n \"BROWSER_BRIDGE_REFRESH\",\n ],\n description:\n \"Owner-only Agent Browser Bridge management for Chrome/Safari. Actions: refresh status/settings/connection, install build+reveal setup, reveal_folder open build folder, open_manager chrome://extensions only on explicit ask. Infer action if omitted.\",\n descriptionCompressed:\n \"Browser Bridge: refresh|install|reveal_folder|open_manager chrome://extensions\",\n validate: async (\n _runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n ): Promise<boolean> => {\n return hasSelectedContext(state) || hasBrowserBridgeIntent(message, state);\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n _state,\n options,\n ): Promise<ActionResult> => {\n const params = (options as { parameters?: ManageBrowserBridgeParameters })\n ?.parameters;\n const subaction =\n normalizeSubaction(params?.action) ??\n normalizeSubaction(params?.subaction) ??\n inferSubactionFromMessage(\n typeof message.content?.text === \"string\" ? message.content.text : \"\",\n );\n try {\n switch (subaction) {\n case \"install\":\n return await runInstall();\n case \"reveal_folder\":\n return await runRevealFolder();\n case \"open_manager\":\n return await runOpenManager();\n case \"refresh\":\n return await runRefresh(runtime);\n default: {\n const exhaustive: never = subaction;\n throw new Error(\n `Unsupported MANAGE_BROWSER_BRIDGE subaction: ${exhaustive}`,\n );\n }\n }\n } catch (err) {\n const text =\n `Failed MANAGE_BROWSER_BRIDGE ${subaction}: ${describeError(err)}`.slice(\n 0,\n MAX_BROWSER_BRIDGE_TEXT_LENGTH,\n );\n logger.warn(`[${ACTION_NAME}] ${text}`);\n return {\n text,\n success: false,\n values: {\n success: false,\n subaction,\n error: `MANAGE_BROWSER_BRIDGE_${subaction.toUpperCase()}_FAILED`,\n },\n data: { actionName: ACTION_NAME, subaction },\n };\n }\n },\n parameters: [\n {\n name: \"action\",\n description:\n \"Bridge action. refresh=status/settings; open_manager only explicit chrome://extensions; install setup; reveal_folder build folder. Infer if omitted.\",\n required: false,\n schema: {\n type: \"string\" as const,\n enum: [...BROWSER_BRIDGE_SUBACTIONS],\n },\n },\n ],\n examples: [\n [\n {\n name: \"{{name1}}\",\n content: { text: \"Show the browser bridge status.\", source: \"chat\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"Refreshing the browser bridge status.\",\n actions: [\"MANAGE_BROWSER_BRIDGE\"],\n thought:\n \"Show/status request maps to MANAGE_BROWSER_BRIDGE action=refresh.\",\n },\n },\n ],\n [\n {\n name: \"{{name1}}\",\n content: {\n text: \"Install the agent browser bridge extension.\",\n source: \"chat\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"Building and revealing the bridge extension.\",\n actions: [\"MANAGE_BROWSER_BRIDGE\"],\n thought: \"Setup intent maps to MANAGE_BROWSER_BRIDGE action=install.\",\n },\n },\n ],\n [\n {\n name: \"{{name1}}\",\n content: { text: \"Open chrome://extensions for me.\", source: \"chat\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"Opening the extension manager.\",\n actions: [\"MANAGE_BROWSER_BRIDGE\"],\n thought:\n \"Explicit chrome://extensions request maps to MANAGE_BROWSER_BRIDGE action=open_manager.\",\n },\n },\n ],\n ],\n};\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const MAX_BROWSER_FOCUS_WINDOW_MS: number;
|
|
2
|
+
export declare const DEFAULT_BROWSER_COMPANION_PAIRING_TOKEN_TTL_MS: number;
|
|
3
|
+
type BrowserBridgeCompanionPairingTokenEnv = {
|
|
4
|
+
readonly [key: string]: string | undefined;
|
|
5
|
+
};
|
|
6
|
+
export declare function resolveBrowserBridgeCompanionPairingTokenTtlMs(env?: BrowserBridgeCompanionPairingTokenEnv): number;
|
|
7
|
+
export declare function resolveBrowserBridgeCompanionPairingTokenExpiresAt(nowMs?: number, env?: Parameters<typeof resolveBrowserBridgeCompanionPairingTokenTtlMs>[0]): string;
|
|
8
|
+
export declare function browserBridgeDomainFromUrl(url: string): string | null;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=bridge-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge-policy.d.ts","sourceRoot":"","sources":["../src/bridge-policy.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,QAAgB,CAAC;AACzD,eAAO,MAAM,8CAA8C,QACjC,CAAC;AAE3B,KAAK,qCAAqC,GAAG;IAC3C,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CAC5C,CAAC;AAEF,wBAAgB,8CAA8C,CAC5D,GAAG,GAAE,qCAAmD,GACvD,MAAM,CAWR;AAED,wBAAgB,kDAAkD,CAChE,KAAK,SAAa,EAClB,GAAG,CAAC,EAAE,UAAU,CAAC,OAAO,8CAA8C,CAAC,CAAC,CAAC,CAAC,GACzE,MAAM,CAIR;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWrE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
const MAX_BROWSER_FOCUS_WINDOW_MS = 2 * 60 * 1e3;
|
|
2
|
+
const DEFAULT_BROWSER_COMPANION_PAIRING_TOKEN_TTL_MS = 30 * 24 * 60 * 60 * 1e3;
|
|
3
|
+
function resolveBrowserBridgeCompanionPairingTokenTtlMs(env = process.env) {
|
|
4
|
+
const raw = env.BROWSER_BRIDGE_COMPANION_TOKEN_TTL_MS ?? env.ELIZA_BROWSER_BRIDGE_COMPANION_TOKEN_TTL_MS;
|
|
5
|
+
if (typeof raw === "string" && raw.trim().length > 0) {
|
|
6
|
+
const parsed = Number(raw);
|
|
7
|
+
if (Number.isFinite(parsed) && parsed > 0) {
|
|
8
|
+
return Math.trunc(parsed);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
return DEFAULT_BROWSER_COMPANION_PAIRING_TOKEN_TTL_MS;
|
|
12
|
+
}
|
|
13
|
+
function resolveBrowserBridgeCompanionPairingTokenExpiresAt(nowMs = Date.now(), env) {
|
|
14
|
+
return new Date(
|
|
15
|
+
nowMs + resolveBrowserBridgeCompanionPairingTokenTtlMs(env)
|
|
16
|
+
).toISOString();
|
|
17
|
+
}
|
|
18
|
+
function browserBridgeDomainFromUrl(url) {
|
|
19
|
+
try {
|
|
20
|
+
const parsed = new URL(url);
|
|
21
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
const hostname = parsed.hostname.trim().toLowerCase().replace(/\.+$/, "");
|
|
25
|
+
return hostname.length > 0 ? hostname : null;
|
|
26
|
+
} catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export {
|
|
31
|
+
DEFAULT_BROWSER_COMPANION_PAIRING_TOKEN_TTL_MS,
|
|
32
|
+
MAX_BROWSER_FOCUS_WINDOW_MS,
|
|
33
|
+
browserBridgeDomainFromUrl,
|
|
34
|
+
resolveBrowserBridgeCompanionPairingTokenExpiresAt,
|
|
35
|
+
resolveBrowserBridgeCompanionPairingTokenTtlMs
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=bridge-policy.js.map
|