free-computer-use 0.1.0

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 (135) hide show
  1. package/.env.example +31 -0
  2. package/CHANGELOG.md +19 -0
  3. package/CONTRIBUTING.md +66 -0
  4. package/LICENSE +21 -0
  5. package/README.md +140 -0
  6. package/SECURITY.md +133 -0
  7. package/artifacts/benchmark-public.json +797 -0
  8. package/assets/readme/hero.svg +53 -0
  9. package/assets/readme/incident-demo.gif +0 -0
  10. package/assets/readme/incident-evidence.json +52 -0
  11. package/dist/actions/compiler.d.ts +5 -0
  12. package/dist/actions/compiler.js +16 -0
  13. package/dist/actions/compiler.js.map +1 -0
  14. package/dist/actions/executor.d.ts +38 -0
  15. package/dist/actions/executor.js +305 -0
  16. package/dist/actions/executor.js.map +1 -0
  17. package/dist/actions/policy.d.ts +4 -0
  18. package/dist/actions/policy.js +18 -0
  19. package/dist/actions/policy.js.map +1 -0
  20. package/dist/actions/schema.d.ts +4149 -0
  21. package/dist/actions/schema.js +59 -0
  22. package/dist/actions/schema.js.map +1 -0
  23. package/dist/adapters/generic.d.ts +14 -0
  24. package/dist/adapters/generic.js +33 -0
  25. package/dist/adapters/generic.js.map +1 -0
  26. package/dist/agent/Agent.d.ts +69 -0
  27. package/dist/agent/Agent.js +375 -0
  28. package/dist/agent/Agent.js.map +1 -0
  29. package/dist/agent/Control.d.ts +23 -0
  30. package/dist/agent/Control.js +51 -0
  31. package/dist/agent/Control.js.map +1 -0
  32. package/dist/agent/TokenBudget.d.ts +52 -0
  33. package/dist/agent/TokenBudget.js +47 -0
  34. package/dist/agent/TokenBudget.js.map +1 -0
  35. package/dist/agent/goalCriteria.d.ts +2 -0
  36. package/dist/agent/goalCriteria.js +13 -0
  37. package/dist/agent/goalCriteria.js.map +1 -0
  38. package/dist/browser/Browser.d.ts +72 -0
  39. package/dist/browser/Browser.js +378 -0
  40. package/dist/browser/Browser.js.map +1 -0
  41. package/dist/browser/DomExtractor.d.ts +6 -0
  42. package/dist/browser/DomExtractor.js +134 -0
  43. package/dist/browser/DomExtractor.js.map +1 -0
  44. package/dist/browser/Interaction.d.ts +43 -0
  45. package/dist/browser/Interaction.js +225 -0
  46. package/dist/browser/Interaction.js.map +1 -0
  47. package/dist/browser/NetworkGuardProxy.d.ts +31 -0
  48. package/dist/browser/NetworkGuardProxy.js +331 -0
  49. package/dist/browser/NetworkGuardProxy.js.map +1 -0
  50. package/dist/browser/Observer.d.ts +12 -0
  51. package/dist/browser/Observer.js +31 -0
  52. package/dist/browser/Observer.js.map +1 -0
  53. package/dist/browser/PageCompressor.d.ts +47 -0
  54. package/dist/browser/PageCompressor.js +62 -0
  55. package/dist/browser/PageCompressor.js.map +1 -0
  56. package/dist/browser/SecurityBoundaryError.d.ts +3 -0
  57. package/dist/browser/SecurityBoundaryError.js +4 -0
  58. package/dist/browser/SecurityBoundaryError.js.map +1 -0
  59. package/dist/browser/SelectorEngine.d.ts +18 -0
  60. package/dist/browser/SelectorEngine.js +72 -0
  61. package/dist/browser/SelectorEngine.js.map +1 -0
  62. package/dist/browser/types.d.ts +38 -0
  63. package/dist/browser/types.js +2 -0
  64. package/dist/browser/types.js.map +1 -0
  65. package/dist/cli/index.d.ts +2 -0
  66. package/dist/cli/index.js +284 -0
  67. package/dist/cli/index.js.map +1 -0
  68. package/dist/config.d.ts +11 -0
  69. package/dist/config.js +77 -0
  70. package/dist/config.js.map +1 -0
  71. package/dist/history/TraceStore.d.ts +29 -0
  72. package/dist/history/TraceStore.js +53 -0
  73. package/dist/history/TraceStore.js.map +1 -0
  74. package/dist/index.d.ts +18 -0
  75. package/dist/index.js +16 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/llm/ClaudeSubscriptionProvider.d.ts +26 -0
  78. package/dist/llm/ClaudeSubscriptionProvider.js +182 -0
  79. package/dist/llm/ClaudeSubscriptionProvider.js.map +1 -0
  80. package/dist/llm/CodexSubscriptionProvider.d.ts +26 -0
  81. package/dist/llm/CodexSubscriptionProvider.js +168 -0
  82. package/dist/llm/CodexSubscriptionProvider.js.map +1 -0
  83. package/dist/llm/FlashProvider.d.ts +27 -0
  84. package/dist/llm/FlashProvider.js +103 -0
  85. package/dist/llm/FlashProvider.js.map +1 -0
  86. package/dist/llm/LLMProvider.d.ts +37 -0
  87. package/dist/llm/LLMProvider.js +2 -0
  88. package/dist/llm/LLMProvider.js.map +1 -0
  89. package/dist/llm/cliEnvironment.d.ts +5 -0
  90. package/dist/llm/cliEnvironment.js +21 -0
  91. package/dist/llm/cliEnvironment.js.map +1 -0
  92. package/dist/llm/prompts.d.ts +4 -0
  93. package/dist/llm/prompts.js +12 -0
  94. package/dist/llm/prompts.js.map +1 -0
  95. package/dist/llm/structuredOutput.d.ts +3 -0
  96. package/dist/llm/structuredOutput.js +58 -0
  97. package/dist/llm/structuredOutput.js.map +1 -0
  98. package/dist/mcp/index.d.ts +13 -0
  99. package/dist/mcp/index.js +243 -0
  100. package/dist/mcp/index.js.map +1 -0
  101. package/dist/profile/ProfileStore.d.ts +7 -0
  102. package/dist/profile/ProfileStore.js +52 -0
  103. package/dist/profile/ProfileStore.js.map +1 -0
  104. package/dist/profile/VariableResolver.d.ts +15 -0
  105. package/dist/profile/VariableResolver.js +50 -0
  106. package/dist/profile/VariableResolver.js.map +1 -0
  107. package/dist/server/index.d.ts +14 -0
  108. package/dist/server/index.js +239 -0
  109. package/dist/server/index.js.map +1 -0
  110. package/dist/ui/app.js +132 -0
  111. package/dist/ui/index.html +29 -0
  112. package/dist/ui/logo.svg +5 -0
  113. package/dist/ui/results.js +59 -0
  114. package/dist/ui/style.css +33 -0
  115. package/dist/verification/Verifier.d.ts +72 -0
  116. package/dist/verification/Verifier.js +87 -0
  117. package/dist/verification/Verifier.js.map +1 -0
  118. package/dist/workflows/WorkflowEngine.d.ts +23 -0
  119. package/dist/workflows/WorkflowEngine.js +52 -0
  120. package/dist/workflows/WorkflowEngine.js.map +1 -0
  121. package/docs/ADOPTION.md +61 -0
  122. package/docs/ARCHITECTURE.md +65 -0
  123. package/docs/BENCHMARKS.md +64 -0
  124. package/docs/IMPLEMENTATION.md +93 -0
  125. package/docs/LOCAL_DATA.md +98 -0
  126. package/docs/LOCAL_VALIDATION.md +87 -0
  127. package/docs/MCP.md +81 -0
  128. package/docs/PROVIDERS.md +150 -0
  129. package/docs/RELEASE_CHECKLIST.md +37 -0
  130. package/docs/REQUIREMENTS.md +39 -0
  131. package/docs/SUPPORT_MATRIX.md +193 -0
  132. package/docs/THREAT_MODEL.md +108 -0
  133. package/docs/USEFUL_EXAMPLES.md +151 -0
  134. package/docs/brand-mark.svg +12 -0
  135. package/package.json +90 -0
@@ -0,0 +1,378 @@
1
+ import { chromium } from 'playwright';
2
+ import { chmod, lstat, mkdir, mkdtemp, readFile, rename, rm, writeFile } from 'node:fs/promises';
3
+ import { randomUUID } from 'node:crypto';
4
+ import { isIP } from 'node:net';
5
+ import { join, resolve } from 'node:path';
6
+ import { tmpdir } from 'node:os';
7
+ import { Interaction } from './Interaction.js';
8
+ import { NetworkGuardProxy, resolvePublicAddresses } from './NetworkGuardProxy.js';
9
+ import { SecurityBoundaryError } from './SecurityBoundaryError.js';
10
+ const browserChannels = ['chrome', 'chrome-beta', 'chrome-dev', 'chrome-canary', 'msedge', 'msedge-beta', 'msedge-dev', 'msedge-canary'];
11
+ const pageTargetFilter = [{ type: 'page', exclude: false }, { exclude: true }];
12
+ const nestedTargetFilter = [...['iframe', 'worker', 'shared_worker', 'service_worker'].map(type => ({ type, exclude: false })), { exclude: true }];
13
+ export function checkedHttpURL(value, base) {
14
+ const url = base ? new URL(value, base) : new URL(value);
15
+ if (!['http:', 'https:'].includes(url.protocol) || url.username || url.password)
16
+ throw new Error('Only HTTP(S) destinations without embedded credentials are supported');
17
+ return url;
18
+ }
19
+ export async function assertNoPrivateDNSResolution(value) {
20
+ const url = checkedHttpURL(value), hostname = url.hostname.replace(/^\[|\]$/g, '');
21
+ if (isIP(hostname))
22
+ return;
23
+ await resolvePublicAddresses(hostname);
24
+ }
25
+ function launchOptions(headless) {
26
+ const channel = process.env.FCU_BROWSER_CHANNEL;
27
+ if (channel && !browserChannels.includes(channel))
28
+ throw new Error(`FCU_BROWSER_CHANNEL must be one of: ${browserChannels.join(', ')}`);
29
+ return { headless, ...(channel ? { channel } : {}) };
30
+ }
31
+ async function restrictUnproxiedWebRTC(userDataDir) {
32
+ const profileDir = join(userDataDir, 'Default'), preferencesPath = join(profileDir, 'Preferences');
33
+ await mkdir(profileDir, { recursive: true, mode: 0o700 });
34
+ const directory = await lstat(profileDir);
35
+ if (!directory.isDirectory() || directory.isSymbolicLink())
36
+ throw new Error('Browser profile must be a local directory');
37
+ await chmod(profileDir, 0o700);
38
+ let preferences = {};
39
+ try {
40
+ const info = await lstat(preferencesPath);
41
+ if (!info.isFile() || info.isSymbolicLink())
42
+ throw new Error('Browser preferences must be a regular file');
43
+ const value = JSON.parse(await readFile(preferencesPath, 'utf8'));
44
+ if (typeof value !== 'object' || value === null || Array.isArray(value))
45
+ throw new Error('Browser preferences must be a JSON object');
46
+ preferences = value;
47
+ }
48
+ catch (error) {
49
+ if (error.code !== 'ENOENT')
50
+ throw error;
51
+ }
52
+ const webrtc = preferences.webrtc && typeof preferences.webrtc === 'object' && !Array.isArray(preferences.webrtc) ? preferences.webrtc : {};
53
+ preferences.webrtc = { ...webrtc, ip_handling_policy: 'disable_non_proxied_udp' };
54
+ const temporary = `${preferencesPath}.${randomUUID()}.tmp`;
55
+ try {
56
+ await writeFile(temporary, JSON.stringify(preferences), { flag: 'wx', mode: 0o600 });
57
+ await rename(temporary, preferencesPath);
58
+ await chmod(preferencesPath, 0o600);
59
+ }
60
+ finally {
61
+ await rm(temporary, { force: true });
62
+ }
63
+ }
64
+ export class Browser {
65
+ options;
66
+ context;
67
+ page;
68
+ downloads = [];
69
+ extractions = [];
70
+ responses = [];
71
+ formReceipts = [];
72
+ wired = new WeakSet();
73
+ cdpSocket;
74
+ cdpSequence = 0;
75
+ cdpPending = new Map();
76
+ initialPageGuard;
77
+ networkProxy;
78
+ temporaryProfileDir;
79
+ closing = false;
80
+ closePromise;
81
+ interaction;
82
+ constructor(options = {}) {
83
+ this.options = options;
84
+ this.interaction = new Interaction(() => this.page, options.visualInteraction);
85
+ }
86
+ async checkNetworkDestination(value) { if (!this.options.allowExternal)
87
+ try {
88
+ await assertNoPrivateDNSResolution(value);
89
+ }
90
+ catch (error) {
91
+ throw new SecurityBoundaryError(error instanceof Error ? error.message : 'Destination blocked by local browser policy');
92
+ } }
93
+ async launch() {
94
+ const folder = this.options.profileDir ? resolve(this.options.profileDir) : await mkdtemp(join(tmpdir(), 'free-computer-use-'));
95
+ if (this.options.profileDir) {
96
+ await mkdir(folder, { recursive: true, mode: 0o700 });
97
+ const info = await lstat(folder);
98
+ if (!info.isDirectory() || info.isSymbolicLink())
99
+ throw new Error('Browser profile must be a local directory');
100
+ await chmod(folder, 0o700);
101
+ }
102
+ else
103
+ this.temporaryProfileDir = folder;
104
+ this.networkProxy = new NetworkGuardProxy({ allowPrivate: () => this.options.allowExternal === true, permits: url => this.permits(url) });
105
+ try {
106
+ await restrictUnproxiedWebRTC(folder);
107
+ const proxy = await this.networkProxy.start();
108
+ this.context = await chromium.launchPersistentContext(folder, { ...launchOptions(this.options.headless ?? true), proxy: { server: proxy, bypass: '<-loopback>' }, acceptDownloads: true, serviceWorkers: 'block', args: ['--disable-quic', '--remote-debugging-port=0', '--remote-debugging-address=127.0.0.1'] });
109
+ this.context.setDefaultTimeout(this.options.timeoutMs ?? 4000);
110
+ this.context.setDefaultNavigationTimeout(20000);
111
+ this.context.on('page', page => { this.wire(page); this.page = page; void this.interaction.initialize(page).catch(() => { }); });
112
+ this.page = this.context.pages()[0] ?? await this.context.newPage();
113
+ this.wire(this.page);
114
+ await this.interaction.initialize(this.page);
115
+ await this.context.route('**/*', async (route) => {
116
+ const url = route.request().url();
117
+ if (route.request().isNavigationRequest()) {
118
+ if (this.options.beforeNavigate) {
119
+ try {
120
+ await this.options.beforeNavigate(url);
121
+ }
122
+ catch {
123
+ await route.abort('blockedbyclient');
124
+ return;
125
+ }
126
+ }
127
+ }
128
+ // All initial browser HTTP requests, frames, fetches and form posts.
129
+ if (!this.permits(url))
130
+ await route.abort('blockedbyclient');
131
+ else
132
+ await route.continue();
133
+ });
134
+ await this.startRedirectGuard(folder);
135
+ return this;
136
+ }
137
+ catch (error) {
138
+ await this.context?.close().catch(() => { });
139
+ await this.networkProxy.close().catch(() => { });
140
+ await this.cleanupTemporaryProfile();
141
+ throw error;
142
+ }
143
+ }
144
+ wire(page) {
145
+ if (this.wired.has(page))
146
+ return;
147
+ this.wired.add(page);
148
+ this.interaction.wire(page);
149
+ page.on('dialog', dialog => void dialog.dismiss());
150
+ page.on('response', response => {
151
+ this.responses.push({ url: response.url(), status: response.status(), time: Date.now(), method: response.request().method(), resource: response.request().resourceType() });
152
+ if (this.responses.length > 300)
153
+ this.responses.shift();
154
+ });
155
+ }
156
+ async startRedirectGuard(profileDir) {
157
+ let endpoint;
158
+ for (let attempt = 0; attempt < 20 && !endpoint; attempt++) {
159
+ try {
160
+ const [port, path] = (await readFile(join(profileDir, 'DevToolsActivePort'), 'utf8')).trim().split('\n');
161
+ if (/^\d+$/.test(port ?? '') && path?.startsWith('/devtools/browser/'))
162
+ endpoint = `ws://127.0.0.1:${port}${path}`;
163
+ }
164
+ catch { }
165
+ if (!endpoint)
166
+ await new Promise(resolve => setTimeout(resolve, 50));
167
+ }
168
+ if (!endpoint)
169
+ throw new Error('The local browser request guard could not start');
170
+ const socket = new WebSocket(endpoint);
171
+ this.cdpSocket = socket;
172
+ await new Promise((resolve, reject) => {
173
+ const timer = setTimeout(() => reject(new Error('The local browser request guard did not connect')), 5000);
174
+ socket.addEventListener('open', () => { clearTimeout(timer); resolve(); }, { once: true });
175
+ socket.addEventListener('error', () => { clearTimeout(timer); reject(new Error('The local browser request guard could not connect')); }, { once: true });
176
+ });
177
+ socket.addEventListener('message', event => this.receiveCDP(String(event.data)));
178
+ socket.addEventListener('error', () => this.failCDP(new Error('The local browser request guard disconnected')));
179
+ socket.addEventListener('close', () => {
180
+ this.failCDP(new Error('The local browser request guard disconnected'));
181
+ if (!this.closing)
182
+ void this.context.close().catch(() => { }).then(() => this.networkProxy?.close()).then(() => this.cleanupTemporaryProfile());
183
+ });
184
+ let resolvePage, rejectPage;
185
+ const promise = new Promise((resolve, reject) => { resolvePage = resolve; rejectPage = reject; });
186
+ this.initialPageGuard = { promise, resolve: resolvePage, reject: rejectPage };
187
+ await this.sendCDP('Target.setAutoAttach', { autoAttach: true, waitForDebuggerOnStart: true, flatten: true, filter: pageTargetFilter });
188
+ let timer;
189
+ try {
190
+ await Promise.race([promise, new Promise((_, reject) => { timer = setTimeout(() => reject(new Error('The initial browser page was not guarded')), 5000); })]);
191
+ }
192
+ finally {
193
+ if (timer)
194
+ clearTimeout(timer);
195
+ }
196
+ }
197
+ receiveCDP(value) {
198
+ let message;
199
+ try {
200
+ message = JSON.parse(value);
201
+ }
202
+ catch {
203
+ return;
204
+ }
205
+ if (message.id !== undefined) {
206
+ const pending = this.cdpPending.get(message.id);
207
+ if (!pending)
208
+ return;
209
+ this.cdpPending.delete(message.id);
210
+ clearTimeout(pending.timer);
211
+ if (message.error)
212
+ pending.reject(new Error(message.error.message ?? 'Chromium DevTools command failed'));
213
+ else
214
+ pending.resolve(message.result);
215
+ return;
216
+ }
217
+ if (message.method === 'Target.attachedToTarget') {
218
+ const params = message.params;
219
+ if (!params)
220
+ return;
221
+ void this.guardTarget(params.sessionId, params.targetInfo, params.waitingForDebugger).then(() => {
222
+ if (params.targetInfo.type === 'page')
223
+ this.initialPageGuard?.resolve();
224
+ }).catch(async (error) => {
225
+ if (params.targetInfo.type === 'page')
226
+ this.initialPageGuard?.reject(error instanceof Error ? error : new Error('The local browser request guard failed'));
227
+ await this.sendCDP('Target.closeTarget', { targetId: params.targetInfo.targetId }).catch(() => { });
228
+ });
229
+ }
230
+ else if (message.method === 'Fetch.requestPaused')
231
+ void this.guardPausedRequest(message);
232
+ }
233
+ async guardTarget(sessionId, target, waiting) {
234
+ await this.sendCDP('Fetch.enable', { patterns: [{ urlPattern: '*', requestStage: 'Request' }] }, sessionId);
235
+ if (target.type === 'page' || target.type === 'iframe') {
236
+ await this.sendCDP('Target.setAutoAttach', { autoAttach: true, waitForDebuggerOnStart: true, flatten: true, filter: nestedTargetFilter }, sessionId);
237
+ }
238
+ if (waiting)
239
+ await this.sendCDP('Runtime.runIfWaitingForDebugger', {}, sessionId);
240
+ }
241
+ async guardPausedRequest(message) {
242
+ const params = message.params;
243
+ const sessionId = message.sessionId;
244
+ if (!params || !sessionId)
245
+ return;
246
+ const fail = () => this.sendCDP('Fetch.failRequest', { requestId: params.requestId, errorReason: 'BlockedByClient' }, sessionId);
247
+ try {
248
+ if (params.redirectedRequestId) {
249
+ if (params.resourceType === 'Document' && this.options.beforeNavigate) {
250
+ try {
251
+ await this.options.beforeNavigate(params.request.url);
252
+ }
253
+ catch {
254
+ await fail();
255
+ return;
256
+ }
257
+ }
258
+ if (!this.permits(params.request.url)) {
259
+ await fail();
260
+ return;
261
+ }
262
+ }
263
+ await this.sendCDP('Fetch.continueRequest', { requestId: params.requestId }, sessionId);
264
+ }
265
+ catch {
266
+ await fail().catch(() => { });
267
+ }
268
+ }
269
+ sendCDP(method, params = {}, sessionId) {
270
+ const socket = this.cdpSocket;
271
+ if (!socket || socket.readyState !== 1)
272
+ return Promise.reject(new Error('The local browser request guard is unavailable'));
273
+ const id = ++this.cdpSequence;
274
+ return new Promise((resolve, reject) => {
275
+ const timer = setTimeout(() => { this.cdpPending.delete(id); reject(new Error(`Chromium DevTools command timed out: ${method}`)); }, 5000);
276
+ this.cdpPending.set(id, { resolve, reject, timer });
277
+ try {
278
+ socket.send(JSON.stringify({ id, method, params, ...(sessionId ? { sessionId } : {}) }));
279
+ }
280
+ catch (error) {
281
+ this.cdpPending.delete(id);
282
+ clearTimeout(timer);
283
+ reject(error instanceof Error ? error : new Error('Chromium DevTools command failed'));
284
+ }
285
+ });
286
+ }
287
+ failCDP(error) {
288
+ for (const pending of this.cdpPending.values()) {
289
+ clearTimeout(pending.timer);
290
+ pending.reject(error);
291
+ }
292
+ this.cdpPending.clear();
293
+ }
294
+ async cleanupTemporaryProfile() {
295
+ const folder = this.temporaryProfileDir;
296
+ this.temporaryProfileDir = undefined;
297
+ if (folder)
298
+ await rm(folder, { recursive: true, force: true }).catch(() => { });
299
+ }
300
+ permits(value) {
301
+ try {
302
+ const url = checkedHttpURL(value);
303
+ if (this.options.blockedOrigins?.includes(url.origin))
304
+ return false;
305
+ return this.options.allowExternal === true || !!this.options.allowedOrigins?.some(origin => {
306
+ try {
307
+ const allowed = checkedHttpURL(origin);
308
+ return allowed.origin === url.origin && allowed.pathname === '/' && !allowed.search && !allowed.hash;
309
+ }
310
+ catch {
311
+ return false;
312
+ }
313
+ });
314
+ }
315
+ catch {
316
+ return false;
317
+ }
318
+ }
319
+ async navigate(value) {
320
+ const url = checkedHttpURL(value, this.page.url());
321
+ await this.options.beforeNavigate?.(url.href);
322
+ await this.checkNetworkDestination(url.href);
323
+ if (!this.permits(url.href))
324
+ throw new SecurityBoundaryError('Navigation destination is outside the local origin policy');
325
+ await this.page.goto(url.href, { waitUntil: 'domcontentloaded' });
326
+ }
327
+ async openTab(url) {
328
+ const destination = checkedHttpURL(url, this.page.url());
329
+ await this.options.beforeNavigate?.(destination.href);
330
+ await this.checkNetworkDestination(destination.href);
331
+ if (!this.permits(destination.href))
332
+ throw new SecurityBoundaryError('Tab destination is outside the origin policy');
333
+ this.page = await this.context.newPage();
334
+ await this.navigate(destination.href);
335
+ }
336
+ async switchTab(index, timeoutMs = 4000) {
337
+ const deadline = Date.now() + timeoutMs;
338
+ while (!this.context.pages()[index] && Date.now() < deadline) {
339
+ await this.context.waitForEvent('page', { timeout: Math.max(1, deadline - Date.now()) }).catch(() => { });
340
+ }
341
+ const page = this.context.pages()[index];
342
+ if (!page)
343
+ throw new Error('Tab index does not exist');
344
+ await page.waitForLoadState('domcontentloaded', { timeout: timeoutMs });
345
+ this.page = page;
346
+ await this.interaction.initialize(page);
347
+ }
348
+ async closeTab() {
349
+ if (this.context.pages().length === 1)
350
+ throw new Error('Cannot close the last tab');
351
+ const closing = this.page;
352
+ this.page = this.context.pages().filter(page => page !== closing).at(-1);
353
+ await closing.close();
354
+ }
355
+ async prepareForNextRun() {
356
+ if (!this.context)
357
+ return;
358
+ await Promise.all(this.context.pages().map(page => page.close()));
359
+ this.page = await this.context.newPage();
360
+ await this.interaction.initialize(this.page);
361
+ }
362
+ async close() {
363
+ if (this.closePromise)
364
+ return this.closePromise;
365
+ this.closing = true;
366
+ this.cdpSocket?.close();
367
+ this.failCDP(new Error('Browser closed'));
368
+ this.closePromise = (async () => { try {
369
+ await this.context?.close();
370
+ }
371
+ finally {
372
+ await this.networkProxy?.close();
373
+ await this.cleanupTemporaryProfile();
374
+ } })();
375
+ return this.closePromise;
376
+ }
377
+ }
378
+ //# sourceMappingURL=Browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Browser.js","sourceRoot":"","sources":["../../src/browser/Browser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Page } from 'playwright';
2
+ import type { PageState } from './types.js';
3
+ export declare const stateHash: (state: Pick<PageState, 'url' | 'title' | 'text' | 'elements'> & Partial<Pick<PageState, 'tables'>>) => string;
4
+ export declare class DomExtractor {
5
+ extract(page: Page, region?: string): Promise<PageState>;
6
+ }
@@ -0,0 +1,134 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ export const stateHash = (state) => createHash('sha256')
3
+ .update(JSON.stringify([state.url, state.title, state.text, state.tables ?? [], state.elements.map(e => [e.frame, e.role, e.name, e.hasValue, e.checked, e.disabled, e.error])])).digest('hex').slice(0, 20);
4
+ async function evaluateWhilePageOpen(page, evaluation) {
5
+ if (page.isClosed())
6
+ throw new Error('Browser page closed during DOM inspection');
7
+ let rejectClosed;
8
+ const closed = new Promise((_, reject) => { rejectClosed = reject; });
9
+ const onClose = () => rejectClosed(new Error('Browser page closed during DOM inspection'));
10
+ page.once('close', onClose);
11
+ try {
12
+ return await Promise.race([evaluation, closed]);
13
+ }
14
+ finally {
15
+ page.off('close', onClose);
16
+ }
17
+ }
18
+ export class DomExtractor {
19
+ async extract(page, region) {
20
+ const pieces = [];
21
+ const frames = page.frames();
22
+ for (let index = 0; index < frames.length; index++) {
23
+ const frame = frames[index];
24
+ try {
25
+ const data = await evaluateWhilePageOpen(page, frame.evaluate(({ index, region, documentId }) => {
26
+ // Array destructuring avoids tsx's named-function helper in browser serialization.
27
+ const [clean] = [(s, max = 180) => (s ?? '').replace(/\s+/g, ' ').trim().slice(0, max)];
28
+ const [visible] = [(el) => {
29
+ if (el.closest('[hidden],[inert],[aria-hidden="true"]'))
30
+ return false;
31
+ const modal = document.querySelector('dialog:modal,[role=dialog][aria-modal=true]');
32
+ if (modal && modal.getClientRects().length && !modal.contains(el) && modal !== el)
33
+ return false;
34
+ const style = getComputedStyle(el);
35
+ return style.display !== 'none' && style.visibility !== 'hidden' && style.opacity !== '0' && el.getClientRects().length > 0;
36
+ }];
37
+ const roots = [document];
38
+ const all = [];
39
+ for (let rootIndex = 0; rootIndex < roots.length; rootIndex++) {
40
+ for (const el of roots[rootIndex].querySelectorAll('*')) {
41
+ all.push(el);
42
+ if (el.shadowRoot)
43
+ roots.push(el.shadowRoot);
44
+ }
45
+ }
46
+ const scope = region ? all.find(el => el.id === region || el.getAttribute('aria-label') === region || el.tagName.toLowerCase() === region || el.getAttribute('role') === region) : undefined;
47
+ if (region && !scope)
48
+ return { elements: [], headings: [], text: '', tables: [], dialogs: [], htmlBytes: 0, truncated: false };
49
+ const [included] = [(el) => !scope || scope === el || scope.contains(el)];
50
+ const global = window;
51
+ const registry = global.__fcuRegistry ??= { refs: new WeakMap(), next: 1, documentId };
52
+ const htmlBytes = new TextEncoder().encode(document.documentElement.outerHTML).length;
53
+ const candidates = all.filter(el => included(el) && visible(el) && el.matches('button,a[href],input:not([type=hidden]),textarea,select,summary,[contenteditable=true],[role=button],[role=link],[role=textbox],[role=checkbox],[role=radio],[role=combobox],[role=menuitem],[role=tab],[role=switch],[role=slider]'));
54
+ const elements = candidates.slice(0, 500).map(el => {
55
+ const tag = el.tagName.toLowerCase();
56
+ const input = el;
57
+ const type = el.getAttribute('type') ?? '';
58
+ const implicit = tag === 'button' || ['submit', 'button', 'reset'].includes(type) ? 'button'
59
+ : tag === 'a' ? 'link' : tag === 'select' ? 'combobox'
60
+ : type === 'checkbox' ? 'checkbox' : type === 'radio' ? 'radio'
61
+ : type === 'file' ? 'upload' : type === 'number' ? 'spinbutton' : tag === 'summary' ? 'button' : 'textbox';
62
+ const role = el.getAttribute('role') ?? implicit;
63
+ const labelled = (el.getAttribute('aria-labelledby') ?? '').split(/\s+/).map(id => el.getRootNode() instanceof Document ? document.getElementById(id)?.textContent : el.getRootNode().getElementById(id)?.textContent).join(' ');
64
+ const label = clean(el.getAttribute('aria-label') || labelled || (input.labels ? [...input.labels].map(l => l.textContent).join(' ') : ''));
65
+ const name = label || clean(['input', 'textarea', 'select'].includes(tag) ? el.getAttribute('placeholder') || el.getAttribute('name') || (['submit', 'button'].includes(type) ? input.value : '') : el.textContent);
66
+ let ref = registry.refs.get(el);
67
+ if (!ref) {
68
+ ref = `f${index}d${registry.documentId}e${registry.next++}`;
69
+ registry.refs.set(el, ref);
70
+ }
71
+ el.setAttribute('data-fcu-ref', ref);
72
+ const parts = [];
73
+ let parent = el;
74
+ while (parent && parts.length < 9) {
75
+ const siblings = parent.parentElement ? [...parent.parentElement.children].filter(s => s.tagName === parent.tagName) : [];
76
+ parts.unshift(`${parent.tagName.toLowerCase()}${siblings.length > 1 ? `:nth-of-type(${siblings.indexOf(parent) + 1})` : ''}`);
77
+ parent = parent.parentElement;
78
+ }
79
+ const errors = (el.getAttribute('aria-errormessage') || el.getAttribute('aria-describedby') || '').split(/\s+/).map(id => document.getElementById(id)?.textContent).join(' ');
80
+ const form = input.form;
81
+ const section = el.closest('form,dialog,[role=dialog],nav,main,section');
82
+ return {
83
+ ref, tag, role, name, label: label || undefined, type: type || undefined,
84
+ required: input.required || el.getAttribute('aria-required') === 'true',
85
+ disabled: input.disabled || el.getAttribute('aria-disabled') === 'true',
86
+ hasValue: ['input', 'textarea', 'select'].includes(tag) ? !!input.value : undefined,
87
+ checked: ['checkbox', 'radio'].includes(type) ? input.checked : undefined,
88
+ options: tag === 'select' ? [...el.options].slice(0, 40).map(o => clean(o.text)) : undefined,
89
+ error: clean(errors || (input.validity && !input.validity.valid && input.value ? input.validationMessage : '')) || undefined,
90
+ form: form ? clean(form.getAttribute('aria-label') || form.id || 'form') : undefined,
91
+ frame: index, region: section ? clean(section.getAttribute('aria-label') || section.id || section.tagName.toLowerCase()) : undefined,
92
+ href: tag === 'a' ? el.href : undefined,
93
+ path: parts.join(' > '), selectors: {
94
+ role: role === 'upload' ? undefined : role, name: name || undefined,
95
+ label: label || undefined, placeholder: el.getAttribute('placeholder') || undefined,
96
+ testId: el.getAttribute('data-testid') || undefined,
97
+ id: el.id || undefined, attributeName: el.getAttribute('name') || undefined,
98
+ text: !['input', 'select', 'textarea'].includes(tag) ? clean(el.textContent) || undefined : undefined,
99
+ frame: index,
100
+ },
101
+ };
102
+ });
103
+ const headings = all.filter(el => included(el) && visible(el) && el.matches('h1,h2,h3,[role=heading]')).slice(0, 24).map(el => clean(el.textContent));
104
+ const paragraphs = all.filter(el => included(el) && visible(el) && el.matches('p,li,dt,dd,output,[role=status],[role=alert]')).sort((a, b) => Number(!!b.closest('main,article,[role=main]')) - Number(!!a.closest('main,article,[role=main]'))).slice(0, 100).map(el => clean(el.textContent, 300));
105
+ const tables = all.filter(el => included(el) && visible(el) && el.matches('table')).slice(0, 5).map(table => [...table.querySelectorAll('tr')].filter(visible).slice(0, 25).map(row => [...row.querySelectorAll('th,td')].slice(0, 12).map(cell => clean(cell.textContent))));
106
+ const dialogs = all.filter(el => included(el) && visible(el) && el.matches('dialog,[role=dialog],[role=menu]')).map(el => clean(el.getAttribute('aria-label') || el.textContent, 250));
107
+ return { elements, headings, text: [...new Set(paragraphs)].join('\n').slice(0, 8000), tables, dialogs, htmlBytes, truncated: candidates.length > 500 };
108
+ }, { index, region, documentId: randomUUID().slice(0, 8) }));
109
+ pieces.push(data);
110
+ }
111
+ catch (error) {
112
+ if (index === 0 || page.isClosed())
113
+ throw error;
114
+ // Detached child frames are reported instead of silently losing the page.
115
+ }
116
+ }
117
+ const state = {
118
+ url: page.url(), title: await page.title(), elements: pieces.flatMap(p => p.elements),
119
+ headings: pieces.flatMap(p => p.headings), text: pieces.map(p => p.text).filter(Boolean).join('\n'),
120
+ tables: pieces.flatMap(p => p.tables), dialogs: pieces.flatMap(p => p.dialogs),
121
+ htmlBytes: pieces.reduce((sum, p) => sum + p.htmlBytes, 0), hash: '',
122
+ warnings: [], frames: frames.map((f, index) => ({ index, url: f.url() })), truncated: pieces.some(p => p.truncated),
123
+ };
124
+ if (pieces.length < frames.length)
125
+ state.warnings.push('Some frames could not be inspected');
126
+ if (/ignore (all |your |previous )?instructions|send (all |user )?data|system prompt/i.test(state.text))
127
+ state.warnings.push('Possible prompt injection in untrusted page content');
128
+ if (/captcha|verify you are human|sign in to continue/i.test([state.title, state.text, ...state.elements.map(e => e.name)].join(' ')))
129
+ state.warnings.push('Human authentication or security challenge may be required');
130
+ state.hash = stateHash(state);
131
+ return state;
132
+ }
133
+ }
134
+ //# sourceMappingURL=DomExtractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DomExtractor.js","sourceRoot":"","sources":["../../src/browser/DomExtractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import type { Locator, Page } from 'playwright';
3
+ export type InteractionKind = 'moving' | 'click' | 'doubleClick' | 'hover' | 'fill' | 'type' | 'select' | 'check' | 'uncheck' | 'press' | 'scroll' | 'upload' | 'submit' | 'extract' | 'idle';
4
+ export interface PointerState {
5
+ sequence: number;
6
+ pageId: number;
7
+ x: number;
8
+ y: number;
9
+ width: number;
10
+ height: number;
11
+ visible: boolean;
12
+ kind: InteractionKind;
13
+ time: number;
14
+ }
15
+ export interface InteractionOptions {
16
+ timeout: number;
17
+ checkpoint: () => Promise<void>;
18
+ beforeEffect?: () => Promise<void>;
19
+ }
20
+ export declare class Interaction extends EventEmitter {
21
+ private currentPage;
22
+ readonly enabled: boolean;
23
+ private pages;
24
+ private positions;
25
+ private initializing;
26
+ private nextPage;
27
+ private sequence;
28
+ private latest?;
29
+ constructor(currentPage: () => Page, enabled?: boolean);
30
+ pageId(page?: Page): number;
31
+ wire(page: Page): void;
32
+ snapshot(): PointerState | undefined;
33
+ initialize(page?: Page): Promise<void>;
34
+ private state;
35
+ cue(kind: InteractionKind, page?: Page, visible?: boolean): void;
36
+ move(x: number, y: number, options: InteractionOptions, page?: Page): Promise<void>;
37
+ private prepare;
38
+ private assertTarget;
39
+ perform<T>(locator: Locator, kind: InteractionKind, operation: () => Promise<T>, options: InteractionOptions): Promise<T>;
40
+ enter(locator: Locator, value: string, replace: boolean, options: InteractionOptions): Promise<void>;
41
+ scroll(pixels: number, options: InteractionOptions): Promise<void>;
42
+ manualClick(x: number, y: number, options: InteractionOptions): Promise<void>;
43
+ }