@lobu/connector-sdk 6.0.1

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 (93) hide show
  1. package/dist/api-paginated.d.ts +79 -0
  2. package/dist/api-paginated.d.ts.map +1 -0
  3. package/dist/api-paginated.js +120 -0
  4. package/dist/api-paginated.js.map +1 -0
  5. package/dist/base.d.ts +66 -0
  6. package/dist/base.d.ts.map +1 -0
  7. package/dist/base.js +122 -0
  8. package/dist/base.js.map +1 -0
  9. package/dist/browser/acquire.d.ts +66 -0
  10. package/dist/browser/acquire.d.ts.map +1 -0
  11. package/dist/browser/acquire.js +109 -0
  12. package/dist/browser/acquire.js.map +1 -0
  13. package/dist/browser/cdp-page.d.ts +48 -0
  14. package/dist/browser/cdp-page.d.ts.map +1 -0
  15. package/dist/browser/cdp-page.js +165 -0
  16. package/dist/browser/cdp-page.js.map +1 -0
  17. package/dist/browser/cdp.d.ts +44 -0
  18. package/dist/browser/cdp.d.ts.map +1 -0
  19. package/dist/browser/cdp.js +252 -0
  20. package/dist/browser/cdp.js.map +1 -0
  21. package/dist/browser/launcher.d.ts +29 -0
  22. package/dist/browser/launcher.d.ts.map +1 -0
  23. package/dist/browser/launcher.js +157 -0
  24. package/dist/browser/launcher.js.map +1 -0
  25. package/dist/browser/stealth.d.ts +55 -0
  26. package/dist/browser/stealth.d.ts.map +1 -0
  27. package/dist/browser/stealth.js +170 -0
  28. package/dist/browser/stealth.js.map +1 -0
  29. package/dist/browser-network.d.ts +51 -0
  30. package/dist/browser-network.d.ts.map +1 -0
  31. package/dist/browser-network.js +175 -0
  32. package/dist/browser-network.js.map +1 -0
  33. package/dist/browser-paginated.d.ts +141 -0
  34. package/dist/browser-paginated.d.ts.map +1 -0
  35. package/dist/browser-paginated.js +269 -0
  36. package/dist/browser-paginated.js.map +1 -0
  37. package/dist/connector-runtime.d.ts +70 -0
  38. package/dist/connector-runtime.d.ts.map +1 -0
  39. package/dist/connector-runtime.js +48 -0
  40. package/dist/connector-runtime.js.map +1 -0
  41. package/dist/connector-types.d.ts +613 -0
  42. package/dist/connector-types.d.ts.map +1 -0
  43. package/dist/connector-types.js +27 -0
  44. package/dist/connector-types.js.map +1 -0
  45. package/dist/event-taxonomy.d.ts +3 -0
  46. package/dist/event-taxonomy.d.ts.map +1 -0
  47. package/dist/event-taxonomy.js +30 -0
  48. package/dist/event-taxonomy.js.map +1 -0
  49. package/dist/http.d.ts +18 -0
  50. package/dist/http.d.ts.map +1 -0
  51. package/dist/http.js +74 -0
  52. package/dist/http.js.map +1 -0
  53. package/dist/identity-normalize.d.ts +53 -0
  54. package/dist/identity-normalize.d.ts.map +1 -0
  55. package/dist/identity-normalize.js +146 -0
  56. package/dist/identity-normalize.js.map +1 -0
  57. package/dist/identity-types.d.ts +214 -0
  58. package/dist/identity-types.d.ts.map +1 -0
  59. package/dist/identity-types.js +217 -0
  60. package/dist/identity-types.js.map +1 -0
  61. package/dist/index.d.ts +37 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +33 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/logger.d.ts +7 -0
  66. package/dist/logger.d.ts.map +1 -0
  67. package/dist/logger.js +10 -0
  68. package/dist/logger.js.map +1 -0
  69. package/dist/paginated.d.ts +93 -0
  70. package/dist/paginated.d.ts.map +1 -0
  71. package/dist/paginated.js +167 -0
  72. package/dist/paginated.js.map +1 -0
  73. package/dist/reaction-sdk.d.ts +43 -0
  74. package/dist/reaction-sdk.d.ts.map +1 -0
  75. package/dist/reaction-sdk.js +9 -0
  76. package/dist/reaction-sdk.js.map +1 -0
  77. package/dist/retry.d.ts +19 -0
  78. package/dist/retry.d.ts.map +1 -0
  79. package/dist/retry.js +131 -0
  80. package/dist/retry.js.map +1 -0
  81. package/dist/scoring.d.ts +17 -0
  82. package/dist/scoring.d.ts.map +1 -0
  83. package/dist/scoring.js +28 -0
  84. package/dist/scoring.js.map +1 -0
  85. package/dist/types.d.ts +280 -0
  86. package/dist/types.d.ts.map +1 -0
  87. package/dist/types.js +2 -0
  88. package/dist/types.js.map +1 -0
  89. package/dist/watcher-time.d.ts +14 -0
  90. package/dist/watcher-time.d.ts.map +1 -0
  91. package/dist/watcher-time.js +112 -0
  92. package/dist/watcher-time.js.map +1 -0
  93. package/package.json +59 -0
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Lightweight CDP Page
3
+ *
4
+ * A minimal Page-like interface over raw Chrome DevTools Protocol.
5
+ * Used when Playwright's connectOverCDP crashes on browsers with many tabs
6
+ * (it tries to enumerate all targets, which fails on real user browsers).
7
+ *
8
+ * Supports the subset of Playwright's Page API used by DOM scraper connectors:
9
+ * goto, evaluate, waitForSelector, waitForTimeout, click, close.
10
+ */
11
+ import { sdkLogger } from '../logger.js';
12
+ export class CdpPage {
13
+ ws;
14
+ sessionId;
15
+ targetId;
16
+ msgId = 1;
17
+ constructor(ws, sessionId, targetId) {
18
+ this.ws = ws;
19
+ this.sessionId = sessionId;
20
+ this.targetId = targetId;
21
+ }
22
+ /**
23
+ * Create a new tab in the browser and return a CdpPage handle.
24
+ * Does NOT enumerate existing tabs — avoids the Playwright crash.
25
+ */
26
+ static async create(browserWsUrl) {
27
+ const ws = new WebSocket(browserWsUrl);
28
+ await new Promise((resolve, reject) => {
29
+ const timer = setTimeout(() => reject(new Error('CDP WebSocket connection timeout')), 10000);
30
+ ws.onopen = () => {
31
+ clearTimeout(timer);
32
+ resolve();
33
+ };
34
+ ws.onerror = () => {
35
+ clearTimeout(timer);
36
+ reject(new Error('CDP WebSocket connection failed'));
37
+ };
38
+ });
39
+ const sendBrowser = (method, params = {}) => {
40
+ return new Promise((resolve, reject) => {
41
+ const id = Math.floor(Math.random() * 1e9);
42
+ const timer = setTimeout(() => reject(new Error(`${method} timeout`)), 15000);
43
+ const handler = (event) => {
44
+ const data = JSON.parse(event.data);
45
+ if (data.id === id) {
46
+ clearTimeout(timer);
47
+ ws.removeEventListener('message', handler);
48
+ data.error ? reject(new Error(data.error.message)) : resolve(data.result);
49
+ }
50
+ };
51
+ ws.addEventListener('message', handler);
52
+ ws.send(JSON.stringify({ id, method, params }));
53
+ });
54
+ };
55
+ const { targetId } = await sendBrowser('Target.createTarget', { url: 'about:blank' });
56
+ const { sessionId } = await sendBrowser('Target.attachToTarget', {
57
+ targetId,
58
+ flatten: true,
59
+ });
60
+ const page = new CdpPage(ws, sessionId, targetId);
61
+ await page.send('Page.enable');
62
+ await page.send('Runtime.enable');
63
+ await page.send('DOM.enable');
64
+ sdkLogger.info({ targetId }, '[CdpPage] Created tab');
65
+ return page;
66
+ }
67
+ send(method, params = {}) {
68
+ return new Promise((resolve, reject) => {
69
+ const id = this.msgId++;
70
+ const timer = setTimeout(() => reject(new Error(`${method} timeout`)), 30000);
71
+ const handler = (event) => {
72
+ const data = JSON.parse(event.data);
73
+ if (data.id === id) {
74
+ clearTimeout(timer);
75
+ this.ws.removeEventListener('message', handler);
76
+ data.error ? reject(new Error(data.error.message)) : resolve(data.result);
77
+ }
78
+ };
79
+ this.ws.addEventListener('message', handler);
80
+ this.ws.send(JSON.stringify({ id, method, params, sessionId: this.sessionId }));
81
+ });
82
+ }
83
+ /** Navigate to a URL and wait for the page to load. */
84
+ async goto(url, options) {
85
+ const timeout = options?.timeout ?? 30000;
86
+ await this.send('Page.navigate', { url });
87
+ // Wait for load event
88
+ await new Promise((resolve) => {
89
+ const timer = setTimeout(() => resolve(), timeout);
90
+ const handler = (event) => {
91
+ const data = JSON.parse(event.data);
92
+ if (data.method === 'Page.loadEventFired' && data.sessionId === this.sessionId) {
93
+ clearTimeout(timer);
94
+ this.ws.removeEventListener('message', handler);
95
+ resolve();
96
+ }
97
+ };
98
+ this.ws.addEventListener('message', handler);
99
+ });
100
+ }
101
+ /** Evaluate a JavaScript expression in the page and return the result. */
102
+ async evaluate(expression) {
103
+ const code = typeof expression === 'function' ? `(${expression.toString()})()` : expression;
104
+ const { result, exceptionDetails } = await this.send('Runtime.evaluate', {
105
+ expression: code,
106
+ returnByValue: true,
107
+ awaitPromise: true,
108
+ });
109
+ if (exceptionDetails) {
110
+ throw new Error(`evaluate failed: ${exceptionDetails.text || exceptionDetails.exception?.description || 'unknown error'}`);
111
+ }
112
+ return result.value;
113
+ }
114
+ /**
115
+ * Wait for a CSS selector to appear in the DOM.
116
+ * Returns true if found, false on timeout.
117
+ */
118
+ async waitForSelector(selector, options) {
119
+ const timeout = options?.timeout ?? 10000;
120
+ const start = Date.now();
121
+ while (Date.now() - start < timeout) {
122
+ const found = await this.evaluate(`!!document.querySelector(${JSON.stringify(selector)})`);
123
+ if (found)
124
+ return true;
125
+ await this.waitForTimeout(500);
126
+ }
127
+ return false;
128
+ }
129
+ /** Click the first element matching a CSS selector. */
130
+ async click(selector) {
131
+ await this.evaluate(`document.querySelector(${JSON.stringify(selector)})?.click()`);
132
+ }
133
+ /** Wait for a fixed duration. */
134
+ async waitForTimeout(ms) {
135
+ await new Promise((resolve) => setTimeout(resolve, ms));
136
+ }
137
+ /** Get the current page URL. */
138
+ async url() {
139
+ return this.evaluate('location.href');
140
+ }
141
+ /** Get the page title. */
142
+ async title() {
143
+ return this.evaluate('document.title');
144
+ }
145
+ /** Close the tab and disconnect. */
146
+ async close() {
147
+ try {
148
+ await this.send('Page.close').catch(() => { });
149
+ // Also close via Target API as fallback
150
+ const id = this.msgId++;
151
+ this.ws.send(JSON.stringify({
152
+ id,
153
+ method: 'Target.closeTarget',
154
+ params: { targetId: this.targetId },
155
+ }));
156
+ await new Promise((r) => setTimeout(r, 300));
157
+ this.ws.close();
158
+ }
159
+ catch {
160
+ // Best-effort cleanup
161
+ }
162
+ sdkLogger.info({ targetId: this.targetId }, '[CdpPage] Tab closed');
163
+ }
164
+ }
165
+ //# sourceMappingURL=cdp-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdp-page.js","sourceRoot":"","sources":["../../src/browser/cdp-page.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ export interface CdpVersionInfo {
2
+ Browser?: string;
3
+ webSocketDebuggerUrl?: string;
4
+ /** Whether the browser is headless (test/automation instance) */
5
+ isHeadless?: boolean;
6
+ }
7
+ export declare function normalizeCdpUrl(value: string): string;
8
+ export declare function fetchCdpVersionInfo(baseUrl: string): Promise<CdpVersionInfo | null>;
9
+ /**
10
+ * Try connecting to a Chrome DevTools endpoint via direct WebSocket.
11
+ * Chrome's DevTools remote debugging UI (chrome://inspect/#remote-debugging)
12
+ * exposes CDP over WebSocket at ws://{host}:{port}/devtools/browser
13
+ * without the HTTP /json/version endpoint.
14
+ */
15
+ export declare function tryWebSocketCdp(host: string, port: number, timeoutMs?: number): Promise<CdpVersionInfo | null>;
16
+ /**
17
+ * Discover Chrome processes listening on TCP ports by parsing `lsof` output.
18
+ * Returns ports for processes named "Google" (Chrome) on macOS/Linux.
19
+ */
20
+ export declare function discoverChromeListeningPorts(): Promise<number[]>;
21
+ /**
22
+ * Discover Chrome processes launched with --remote-debugging-port flag.
23
+ * Returns http:// URLs for those endpoints.
24
+ */
25
+ export declare function discoverChromeProcessCdpUrls(): Promise<string[]>;
26
+ export interface ResolveCdpOptions {
27
+ defaultUrls?: string[];
28
+ loggerLabel?: string;
29
+ /** If true, prefer non-headless (real user) browsers over headless instances */
30
+ preferRealBrowser?: boolean;
31
+ }
32
+ /**
33
+ * Resolve a CDP endpoint URL. Tries multiple discovery strategies:
34
+ *
35
+ * 1. Explicit URL (if not 'auto')
36
+ * 2. WebSocket probe on Chrome listening ports (new DevTools UI style)
37
+ * 3. HTTP /json/version on --remote-debugging-port URLs (old style)
38
+ * 4. HTTP /json/version on default ports (9222, 9223)
39
+ *
40
+ * When `preferRealBrowser` is true (default), non-headless browsers are
41
+ * returned first. Returns the `ws://` URL for direct WebSocket connections.
42
+ */
43
+ export declare function resolveCdpUrl(input?: string | null, options?: ResolveCdpOptions): Promise<string>;
44
+ //# sourceMappingURL=cdp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdp.d.ts","sourceRoot":"","sources":["../../src/browser/cdp.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iEAAiE;IACjE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIrD;AAMD,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAgBzF;AAMD;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,SAAS,SAAO,GACf,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAoDhC;AAMD;;;GAGG;AACH,wBAAsB,4BAA4B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAuBtE;AAED;;;GAGG;AACH,wBAAsB,4BAA4B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAuBtE;AAMD,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CACjC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,EACrB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAgGjB"}
@@ -0,0 +1,252 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ import { sdkLogger } from '../logger.js';
4
+ const execFileAsync = promisify(execFile);
5
+ const DEFAULT_CDP_URLS = [
6
+ 'http://127.0.0.1:9222',
7
+ 'http://localhost:9222',
8
+ 'http://127.0.0.1:9223',
9
+ ];
10
+ export function normalizeCdpUrl(value) {
11
+ let end = value.length;
12
+ while (end > 0 && value.charCodeAt(end - 1) === 47)
13
+ end--;
14
+ return end === value.length ? value : value.slice(0, end);
15
+ }
16
+ // ---------------------------------------------------------------------------
17
+ // HTTP-based discovery (old style: --remote-debugging-port)
18
+ // ---------------------------------------------------------------------------
19
+ export async function fetchCdpVersionInfo(baseUrl) {
20
+ const url = normalizeCdpUrl(baseUrl);
21
+ try {
22
+ const resp = await fetch(`${url}/json/version`, { headers: { Host: 'localhost' } });
23
+ if (!resp.ok)
24
+ return null;
25
+ const info = (await resp.json());
26
+ if (!info.webSocketDebuggerUrl)
27
+ return null;
28
+ const ua = info['User-Agent'];
29
+ info.isHeadless = ua ? /headless/i.test(ua) : false;
30
+ return info;
31
+ }
32
+ catch {
33
+ return null;
34
+ }
35
+ }
36
+ // ---------------------------------------------------------------------------
37
+ // WebSocket-based discovery (new style: chrome://inspect remote debugging UI)
38
+ // ---------------------------------------------------------------------------
39
+ /**
40
+ * Try connecting to a Chrome DevTools endpoint via direct WebSocket.
41
+ * Chrome's DevTools remote debugging UI (chrome://inspect/#remote-debugging)
42
+ * exposes CDP over WebSocket at ws://{host}:{port}/devtools/browser
43
+ * without the HTTP /json/version endpoint.
44
+ */
45
+ export async function tryWebSocketCdp(host, port, timeoutMs = 3000) {
46
+ const wsUrl = `ws://${host}:${port}/devtools/browser`;
47
+ return new Promise((resolve) => {
48
+ const timer = setTimeout(() => {
49
+ try {
50
+ ws.close();
51
+ }
52
+ catch { }
53
+ resolve(null);
54
+ }, timeoutMs);
55
+ let ws;
56
+ try {
57
+ ws = new WebSocket(wsUrl);
58
+ }
59
+ catch {
60
+ clearTimeout(timer);
61
+ resolve(null);
62
+ return;
63
+ }
64
+ ws.onopen = () => {
65
+ ws.send(JSON.stringify({ id: 1, method: 'Browser.getVersion' }));
66
+ };
67
+ ws.onmessage = (event) => {
68
+ clearTimeout(timer);
69
+ try {
70
+ const data = JSON.parse(event.data);
71
+ const result = data?.result;
72
+ if (!result?.product) {
73
+ ws.close();
74
+ resolve(null);
75
+ return;
76
+ }
77
+ const ua = result.userAgent;
78
+ ws.close();
79
+ resolve({
80
+ Browser: result.product,
81
+ webSocketDebuggerUrl: wsUrl,
82
+ isHeadless: ua ? /headless/i.test(ua) : false,
83
+ });
84
+ }
85
+ catch {
86
+ ws.close();
87
+ resolve(null);
88
+ }
89
+ };
90
+ ws.onerror = () => {
91
+ clearTimeout(timer);
92
+ resolve(null);
93
+ };
94
+ });
95
+ }
96
+ // ---------------------------------------------------------------------------
97
+ // Port discovery
98
+ // ---------------------------------------------------------------------------
99
+ /**
100
+ * Discover Chrome processes listening on TCP ports by parsing `lsof` output.
101
+ * Returns ports for processes named "Google" (Chrome) on macOS/Linux.
102
+ */
103
+ export async function discoverChromeListeningPorts() {
104
+ if (process.platform === 'win32')
105
+ return [];
106
+ try {
107
+ const { stdout } = await execFileAsync('lsof', ['-iTCP', '-sTCP:LISTEN', '-P', '-n'], {
108
+ timeout: 5000,
109
+ });
110
+ const ports = [];
111
+ for (const line of stdout.split('\n')) {
112
+ // Match Chrome processes: "Google" (macOS Chrome) or "chrome"/"chromium" (Linux)
113
+ if (!/^Google\s|^chrome\s|^chromium\s/i.test(line))
114
+ continue;
115
+ const portMatch = line.match(/:(\d+)\s+\(LISTEN\)/);
116
+ if (portMatch) {
117
+ ports.push(Number(portMatch[1]));
118
+ }
119
+ }
120
+ return [...new Set(ports)];
121
+ }
122
+ catch {
123
+ return [];
124
+ }
125
+ }
126
+ /**
127
+ * Discover Chrome processes launched with --remote-debugging-port flag.
128
+ * Returns http:// URLs for those endpoints.
129
+ */
130
+ export async function discoverChromeProcessCdpUrls() {
131
+ if (process.platform === 'win32')
132
+ return [];
133
+ try {
134
+ const { stdout } = await execFileAsync('ps', ['-ax', '-o', 'command=']);
135
+ const urls = new Set();
136
+ for (const line of stdout.split('\n')) {
137
+ if (!/chrome|chromium|google chrome/i.test(line))
138
+ continue;
139
+ const portMatch = line.match(/--remote-debugging-port(?:=|\s+)(\d+)/);
140
+ if (!portMatch)
141
+ continue;
142
+ const addressMatch = line.match(/--remote-debugging-address(?:=|\s+)([^\s]+)/);
143
+ const host = addressMatch?.[1] && addressMatch[1] !== '0.0.0.0' ? addressMatch[1] : '127.0.0.1';
144
+ urls.add(`http://${host}:${portMatch[1]}`);
145
+ }
146
+ return [...urls];
147
+ }
148
+ catch {
149
+ return [];
150
+ }
151
+ }
152
+ /**
153
+ * Resolve a CDP endpoint URL. Tries multiple discovery strategies:
154
+ *
155
+ * 1. Explicit URL (if not 'auto')
156
+ * 2. WebSocket probe on Chrome listening ports (new DevTools UI style)
157
+ * 3. HTTP /json/version on --remote-debugging-port URLs (old style)
158
+ * 4. HTTP /json/version on default ports (9222, 9223)
159
+ *
160
+ * When `preferRealBrowser` is true (default), non-headless browsers are
161
+ * returned first. Returns the `ws://` URL for direct WebSocket connections.
162
+ */
163
+ export async function resolveCdpUrl(input, options) {
164
+ const label = options?.loggerLabel;
165
+ const preferReal = options?.preferRealBrowser ?? true;
166
+ const normalizedInput = input?.trim();
167
+ // Explicit URL — resolve to ws:// if possible
168
+ if (normalizedInput && normalizedInput.toLowerCase() !== 'auto') {
169
+ const url = normalizeCdpUrl(normalizedInput);
170
+ if (url.startsWith('ws://') || url.startsWith('wss://'))
171
+ return url;
172
+ // Try HTTP /json/version to get the ws:// URL
173
+ const info = await fetchCdpVersionInfo(url);
174
+ if (info?.webSocketDebuggerUrl)
175
+ return info.webSocketDebuggerUrl;
176
+ // No HTTP endpoint — assume new-style DevTools UI. Build ws:// URL from the http:// URL.
177
+ // Don't probe via WS here to avoid triggering Chrome's permission dialog.
178
+ try {
179
+ const parsed = new URL(url);
180
+ return `ws://${parsed.hostname}:${parsed.port}/devtools/browser`;
181
+ }
182
+ catch {
183
+ return url;
184
+ }
185
+ }
186
+ // --- Strategy 1: Probe Chrome listening ports ---
187
+ // HTTP-only discovery: check /json/version on each port. This is non-intrusive
188
+ // and doesn't trigger Chrome's "Allow remote debugging?" permission dialog.
189
+ //
190
+ // For Chrome's new DevTools UI style (WS-only, no HTTP), we can't probe without
191
+ // triggering the dialog. Instead we build a ws:// candidate URL for any Chrome
192
+ // port that doesn't serve HTTP. The actual connection happens once in
193
+ // acquireBrowser() via connectOverCDP(), which is when the user clicks "Allow".
194
+ const listeningPorts = await discoverChromeListeningPorts();
195
+ const discovered = [];
196
+ for (const port of listeningPorts) {
197
+ const httpInfo = await fetchCdpVersionInfo(`http://127.0.0.1:${port}`);
198
+ if (httpInfo?.webSocketDebuggerUrl) {
199
+ discovered.push({ wsUrl: httpInfo.webSocketDebuggerUrl, info: httpInfo });
200
+ }
201
+ else {
202
+ // No HTTP endpoint — assume new-style DevTools UI (ws-only).
203
+ // Add as a candidate without probing. We mark it as non-headless because
204
+ // the DevTools UI checkbox is only available in the user's real Chrome.
205
+ discovered.push({
206
+ wsUrl: `ws://127.0.0.1:${port}/devtools/browser`,
207
+ info: {
208
+ Browser: 'Chrome (DevTools UI)',
209
+ webSocketDebuggerUrl: `ws://127.0.0.1:${port}/devtools/browser`,
210
+ isHeadless: false,
211
+ },
212
+ });
213
+ }
214
+ }
215
+ // --- Strategy 2: Also check --remote-debugging-port processes + default ports ---
216
+ const processUrls = await discoverChromeProcessCdpUrls();
217
+ const extraCandidates = new Set([
218
+ ...processUrls,
219
+ ...(options?.defaultUrls ?? DEFAULT_CDP_URLS),
220
+ ]);
221
+ // Remove ports we already probed
222
+ const probedPorts = new Set(listeningPorts);
223
+ for (const candidate of extraCandidates) {
224
+ try {
225
+ const port = Number(new URL(candidate).port);
226
+ if (probedPorts.has(port))
227
+ continue;
228
+ }
229
+ catch {
230
+ /* ignore parse errors */
231
+ }
232
+ const info = await fetchCdpVersionInfo(candidate);
233
+ if (info?.webSocketDebuggerUrl) {
234
+ discovered.push({ wsUrl: info.webSocketDebuggerUrl, info });
235
+ }
236
+ }
237
+ // Pick the best: prefer real (non-headless) browsers
238
+ if (discovered.length > 0) {
239
+ const sorted = preferReal
240
+ ? discovered.sort((a, b) => a.info.isHeadless === b.info.isHeadless ? 0 : a.info.isHeadless ? 1 : -1)
241
+ : discovered;
242
+ const best = sorted[0];
243
+ if (label) {
244
+ sdkLogger.info({ wsUrl: best.wsUrl, browser: best.info.Browser, headless: best.info.isHeadless }, `[${label}] Auto-detected CDP endpoint`);
245
+ }
246
+ return best.wsUrl;
247
+ }
248
+ throw new Error('Could not auto-detect a Chrome DevTools endpoint.\n' +
249
+ 'Enable remote debugging in Chrome: chrome://inspect/#remote-debugging\n' +
250
+ 'Or start Chrome with: --remote-debugging-port=9222');
251
+ }
252
+ //# sourceMappingURL=cdp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdp.js","sourceRoot":"","sources":["../../src/browser/cdp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Browser Launcher Utility
3
+ * Provides Playwright-based browser automation
4
+ */
5
+ import type { Env } from '../types.js';
6
+ export interface BrowserLaunchOptions {
7
+ debug?: boolean;
8
+ trace?: boolean;
9
+ screenshotDir?: string;
10
+ stealth?: boolean;
11
+ }
12
+ export interface EnhancedBrowser {
13
+ browser: any;
14
+ isPlaywright: boolean;
15
+ screenshotDir: string;
16
+ }
17
+ /**
18
+ * Launch browser with Playwright
19
+ */
20
+ export declare function launchBrowser(_env: Env, options?: BrowserLaunchOptions): Promise<EnhancedBrowser>;
21
+ /**
22
+ * Capture error artifacts (screenshot, HTML, trace) when feed fails
23
+ */
24
+ export declare function captureErrorArtifacts(page: any, error: Error, feedType: string, screenshotDir: string): Promise<void>;
25
+ /**
26
+ * Wrap feed execution with error artifact capture
27
+ */
28
+ export declare function withErrorCapture<T>(fn: () => Promise<T>, page: any, feedType: string, screenshotDir: string): Promise<T>;
29
+ //# sourceMappingURL=launcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../../src/browser/launcher.ts"],"names":[],"mappings":"AACA;;;GAGG;AAKH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAGvC,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,GAAG,CAAC;IACb,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB;AAiBD;;GAEG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,GAAG,EACT,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,eAAe,CAAC,CA8E1B;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,GAAG,EACT,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CA6Df;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,IAAI,EAAE,GAAG,EACT,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,CAAC,CAAC,CAOZ"}