@cereworker/browser 26.324.4 → 26.324.5
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/backend.d.ts +24 -0
- package/dist/backend.d.ts.map +1 -0
- package/dist/backend.js +2 -0
- package/dist/backend.js.map +1 -0
- package/dist/cdp.d.ts +23 -6
- package/dist/cdp.d.ts.map +1 -1
- package/dist/cdp.js +156 -24
- package/dist/cdp.js.map +1 -1
- package/dist/extension-backend.d.ts +22 -0
- package/dist/extension-backend.d.ts.map +1 -0
- package/dist/extension-backend.js +57 -0
- package/dist/extension-backend.js.map +1 -0
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/puppeteer.d.ts +24 -14
- package/dist/puppeteer.d.ts.map +1 -1
- package/dist/puppeteer.js +146 -106
- package/dist/puppeteer.js.map +1 -1
- package/dist/relay.d.ts +32 -0
- package/dist/relay.d.ts.map +1 -0
- package/dist/relay.js +139 -0
- package/dist/relay.js.map +1 -0
- package/dist/tools.d.ts +44 -15
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +100 -95
- package/dist/tools.js.map +1 -1
- package/extension/background.js +339 -0
- package/extension/icons/icon128.png +0 -0
- package/extension/icons/icon16.png +0 -0
- package/extension/icons/icon32.png +0 -0
- package/extension/icons/icon48.png +0 -0
- package/extension/manifest.json +37 -0
- package/extension/options.html +34 -0
- package/extension/options.js +53 -0
- package/package.json +7 -4
package/dist/puppeteer.js
CHANGED
|
@@ -1,122 +1,162 @@
|
|
|
1
1
|
import puppeteer from 'puppeteer';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
return
|
|
2
|
+
export class PuppeteerBackend {
|
|
3
|
+
session = null;
|
|
4
|
+
headless;
|
|
5
|
+
constructor(options) {
|
|
6
|
+
this.headless = options?.headless ?? true;
|
|
7
|
+
}
|
|
8
|
+
async getSession() {
|
|
9
|
+
if (this.session)
|
|
10
|
+
return this.session;
|
|
11
|
+
try {
|
|
12
|
+
const browser = await puppeteer.launch({
|
|
13
|
+
headless: this.headless ? 'shell' : false,
|
|
14
|
+
args: ['--no-sandbox', '--disable-setuid-sandbox'],
|
|
15
|
+
});
|
|
16
|
+
const page = await browser.newPage();
|
|
17
|
+
await page.setViewport({ width: 1280, height: 800 });
|
|
18
|
+
this.session = { browser, page };
|
|
19
|
+
return this.session;
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
23
|
+
throw new Error(`No browser available (${msg}). ` +
|
|
24
|
+
'Use httpFetch/shell tools for API calls, or install Chrome for browser automation.');
|
|
20
25
|
}
|
|
21
|
-
return await launchBrowser();
|
|
22
26
|
}
|
|
23
|
-
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
'or use httpFetch/shell tools instead of browser automation.');
|
|
27
|
+
async navigate(url) {
|
|
28
|
+
const s = await this.getSession();
|
|
29
|
+
await s.page.goto(url, { waitUntil: 'networkidle2', timeout: 30000 });
|
|
30
|
+
return `Navigated to ${s.page.url()} - Title: ${await s.page.title()}`;
|
|
28
31
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
headless: headless ? 'shell' : false,
|
|
35
|
-
args: ['--no-sandbox', '--disable-setuid-sandbox'],
|
|
36
|
-
});
|
|
37
|
-
const page = await browser.newPage();
|
|
38
|
-
await page.setViewport({ width: 1280, height: 800 });
|
|
39
|
-
session = { browser, page };
|
|
40
|
-
return session;
|
|
41
|
-
}
|
|
42
|
-
export async function closeBrowser() {
|
|
43
|
-
if (mode === 'connect') {
|
|
44
|
-
await disconnectCdp();
|
|
45
|
-
return;
|
|
32
|
+
async getPageText() {
|
|
33
|
+
const s = await this.getSession();
|
|
34
|
+
const text = await s.page.evaluate(() => document.body.innerText);
|
|
35
|
+
const maxLen = 10000;
|
|
36
|
+
return text.length > maxLen ? text.slice(0, maxLen) + '\n... (truncated)' : text;
|
|
46
37
|
}
|
|
47
|
-
|
|
48
|
-
await
|
|
49
|
-
|
|
38
|
+
async screenshot(path) {
|
|
39
|
+
const s = await this.getSession();
|
|
40
|
+
const filePath = path ?? `/tmp/cereworker-screenshot-${Date.now()}.png`;
|
|
41
|
+
await s.page.screenshot({ path: filePath, fullPage: false });
|
|
42
|
+
return `Screenshot saved to ${filePath}`;
|
|
50
43
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
return `Navigated to ${s.page.url()} - Title: ${await s.page.title()}`;
|
|
61
|
-
}
|
|
62
|
-
export async function getPageText() {
|
|
63
|
-
const s = await getOrCreateSession();
|
|
64
|
-
const text = await s.page.evaluate(() => document.body.innerText);
|
|
65
|
-
// Truncate to avoid massive output
|
|
66
|
-
const maxLen = 10000;
|
|
67
|
-
if (text.length > maxLen) {
|
|
68
|
-
return text.slice(0, maxLen) + '\n... (truncated)';
|
|
69
|
-
}
|
|
70
|
-
return text;
|
|
71
|
-
}
|
|
72
|
-
export async function screenshot(path) {
|
|
73
|
-
const s = await getOrCreateSession();
|
|
74
|
-
const filePath = path ?? `/tmp/cereworker-screenshot-${Date.now()}.png`;
|
|
75
|
-
await s.page.screenshot({ path: filePath, fullPage: false });
|
|
76
|
-
return `Screenshot saved to ${filePath}`;
|
|
77
|
-
}
|
|
78
|
-
export async function clickElement(selector) {
|
|
79
|
-
const s = await getOrCreateSession();
|
|
80
|
-
try {
|
|
81
|
-
await s.page.click(selector);
|
|
82
|
-
return `Clicked: ${selector}`;
|
|
44
|
+
async click(selector) {
|
|
45
|
+
const s = await this.getSession();
|
|
46
|
+
try {
|
|
47
|
+
await s.page.click(selector);
|
|
48
|
+
return `Clicked: ${selector}`;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return `Element not found: ${selector}`;
|
|
52
|
+
}
|
|
83
53
|
}
|
|
84
|
-
|
|
85
|
-
|
|
54
|
+
async type(selector, text) {
|
|
55
|
+
const s = await this.getSession();
|
|
56
|
+
try {
|
|
57
|
+
await s.page.type(selector, text);
|
|
58
|
+
return `Typed into: ${selector}`;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return `Element not found: ${selector}`;
|
|
62
|
+
}
|
|
86
63
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
64
|
+
async evaluate(code) {
|
|
65
|
+
const s = await this.getSession();
|
|
66
|
+
try {
|
|
67
|
+
const result = await s.page.evaluate(code);
|
|
68
|
+
return String(result ?? '(no result)');
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
return `Error: ${err instanceof Error ? err.message : String(err)}`;
|
|
72
|
+
}
|
|
93
73
|
}
|
|
94
|
-
|
|
95
|
-
|
|
74
|
+
async waitForSelector(selector, timeoutMs = 5000) {
|
|
75
|
+
const s = await this.getSession();
|
|
76
|
+
try {
|
|
77
|
+
await s.page.waitForSelector(selector, { timeout: timeoutMs });
|
|
78
|
+
return `Found: ${selector}`;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return `Timeout waiting for: ${selector}`;
|
|
82
|
+
}
|
|
96
83
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
try {
|
|
101
|
-
const result = await s.page.evaluate(code);
|
|
102
|
-
return String(result ?? '(no result)');
|
|
84
|
+
async getPageUrl() {
|
|
85
|
+
const s = await this.getSession();
|
|
86
|
+
return s.page.url();
|
|
103
87
|
}
|
|
104
|
-
|
|
105
|
-
|
|
88
|
+
async listTabs() {
|
|
89
|
+
const s = await this.getSession();
|
|
90
|
+
const pages = await s.browser.pages();
|
|
91
|
+
return pages.map((p, i) => ({
|
|
92
|
+
id: String(i),
|
|
93
|
+
title: '', // title() is async, keep lightweight
|
|
94
|
+
url: p.url(),
|
|
95
|
+
active: p === s.page,
|
|
96
|
+
}));
|
|
106
97
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
98
|
+
async switchTab(tabId) {
|
|
99
|
+
const s = await this.getSession();
|
|
100
|
+
const pages = await s.browser.pages();
|
|
101
|
+
const idx = parseInt(tabId, 10);
|
|
102
|
+
if (isNaN(idx) || idx < 0 || idx >= pages.length) {
|
|
103
|
+
return `Invalid tab id: ${tabId}. Use browserListTabs to see available tabs.`;
|
|
104
|
+
}
|
|
105
|
+
s.page = pages[idx];
|
|
106
|
+
this.session = s;
|
|
107
|
+
await s.page.bringToFront();
|
|
108
|
+
return `Switched to tab ${idx}: ${s.page.url()}`;
|
|
113
109
|
}
|
|
114
|
-
|
|
115
|
-
|
|
110
|
+
async newTab(url) {
|
|
111
|
+
const s = await this.getSession();
|
|
112
|
+
const page = await s.browser.newPage();
|
|
113
|
+
await page.setViewport({ width: 1280, height: 800 });
|
|
114
|
+
if (url) {
|
|
115
|
+
await page.goto(url, { waitUntil: 'networkidle2', timeout: 30000 });
|
|
116
|
+
}
|
|
117
|
+
s.page = page;
|
|
118
|
+
this.session = s;
|
|
119
|
+
const pages = await s.browser.pages();
|
|
120
|
+
return `Opened new tab (${pages.length} total)${url ? `: ${page.url()}` : ''}`;
|
|
121
|
+
}
|
|
122
|
+
async closeTab(tabId) {
|
|
123
|
+
const s = await this.getSession();
|
|
124
|
+
const pages = await s.browser.pages();
|
|
125
|
+
if (pages.length <= 1)
|
|
126
|
+
return 'Cannot close the last tab.';
|
|
127
|
+
if (tabId !== undefined) {
|
|
128
|
+
const idx = parseInt(tabId, 10);
|
|
129
|
+
if (isNaN(idx) || idx < 0 || idx >= pages.length) {
|
|
130
|
+
return `Invalid tab id: ${tabId}`;
|
|
131
|
+
}
|
|
132
|
+
await pages[idx].close();
|
|
133
|
+
if (pages[idx] === s.page) {
|
|
134
|
+
const remaining = await s.browser.pages();
|
|
135
|
+
s.page = remaining[remaining.length - 1];
|
|
136
|
+
this.session = s;
|
|
137
|
+
}
|
|
138
|
+
return `Closed tab ${idx}`;
|
|
139
|
+
}
|
|
140
|
+
// Close current tab
|
|
141
|
+
const current = s.page;
|
|
142
|
+
await current.close();
|
|
143
|
+
const remaining = await s.browser.pages();
|
|
144
|
+
s.page = remaining[remaining.length - 1];
|
|
145
|
+
this.session = s;
|
|
146
|
+
return `Closed current tab. Now on: ${s.page.url()}`;
|
|
147
|
+
}
|
|
148
|
+
async connect() {
|
|
149
|
+
const s = await this.getSession();
|
|
150
|
+
return `Browser launched (headless: ${this.headless}). Page: ${s.page.url()}`;
|
|
151
|
+
}
|
|
152
|
+
async disconnect() {
|
|
153
|
+
if (this.session) {
|
|
154
|
+
await this.session.browser.close();
|
|
155
|
+
this.session = null;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
isConnected() {
|
|
159
|
+
return this.session !== null && this.session.browser.connected;
|
|
116
160
|
}
|
|
117
|
-
}
|
|
118
|
-
export async function getPageUrl() {
|
|
119
|
-
const s = await getOrCreateSession();
|
|
120
|
-
return s.page.url();
|
|
121
161
|
}
|
|
122
162
|
//# sourceMappingURL=puppeteer.js.map
|
package/dist/puppeteer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"puppeteer.js","sourceRoot":"","sources":["../src/puppeteer.ts"],"names":[],"mappings":"AAAA,OAAO,SAAsC,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"puppeteer.js","sourceRoot":"","sources":["../src/puppeteer.ts"],"names":[],"mappings":"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"}
|
package/dist/relay.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
export interface RelayCommand {
|
|
3
|
+
type: 'command';
|
|
4
|
+
id: string;
|
|
5
|
+
method: string;
|
|
6
|
+
params?: Record<string, unknown>;
|
|
7
|
+
}
|
|
8
|
+
export interface RelayResult {
|
|
9
|
+
type: 'result';
|
|
10
|
+
id: string;
|
|
11
|
+
result?: string;
|
|
12
|
+
error?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface RelayConfig {
|
|
15
|
+
port: number;
|
|
16
|
+
token?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare class BrowserRelay extends EventEmitter {
|
|
19
|
+
private httpServer;
|
|
20
|
+
private wss;
|
|
21
|
+
private extensionWs;
|
|
22
|
+
private pending;
|
|
23
|
+
private commandId;
|
|
24
|
+
private config;
|
|
25
|
+
private pingTimer;
|
|
26
|
+
constructor(config: RelayConfig);
|
|
27
|
+
start(): Promise<void>;
|
|
28
|
+
stop(): Promise<void>;
|
|
29
|
+
isExtensionConnected(): boolean;
|
|
30
|
+
send(method: string, params?: Record<string, unknown>, timeoutMs?: number): Promise<string>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=relay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../src/relay.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAQD,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,WAAW,CAA0B;IAC7C,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,SAAS,CAA+C;gBAEpD,MAAM,EAAE,WAAW;IAKzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyFtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB3B,oBAAoB,IAAI,OAAO;IAIzB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;CAkBlG"}
|
package/dist/relay.js
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { WebSocketServer, WebSocket } from 'ws';
|
|
2
|
+
import { createServer } from 'node:http';
|
|
3
|
+
import { createLogger } from '@cereworker/core';
|
|
4
|
+
import { EventEmitter } from 'node:events';
|
|
5
|
+
const log = createLogger('browser-relay');
|
|
6
|
+
export class BrowserRelay extends EventEmitter {
|
|
7
|
+
httpServer = null;
|
|
8
|
+
wss = null;
|
|
9
|
+
extensionWs = null;
|
|
10
|
+
pending = new Map();
|
|
11
|
+
commandId = 0;
|
|
12
|
+
config;
|
|
13
|
+
pingTimer = null;
|
|
14
|
+
constructor(config) {
|
|
15
|
+
super();
|
|
16
|
+
this.config = config;
|
|
17
|
+
}
|
|
18
|
+
async start() {
|
|
19
|
+
this.httpServer = createServer((_req, res) => {
|
|
20
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
21
|
+
res.end(JSON.stringify({ connected: this.isExtensionConnected() }));
|
|
22
|
+
});
|
|
23
|
+
this.wss = new WebSocketServer({ server: this.httpServer });
|
|
24
|
+
this.wss.on('connection', (ws, req) => {
|
|
25
|
+
const url = new URL(req.url ?? '/', `http://localhost:${this.config.port}`);
|
|
26
|
+
// Validate path
|
|
27
|
+
if (url.pathname !== '/extension') {
|
|
28
|
+
ws.close(4001, 'Invalid path');
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// Validate token
|
|
32
|
+
if (this.config.token) {
|
|
33
|
+
const token = url.searchParams.get('token');
|
|
34
|
+
if (token !== this.config.token) {
|
|
35
|
+
ws.close(4003, 'Invalid token');
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Only allow one extension connection
|
|
40
|
+
if (this.extensionWs) {
|
|
41
|
+
this.extensionWs.close(4002, 'Replaced by new connection');
|
|
42
|
+
}
|
|
43
|
+
this.extensionWs = ws;
|
|
44
|
+
log.info('Extension connected');
|
|
45
|
+
this.emit('extension:connected');
|
|
46
|
+
ws.on('message', (data) => {
|
|
47
|
+
try {
|
|
48
|
+
const msg = JSON.parse(data.toString());
|
|
49
|
+
if (msg.type === 'result' && msg.id) {
|
|
50
|
+
const pending = this.pending.get(msg.id);
|
|
51
|
+
if (pending) {
|
|
52
|
+
this.pending.delete(msg.id);
|
|
53
|
+
clearTimeout(pending.timer);
|
|
54
|
+
if (msg.error) {
|
|
55
|
+
pending.reject(new Error(msg.error));
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
pending.resolve(msg.result ?? '');
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
log.debug('Invalid message from extension');
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
ws.on('close', () => {
|
|
68
|
+
if (this.extensionWs === ws) {
|
|
69
|
+
this.extensionWs = null;
|
|
70
|
+
log.info('Extension disconnected');
|
|
71
|
+
this.emit('extension:disconnected');
|
|
72
|
+
// Reject all pending commands
|
|
73
|
+
for (const [id, pending] of this.pending) {
|
|
74
|
+
clearTimeout(pending.timer);
|
|
75
|
+
pending.reject(new Error('Extension disconnected'));
|
|
76
|
+
this.pending.delete(id);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
ws.on('error', (err) => {
|
|
81
|
+
log.debug('Extension WebSocket error', { error: err.message });
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
// Keepalive ping every 30s
|
|
85
|
+
this.pingTimer = setInterval(() => {
|
|
86
|
+
if (this.extensionWs?.readyState === WebSocket.OPEN) {
|
|
87
|
+
this.extensionWs.ping();
|
|
88
|
+
}
|
|
89
|
+
}, 30_000);
|
|
90
|
+
await new Promise((resolve) => {
|
|
91
|
+
this.httpServer.listen(this.config.port, '127.0.0.1', () => {
|
|
92
|
+
log.info('Relay server listening', { port: this.config.port });
|
|
93
|
+
resolve();
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
async stop() {
|
|
98
|
+
if (this.pingTimer) {
|
|
99
|
+
clearInterval(this.pingTimer);
|
|
100
|
+
this.pingTimer = null;
|
|
101
|
+
}
|
|
102
|
+
if (this.extensionWs) {
|
|
103
|
+
this.extensionWs.close();
|
|
104
|
+
this.extensionWs = null;
|
|
105
|
+
}
|
|
106
|
+
for (const [id, pending] of this.pending) {
|
|
107
|
+
clearTimeout(pending.timer);
|
|
108
|
+
pending.reject(new Error('Relay stopped'));
|
|
109
|
+
this.pending.delete(id);
|
|
110
|
+
}
|
|
111
|
+
if (this.wss) {
|
|
112
|
+
this.wss.close();
|
|
113
|
+
this.wss = null;
|
|
114
|
+
}
|
|
115
|
+
if (this.httpServer) {
|
|
116
|
+
await new Promise((resolve) => this.httpServer.close(() => resolve()));
|
|
117
|
+
this.httpServer = null;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
isExtensionConnected() {
|
|
121
|
+
return this.extensionWs?.readyState === WebSocket.OPEN;
|
|
122
|
+
}
|
|
123
|
+
async send(method, params, timeoutMs = 30_000) {
|
|
124
|
+
if (!this.extensionWs || this.extensionWs.readyState !== WebSocket.OPEN) {
|
|
125
|
+
throw new Error('Extension not connected. Load the CereWorker extension in Chrome and check the connection.');
|
|
126
|
+
}
|
|
127
|
+
const id = String(++this.commandId);
|
|
128
|
+
const command = { type: 'command', id, method, params };
|
|
129
|
+
return new Promise((resolve, reject) => {
|
|
130
|
+
const timer = setTimeout(() => {
|
|
131
|
+
this.pending.delete(id);
|
|
132
|
+
reject(new Error(`Command ${method} timed out after ${timeoutMs}ms`));
|
|
133
|
+
}, timeoutMs);
|
|
134
|
+
this.pending.set(id, { resolve, reject, timer });
|
|
135
|
+
this.extensionWs.send(JSON.stringify(command));
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=relay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay.js","sourceRoot":"","sources":["../src/relay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAChD,OAAO,EAAE,YAAY,EAAe,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,GAAG,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;AA2B1C,MAAM,OAAO,YAAa,SAAQ,YAAY;IACpC,UAAU,GAAkB,IAAI,CAAC;IACjC,GAAG,GAA2B,IAAI,CAAC;IACnC,WAAW,GAAqB,IAAI,CAAC;IACrC,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC5C,SAAS,GAAG,CAAC,CAAC;IACd,MAAM,CAAc;IACpB,SAAS,GAA0C,IAAI,CAAC;IAEhE,YAAY,MAAmB;QAC7B,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,UAAU,GAAG,YAAY,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;YAC3C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,GAAG,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAE5D,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE;YACpC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,oBAAoB,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YAE5E,gBAAgB;YAChB,IAAI,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;gBAClC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;gBAC/B,OAAO;YACT,CAAC;YAED,iBAAiB;YACjB,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACtB,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC5C,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBAChC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;oBAChC,OAAO;gBACT,CAAC;YACH,CAAC;YAED,sCAAsC;YACtC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,4BAA4B,CAAC,CAAC;YAC7D,CAAC;YAED,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;YACtB,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAEjC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;gBACxB,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAgB,CAAC;oBACvD,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;wBACpC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBACzC,IAAI,OAAO,EAAE,CAAC;4BACZ,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;4BAC5B,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;4BAC5B,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gCACd,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;4BACvC,CAAC;iCAAM,CAAC;gCACN,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;4BACpC,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,GAAG,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;gBAC9C,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBAClB,IAAI,IAAI,CAAC,WAAW,KAAK,EAAE,EAAE,CAAC;oBAC5B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;oBACxB,GAAG,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;oBACnC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;oBACpC,8BAA8B;oBAC9B,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;wBACzC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;wBAC5B,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;wBACpD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBAC1B,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACrB,GAAG,CAAC,KAAK,CAAC,2BAA2B,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACjE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,2BAA2B;QAC3B,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,IAAI,IAAI,CAAC,WAAW,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;gBACpD,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YAC1B,CAAC;QACH,CAAC,EAAE,MAAM,CAAC,CAAC;QAEX,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,IAAI,CAAC,UAAW,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;gBAC1D,GAAG,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC/D,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;QACD,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACzC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC5B,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;YAC3C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACjB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;QAClB,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,UAAW,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC9E,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;IACH,CAAC;IAED,oBAAoB;QAClB,OAAO,IAAI,CAAC,WAAW,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,MAAgC,EAAE,SAAS,GAAG,MAAM;QAC7E,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACxE,MAAM,IAAI,KAAK,CAAC,4FAA4F,CAAC,CAAC;QAChH,CAAC;QAED,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACpC,MAAM,OAAO,GAAiB,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAEtE,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC7C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACxB,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW,MAAM,oBAAoB,SAAS,IAAI,CAAC,CAAC,CAAC;YACxE,CAAC,EAAE,SAAS,CAAC,CAAC;YAEd,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YACjD,IAAI,CAAC,WAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
package/dist/tools.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
|
|
2
|
+
import type { BrowserBackend } from './backend.js';
|
|
3
|
+
export declare function createBrowserTools(backend: BrowserBackend): {
|
|
3
4
|
browserNavigate: {
|
|
4
5
|
description: string;
|
|
5
6
|
parameters: z.ZodObject<{
|
|
@@ -96,33 +97,61 @@ export declare const browserToolDefinitions: {
|
|
|
96
97
|
parameters: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
|
|
97
98
|
execute: (args: unknown) => Promise<string>;
|
|
98
99
|
};
|
|
99
|
-
|
|
100
|
+
browserListTabs: {
|
|
101
|
+
description: string;
|
|
102
|
+
parameters: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
|
|
103
|
+
execute: (args: unknown) => Promise<string>;
|
|
104
|
+
};
|
|
105
|
+
browserSwitchTab: {
|
|
100
106
|
description: string;
|
|
101
107
|
parameters: z.ZodObject<{
|
|
102
|
-
|
|
103
|
-
wsEndpoint: z.ZodOptional<z.ZodString>;
|
|
108
|
+
tabId: z.ZodString;
|
|
104
109
|
}, "strip", z.ZodTypeAny, {
|
|
105
|
-
|
|
106
|
-
wsEndpoint?: string | undefined;
|
|
110
|
+
tabId: string;
|
|
107
111
|
}, {
|
|
108
|
-
|
|
109
|
-
wsEndpoint?: string | undefined;
|
|
112
|
+
tabId: string;
|
|
110
113
|
}>;
|
|
111
114
|
execute: (args: {
|
|
112
|
-
|
|
113
|
-
wsEndpoint?: string;
|
|
115
|
+
tabId: string;
|
|
114
116
|
}) => Promise<string>;
|
|
115
117
|
};
|
|
116
|
-
|
|
118
|
+
browserNewTab: {
|
|
119
|
+
description: string;
|
|
120
|
+
parameters: z.ZodObject<{
|
|
121
|
+
url: z.ZodOptional<z.ZodString>;
|
|
122
|
+
}, "strip", z.ZodTypeAny, {
|
|
123
|
+
url?: string | undefined;
|
|
124
|
+
}, {
|
|
125
|
+
url?: string | undefined;
|
|
126
|
+
}>;
|
|
127
|
+
execute: (args: {
|
|
128
|
+
url?: string;
|
|
129
|
+
}) => Promise<string>;
|
|
130
|
+
};
|
|
131
|
+
browserCloseTab: {
|
|
132
|
+
description: string;
|
|
133
|
+
parameters: z.ZodObject<{
|
|
134
|
+
tabId: z.ZodOptional<z.ZodString>;
|
|
135
|
+
}, "strip", z.ZodTypeAny, {
|
|
136
|
+
tabId?: string | undefined;
|
|
137
|
+
}, {
|
|
138
|
+
tabId?: string | undefined;
|
|
139
|
+
}>;
|
|
140
|
+
execute: (args: {
|
|
141
|
+
tabId?: string;
|
|
142
|
+
}) => Promise<string>;
|
|
143
|
+
};
|
|
144
|
+
browserConnect: {
|
|
117
145
|
description: string;
|
|
118
146
|
parameters: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
|
|
119
|
-
execute: () => Promise<
|
|
147
|
+
execute: (args: unknown) => Promise<string>;
|
|
120
148
|
};
|
|
121
|
-
|
|
149
|
+
browserDisconnect: {
|
|
122
150
|
description: string;
|
|
123
151
|
parameters: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
|
|
124
|
-
execute: () => Promise<
|
|
152
|
+
execute: (args: unknown) => Promise<string>;
|
|
125
153
|
};
|
|
126
154
|
};
|
|
127
|
-
export type
|
|
155
|
+
export type BrowserTools = ReturnType<typeof createBrowserTools>;
|
|
156
|
+
export type BrowserToolName = keyof BrowserTools;
|
|
128
157
|
//# sourceMappingURL=tools.d.ts.map
|
package/dist/tools.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAYnD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc;;;;;;;;;;;iBAOxB,MAAM;cAjByB,OAAO,CAAC,MAAM,CAAC;;;;;oCAAf,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;mBA6BtC,MAAM;cA7BiB,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;sBAoCnC,MAAM;cApCc,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;sBA4CnC,MAAM;kBAAQ,MAAM;cA5CA,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;kBAmDvC,MAAM;cAnDkB,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;sBA2DnC,MAAM;sBAAY,MAAM;cA3DJ,OAAO,CAAC,MAAM,CAAC;;;;;oCAAf,OAAO,CAAC,MAAM,CAAC;;;;;oCAAf,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;mBAmFtC,MAAM;cAnFiB,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;kBA0FvC,MAAM;cA1FkB,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;oBAiGrC,MAAM;cAjGgB,OAAO,CAAC,MAAM,CAAC;;;;;oCAAf,OAAO,CAAC,MAAM,CAAC;;;;;oCAAf,OAAO,CAAC,MAAM,CAAC;;EAiH/E;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AACjE,MAAM,MAAM,eAAe,GAAG,MAAM,YAAY,CAAC"}
|