@cereworker/browser 26.324.4 → 26.324.6

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/puppeteer.js CHANGED
@@ -1,122 +1,162 @@
1
1
  import puppeteer from 'puppeteer';
2
- import { connectCdp, disconnectCdp, getCdpSession } from './cdp.js';
3
- let session = null;
4
- let mode = 'launch';
5
- let cdpOptions = {};
6
- export function setMode(m, options) {
7
- mode = m;
8
- cdpOptions = options ?? {};
9
- }
10
- export function getMode() {
11
- return mode;
12
- }
13
- async function getOrCreateSession() {
14
- try {
15
- if (mode === 'connect') {
16
- const existing = getCdpSession();
17
- if (existing)
18
- return existing;
19
- return await connectCdp(cdpOptions);
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
- catch (err) {
24
- const msg = err instanceof Error ? err.message : String(err);
25
- throw new Error(`No browser available (${msg}). ` +
26
- 'Either launch Chrome with --remote-debugging-port and use browserConnect, ' +
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
- export async function launchBrowser(headless = true) {
31
- if (session)
32
- return session;
33
- const browser = await puppeteer.launch({
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
- if (session) {
48
- await session.browser.close();
49
- session = null;
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
- export function getSession() {
53
- if (mode === 'connect')
54
- return getCdpSession();
55
- return session;
56
- }
57
- export async function navigateTo(url) {
58
- const s = await getOrCreateSession();
59
- await s.page.goto(url, { waitUntil: 'networkidle2', timeout: 30000 });
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
- catch {
85
- return `Element not found: ${selector}`;
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
- export async function typeText(selector, text) {
89
- const s = await getOrCreateSession();
90
- try {
91
- await s.page.type(selector, text);
92
- return `Typed into: ${selector}`;
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
- catch {
95
- return `Element not found: ${selector}`;
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
- export async function evaluateJs(code) {
99
- const s = await getOrCreateSession();
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
- catch (err) {
105
- return `Error: ${err instanceof Error ? err.message : String(err)}`;
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
- export async function waitForSelector(selector, timeoutMs = 5000) {
109
- const s = await getOrCreateSession();
110
- try {
111
- await s.page.waitForSelector(selector, { timeout: timeoutMs });
112
- return `Found: ${selector}`;
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
- catch {
115
- return `Timeout waiting for: ${selector}`;
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
@@ -1 +1 @@
1
- {"version":3,"file":"puppeteer.js","sourceRoot":"","sources":["../src/puppeteer.ts"],"names":[],"mappings":"AAAA,OAAO,SAAsC,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAA6B,MAAM,UAAU,CAAC;AAO/F,IAAI,OAAO,GAA0B,IAAI,CAAC;AAC1C,IAAI,IAAI,GAAyB,QAAQ,CAAC;AAC1C,IAAI,UAAU,GAAyB,EAAE,CAAC;AAE1C,MAAM,UAAU,OAAO,CAAC,CAAuB,EAAE,OAA8B;IAC7E,IAAI,GAAG,CAAC,CAAC;IACT,UAAU,GAAG,OAAO,IAAI,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,kBAAkB;IAC/B,IAAI,CAAC;QACH,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAC;YACjC,IAAI,QAAQ;gBAAE,OAAO,QAAQ,CAAC;YAC9B,OAAO,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,MAAM,aAAa,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,MAAM,IAAI,KAAK,CACb,yBAAyB,GAAG,KAAK;YACjC,4EAA4E;YAC5E,6DAA6D,CAC9D,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAQ,GAAG,IAAI;IACjD,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAE5B,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC;QACrC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;QACpC,IAAI,EAAE,CAAC,cAAc,EAAE,0BAA0B,CAAC;KACnD,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACrC,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAErD,OAAO,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC5B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,aAAa,EAAE,CAAC;QACtB,OAAO;IACT,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC9B,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,aAAa,EAAE,CAAC;IAC/C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW;IAC1C,MAAM,CAAC,GAAG,MAAM,kBAAkB,EAAE,CAAC;IACrC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IACtE,OAAO,gBAAgB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;AACzE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,CAAC,GAAG,MAAM,kBAAkB,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClE,mCAAmC;IACnC,MAAM,MAAM,GAAG,KAAK,CAAC;IACrB,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,mBAAmB,CAAC;IACrD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAa;IAC5C,MAAM,CAAC,GAAG,MAAM,kBAAkB,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,IAAI,IAAI,8BAA8B,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;IACxE,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,OAAO,uBAAuB,QAAQ,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,MAAM,CAAC,GAAG,MAAM,kBAAkB,EAAE,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,YAAY,QAAQ,EAAE,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,sBAAsB,QAAQ,EAAE,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgB,EAAE,IAAY;IAC3D,MAAM,CAAC,GAAG,MAAM,kBAAkB,EAAE,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAClC,OAAO,eAAe,QAAQ,EAAE,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,sBAAsB,QAAQ,EAAE,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,MAAM,CAAC,GAAG,MAAM,kBAAkB,EAAE,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC3C,OAAO,MAAM,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IACtE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,SAAS,GAAG,IAAI;IACtE,MAAM,CAAC,GAAG,MAAM,kBAAkB,EAAE,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/D,OAAO,UAAU,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,wBAAwB,QAAQ,EAAE,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,CAAC,GAAG,MAAM,kBAAkB,EAAE,CAAC;IACrC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;AACtB,CAAC"}
1
+ {"version":3,"file":"puppeteer.js","sourceRoot":"","sources":["../src/puppeteer.ts"],"names":[],"mappings":"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"}
@@ -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
- export declare const browserToolDefinitions: {
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
- browserConnect: {
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
- port: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
103
- wsEndpoint: z.ZodOptional<z.ZodString>;
108
+ tabId: z.ZodString;
104
109
  }, "strip", z.ZodTypeAny, {
105
- port: number;
106
- wsEndpoint?: string | undefined;
110
+ tabId: string;
107
111
  }, {
108
- port?: number | undefined;
109
- wsEndpoint?: string | undefined;
112
+ tabId: string;
110
113
  }>;
111
114
  execute: (args: {
112
- port?: number;
113
- wsEndpoint?: string;
115
+ tabId: string;
114
116
  }) => Promise<string>;
115
117
  };
116
- browserDisconnect: {
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<"Not in CDP mode. Use browserClose to close a launched browser." | "Disconnected from Chrome">;
147
+ execute: (args: unknown) => Promise<string>;
120
148
  };
121
- browserClose: {
149
+ browserDisconnect: {
122
150
  description: string;
123
151
  parameters: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
124
- execute: () => Promise<"Disconnected from Chrome" | "Browser closed">;
152
+ execute: (args: unknown) => Promise<string>;
125
153
  };
126
154
  };
127
- export type BrowserToolName = keyof typeof browserToolDefinitions;
155
+ export type BrowserTools = ReturnType<typeof createBrowserTools>;
156
+ export type BrowserToolName = keyof BrowserTools;
128
157
  //# sourceMappingURL=tools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA0BxB,eAAO,MAAM,sBAAsB;;;;;;;;;;;iBAMQ,MAAM;cAhB2B,OAAO,CAAC,MAAM,CAAC;;;;;oCAAf,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;mBA4BxC,MAAM;cA5BmB,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;sBAmCrC,MAAM;cAnCgB,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;sBA2CrC,MAAM;kBAAQ,MAAM;cA3CE,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;kBAkDzC,MAAM;cAlDoB,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;sBA0DrC,MAAM;sBAAY,MAAM;cA1DF,OAAO,CAAC,MAAM,CAAC;;;;;oCAAf,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;;;wBAyEjE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAA;SAAE;;;;;;;;;;;;CAgC/D,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,sBAAsB,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"}