@playwright-repl/core 0.7.10

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.
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Terminal color helpers.
3
+ * No dependency — just ANSI escape codes.
4
+ */
5
+ export declare const c: Record<string, string>;
6
+ //# sourceMappingURL=colors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../src/colors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAWpC,CAAC"}
package/dist/colors.js ADDED
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Terminal color helpers.
3
+ * No dependency — just ANSI escape codes.
4
+ */
5
+ export const c = {
6
+ reset: '\x1b[0m',
7
+ bold: '\x1b[1m',
8
+ dim: '\x1b[2m',
9
+ red: '\x1b[31m',
10
+ green: '\x1b[32m',
11
+ yellow: '\x1b[33m',
12
+ blue: '\x1b[34m',
13
+ magenta: '\x1b[35m',
14
+ cyan: '\x1b[36m',
15
+ gray: '\x1b[90m',
16
+ };
17
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../src/colors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,CAAC,GAA2B;IACvC,KAAK,EAAI,SAAS;IAClB,IAAI,EAAK,SAAS;IAClB,GAAG,EAAM,SAAS;IAClB,GAAG,EAAM,UAAU;IACnB,KAAK,EAAI,UAAU;IACnB,MAAM,EAAG,UAAU;IACnB,IAAI,EAAK,UAAU;IACnB,OAAO,EAAE,UAAU;IACnB,IAAI,EAAK,UAAU;IACnB,IAAI,EAAK,UAAU;CACpB,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Completion data — builds the list of items for ghost completion.
3
+ *
4
+ * Sources: COMMANDS from resolve.ts plus REPL meta-commands (.help, .exit, etc.).
5
+ */
6
+ export interface CompletionItem {
7
+ cmd: string;
8
+ desc: string;
9
+ }
10
+ /**
11
+ * Returns a sorted array of `{ cmd, desc }` for all completable items:
12
+ * commands and meta-commands.
13
+ */
14
+ export declare function buildCompletionItems(): {
15
+ cmd: string;
16
+ desc: string;
17
+ }[];
18
+ //# sourceMappingURL=completion-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion-data.d.ts","sourceRoot":"","sources":["../src/completion-data.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmCH,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAID;;;GAGG;AACH,wBAAgB,oBAAoB;;;IAgBnC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Completion data — builds the list of items for ghost completion.
3
+ *
4
+ * Sources: COMMANDS from resolve.ts plus REPL meta-commands (.help, .exit, etc.).
5
+ */
6
+ import { COMMANDS } from './resolve.js';
7
+ // ─── Meta-commands ───────────────────────────────────────────────────────────
8
+ const META_COMMANDS = [
9
+ { cmd: '.clear', desc: 'Clear terminal output' },
10
+ { cmd: '.help', desc: 'Show available commands' },
11
+ { cmd: '.aliases', desc: 'Show command aliases' },
12
+ { cmd: '.history', desc: 'Show command history' },
13
+ { cmd: '.history clear', desc: 'Clear command history' },
14
+ { cmd: '.status', desc: 'Show connection status' },
15
+ { cmd: '.reconnect', desc: 'Reconnect to daemon' },
16
+ { cmd: '.record', desc: 'Start recording commands' },
17
+ { cmd: '.save', desc: 'Stop recording and save' },
18
+ { cmd: '.pause', desc: 'Pause/resume recording' },
19
+ { cmd: '.discard', desc: 'Discard current recording' },
20
+ { cmd: '.replay', desc: 'Replay a recorded session' },
21
+ { cmd: '.exit', desc: 'Exit REPL' },
22
+ ];
23
+ const EXTRA_COMMANDS = [
24
+ { cmd: 'highlight', desc: 'Highlight matching elements' },
25
+ { cmd: 'verify', desc: 'Assert page state (title, url, text, element, value, list)' },
26
+ { cmd: 'verify-text', desc: 'Assert text is visible on page' },
27
+ { cmd: 'verify-element', desc: 'Assert element exists by role and name' },
28
+ { cmd: 'verify-value', desc: 'Assert input/select/checkbox value' },
29
+ { cmd: 'verify-list', desc: 'Assert list contains expected items' },
30
+ { cmd: 'verify-title', desc: 'Assert page title contains text' },
31
+ { cmd: 'verify-url', desc: 'Assert page URL contains text' },
32
+ { cmd: 'verify-no-text', desc: 'Assert text is not visible on page' },
33
+ { cmd: 'verify-no-element', desc: 'Assert element does not exist' },
34
+ ];
35
+ // ─── Build completion items ──────────────────────────────────────────────────
36
+ /**
37
+ * Returns a sorted array of `{ cmd, desc }` for all completable items:
38
+ * commands and meta-commands.
39
+ */
40
+ export function buildCompletionItems() {
41
+ const items = [];
42
+ // Primary commands
43
+ for (const [name, info] of Object.entries(COMMANDS)) {
44
+ items.push({ cmd: name, desc: info.desc });
45
+ }
46
+ // Extra commands (not in COMMANDS but handled by REPL)
47
+ items.push(...EXTRA_COMMANDS);
48
+ // Meta-commands
49
+ items.push(...META_COMMANDS);
50
+ items.sort((a, b) => a.cmd.localeCompare(b.cmd));
51
+ return items;
52
+ }
53
+ //# sourceMappingURL=completion-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion-data.js","sourceRoot":"","sources":["../src/completion-data.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,gFAAgF;AAEhF,MAAM,aAAa,GAAG;IACpB,EAAE,GAAG,EAAE,QAAQ,EAAM,IAAI,EAAE,uBAAuB,EAAE;IACpD,EAAE,GAAG,EAAE,OAAO,EAAO,IAAI,EAAE,yBAAyB,EAAE;IACtD,EAAE,GAAG,EAAE,UAAU,EAAI,IAAI,EAAE,sBAAsB,EAAE;IACnD,EAAE,GAAG,EAAE,UAAU,EAAI,IAAI,EAAE,sBAAsB,EAAE;IACnD,EAAE,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,uBAAuB,EAAE;IACxD,EAAE,GAAG,EAAE,SAAS,EAAK,IAAI,EAAE,wBAAwB,EAAE;IACrD,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,qBAAqB,EAAE;IAClD,EAAE,GAAG,EAAE,SAAS,EAAK,IAAI,EAAE,0BAA0B,EAAE;IACvD,EAAE,GAAG,EAAE,OAAO,EAAO,IAAI,EAAE,yBAAyB,EAAE;IACtD,EAAE,GAAG,EAAE,QAAQ,EAAM,IAAI,EAAE,wBAAwB,EAAE;IACrD,EAAE,GAAG,EAAE,UAAU,EAAI,IAAI,EAAE,2BAA2B,EAAE;IACxD,EAAE,GAAG,EAAE,SAAS,EAAK,IAAI,EAAE,2BAA2B,EAAE;IACxD,EAAE,GAAG,EAAE,OAAO,EAAO,IAAI,EAAE,WAAW,EAAE;CACzC,CAAC;AAEF,MAAM,cAAc,GAAG;IACrB,EAAE,GAAG,EAAE,WAAW,EAAQ,IAAI,EAAE,6BAA6B,EAAE;IAC/D,EAAE,GAAG,EAAE,QAAQ,EAAW,IAAI,EAAE,4DAA4D,EAAE;IAC9F,EAAE,GAAG,EAAE,aAAa,EAAM,IAAI,EAAE,gCAAgC,EAAE;IAClE,EAAE,GAAG,EAAE,gBAAgB,EAAG,IAAI,EAAE,wCAAwC,EAAE;IAC1E,EAAE,GAAG,EAAE,cAAc,EAAK,IAAI,EAAE,oCAAoC,EAAE;IACtE,EAAE,GAAG,EAAE,aAAa,EAAM,IAAI,EAAE,qCAAqC,EAAE;IACvE,EAAE,GAAG,EAAE,cAAc,EAAK,IAAI,EAAE,iCAAiC,EAAE;IACnE,EAAE,GAAG,EAAE,YAAY,EAAO,IAAI,EAAE,+BAA+B,EAAE;IACjE,EAAE,GAAG,EAAE,gBAAgB,EAAG,IAAI,EAAE,oCAAoC,EAAE;IACtE,EAAE,GAAG,EAAE,mBAAmB,EAAE,IAAI,EAAE,+BAA+B,EAAE;CACpE,CAAC;AAOF,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,KAAK,GAAG,EAAE,CAAC;IAEjB,mBAAmB;IACnB,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,uDAAuD;IACvD,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC;IAE9B,gBAAgB;IAChB,KAAK,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;IAE7B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Engine — in-process Playwright backend.
3
+ *
4
+ * Wraps BrowserServerBackend directly, eliminating the daemon process.
5
+ * Provides the same interface as DaemonConnection: run(args), connected, close().
6
+ *
7
+ * Three connection modes:
8
+ * - launch: new browser via Playwright (default)
9
+ * - connect: existing Chrome via CDP port (--connect [port])
10
+ * - extension: DevTools extension CDP relay (--extension)
11
+ */
12
+ export interface EngineOpts {
13
+ headed?: boolean;
14
+ browser?: string;
15
+ connect?: number | boolean;
16
+ extension?: boolean;
17
+ spawn?: boolean;
18
+ port?: number;
19
+ cdpPort?: number;
20
+ persistent?: boolean;
21
+ profile?: string;
22
+ cwd?: string;
23
+ [key: string]: unknown;
24
+ }
25
+ export interface EngineResult {
26
+ text?: string;
27
+ image?: string;
28
+ isError?: boolean;
29
+ }
30
+ export interface ParsedArgs {
31
+ _: string[];
32
+ cwd?: string;
33
+ nth?: string | number;
34
+ [key: string]: unknown;
35
+ }
36
+ interface PlaywrightDeps {
37
+ BrowserServerBackend: new (config: any, factory: any, opts: any) => any;
38
+ contextFactory: (config: any) => {
39
+ createContext: (info: any, signal: AbortSignal, opts: any) => Promise<{
40
+ browserContext: any;
41
+ close: () => Promise<void>;
42
+ }>;
43
+ };
44
+ playwright: any;
45
+ registry: {
46
+ findExecutable: (name: string) => {
47
+ executablePath: () => string | undefined;
48
+ } | undefined;
49
+ };
50
+ resolveConfig: (config: any) => Promise<any> | any;
51
+ commands: Record<string, any>;
52
+ parseCommand: (command: any, args: any) => {
53
+ toolName: string;
54
+ toolParams: Record<string, any>;
55
+ };
56
+ }
57
+ export declare class Engine {
58
+ private _deps;
59
+ private _backend;
60
+ private _browserContext;
61
+ private _close;
62
+ private _connected;
63
+ private _commandServer;
64
+ private _chromeProc;
65
+ constructor(deps?: PlaywrightDeps);
66
+ get connected(): boolean;
67
+ /**
68
+ * Start the engine with given options.
69
+ */
70
+ start(opts?: EngineOpts): Promise<void>;
71
+ /**
72
+ * Run a command given minimist-parsed args.
73
+ * Returns { text, isError } matching DaemonConnection.run() shape.
74
+ */
75
+ run(args: ParsedArgs): Promise<EngineResult>;
76
+ /**
77
+ * Select the Playwright page matching the given URL.
78
+ * Uses backend.callTool('browser_tabs') to properly update the tab tracker.
79
+ */
80
+ selectPageByUrl(targetUrl: string): Promise<void>;
81
+ /**
82
+ * Shut down the browser and backend.
83
+ */
84
+ close(): Promise<void>;
85
+ private _buildConfig;
86
+ }
87
+ export {};
88
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,CAAC,EAAE,MAAM,EAAE,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAGD,UAAU,cAAc;IACtB,oBAAoB,EAAE,KAAK,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,KAAK,GAAG,CAAC;IACxE,cAAc,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK;QAAE,aAAa,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC;YAAE,cAAc,EAAE,GAAG,CAAC;YAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IAChK,UAAU,EAAE,GAAG,CAAC;IAChB,QAAQ,EAAE;QAAE,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;YAAE,cAAc,EAAE,MAAM,MAAM,GAAG,SAAS,CAAA;SAAE,GAAG,SAAS,CAAA;KAAE,CAAC;IACzG,aAAa,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACnD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,YAAY,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,CAAC;CAClG;AA6BD,qBAAa,MAAM;IAEjB,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,MAAM,CAAsC;IACpD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,WAAW,CAAwD;gBAG/D,IAAI,CAAC,EAAE,cAAc;IAIjC,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED;;OAEG;IACG,KAAK,CAAC,IAAI,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAkIjD;;;OAGG;IACG,GAAG,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IA6DlD;;;OAGG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAevD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAsBd,YAAY;CA0D3B"}
package/dist/engine.js ADDED
@@ -0,0 +1,346 @@
1
+ /**
2
+ * Engine — in-process Playwright backend.
3
+ *
4
+ * Wraps BrowserServerBackend directly, eliminating the daemon process.
5
+ * Provides the same interface as DaemonConnection: run(args), connected, close().
6
+ *
7
+ * Three connection modes:
8
+ * - launch: new browser via Playwright (default)
9
+ * - connect: existing Chrome via CDP port (--connect [port])
10
+ * - extension: DevTools extension CDP relay (--extension)
11
+ */
12
+ import { createRequire } from 'node:module';
13
+ import path from 'node:path';
14
+ import url from 'node:url';
15
+ import { replVersion } from './resolve.js';
16
+ /* eslint-enable @typescript-eslint/no-explicit-any */
17
+ // ─── Lazy-loaded Playwright dependencies ────────────────────────────────────
18
+ let _deps;
19
+ function loadDeps() {
20
+ if (_deps)
21
+ return _deps;
22
+ const require = createRequire(import.meta.url);
23
+ // Resolve absolute paths to bypass Playwright's exports map.
24
+ const pwDir = path.dirname(require.resolve('playwright/package.json'));
25
+ const pwReq = (sub) => require(path.join(pwDir, sub));
26
+ const pwCoreDir = path.dirname(require.resolve('playwright-core/package.json'));
27
+ const pwCoreReq = (sub) => require(path.join(pwCoreDir, sub));
28
+ _deps = {
29
+ BrowserServerBackend: pwReq('lib/mcp/browser/browserServerBackend.js').BrowserServerBackend,
30
+ contextFactory: pwReq('lib/mcp/browser/browserContextFactory.js').contextFactory,
31
+ playwright: require('playwright-core'),
32
+ registry: pwCoreReq('lib/server/registry/index.js').registry,
33
+ resolveConfig: pwReq('lib/mcp/browser/config.js').resolveConfig,
34
+ commands: pwReq('lib/cli/daemon/commands.js').commands,
35
+ parseCommand: pwReq('lib/cli/daemon/command.js').parseCommand,
36
+ };
37
+ return _deps;
38
+ }
39
+ // ─── Engine ─────────────────────────────────────────────────────────────────
40
+ export class Engine {
41
+ /* eslint-disable @typescript-eslint/no-explicit-any */
42
+ _deps;
43
+ _backend = null;
44
+ _browserContext = null;
45
+ _close = null;
46
+ _connected = false;
47
+ _commandServer = null;
48
+ _chromeProc = null;
49
+ /* eslint-enable @typescript-eslint/no-explicit-any */
50
+ constructor(deps) {
51
+ this._deps = deps;
52
+ }
53
+ get connected() {
54
+ return this._connected;
55
+ }
56
+ /**
57
+ * Start the engine with given options.
58
+ */
59
+ async start(opts = {}) {
60
+ const deps = this._deps || loadDeps();
61
+ const config = await this._buildConfig(opts, deps);
62
+ const cwd = url.pathToFileURL(process.cwd()).href;
63
+ const clientInfo = {
64
+ name: 'playwright-repl',
65
+ version: replVersion,
66
+ roots: [{ uri: cwd, name: 'cwd' }],
67
+ timestamp: Date.now(),
68
+ };
69
+ // Choose context factory based on mode.
70
+ if (opts.extension) {
71
+ const serverPort = opts.port || 6781;
72
+ const cdpPort = opts.cdpPort || 9222;
73
+ // 1. Start CommandServer for panel HTTP commands.
74
+ const { CommandServer } = await import('./extension-server.js');
75
+ const cmdServer = new CommandServer(this);
76
+ await cmdServer.start(serverPort);
77
+ this._commandServer = cmdServer;
78
+ console.log(`CommandServer listening on http://localhost:${serverPort}`);
79
+ // 2. Spawn Chrome (only with --spawn).
80
+ if (opts.spawn) {
81
+ const extPath = path.resolve(path.dirname(url.fileURLToPath(import.meta.url)), '../../extension/dist');
82
+ const execInfo = deps.registry.findExecutable(opts.browser || 'chrome');
83
+ const execPath = execInfo?.executablePath();
84
+ if (!execPath)
85
+ throw new Error('Chrome executable not found. Make sure Chrome is installed.');
86
+ // Chrome 136+ requires --user-data-dir for CDP. Use a dedicated profile dir.
87
+ const os = await import('node:os');
88
+ const fs = await import('node:fs');
89
+ const userDataDir = opts.profile || path.join(os.default.homedir(), '.playwright-repl', 'chrome-profile');
90
+ fs.default.mkdirSync(userDataDir, { recursive: true });
91
+ const chromeArgs = [
92
+ `--remote-debugging-port=${cdpPort}`,
93
+ `--user-data-dir=${userDataDir}`,
94
+ `--load-extension=${extPath}`,
95
+ '--no-first-run',
96
+ '--no-default-browser-check',
97
+ ];
98
+ const { spawn } = await import('node:child_process');
99
+ const chromeProc = spawn(execPath, chromeArgs, {
100
+ detached: true, stdio: 'ignore',
101
+ });
102
+ chromeProc.unref();
103
+ this._chromeProc = chromeProc;
104
+ console.log(`Chrome profile: ${userDataDir}`);
105
+ }
106
+ else {
107
+ console.log('Connecting to existing Chrome on port ' + cdpPort + ' (use --spawn to launch Chrome automatically)');
108
+ }
109
+ // 3. Wait for Chrome CDP to be ready (no timeout — waits until available).
110
+ console.log('Waiting for Chrome CDP...');
111
+ const cdpUrl = `http://localhost:${cdpPort}`;
112
+ while (true) {
113
+ try {
114
+ const res = await fetch(`${cdpUrl}/json/version`);
115
+ if (res.ok)
116
+ break;
117
+ }
118
+ catch { /* retry */ }
119
+ await new Promise(r => setTimeout(r, 500));
120
+ }
121
+ console.log('Chrome CDP ready. Connecting Playwright...');
122
+ // 4. Connect Playwright via CDP.
123
+ config.browser.cdpEndpoint = cdpUrl;
124
+ const factory = deps.contextFactory(config);
125
+ const { browserContext, close } = await factory.createContext(clientInfo, new AbortController().signal, {});
126
+ this._browserContext = browserContext;
127
+ this._close = close;
128
+ const existingContextFactory = {
129
+ createContext: () => Promise.resolve({ browserContext, close }),
130
+ };
131
+ this._backend = new deps.BrowserServerBackend(config, existingContextFactory, { allTools: true });
132
+ await this._backend.initialize?.(clientInfo);
133
+ this._connected = true;
134
+ // 5. Auto-select the first visible web page.
135
+ const pages = browserContext.pages();
136
+ const INTERNAL = /^(chrome|devtools|chrome-extension|about):/;
137
+ let selectedIdx = -1;
138
+ for (let i = 0; i < pages.length; i++) {
139
+ const pageUrl = pages[i].url();
140
+ if (!pageUrl || INTERNAL.test(pageUrl))
141
+ continue;
142
+ try {
143
+ const state = await pages[i].evaluate(() => document.visibilityState);
144
+ if (state === 'visible' && selectedIdx === -1) {
145
+ selectedIdx = i;
146
+ }
147
+ }
148
+ catch { /* skip */ }
149
+ }
150
+ if (selectedIdx > 0) {
151
+ await this._backend.callTool('browser_tabs', { action: 'select', index: selectedIdx });
152
+ }
153
+ console.log('Ready! Side panel can send commands.');
154
+ browserContext.on('close', () => {
155
+ this._connected = false;
156
+ });
157
+ }
158
+ else {
159
+ // Launch/connect mode: eagerly create context for immediate feedback.
160
+ const factory = deps.contextFactory(config);
161
+ const { browserContext, close } = await factory.createContext(clientInfo, new AbortController().signal, {});
162
+ this._browserContext = browserContext;
163
+ this._close = close;
164
+ const existingContextFactory = {
165
+ createContext: () => Promise.resolve({ browserContext, close }),
166
+ };
167
+ this._backend = new deps.BrowserServerBackend(config, existingContextFactory, { allTools: true });
168
+ await this._backend.initialize?.(clientInfo);
169
+ this._connected = true;
170
+ browserContext.on('close', () => {
171
+ this._connected = false;
172
+ });
173
+ }
174
+ }
175
+ /**
176
+ * Run a command given minimist-parsed args.
177
+ * Returns { text, isError } matching DaemonConnection.run() shape.
178
+ */
179
+ async run(args) {
180
+ if (!this._backend)
181
+ throw new Error('Engine not started');
182
+ // ── highlight → run-code translation ──
183
+ if (args._[0] === 'highlight') {
184
+ const loc = args._.slice(1).join(' ');
185
+ if (!loc)
186
+ return { text: 'Usage: highlight <locator>', isError: true };
187
+ const isSelector = /[.#\[\]>:=]/.test(loc);
188
+ const locExpr = isSelector
189
+ ? `page.locator(${JSON.stringify(loc)})`
190
+ : `page.getByText(${JSON.stringify(loc)})`;
191
+ args = { _: ['run-code', `async (page) => { await ${locExpr}.highlight(); return "Highlighted"; }`] };
192
+ }
193
+ // ── >> chaining → run-code translation ──
194
+ const LOCATOR_ACTIONS = {
195
+ click: 'click', dblclick: 'dblclick', hover: 'hover',
196
+ check: 'check', uncheck: 'uncheck',
197
+ fill: 'fill', select: 'selectOption',
198
+ };
199
+ if (LOCATOR_ACTIONS[args._[0]] && args._.some(a => a.includes('>>'))) {
200
+ const action = LOCATOR_ACTIONS[args._[0]];
201
+ const positional = args._.slice(1);
202
+ // Find last >> — everything up to the token after it is the selector,
203
+ // everything after that is the action argument (e.g., value for fill).
204
+ let lastChainIdx = -1;
205
+ for (let i = 0; i < positional.length; i++) {
206
+ if (positional[i] === '>>' || positional[i].includes('>>'))
207
+ lastChainIdx = i;
208
+ }
209
+ const selectorEnd = positional[lastChainIdx] !== '>>' && positional[lastChainIdx]?.includes('>>')
210
+ ? lastChainIdx // >> inside quoted token like ".nav >> button"
211
+ : lastChainIdx + 1;
212
+ const selector = positional.slice(0, selectorEnd + 1).join(' ');
213
+ const rest = positional.slice(selectorEnd + 1).join(' ');
214
+ const locExpr = `page.locator(${JSON.stringify(selector)})`;
215
+ const actionCall = rest
216
+ ? `${locExpr}.${action}(${JSON.stringify(rest)})`
217
+ : `${locExpr}.${action}()`;
218
+ args = { _: ['run-code', `async (page) => { await ${actionCall}; return "Done"; }`] };
219
+ }
220
+ const deps = this._deps || loadDeps();
221
+ const command = deps.commands[args._[0]];
222
+ if (!command)
223
+ throw new Error(`Unknown command: ${args._[0]}`);
224
+ const { toolName, toolParams } = deps.parseCommand(command, args);
225
+ // Commands like "close", "list", "kill-all" have empty toolName.
226
+ if (!toolName)
227
+ return { text: `Command "${args._[0]}" is not supported in engine mode.`, isError: true };
228
+ toolParams._meta = { cwd: args.cwd || process.cwd() };
229
+ const response = await this._backend.callTool(toolName, toolParams);
230
+ return formatResult(response);
231
+ }
232
+ /**
233
+ * Select the Playwright page matching the given URL.
234
+ * Uses backend.callTool('browser_tabs') to properly update the tab tracker.
235
+ */
236
+ async selectPageByUrl(targetUrl) {
237
+ if (!this._browserContext || !this._backend || !targetUrl)
238
+ return;
239
+ const pages = this._browserContext.pages();
240
+ const normalize = (u) => u.replace(/\/+$/, '');
241
+ const target = normalize(targetUrl);
242
+ for (let i = 0; i < pages.length; i++) {
243
+ if (normalize(pages[i].url()) === target) {
244
+ try {
245
+ await this._backend.callTool('browser_tabs', { action: 'select', index: i });
246
+ }
247
+ catch { /* ignore */ }
248
+ return;
249
+ }
250
+ }
251
+ }
252
+ /**
253
+ * Shut down the browser and backend.
254
+ */
255
+ async close() {
256
+ this._connected = false;
257
+ if (this._commandServer) {
258
+ await this._commandServer.close();
259
+ this._commandServer = null;
260
+ }
261
+ if (this._backend) {
262
+ this._backend.serverClosed();
263
+ this._backend = null;
264
+ }
265
+ if (this._close) {
266
+ await this._close();
267
+ this._close = null;
268
+ }
269
+ if (this._chromeProc) {
270
+ try {
271
+ this._chromeProc.kill();
272
+ }
273
+ catch { /* ignore */ }
274
+ this._chromeProc = null;
275
+ }
276
+ }
277
+ // ─── Config builder ───────────────────────────────────────────────────────
278
+ async _buildConfig(opts, deps) {
279
+ const config = {
280
+ browser: {
281
+ browserName: 'chromium',
282
+ launchOptions: {
283
+ channel: 'chrome',
284
+ headless: !opts.headed,
285
+ },
286
+ contextOptions: {
287
+ viewport: null,
288
+ },
289
+ isolated: false,
290
+ userDataDir: undefined,
291
+ cdpEndpoint: undefined,
292
+ },
293
+ server: {},
294
+ network: {},
295
+ timeouts: {
296
+ action: 5000,
297
+ navigation: 15000,
298
+ },
299
+ };
300
+ // Browser selection
301
+ if (opts.browser) {
302
+ switch (opts.browser) {
303
+ case 'firefox':
304
+ config.browser.browserName = 'firefox';
305
+ config.browser.launchOptions.channel = undefined;
306
+ break;
307
+ case 'webkit':
308
+ config.browser.browserName = 'webkit';
309
+ config.browser.launchOptions.channel = undefined;
310
+ break;
311
+ default:
312
+ // chrome, msedge, chrome-beta, etc.
313
+ config.browser.browserName = 'chromium';
314
+ config.browser.launchOptions.channel = opts.browser;
315
+ break;
316
+ }
317
+ }
318
+ // Persistent profile
319
+ if (opts.persistent || opts.profile) {
320
+ config.browser.userDataDir = opts.profile || undefined;
321
+ }
322
+ else if (!opts.extension) {
323
+ config.browser.isolated = true;
324
+ }
325
+ // CDP connect mode
326
+ if (opts.connect) {
327
+ const port = typeof opts.connect === 'number' ? opts.connect : 9222;
328
+ config.browser.cdpEndpoint = `http://localhost:${port}`;
329
+ config.browser.isolated = false;
330
+ }
331
+ return await deps.resolveConfig(config);
332
+ }
333
+ }
334
+ function formatResult(result) {
335
+ const isError = result.isError;
336
+ let text;
337
+ let image;
338
+ for (const item of result.content) {
339
+ if (item.type === 'text' && !text)
340
+ text = item.text;
341
+ if (item.type === 'image' && !image)
342
+ image = `data:${item.mimeType || 'image/png'};base64,${item.data}`;
343
+ }
344
+ return { isError, text, image };
345
+ }
346
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAyC3C,sDAAsD;AAEtD,+EAA+E;AAE/E,IAAI,KAAiC,CAAC;AAEtC,SAAS,QAAQ;IACf,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,6DAA6D;IAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC,CAAC;IACvE,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC,CAAC;IAChF,MAAM,SAAS,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;IACtE,KAAK,GAAG;QACN,oBAAoB,EAAM,KAAK,CAAC,yCAAyC,CAAC,CAAC,oBAAoB;QAC/F,cAAc,EAAY,KAAK,CAAC,0CAA0C,CAAC,CAAC,cAAc;QAC1F,UAAU,EAAgB,OAAO,CAAC,iBAAiB,CAAC;QACpD,QAAQ,EAAkB,SAAS,CAAC,8BAA8B,CAAC,CAAC,QAAQ;QAC5E,aAAa,EAAa,KAAK,CAAC,2BAA2B,CAAC,CAAC,aAAa;QAC1E,QAAQ,EAAkB,KAAK,CAAC,4BAA4B,CAAC,CAAC,QAAQ;QACtE,YAAY,EAAc,KAAK,CAAC,2BAA2B,CAAC,CAAC,YAAY;KAC1E,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,+EAA+E;AAE/E,MAAM,OAAO,MAAM;IACjB,uDAAuD;IAC/C,KAAK,CAA6B;IAClC,QAAQ,GAAQ,IAAI,CAAC;IACrB,eAAe,GAAQ,IAAI,CAAC;IAC5B,MAAM,GAAiC,IAAI,CAAC;IAC5C,UAAU,GAAG,KAAK,CAAC;IACnB,cAAc,GAA0C,IAAI,CAAC;IAC7D,WAAW,GAAmD,IAAI,CAAC;IAC3E,sDAAsD;IAEtD,YAAY,IAAqB;QAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,OAAmB,EAAE;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,IAAI,QAAQ,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAEnD,MAAM,GAAG,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC;QAClD,MAAM,UAAU,GAAG;YACjB,IAAI,EAAE,iBAAiB;YACvB,OAAO,EAAE,WAAW;YACpB,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YAClC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QAEF,wCAAwC;QACxC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;YAErC,kDAAkD;YAClD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;YAChE,MAAM,SAAS,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAClC,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,+CAA+C,UAAU,EAAE,CAAC,CAAC;YAEzE,uCAAuC;YACvC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC;gBACvG,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,CAAC;gBACxE,MAAM,QAAQ,GAAG,QAAQ,EAAE,cAAc,EAAE,CAAC;gBAC5C,IAAI,CAAC,QAAQ;oBACX,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;gBAEjF,6EAA6E;gBAC7E,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;gBACnC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;gBACnC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,kBAAkB,EAAE,gBAAgB,CAAC,CAAC;gBAC1G,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAEvD,MAAM,UAAU,GAAG;oBACjB,2BAA2B,OAAO,EAAE;oBACpC,mBAAmB,WAAW,EAAE;oBAChC,oBAAoB,OAAO,EAAE;oBAC7B,gBAAgB;oBAChB,4BAA4B;iBAC7B,CAAC;gBAEF,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;gBACrD,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,EAAE,UAAU,EAAE;oBAC7C,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ;iBAChC,CAAC,CAAC;gBACH,UAAU,CAAC,KAAK,EAAE,CAAC;gBACnB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,mBAAmB,WAAW,EAAE,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,wCAAwC,GAAG,OAAO,GAAG,+CAA+C,CAAC,CAAC;YACpH,CAAC;YAED,2EAA2E;YAC3E,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;YACzC,MAAM,MAAM,GAAG,oBAAoB,OAAO,EAAE,CAAC;YAC7C,OAAO,IAAI,EAAE,CAAC;gBACZ,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,eAAe,CAAC,CAAC;oBAClD,IAAI,GAAG,CAAC,EAAE;wBAAE,MAAM;gBACpB,CAAC;gBAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;gBACvB,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAC7C,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAE1D,iCAAiC;YAChC,MAAc,CAAC,OAAO,CAAC,WAAW,GAAG,MAAM,CAAC;YAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAC5C,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,CAAC,aAAa,CAC3D,UAAU,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE,CAC7C,CAAC;YACF,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;YACtC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YAEpB,MAAM,sBAAsB,GAAG;gBAC7B,aAAa,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;aAChE,CAAC;YACF,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,sBAAsB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAClG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,CAAC;YAC7C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YAEvB,6CAA6C;YAC7C,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,4CAA4C,CAAC;YAC9D,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC;YACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;gBAC/B,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;oBAAE,SAAS;gBACjD,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;oBACtE,IAAI,KAAK,KAAK,SAAS,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC;wBAC9C,WAAW,GAAG,CAAC,CAAC;oBAClB,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;YACxB,CAAC;YACD,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;YACzF,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;YAEpD,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBAC9B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YAC1B,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,sEAAsE;YACtE,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAC5C,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,CAAC,aAAa,CAC3D,UAAU,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE,CAC7C,CAAC;YACF,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;YACtC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YAEpB,MAAM,sBAAsB,GAAG;gBAC7B,aAAa,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;aAChE,CAAC;YACF,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,sBAAsB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAClG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,CAAC;YAC7C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YAEvB,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBAC9B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YAC1B,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,GAAG,CAAC,IAAgB;QACxB,IAAI,CAAC,IAAI,CAAC,QAAQ;YAChB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAExC,yCAAyC;QACzC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,WAAW,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtC,IAAI,CAAC,GAAG;gBAAE,OAAO,EAAE,IAAI,EAAE,4BAA4B,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACvE,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC3C,MAAM,OAAO,GAAG,UAAU;gBACxB,CAAC,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG;gBACxC,CAAC,CAAC,kBAAkB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;YAC7C,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,2BAA2B,OAAO,uCAAuC,CAAC,EAAE,CAAC;QACxG,CAAC;QAED,2CAA2C;QAC3C,MAAM,eAAe,GAA2B;YAC9C,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO;YACpD,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS;YAClC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc;SACrC,CAAC;QACF,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACrE,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAEnC,sEAAsE;YACtE,uEAAuE;YACvE,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;YACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAAE,YAAY,GAAG,CAAC,CAAC;YAC/E,CAAC;YACD,MAAM,WAAW,GAAG,UAAU,CAAC,YAAY,CAAC,KAAK,IAAI,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC;gBAC/F,CAAC,CAAC,YAAY,CAAK,+CAA+C;gBAClE,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC;YACrB,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChE,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEzD,MAAM,OAAO,GAAG,gBAAgB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC;YAC5D,MAAM,UAAU,GAAG,IAAI;gBACrB,CAAC,CAAC,GAAG,OAAO,IAAI,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG;gBACjD,CAAC,CAAC,GAAG,OAAO,IAAI,MAAM,IAAI,CAAC;YAC7B,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,2BAA2B,UAAU,oBAAoB,CAAC,EAAE,CAAC;QACxF,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,IAAI,QAAQ,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO;YACV,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAEnD,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAElE,iEAAiE;QACjE,IAAI,CAAC,QAAQ;YACX,OAAO,EAAE,IAAI,EAAE,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,oCAAoC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAE5F,UAAU,CAAC,KAAK,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;QAEtD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACpE,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,eAAe,CAAC,SAAiB;QACrC,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS;YAAE,OAAO;QAClE,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC3C,MAAM,SAAS,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,EAAE,CAAC;gBACzC,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC/E,CAAC;gBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;gBACxB,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;YAClC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC;gBAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YACvD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,6EAA6E;IAErE,KAAK,CAAC,YAAY,CAAC,IAAgB,EAAE,IAAoB;QAC/D,MAAM,MAAM,GAAG;YACb,OAAO,EAAE;gBACP,WAAW,EAAE,UAAU;gBACvB,aAAa,EAAE;oBACb,OAAO,EAAE,QAA8B;oBACvC,QAAQ,EAAE,CAAC,IAAI,CAAC,MAAM;iBACvB;gBACD,cAAc,EAAE;oBACd,QAAQ,EAAE,IAAY;iBACvB;gBACD,QAAQ,EAAE,KAAK;gBACf,WAAW,EAAE,SAA+B;gBAC5C,WAAW,EAAE,SAA+B;aAC7C;YACD,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,EAAE;YACX,QAAQ,EAAE;gBACR,MAAM,EAAE,IAAI;gBACZ,UAAU,EAAE,KAAK;aAClB;SACF,CAAC;QAEF,oBAAoB;QACpB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;gBACrB,KAAK,SAAS;oBACZ,MAAM,CAAC,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;oBACvC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,GAAG,SAAS,CAAC;oBACjD,MAAM;gBACR,KAAK,QAAQ;oBACX,MAAM,CAAC,OAAO,CAAC,WAAW,GAAG,QAAQ,CAAC;oBACtC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,GAAG,SAAS,CAAC;oBACjD,MAAM;gBACR;oBACE,oCAAoC;oBACpC,MAAM,CAAC,OAAO,CAAC,WAAW,GAAG,UAAU,CAAC;oBACxC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;oBACpD,MAAM;YACV,CAAC;QACH,CAAC;QAED,qBAAqB;QACrB,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACpC,MAAM,CAAC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC;QACzD,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAC3B,MAAM,CAAC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;QACjC,CAAC;QAED,mBAAmB;QACnB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;YACpE,MAAM,CAAC,OAAO,CAAC,WAAW,GAAG,oBAAoB,IAAI,EAAE,CAAC;YACxD,MAAM,CAAC,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC;QAClC,CAAC;QAED,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;CACF;AASD,SAAS,YAAY,CAAC,MAAkB;IACtC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC/B,IAAI,IAAwB,CAAC;IAC7B,IAAI,KAAyB,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,IAAI;YAAE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACpD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK;YAAE,KAAK,GAAG,QAAQ,IAAI,CAAC,QAAQ,IAAI,WAAW,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1G,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * CommandServer — HTTP server for the side panel extension.
3
+ *
4
+ * Endpoints:
5
+ * POST /run Panel commands → engine.run()
6
+ * GET /health Panel checks if server is running
7
+ */
8
+ import type { ParsedArgs, EngineResult } from './engine.js';
9
+ interface EngineInterface {
10
+ run: (args: ParsedArgs) => Promise<EngineResult>;
11
+ selectPageByUrl: (url: string) => Promise<void>;
12
+ connected: boolean;
13
+ }
14
+ export declare class CommandServer {
15
+ private _engine;
16
+ private _server;
17
+ private _port;
18
+ constructor(engine: EngineInterface);
19
+ get port(): number | null;
20
+ start(port?: number): Promise<void>;
21
+ close(): Promise<void>;
22
+ private _handleHttp;
23
+ }
24
+ export {};
25
+ //# sourceMappingURL=extension-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-server.d.ts","sourceRoot":"","sources":["../src/extension-server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI5D,UAAU,eAAe;IACvB,GAAG,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACjD,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,SAAS,EAAE,OAAO,CAAC;CACpB;AAID,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,KAAK,CAAuB;gBAExB,MAAM,EAAE,eAAe;IAInC,IAAI,IAAI,IAAI,MAAM,GAAG,IAAI,CAAuB;IAE1C,KAAK,CAAC,IAAI,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAYjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YASd,WAAW;CAsD1B"}