tuna-agent 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/actions/download.d.ts +16 -0
- package/dist/browser/actions/download.js +39 -0
- package/dist/browser/actions/emulation.d.ts +53 -0
- package/dist/browser/actions/emulation.js +103 -0
- package/dist/browser/actions/evaluate.d.ts +29 -0
- package/dist/browser/actions/evaluate.js +92 -0
- package/dist/browser/actions/interaction.d.ts +79 -0
- package/dist/browser/actions/interaction.js +210 -0
- package/dist/browser/actions/keyboard.d.ts +6 -0
- package/dist/browser/actions/keyboard.js +9 -0
- package/dist/browser/actions/navigation.d.ts +40 -0
- package/dist/browser/actions/navigation.js +92 -0
- package/dist/browser/actions/wait.d.ts +12 -0
- package/dist/browser/actions/wait.js +33 -0
- package/dist/browser/browser.d.ts +722 -0
- package/dist/browser/browser.js +1066 -0
- package/dist/browser/capture/activity.d.ts +22 -0
- package/dist/browser/capture/activity.js +39 -0
- package/dist/browser/capture/pdf.d.ts +6 -0
- package/dist/browser/capture/pdf.js +6 -0
- package/dist/browser/capture/response.d.ts +8 -0
- package/dist/browser/capture/response.js +28 -0
- package/dist/browser/capture/screenshot.d.ts +30 -0
- package/dist/browser/capture/screenshot.js +72 -0
- package/dist/browser/capture/trace.d.ts +13 -0
- package/dist/browser/capture/trace.js +19 -0
- package/dist/browser/chrome-launcher.d.ts +8 -0
- package/dist/browser/chrome-launcher.js +543 -0
- package/dist/browser/connection.d.ts +42 -0
- package/dist/browser/connection.js +359 -0
- package/dist/browser/index.d.ts +6 -0
- package/dist/browser/index.js +3 -0
- package/dist/browser/security.d.ts +51 -0
- package/dist/browser/security.js +357 -0
- package/dist/browser/snapshot/ai-snapshot.d.ts +12 -0
- package/dist/browser/snapshot/ai-snapshot.js +47 -0
- package/dist/browser/snapshot/aria-snapshot.d.ts +26 -0
- package/dist/browser/snapshot/aria-snapshot.js +121 -0
- package/dist/browser/snapshot/ref-map.d.ts +31 -0
- package/dist/browser/snapshot/ref-map.js +250 -0
- package/dist/browser/storage/index.d.ts +36 -0
- package/dist/browser/storage/index.js +65 -0
- package/dist/browser/types.d.ts +429 -0
- package/dist/browser/types.js +2 -0
- package/dist/daemon/extension-handlers.d.ts +63 -0
- package/dist/daemon/extension-handlers.js +630 -0
- package/dist/daemon/index.js +78 -19
- package/dist/daemon/ws-client.d.ts +16 -0
- package/dist/daemon/ws-client.js +45 -0
- package/dist/mcp/browser-server.d.ts +11 -0
- package/dist/mcp/browser-server.js +467 -0
- package/dist/mcp/knowledge-server.js +43 -18
- package/dist/mcp/setup.js +10 -0
- package/dist/utils/claude-cli.js +18 -9
- package/package.json +2 -1
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { connectBrowser, getPageForTargetId, ensurePageState, pageTargetId, findPageByTargetId, getAllPages, normalizeTimeoutMs } from '../connection.js';
|
|
2
|
+
import { assertBrowserNavigationAllowed } from '../security.js';
|
|
3
|
+
export async function navigateViaPlaywright(opts) {
|
|
4
|
+
const url = String(opts.url ?? '').trim();
|
|
5
|
+
if (!url)
|
|
6
|
+
throw new Error('url is required');
|
|
7
|
+
const policy = opts.allowInternal ? { ...opts.ssrfPolicy, dangerouslyAllowPrivateNetwork: true } : opts.ssrfPolicy;
|
|
8
|
+
await assertBrowserNavigationAllowed({ url, ssrfPolicy: policy });
|
|
9
|
+
const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });
|
|
10
|
+
ensurePageState(page);
|
|
11
|
+
await page.goto(url, { timeout: normalizeTimeoutMs(opts.timeoutMs, 30000), waitUntil: 'domcontentloaded' });
|
|
12
|
+
return { url: page.url() };
|
|
13
|
+
}
|
|
14
|
+
export async function listPagesViaPlaywright(opts) {
|
|
15
|
+
const { browser } = await connectBrowser(opts.cdpUrl);
|
|
16
|
+
const pages = await getAllPages(browser);
|
|
17
|
+
const results = [];
|
|
18
|
+
for (const page of pages) {
|
|
19
|
+
const tid = await pageTargetId(page).catch(() => null);
|
|
20
|
+
if (tid)
|
|
21
|
+
results.push({
|
|
22
|
+
targetId: tid,
|
|
23
|
+
title: await page.title().catch(() => ''),
|
|
24
|
+
url: page.url(),
|
|
25
|
+
type: 'page',
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
return results;
|
|
29
|
+
}
|
|
30
|
+
export async function createPageViaPlaywright(opts) {
|
|
31
|
+
const targetUrl = (opts.url ?? '').trim() || 'about:blank';
|
|
32
|
+
if (targetUrl !== 'about:blank') {
|
|
33
|
+
const policy = opts.allowInternal ? { ...opts.ssrfPolicy, dangerouslyAllowPrivateNetwork: true } : opts.ssrfPolicy;
|
|
34
|
+
await assertBrowserNavigationAllowed({ url: targetUrl, ssrfPolicy: policy });
|
|
35
|
+
}
|
|
36
|
+
const { browser } = await connectBrowser(opts.cdpUrl);
|
|
37
|
+
const context = browser.contexts()[0] ?? await browser.newContext();
|
|
38
|
+
const page = await context.newPage();
|
|
39
|
+
ensurePageState(page);
|
|
40
|
+
if (targetUrl !== 'about:blank') {
|
|
41
|
+
await page.goto(targetUrl, { timeout: normalizeTimeoutMs(undefined, 30000), waitUntil: 'domcontentloaded' });
|
|
42
|
+
}
|
|
43
|
+
const tid = await pageTargetId(page).catch(() => null);
|
|
44
|
+
if (!tid)
|
|
45
|
+
throw new Error('Failed to get targetId for new page');
|
|
46
|
+
return {
|
|
47
|
+
targetId: tid,
|
|
48
|
+
title: await page.title().catch(() => ''),
|
|
49
|
+
url: page.url(),
|
|
50
|
+
type: 'page',
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export async function closePageViaPlaywright(opts) {
|
|
54
|
+
const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });
|
|
55
|
+
await page.close();
|
|
56
|
+
}
|
|
57
|
+
export async function closePageByTargetIdViaPlaywright(opts) {
|
|
58
|
+
const { browser } = await connectBrowser(opts.cdpUrl);
|
|
59
|
+
const page = await findPageByTargetId(browser, opts.targetId, opts.cdpUrl);
|
|
60
|
+
if (!page)
|
|
61
|
+
throw new Error(`Tab not found (targetId: ${opts.targetId}). Use browser.tabs() to list open tabs.`);
|
|
62
|
+
await page.close();
|
|
63
|
+
}
|
|
64
|
+
export async function focusPageByTargetIdViaPlaywright(opts) {
|
|
65
|
+
const { browser } = await connectBrowser(opts.cdpUrl);
|
|
66
|
+
const page = await findPageByTargetId(browser, opts.targetId, opts.cdpUrl);
|
|
67
|
+
if (!page)
|
|
68
|
+
throw new Error(`Tab not found (targetId: ${opts.targetId}). Use browser.tabs() to list open tabs.`);
|
|
69
|
+
try {
|
|
70
|
+
await page.bringToFront();
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
const session = await page.context().newCDPSession(page);
|
|
74
|
+
try {
|
|
75
|
+
await session.send('Page.bringToFront');
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
throw err;
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
await session.detach().catch(() => { });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
export async function resizeViewportViaPlaywright(opts) {
|
|
86
|
+
const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });
|
|
87
|
+
ensurePageState(page);
|
|
88
|
+
await page.setViewportSize({
|
|
89
|
+
width: Math.max(1, Math.floor(opts.width)),
|
|
90
|
+
height: Math.max(1, Math.floor(opts.height)),
|
|
91
|
+
});
|
|
92
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function waitForViaPlaywright(opts: {
|
|
2
|
+
cdpUrl: string;
|
|
3
|
+
targetId?: string;
|
|
4
|
+
timeMs?: number;
|
|
5
|
+
text?: string;
|
|
6
|
+
textGone?: string;
|
|
7
|
+
selector?: string;
|
|
8
|
+
url?: string;
|
|
9
|
+
loadState?: 'load' | 'domcontentloaded' | 'networkidle';
|
|
10
|
+
fn?: string;
|
|
11
|
+
timeoutMs?: number;
|
|
12
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { getPageForTargetId, ensurePageState, normalizeTimeoutMs } from '../connection.js';
|
|
2
|
+
export async function waitForViaPlaywright(opts) {
|
|
3
|
+
const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });
|
|
4
|
+
ensurePageState(page);
|
|
5
|
+
const timeout = normalizeTimeoutMs(opts.timeoutMs, 20000);
|
|
6
|
+
if (typeof opts.timeMs === 'number' && Number.isFinite(opts.timeMs)) {
|
|
7
|
+
await page.waitForTimeout(Math.max(0, opts.timeMs));
|
|
8
|
+
}
|
|
9
|
+
if (opts.text) {
|
|
10
|
+
await page.getByText(opts.text).first().waitFor({ state: 'visible', timeout });
|
|
11
|
+
}
|
|
12
|
+
if (opts.textGone) {
|
|
13
|
+
await page.getByText(opts.textGone).first().waitFor({ state: 'hidden', timeout });
|
|
14
|
+
}
|
|
15
|
+
if (opts.selector) {
|
|
16
|
+
const selector = String(opts.selector).trim();
|
|
17
|
+
if (selector)
|
|
18
|
+
await page.locator(selector).first().waitFor({ state: 'visible', timeout });
|
|
19
|
+
}
|
|
20
|
+
if (opts.url) {
|
|
21
|
+
const url = String(opts.url).trim();
|
|
22
|
+
if (url)
|
|
23
|
+
await page.waitForURL(url, { timeout });
|
|
24
|
+
}
|
|
25
|
+
if (opts.loadState) {
|
|
26
|
+
await page.waitForLoadState(opts.loadState, { timeout });
|
|
27
|
+
}
|
|
28
|
+
if (opts.fn) {
|
|
29
|
+
const fn = String(opts.fn).trim();
|
|
30
|
+
if (fn)
|
|
31
|
+
await page.waitForFunction(fn, undefined, { timeout });
|
|
32
|
+
}
|
|
33
|
+
}
|