@cereworker/browser 26.324.3 → 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 +149 -101
- 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 +46 -17
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +109 -94
- 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,114 +1,162 @@
|
|
|
1
1
|
import puppeteer from 'puppeteer';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
mode = m;
|
|
8
|
-
cdpOptions = options ?? {};
|
|
9
|
-
}
|
|
10
|
-
export function getMode() {
|
|
11
|
-
return mode;
|
|
12
|
-
}
|
|
13
|
-
async function getOrCreateSession() {
|
|
14
|
-
if (mode === 'connect') {
|
|
15
|
-
const existing = getCdpSession();
|
|
16
|
-
if (existing)
|
|
17
|
-
return existing;
|
|
18
|
-
return connectCdp(cdpOptions);
|
|
19
|
-
}
|
|
20
|
-
return launchBrowser();
|
|
21
|
-
}
|
|
22
|
-
export async function launchBrowser(headless = true) {
|
|
23
|
-
if (session)
|
|
24
|
-
return session;
|
|
25
|
-
const browser = await puppeteer.launch({
|
|
26
|
-
headless: headless ? 'shell' : false,
|
|
27
|
-
args: ['--no-sandbox', '--disable-setuid-sandbox'],
|
|
28
|
-
});
|
|
29
|
-
const page = await browser.newPage();
|
|
30
|
-
await page.setViewport({ width: 1280, height: 800 });
|
|
31
|
-
session = { browser, page };
|
|
32
|
-
return session;
|
|
33
|
-
}
|
|
34
|
-
export async function closeBrowser() {
|
|
35
|
-
if (mode === 'connect') {
|
|
36
|
-
await disconnectCdp();
|
|
37
|
-
return;
|
|
2
|
+
export class PuppeteerBackend {
|
|
3
|
+
session = null;
|
|
4
|
+
headless;
|
|
5
|
+
constructor(options) {
|
|
6
|
+
this.headless = options?.headless ?? true;
|
|
38
7
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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.');
|
|
25
|
+
}
|
|
42
26
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
return
|
|
47
|
-
return session;
|
|
48
|
-
}
|
|
49
|
-
export async function navigateTo(url) {
|
|
50
|
-
const s = await getOrCreateSession();
|
|
51
|
-
await s.page.goto(url, { waitUntil: 'networkidle2', timeout: 30000 });
|
|
52
|
-
return `Navigated to ${s.page.url()} - Title: ${await s.page.title()}`;
|
|
53
|
-
}
|
|
54
|
-
export async function getPageText() {
|
|
55
|
-
const s = await getOrCreateSession();
|
|
56
|
-
const text = await s.page.evaluate(() => document.body.innerText);
|
|
57
|
-
// Truncate to avoid massive output
|
|
58
|
-
const maxLen = 10000;
|
|
59
|
-
if (text.length > maxLen) {
|
|
60
|
-
return text.slice(0, maxLen) + '\n... (truncated)';
|
|
61
|
-
}
|
|
62
|
-
return text;
|
|
63
|
-
}
|
|
64
|
-
export async function screenshot(path) {
|
|
65
|
-
const s = await getOrCreateSession();
|
|
66
|
-
const filePath = path ?? `/tmp/cereworker-screenshot-${Date.now()}.png`;
|
|
67
|
-
await s.page.screenshot({ path: filePath, fullPage: false });
|
|
68
|
-
return `Screenshot saved to ${filePath}`;
|
|
69
|
-
}
|
|
70
|
-
export async function clickElement(selector) {
|
|
71
|
-
const s = await getOrCreateSession();
|
|
72
|
-
try {
|
|
73
|
-
await s.page.click(selector);
|
|
74
|
-
return `Clicked: ${selector}`;
|
|
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()}`;
|
|
75
31
|
}
|
|
76
|
-
|
|
77
|
-
|
|
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;
|
|
78
37
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
return `Typed into: ${selector}`;
|
|
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}`;
|
|
85
43
|
}
|
|
86
|
-
|
|
87
|
-
|
|
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
|
+
}
|
|
88
53
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
+
}
|
|
95
63
|
}
|
|
96
|
-
|
|
97
|
-
|
|
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
|
+
}
|
|
98
73
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
+
}
|
|
105
83
|
}
|
|
106
|
-
|
|
107
|
-
|
|
84
|
+
async getPageUrl() {
|
|
85
|
+
const s = await this.getSession();
|
|
86
|
+
return s.page.url();
|
|
87
|
+
}
|
|
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
|
+
}));
|
|
97
|
+
}
|
|
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()}`;
|
|
109
|
+
}
|
|
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;
|
|
108
160
|
}
|
|
109
|
-
}
|
|
110
|
-
export async function getPageUrl() {
|
|
111
|
-
const s = await getOrCreateSession();
|
|
112
|
-
return s.page.url();
|
|
113
161
|
}
|
|
114
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":"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"}
|
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<{
|
|
@@ -16,7 +17,7 @@ export declare const browserToolDefinitions: {
|
|
|
16
17
|
browserGetText: {
|
|
17
18
|
description: string;
|
|
18
19
|
parameters: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
|
|
19
|
-
execute: () => Promise<string>;
|
|
20
|
+
execute: (args: unknown) => Promise<string>;
|
|
20
21
|
};
|
|
21
22
|
browserScreenshot: {
|
|
22
23
|
description: string;
|
|
@@ -94,35 +95,63 @@ export declare const browserToolDefinitions: {
|
|
|
94
95
|
browserGetUrl: {
|
|
95
96
|
description: string;
|
|
96
97
|
parameters: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
|
|
97
|
-
execute: () => Promise<string>;
|
|
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"}
|