@agenticmail/enterprise 0.5.78 → 0.5.80

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.
Files changed (101) hide show
  1. package/dist/chunk-7MILGDAA.js +2191 -0
  2. package/dist/chunk-7RNT4O5T.js +15198 -0
  3. package/dist/chunk-AGFOJCSB.js +2191 -0
  4. package/dist/chunk-F4GSFCM3.js +898 -0
  5. package/dist/chunk-GWUIYH7I.js +15035 -0
  6. package/dist/chunk-PZA7YOJE.js +898 -0
  7. package/dist/chunk-Q3V7VZFQ.js +2191 -0
  8. package/dist/chunk-RRFB6G6M.js +15198 -0
  9. package/dist/chunk-VX3VFMVB.js +409 -0
  10. package/dist/chunk-WRPZCOWC.js +898 -0
  11. package/dist/cli.js +1 -1
  12. package/dist/dashboard/pages/agent-detail.js +313 -1
  13. package/dist/index.js +3 -3
  14. package/dist/pw-ai-KPETTB25.js +2212 -0
  15. package/dist/routes-PDHMCIXU.js +6676 -0
  16. package/dist/runtime-7HW4GX5L.js +48 -0
  17. package/dist/runtime-GYVO3NF3.js +47 -0
  18. package/dist/runtime-XXDCZZIK.js +48 -0
  19. package/dist/server-FMP4BFGW.js +12 -0
  20. package/dist/server-JRHDUNII.js +12 -0
  21. package/dist/server-VNW6G4GB.js +12 -0
  22. package/dist/setup-AANLREEL.js +20 -0
  23. package/dist/setup-O5FPRLK4.js +20 -0
  24. package/dist/setup-S4Z4PPIJ.js +20 -0
  25. package/package.json +15 -2
  26. package/src/agent-tools/common.ts +25 -0
  27. package/src/agent-tools/index.ts +4 -0
  28. package/src/agent-tools/schema/typebox.ts +25 -0
  29. package/src/agent-tools/tools/browser-tool.schema.ts +112 -0
  30. package/src/agent-tools/tools/browser-tool.ts +388 -0
  31. package/src/agent-tools/tools/gateway.ts +126 -0
  32. package/src/agent-tools/tools/nodes-utils.ts +80 -0
  33. package/src/browser/bridge-auth-registry.ts +34 -0
  34. package/src/browser/bridge-server.ts +93 -0
  35. package/src/browser/cdp.helpers.ts +180 -0
  36. package/src/browser/cdp.ts +466 -0
  37. package/src/browser/chrome.executables.ts +625 -0
  38. package/src/browser/chrome.profile-decoration.ts +198 -0
  39. package/src/browser/chrome.ts +349 -0
  40. package/src/browser/client-actions-core.ts +259 -0
  41. package/src/browser/client-actions-observe.ts +184 -0
  42. package/src/browser/client-actions-state.ts +284 -0
  43. package/src/browser/client-actions-types.ts +16 -0
  44. package/src/browser/client-actions-url.ts +11 -0
  45. package/src/browser/client-actions.ts +4 -0
  46. package/src/browser/client-fetch.ts +253 -0
  47. package/src/browser/client.ts +337 -0
  48. package/src/browser/config.ts +296 -0
  49. package/src/browser/constants.ts +8 -0
  50. package/src/browser/control-auth.ts +94 -0
  51. package/src/browser/control-service.ts +81 -0
  52. package/src/browser/csrf.ts +87 -0
  53. package/src/browser/enterprise-compat.ts +518 -0
  54. package/src/browser/extension-relay.ts +834 -0
  55. package/src/browser/http-auth.ts +63 -0
  56. package/src/browser/navigation-guard.ts +50 -0
  57. package/src/browser/paths.ts +49 -0
  58. package/src/browser/profiles-service.ts +187 -0
  59. package/src/browser/profiles.ts +113 -0
  60. package/src/browser/proxy-files.ts +41 -0
  61. package/src/browser/pw-ai-module.ts +52 -0
  62. package/src/browser/pw-ai-state.ts +9 -0
  63. package/src/browser/pw-ai.ts +65 -0
  64. package/src/browser/pw-role-snapshot.ts +434 -0
  65. package/src/browser/pw-session.ts +810 -0
  66. package/src/browser/pw-tools-core.activity.ts +68 -0
  67. package/src/browser/pw-tools-core.downloads.ts +281 -0
  68. package/src/browser/pw-tools-core.interactions.ts +646 -0
  69. package/src/browser/pw-tools-core.responses.ts +124 -0
  70. package/src/browser/pw-tools-core.shared.ts +70 -0
  71. package/src/browser/pw-tools-core.snapshot.ts +213 -0
  72. package/src/browser/pw-tools-core.state.ts +209 -0
  73. package/src/browser/pw-tools-core.storage.ts +128 -0
  74. package/src/browser/pw-tools-core.trace.ts +37 -0
  75. package/src/browser/pw-tools-core.ts +8 -0
  76. package/src/browser/resolved-config-refresh.ts +59 -0
  77. package/src/browser/routes/agent.act.shared.ts +52 -0
  78. package/src/browser/routes/agent.act.ts +575 -0
  79. package/src/browser/routes/agent.debug.ts +149 -0
  80. package/src/browser/routes/agent.shared.ts +143 -0
  81. package/src/browser/routes/agent.snapshot.ts +333 -0
  82. package/src/browser/routes/agent.storage.ts +451 -0
  83. package/src/browser/routes/agent.ts +13 -0
  84. package/src/browser/routes/basic.ts +202 -0
  85. package/src/browser/routes/dispatcher.ts +126 -0
  86. package/src/browser/routes/index.ts +11 -0
  87. package/src/browser/routes/path-output.ts +1 -0
  88. package/src/browser/routes/tabs.ts +217 -0
  89. package/src/browser/routes/types.ts +26 -0
  90. package/src/browser/routes/utils.ts +73 -0
  91. package/src/browser/screenshot.ts +54 -0
  92. package/src/browser/server-context.ts +688 -0
  93. package/src/browser/server-context.types.ts +65 -0
  94. package/src/browser/server-lifecycle.ts +48 -0
  95. package/src/browser/server-middleware.ts +37 -0
  96. package/src/browser/server.ts +110 -0
  97. package/src/browser/target-id.ts +30 -0
  98. package/src/browser/trash.ts +21 -0
  99. package/src/dashboard/pages/agent-detail.js +313 -1
  100. package/src/engine/agent-routes.ts +46 -0
  101. package/src/security/external-content.ts +299 -0
@@ -0,0 +1,409 @@
1
+ // src/browser/enterprise-compat.ts
2
+ import crypto from "crypto";
3
+ import fs from "fs";
4
+ import fsp from "fs/promises";
5
+ import path from "path";
6
+ import os from "os";
7
+ import net from "net";
8
+ import { execFile } from "child_process";
9
+ var _currentConfig = {};
10
+ var _configDir = path.join(os.homedir(), ".agenticmail-enterprise");
11
+ function loadConfig() {
12
+ return _currentConfig;
13
+ }
14
+ function createSubsystemLogger(name) {
15
+ const prefix = `[browser:${name}]`;
16
+ const logger = {
17
+ info: (...args) => console.log(prefix, ...args),
18
+ warn: (...args) => console.warn(prefix, ...args),
19
+ error: (...args) => console.error(prefix, ...args),
20
+ debug: (...args) => {
21
+ },
22
+ child: (sub) => createSubsystemLogger(`${name}:${sub}`)
23
+ };
24
+ return logger;
25
+ }
26
+ function formatErrorMessage(err) {
27
+ if (err instanceof Error) return err.message;
28
+ if (typeof err === "string") return err;
29
+ return String(err);
30
+ }
31
+ function isLoopbackHost(host) {
32
+ return /^(127\.\d+\.\d+\.\d+|::1|localhost)$/i.test(host);
33
+ }
34
+ function resolvePreferredOpenClawTmpDir() {
35
+ const dir = path.join(os.tmpdir(), "agenticmail-enterprise");
36
+ fs.mkdirSync(dir, { recursive: true });
37
+ return dir;
38
+ }
39
+ var DEFAULT_UPLOAD_DIR = path.join(os.tmpdir(), "agenticmail-uploads");
40
+ function rawDataToString(data) {
41
+ if (typeof data === "string") return data;
42
+ if (Buffer.isBuffer(data)) return data.toString("utf-8");
43
+ if (data instanceof ArrayBuffer) return Buffer.from(data).toString("utf-8");
44
+ if (Array.isArray(data)) return Buffer.concat(data).toString("utf-8");
45
+ return String(data);
46
+ }
47
+ function formatCliCommand(cmd, args) {
48
+ return [cmd, ...args].join(" ");
49
+ }
50
+ function resolvePinnedHostnameWithPolicy(hostname, _policy) {
51
+ return hostname;
52
+ }
53
+
54
+ // src/browser/cdp.helpers.ts
55
+ import WebSocket2 from "ws";
56
+
57
+ // src/browser/extension-relay.ts
58
+ import { createServer } from "http";
59
+ import WebSocket, { WebSocketServer } from "ws";
60
+ var RELAY_AUTH_HEADER = "x-openclaw-relay-token";
61
+ function resolveGatewayAuthToken() {
62
+ const envToken = process.env.OPENCLAW_GATEWAY_TOKEN?.trim() || process.env.CLAWDBOT_GATEWAY_TOKEN?.trim();
63
+ if (envToken) {
64
+ return envToken;
65
+ }
66
+ try {
67
+ const cfg = loadConfig();
68
+ const configToken = cfg.gateway?.auth?.token?.trim();
69
+ if (configToken) {
70
+ return configToken;
71
+ }
72
+ } catch {
73
+ }
74
+ return null;
75
+ }
76
+ function relayAuthTokenForUrl(url) {
77
+ try {
78
+ const parsed = new URL(url);
79
+ if (!isLoopbackHost(parsed.hostname)) {
80
+ return null;
81
+ }
82
+ return resolveGatewayAuthToken();
83
+ } catch {
84
+ return null;
85
+ }
86
+ }
87
+ function getChromeExtensionRelayAuthHeaders(url) {
88
+ const token = relayAuthTokenForUrl(url);
89
+ if (!token) {
90
+ return {};
91
+ }
92
+ return { [RELAY_AUTH_HEADER]: token };
93
+ }
94
+
95
+ // src/browser/cdp.helpers.ts
96
+ function getHeadersWithAuth(url, headers = {}) {
97
+ const relayHeaders = getChromeExtensionRelayAuthHeaders(url);
98
+ const mergedHeaders = { ...relayHeaders, ...headers };
99
+ try {
100
+ const parsed = new URL(url);
101
+ const hasAuthHeader = Object.keys(mergedHeaders).some(
102
+ (key) => key.toLowerCase() === "authorization"
103
+ );
104
+ if (hasAuthHeader) {
105
+ return mergedHeaders;
106
+ }
107
+ if (parsed.username || parsed.password) {
108
+ const auth = Buffer.from(`${parsed.username}:${parsed.password}`).toString("base64");
109
+ return { ...mergedHeaders, Authorization: `Basic ${auth}` };
110
+ }
111
+ } catch {
112
+ }
113
+ return mergedHeaders;
114
+ }
115
+ function appendCdpPath(cdpUrl, path5) {
116
+ const url = new URL(cdpUrl);
117
+ const basePath = url.pathname.replace(/\/$/, "");
118
+ const suffix = path5.startsWith("/") ? path5 : `/${path5}`;
119
+ url.pathname = `${basePath}${suffix}`;
120
+ return url.toString();
121
+ }
122
+ function createCdpSender(ws) {
123
+ let nextId = 1;
124
+ const pending = /* @__PURE__ */ new Map();
125
+ const send = (method, params, sessionId) => {
126
+ const id = nextId++;
127
+ const msg = { id, method, params, sessionId };
128
+ ws.send(JSON.stringify(msg));
129
+ return new Promise((resolve, reject) => {
130
+ pending.set(id, { resolve, reject });
131
+ });
132
+ };
133
+ const closeWithError = (err) => {
134
+ for (const [, p] of pending) {
135
+ p.reject(err);
136
+ }
137
+ pending.clear();
138
+ try {
139
+ ws.close();
140
+ } catch {
141
+ }
142
+ };
143
+ ws.on("error", (err) => {
144
+ closeWithError(err instanceof Error ? err : new Error(String(err)));
145
+ });
146
+ ws.on("message", (data) => {
147
+ try {
148
+ const parsed = JSON.parse(rawDataToString(data));
149
+ if (typeof parsed.id !== "number") {
150
+ return;
151
+ }
152
+ const p = pending.get(parsed.id);
153
+ if (!p) {
154
+ return;
155
+ }
156
+ pending.delete(parsed.id);
157
+ if (parsed.error?.message) {
158
+ p.reject(new Error(parsed.error.message));
159
+ return;
160
+ }
161
+ p.resolve(parsed.result);
162
+ } catch {
163
+ }
164
+ });
165
+ ws.on("close", () => {
166
+ closeWithError(new Error("CDP socket closed"));
167
+ });
168
+ return { send, closeWithError };
169
+ }
170
+ async function fetchJson(url, timeoutMs = 1500, init) {
171
+ const res = await fetchChecked(url, timeoutMs, init);
172
+ return await res.json();
173
+ }
174
+ async function fetchChecked(url, timeoutMs = 1500, init) {
175
+ const ctrl = new AbortController();
176
+ const t = setTimeout(ctrl.abort.bind(ctrl), timeoutMs);
177
+ try {
178
+ const headers = getHeadersWithAuth(url, init?.headers || {});
179
+ const res = await fetch(url, { ...init, headers, signal: ctrl.signal });
180
+ if (!res.ok) {
181
+ throw new Error(`HTTP ${res.status}`);
182
+ }
183
+ return res;
184
+ } finally {
185
+ clearTimeout(t);
186
+ }
187
+ }
188
+ async function withCdpSocket(wsUrl, fn, opts) {
189
+ const headers = getHeadersWithAuth(wsUrl, opts?.headers ?? {});
190
+ const handshakeTimeoutMs = typeof opts?.handshakeTimeoutMs === "number" && Number.isFinite(opts.handshakeTimeoutMs) ? Math.max(1, Math.floor(opts.handshakeTimeoutMs)) : 5e3;
191
+ const ws = new WebSocket2(wsUrl, {
192
+ handshakeTimeout: handshakeTimeoutMs,
193
+ ...Object.keys(headers).length ? { headers } : {}
194
+ });
195
+ const { send, closeWithError } = createCdpSender(ws);
196
+ const openPromise = new Promise((resolve, reject) => {
197
+ ws.once("open", () => resolve());
198
+ ws.once("error", (err) => reject(err));
199
+ ws.once("close", () => reject(new Error("CDP socket closed")));
200
+ });
201
+ try {
202
+ await openPromise;
203
+ } catch (err) {
204
+ closeWithError(err instanceof Error ? err : new Error(String(err)));
205
+ throw err;
206
+ }
207
+ try {
208
+ return await fn(send);
209
+ } catch (err) {
210
+ closeWithError(err instanceof Error ? err : new Error(String(err)));
211
+ throw err;
212
+ } finally {
213
+ try {
214
+ ws.close();
215
+ } catch {
216
+ }
217
+ }
218
+ }
219
+
220
+ // src/browser/navigation-guard.ts
221
+ var NETWORK_NAVIGATION_PROTOCOLS = /* @__PURE__ */ new Set(["http:", "https:"]);
222
+ var InvalidBrowserNavigationUrlError = class extends Error {
223
+ constructor(message) {
224
+ super(message);
225
+ this.name = "InvalidBrowserNavigationUrlError";
226
+ }
227
+ };
228
+ function withBrowserNavigationPolicy(ssrfPolicy) {
229
+ return ssrfPolicy ? { ssrfPolicy } : {};
230
+ }
231
+ async function assertBrowserNavigationAllowed(opts) {
232
+ const rawUrl = String(opts.url ?? "").trim();
233
+ if (!rawUrl) {
234
+ throw new InvalidBrowserNavigationUrlError("url is required");
235
+ }
236
+ let parsed;
237
+ try {
238
+ parsed = new URL(rawUrl);
239
+ } catch {
240
+ throw new InvalidBrowserNavigationUrlError(`Invalid URL: ${rawUrl}`);
241
+ }
242
+ if (!NETWORK_NAVIGATION_PROTOCOLS.has(parsed.protocol)) {
243
+ return;
244
+ }
245
+ await resolvePinnedHostnameWithPolicy(parsed.hostname, {
246
+ lookupFn: opts.lookupFn,
247
+ policy: opts.ssrfPolicy
248
+ });
249
+ }
250
+
251
+ // src/browser/cdp.ts
252
+ function normalizeCdpWsUrl(wsUrl, cdpUrl) {
253
+ const ws = new URL(wsUrl);
254
+ const cdp = new URL(cdpUrl);
255
+ if (isLoopbackHost(ws.hostname) && !isLoopbackHost(cdp.hostname)) {
256
+ ws.hostname = cdp.hostname;
257
+ const cdpPort = cdp.port || (cdp.protocol === "https:" ? "443" : "80");
258
+ if (cdpPort) {
259
+ ws.port = cdpPort;
260
+ }
261
+ ws.protocol = cdp.protocol === "https:" ? "wss:" : "ws:";
262
+ }
263
+ if (cdp.protocol === "https:" && ws.protocol === "ws:") {
264
+ ws.protocol = "wss:";
265
+ }
266
+ if (!ws.username && !ws.password && (cdp.username || cdp.password)) {
267
+ ws.username = cdp.username;
268
+ ws.password = cdp.password;
269
+ }
270
+ for (const [key, value] of cdp.searchParams.entries()) {
271
+ if (!ws.searchParams.has(key)) {
272
+ ws.searchParams.append(key, value);
273
+ }
274
+ }
275
+ return ws.toString();
276
+ }
277
+ function axValue(v) {
278
+ if (!v || typeof v !== "object") {
279
+ return "";
280
+ }
281
+ const value = v.value;
282
+ if (typeof value === "string") {
283
+ return value;
284
+ }
285
+ if (typeof value === "number" || typeof value === "boolean") {
286
+ return String(value);
287
+ }
288
+ return "";
289
+ }
290
+ function formatAriaSnapshot(nodes, limit) {
291
+ const byId = /* @__PURE__ */ new Map();
292
+ for (const n of nodes) {
293
+ if (n.nodeId) {
294
+ byId.set(n.nodeId, n);
295
+ }
296
+ }
297
+ const referenced = /* @__PURE__ */ new Set();
298
+ for (const n of nodes) {
299
+ for (const c of n.childIds ?? []) {
300
+ referenced.add(c);
301
+ }
302
+ }
303
+ const root = nodes.find((n) => n.nodeId && !referenced.has(n.nodeId)) ?? nodes[0];
304
+ if (!root?.nodeId) {
305
+ return [];
306
+ }
307
+ const out = [];
308
+ const stack = [{ id: root.nodeId, depth: 0 }];
309
+ while (stack.length && out.length < limit) {
310
+ const popped = stack.pop();
311
+ if (!popped) {
312
+ break;
313
+ }
314
+ const { id, depth } = popped;
315
+ const n = byId.get(id);
316
+ if (!n) {
317
+ continue;
318
+ }
319
+ const role = axValue(n.role);
320
+ const name = axValue(n.name);
321
+ const value = axValue(n.value);
322
+ const description = axValue(n.description);
323
+ const ref = `ax${out.length + 1}`;
324
+ out.push({
325
+ ref,
326
+ role: role || "unknown",
327
+ name: name || "",
328
+ ...value ? { value } : {},
329
+ ...description ? { description } : {},
330
+ ...typeof n.backendDOMNodeId === "number" ? { backendDOMNodeId: n.backendDOMNodeId } : {},
331
+ depth
332
+ });
333
+ const children = (n.childIds ?? []).filter((c) => byId.has(c));
334
+ for (let i = children.length - 1; i >= 0; i--) {
335
+ const child = children[i];
336
+ if (child) {
337
+ stack.push({ id: child, depth: depth + 1 });
338
+ }
339
+ }
340
+ }
341
+ return out;
342
+ }
343
+
344
+ // src/browser/chrome.ts
345
+ import { spawn } from "child_process";
346
+ import fs4 from "fs";
347
+ import os3 from "os";
348
+ import path4 from "path";
349
+ import WebSocket3 from "ws";
350
+
351
+ // src/browser/chrome.executables.ts
352
+ import { execFileSync } from "child_process";
353
+ import fs2 from "fs";
354
+ import os2 from "os";
355
+ import path2 from "path";
356
+
357
+ // src/browser/chrome.profile-decoration.ts
358
+ import fs3 from "fs";
359
+ import path3 from "path";
360
+
361
+ // src/browser/chrome.ts
362
+ var log = createSubsystemLogger("browser").child("chrome");
363
+ async function fetchChromeVersion(cdpUrl, timeoutMs = 500) {
364
+ const ctrl = new AbortController();
365
+ const t = setTimeout(ctrl.abort.bind(ctrl), timeoutMs);
366
+ try {
367
+ const versionUrl = appendCdpPath(cdpUrl, "/json/version");
368
+ const res = await fetch(versionUrl, {
369
+ signal: ctrl.signal,
370
+ headers: getHeadersWithAuth(versionUrl)
371
+ });
372
+ if (!res.ok) {
373
+ return null;
374
+ }
375
+ const data = await res.json();
376
+ if (!data || typeof data !== "object") {
377
+ return null;
378
+ }
379
+ return data;
380
+ } catch {
381
+ return null;
382
+ } finally {
383
+ clearTimeout(t);
384
+ }
385
+ }
386
+ async function getChromeWebSocketUrl(cdpUrl, timeoutMs = 500) {
387
+ const version = await fetchChromeVersion(cdpUrl, timeoutMs);
388
+ const wsUrl = String(version?.webSocketDebuggerUrl ?? "").trim();
389
+ if (!wsUrl) {
390
+ return null;
391
+ }
392
+ return normalizeCdpWsUrl(wsUrl, cdpUrl);
393
+ }
394
+
395
+ export {
396
+ createSubsystemLogger,
397
+ formatErrorMessage,
398
+ resolvePreferredOpenClawTmpDir,
399
+ formatCliCommand,
400
+ getHeadersWithAuth,
401
+ appendCdpPath,
402
+ fetchJson,
403
+ withCdpSocket,
404
+ withBrowserNavigationPolicy,
405
+ assertBrowserNavigationAllowed,
406
+ normalizeCdpWsUrl,
407
+ formatAriaSnapshot,
408
+ getChromeWebSocketUrl
409
+ };