@browsers-cli/se-cli 0.1.0

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 (87) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +379 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +14 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/config.d.ts +17 -0
  7. package/dist/config.js +80 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/daemon/backend.d.ts +9 -0
  10. package/dist/daemon/backend.js +52 -0
  11. package/dist/daemon/backend.js.map +1 -0
  12. package/dist/daemon/server.d.ts +1 -0
  13. package/dist/daemon/server.js +341 -0
  14. package/dist/daemon/server.js.map +1 -0
  15. package/dist/daemon/tools/check.d.ts +7 -0
  16. package/dist/daemon/tools/check.js +20 -0
  17. package/dist/daemon/tools/check.js.map +1 -0
  18. package/dist/daemon/tools/click.d.ts +4 -0
  19. package/dist/daemon/tools/click.js +14 -0
  20. package/dist/daemon/tools/click.js.map +1 -0
  21. package/dist/daemon/tools/eval.d.ts +5 -0
  22. package/dist/daemon/tools/eval.js +18 -0
  23. package/dist/daemon/tools/eval.js.map +1 -0
  24. package/dist/daemon/tools/fill.d.ts +6 -0
  25. package/dist/daemon/tools/fill.js +25 -0
  26. package/dist/daemon/tools/fill.js.map +1 -0
  27. package/dist/daemon/tools/find.d.ts +5 -0
  28. package/dist/daemon/tools/find.js +84 -0
  29. package/dist/daemon/tools/find.js.map +1 -0
  30. package/dist/daemon/tools/goto.d.ts +4 -0
  31. package/dist/daemon/tools/goto.js +25 -0
  32. package/dist/daemon/tools/goto.js.map +1 -0
  33. package/dist/daemon/tools/index.d.ts +1 -0
  34. package/dist/daemon/tools/index.js +37 -0
  35. package/dist/daemon/tools/index.js.map +1 -0
  36. package/dist/daemon/tools/navigation.d.ts +4 -0
  37. package/dist/daemon/tools/navigation.js +21 -0
  38. package/dist/daemon/tools/navigation.js.map +1 -0
  39. package/dist/daemon/tools/press.d.ts +4 -0
  40. package/dist/daemon/tools/press.js +23 -0
  41. package/dist/daemon/tools/press.js.map +1 -0
  42. package/dist/daemon/tools/screenshot.d.ts +5 -0
  43. package/dist/daemon/tools/screenshot.js +57 -0
  44. package/dist/daemon/tools/screenshot.js.map +1 -0
  45. package/dist/daemon/tools/select.d.ts +5 -0
  46. package/dist/daemon/tools/select.js +13 -0
  47. package/dist/daemon/tools/select.js.map +1 -0
  48. package/dist/daemon/tools/shared.d.ts +4 -0
  49. package/dist/daemon/tools/shared.js +35 -0
  50. package/dist/daemon/tools/shared.js.map +1 -0
  51. package/dist/daemon/tools/snapshot.d.ts +6 -0
  52. package/dist/daemon/tools/snapshot.js +90 -0
  53. package/dist/daemon/tools/snapshot.js.map +1 -0
  54. package/dist/daemon/tools/title.d.ts +2 -0
  55. package/dist/daemon/tools/title.js +8 -0
  56. package/dist/daemon/tools/title.js.map +1 -0
  57. package/dist/daemon/tools/type.d.ts +4 -0
  58. package/dist/daemon/tools/type.js +9 -0
  59. package/dist/daemon/tools/type.js.map +1 -0
  60. package/dist/daemon/tools/url.d.ts +2 -0
  61. package/dist/daemon/tools/url.js +8 -0
  62. package/dist/daemon/tools/url.js.map +1 -0
  63. package/dist/minimist.d.ts +10 -0
  64. package/dist/minimist.js +52 -0
  65. package/dist/minimist.js.map +1 -0
  66. package/dist/output.d.ts +6 -0
  67. package/dist/output.js +32 -0
  68. package/dist/output.js.map +1 -0
  69. package/dist/program.d.ts +2 -0
  70. package/dist/program.js +200 -0
  71. package/dist/program.js.map +1 -0
  72. package/dist/protocol.d.ts +29 -0
  73. package/dist/protocol.js +3 -0
  74. package/dist/protocol.js.map +1 -0
  75. package/dist/registry.d.ts +19 -0
  76. package/dist/registry.js +91 -0
  77. package/dist/registry.js.map +1 -0
  78. package/dist/response.d.ts +23 -0
  79. package/dist/response.js +64 -0
  80. package/dist/response.js.map +1 -0
  81. package/dist/session.d.ts +23 -0
  82. package/dist/session.js +264 -0
  83. package/dist/session.js.map +1 -0
  84. package/dist/snapshot/aria-snapshot.d.ts +1 -0
  85. package/dist/snapshot/aria-snapshot.js +200 -0
  86. package/dist/snapshot/aria-snapshot.js.map +1 -0
  87. package/package.json +55 -0
package/dist/config.js ADDED
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.defaultSessionName = void 0;
37
+ exports.userHash = userHash;
38
+ exports.workspaceHash = workspaceHash;
39
+ exports.makeSocketPath = makeSocketPath;
40
+ exports.baseDaemonDir = baseDaemonDir;
41
+ exports.sessionFileDir = sessionFileDir;
42
+ exports.sessionFilePath = sessionFilePath;
43
+ exports.outputDir = outputDir;
44
+ const crypto = __importStar(require("crypto"));
45
+ const os = __importStar(require("os"));
46
+ const path = __importStar(require("path"));
47
+ exports.defaultSessionName = 'default';
48
+ function userHash() {
49
+ const user = process.env.USERNAME || process.env.USER || 'default';
50
+ return crypto.createHash('sha1').update(user).digest('hex').slice(0, 8);
51
+ }
52
+ function workspaceHash(workspaceDir) {
53
+ return crypto.createHash('sha1').update(workspaceDir).digest('hex').slice(0, 16);
54
+ }
55
+ function makeSocketPath(wsHash, sessionName) {
56
+ const uHash = userHash();
57
+ if (process.platform === 'win32') {
58
+ return `\\\\.\\pipe\\se-cli-${uHash}-${wsHash}-${sessionName}`;
59
+ }
60
+ // Use a flat path under TMPDIR to avoid:
61
+ // 1. needing to create nested directories before listen(), and
62
+ // 2. exceeding macOS sun_path 104-byte limit on long TMPDIR values.
63
+ const tmpDir = process.env.TMPDIR || '/tmp';
64
+ return path.join(tmpDir, `se-cli-${uHash}-${wsHash}-${sessionName}.sock`);
65
+ }
66
+ function baseDaemonDir() {
67
+ const cacheDir = process.env.LOCALAPPDATA
68
+ || (process.platform === 'darwin' ? path.join(os.homedir(), 'Library', 'Caches') : path.join(os.homedir(), '.cache'));
69
+ return path.join(cacheDir, 'ms-se-cli', 'daemon');
70
+ }
71
+ function sessionFileDir(wsHash) {
72
+ return path.join(baseDaemonDir(), wsHash);
73
+ }
74
+ function sessionFilePath(wsHash, sessionName) {
75
+ return path.join(sessionFileDir(wsHash), `${sessionName}.session`);
76
+ }
77
+ function outputDir(cwd) {
78
+ return path.join(cwd, '.se-cli');
79
+ }
80
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,4BAGC;AAED,sCAEC;AAED,wCAUC;AAED,sCAIC;AAED,wCAEC;AAED,0CAEC;AAYD,8BAEC;AArDD,+CAAiC;AACjC,uCAAyB;AACzB,2CAA6B;AAEhB,QAAA,kBAAkB,GAAG,SAAS,CAAC;AAE5C,SAAgB,QAAQ;IACtB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,SAAS,CAAC;IACnE,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,SAAgB,aAAa,CAAC,YAAoB;IAChD,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACnF,CAAC;AAED,SAAgB,cAAc,CAAC,MAAc,EAAE,WAAmB;IAChE,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,uBAAuB,KAAK,IAAI,MAAM,IAAI,WAAW,EAAE,CAAC;IACjE,CAAC;IACD,yCAAyC;IACzC,iEAAiE;IACjE,sEAAsE;IACtE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC;IAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,MAAM,IAAI,WAAW,OAAO,CAAC,CAAC;AAC5E,CAAC;AAED,SAAgB,aAAa;IAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY;WACpC,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;IACxH,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;AACpD,CAAC;AAED,SAAgB,cAAc,CAAC,MAAc;IAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,SAAgB,eAAe,CAAC,MAAc,EAAE,WAAmB;IACjE,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,GAAG,WAAW,UAAU,CAAC,CAAC;AACrE,CAAC;AAYD,SAAgB,SAAS,CAAC,GAAW;IACnC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { Response } from '../response';
2
+ export declare function callTool(driver: any, toolName: string, params: any, responseOpts: {
3
+ raw: boolean;
4
+ json: boolean;
5
+ }): Promise<Response>;
6
+ export declare function parseCommand(args: string[]): {
7
+ toolName: string;
8
+ toolParams: any;
9
+ };
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.callTool = callTool;
4
+ exports.parseCommand = parseCommand;
5
+ const response_1 = require("../response");
6
+ const minimist_1 = require("../minimist");
7
+ const tools_1 = require("./tools");
8
+ async function callTool(driver, toolName, params, responseOpts) {
9
+ const handler = tools_1.tools[toolName];
10
+ if (!handler) {
11
+ const r = new response_1.Response(responseOpts);
12
+ r.addError(`Unknown tool: ${toolName}`);
13
+ return r;
14
+ }
15
+ const response = new response_1.Response(responseOpts);
16
+ await handler(driver, params, response);
17
+ return response;
18
+ }
19
+ function parseCommand(args) {
20
+ const [cmd, ...rest] = args;
21
+ // Parse flags from rest using minimist
22
+ const parsed = (0, minimist_1.parseArgs)(rest, {
23
+ boolean: ['submit'],
24
+ string: ['filename', 'depth', 'regex'],
25
+ alias: {},
26
+ });
27
+ const positional = parsed._;
28
+ const commands = {
29
+ 'goto': () => ({ toolName: 'browser_goto', toolParams: { url: positional[0] } }),
30
+ 'go-back': () => ({ toolName: 'browser_go_back', toolParams: {} }),
31
+ 'go-forward': () => ({ toolName: 'browser_go_forward', toolParams: {} }),
32
+ 'reload': () => ({ toolName: 'browser_reload', toolParams: {} }),
33
+ 'title': () => ({ toolName: 'browser_title', toolParams: {} }),
34
+ 'url': () => ({ toolName: 'browser_url', toolParams: {} }),
35
+ 'click': () => ({ toolName: 'browser_click', toolParams: { target: positional[0] } }),
36
+ 'fill': () => ({ toolName: 'browser_fill', toolParams: { target: positional[0], value: positional[1], submit: parsed.submit } }),
37
+ 'type': () => ({ toolName: 'browser_type', toolParams: { value: positional[0] } }),
38
+ 'press': () => ({ toolName: 'browser_press', toolParams: { key: positional[0] } }),
39
+ 'select': () => ({ toolName: 'browser_select', toolParams: { target: positional[0], value: positional[1] } }),
40
+ 'check': () => ({ toolName: 'browser_check', toolParams: { target: positional[0] } }),
41
+ 'uncheck': () => ({ toolName: 'browser_uncheck', toolParams: { target: positional[0] } }),
42
+ 'snapshot': () => ({ toolName: 'browser_snapshot', toolParams: { target: positional[0], depth: parsed.depth ? parseInt(parsed.depth) : undefined, filename: parsed.filename } }),
43
+ 'find': () => ({ toolName: 'browser_find', toolParams: { text: positional[0], regex: parsed.regex } }),
44
+ 'screenshot': () => ({ toolName: 'browser_screenshot', toolParams: { target: positional[0], filename: parsed.filename } }),
45
+ 'eval': () => ({ toolName: 'browser_eval', toolParams: { script: positional[0], target: positional[1] } }),
46
+ };
47
+ const factory = commands[cmd];
48
+ if (!factory)
49
+ throw new Error(`Unknown command: ${cmd}`);
50
+ return factory();
51
+ }
52
+ //# sourceMappingURL=backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/daemon/backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,341 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const net = __importStar(require("net"));
37
+ const fs = __importStar(require("fs"));
38
+ const registry_1 = require("../registry");
39
+ const config_1 = require("../config");
40
+ const args = process.argv.slice(2);
41
+ const sessionName = args[0];
42
+ const socketPath = args[1];
43
+ const workspaceDir = args[2];
44
+ const browserName = args[3] || 'chrome';
45
+ const headed = args.includes('--headed');
46
+ const cdpEndpoint = args.find(a => a.startsWith('--cdp='))?.slice('--cdp='.length);
47
+ const version = require('../../package.json').version;
48
+ const ALLOWED_BROWSERS = new Set(['chrome', 'edge', 'firefox']);
49
+ if (!ALLOWED_BROWSERS.has(browserName)) {
50
+ throw new Error(`Unsupported browser: ${browserName}. Supported: chrome, edge, firefox`);
51
+ }
52
+ let driver = null;
53
+ let driverInitError = null;
54
+ let lastActivity = Date.now();
55
+ const crypto = require('crypto');
56
+ const wsHash = crypto.createHash('sha1').update(workspaceDir).digest('hex').slice(0, 16);
57
+ const registry = new registry_1.Registry((0, config_1.baseDaemonDir)());
58
+ // Track the current socket so we can send an error response if the
59
+ // process crashes unexpectedly (e.g. native browser driver crash).
60
+ let activeSocket = null;
61
+ const server = net.createServer((socket) => {
62
+ activeSocket = socket;
63
+ let buffer = '';
64
+ socket.on('data', async (data) => {
65
+ buffer += data.toString();
66
+ const lines = buffer.split('\n');
67
+ buffer = lines.pop() || '';
68
+ for (const line of lines) {
69
+ if (!line.trim())
70
+ continue;
71
+ try {
72
+ const msg = JSON.parse(line);
73
+ lastActivity = Date.now();
74
+ // Handle 'stop' specially: send response before shutting down,
75
+ // otherwise process.exit() kills the socket before the client
76
+ // receives the acknowledgement.
77
+ if (msg.method === 'stop') {
78
+ socket.write(JSON.stringify({ ok: true, text: 'stopping' }) + '\n');
79
+ socket.end();
80
+ shutdown();
81
+ return;
82
+ }
83
+ const response = await handleMessage(msg);
84
+ socket.write(JSON.stringify(response) + '\n');
85
+ }
86
+ catch (e) {
87
+ const errResp = { ok: false, error: e.message, code: 'DRIVER_ERROR' };
88
+ try {
89
+ socket.write(JSON.stringify(errResp) + '\n');
90
+ }
91
+ catch { }
92
+ }
93
+ }
94
+ });
95
+ socket.on('error', () => {
96
+ // Silently ignore socket errors (client disconnect, EPIPE, etc.)
97
+ });
98
+ });
99
+ async function buildDriver() {
100
+ const { Builder } = require('selenium-webdriver');
101
+ // selenium-webdriver expects 'MicrosoftEdge' for Edge, not 'edge'.
102
+ const seleniumBrowserName = browserName === 'edge' ? 'MicrosoftEdge' : browserName;
103
+ const builder = new Builder().forBrowser(seleniumBrowserName);
104
+ if (browserName === 'chrome') {
105
+ const chromeArgs = [];
106
+ if (!headed && !cdpEndpoint) {
107
+ chromeArgs.push('--headless=new', '--no-sandbox', '--disable-dev-shm-usage', '--disable-gpu');
108
+ }
109
+ const chromeOpts = { args: chromeArgs };
110
+ if (cdpEndpoint)
111
+ chromeOpts.debuggerAddress = cdpEndpoint;
112
+ // Allow overriding the Chrome binary path via env var (useful in CI).
113
+ if (process.env.SE_CHROME_BINARY)
114
+ chromeOpts.binary = process.env.SE_CHROME_BINARY;
115
+ builder.getCapabilities().set('goog:chromeOptions', chromeOpts);
116
+ }
117
+ else if (browserName === 'edge') {
118
+ const edgeArgs = [];
119
+ if (!headed) {
120
+ edgeArgs.push('--headless=new', '--no-sandbox', '--disable-dev-shm-usage', '--disable-gpu');
121
+ }
122
+ const edgeOpts = { args: edgeArgs };
123
+ if (cdpEndpoint)
124
+ edgeOpts.debuggerAddress = cdpEndpoint;
125
+ if (process.env.SE_EDGE_BINARY)
126
+ edgeOpts.binary = process.env.SE_EDGE_BINARY;
127
+ builder.getCapabilities().set('ms:edgeOptions', edgeOpts);
128
+ }
129
+ else if (browserName === 'firefox') {
130
+ const firefoxOpts = {};
131
+ if (!headed) {
132
+ firefoxOpts.args = ['-headless'];
133
+ }
134
+ // Allow overriding the Firefox binary path via env var (useful in CI
135
+ // where browser-actions/setup-firefox installs to a non-standard path).
136
+ if (process.env.SE_FIREFOX_BINARY)
137
+ firefoxOpts.binary = process.env.SE_FIREFOX_BINARY;
138
+ builder.getCapabilities().set('moz:firefoxOptions', firefoxOpts);
139
+ }
140
+ // Add a timeout so builder.build() doesn't hang indefinitely if
141
+ // the browser driver process stalls.
142
+ const buildPromise = builder.build();
143
+ const timeoutPromise = new Promise((_, reject) => {
144
+ setTimeout(() => reject(new Error(`Timed out building ${browserName} driver after 60s`)), 60000);
145
+ });
146
+ driver = await Promise.race([buildPromise, timeoutPromise]);
147
+ driverInitError = null;
148
+ }
149
+ async function handleMessage(msg) {
150
+ if (msg.method === 'ping')
151
+ return { ok: true, text: 'pong' };
152
+ // method === 'run' — dispatch to backend
153
+ const { callTool, parseCommand } = require('./backend');
154
+ try {
155
+ if (!driver) {
156
+ if (driverInitError) {
157
+ return { ok: false, error: driverInitError, code: 'DRIVER_ERROR' };
158
+ }
159
+ try {
160
+ await buildDriver();
161
+ }
162
+ catch (e) {
163
+ driverInitError = `Failed to build ${browserName} driver: ${e.message}`;
164
+ process.stderr.write(driverInitError + '\n' + (e.stack || '') + '\n');
165
+ return { ok: false, error: driverInitError, code: 'DRIVER_ERROR' };
166
+ }
167
+ }
168
+ const { toolName, toolParams } = parseCommand(msg.params.args);
169
+ const response = await callTool(driver, toolName, toolParams, { raw: !!msg.params.raw, json: !!msg.params.json });
170
+ return { ok: true, text: response.serialize() };
171
+ }
172
+ catch (e) {
173
+ let code = 'DRIVER_ERROR';
174
+ const name = e.name || '';
175
+ if (name === 'NoSuchElementError' || name === 'StaleElementReferenceError')
176
+ code = 'ELEMENT_NOT_FOUND';
177
+ else if (name === 'TimeoutError')
178
+ code = 'TIMEOUT';
179
+ return { ok: false, error: e.message, code };
180
+ }
181
+ }
182
+ async function shutdown() {
183
+ // Close the server first so no new connections are accepted.
184
+ server.close();
185
+ if (process.platform !== 'win32') {
186
+ try {
187
+ fs.unlinkSync(socketPath);
188
+ }
189
+ catch { }
190
+ }
191
+ // Quit the driver with a timeout — if it hangs, we still exit.
192
+ try {
193
+ await Promise.race([
194
+ driver ? driver.quit() : Promise.resolve(),
195
+ new Promise((_, reject) => setTimeout(() => reject(new Error('driver quit timeout')), 5000)),
196
+ ]);
197
+ }
198
+ catch (e) {
199
+ process.stderr.write(`driver quit failed: ${e.message}\n`);
200
+ }
201
+ // NOTE: Do NOT delete the session file here. The CLI's stop() method
202
+ // handles session file cleanup AFTER the daemon has exited. If the
203
+ // daemon deletes the file during shutdown(), it may race with a new
204
+ // daemon that has already written its own session file, causing the
205
+ // "list" command to return empty results.
206
+ process.exit(0);
207
+ }
208
+ // Catch uncaught exceptions so the daemon doesn't silently crash.
209
+ // Try to send an error response to the client. For errors that occur
210
+ // during driver operations, reset the driver so the next command can
211
+ // attempt to rebuild it rather than killing the daemon entirely.
212
+ process.on('uncaughtException', (err) => {
213
+ // Silently ignore EPIPE/ECONNRESET — these happen when the parent
214
+ // process closes its end of the stdio pipe after the daemon starts.
215
+ const msg = err.message || '';
216
+ if (msg.includes('EPIPE') || msg.includes('ECONNRESET') || msg.includes('write EPIPE')) {
217
+ return;
218
+ }
219
+ process.stderr.write(`Uncaught exception: ${err.message}\n${err.stack || ''}\n`);
220
+ if (activeSocket && !activeSocket.destroyed) {
221
+ try {
222
+ const errResp = { ok: false, error: `daemon crash: ${err.message}`, code: 'DRIVER_ERROR' };
223
+ activeSocket.write(JSON.stringify(errResp) + '\n');
224
+ activeSocket.end();
225
+ }
226
+ catch { }
227
+ }
228
+ // Reset driver state so subsequent commands can try to rebuild.
229
+ // Only exit if the error is not driver-related (e.g. out of memory).
230
+ const isDriverError = msg.includes('driver') || msg.includes('WebDriver') ||
231
+ msg.includes('Session') || msg.includes('geckodriver') || msg.includes('chromedriver');
232
+ if (isDriverError) {
233
+ try {
234
+ if (driver)
235
+ driver.quit();
236
+ }
237
+ catch { }
238
+ driver = null;
239
+ driverInitError = null;
240
+ }
241
+ else {
242
+ shutdown();
243
+ }
244
+ });
245
+ // Catch unhandled promise rejections — same strategy as uncaught exceptions.
246
+ process.on('unhandledRejection', (err) => {
247
+ const msg = err instanceof Error ? err.message : String(err);
248
+ if (msg.includes('EPIPE') || msg.includes('ECONNRESET') || msg.includes('write EPIPE')) {
249
+ return;
250
+ }
251
+ process.stderr.write(`Unhandled rejection: ${msg}\n${err instanceof Error ? err.stack || '' : ''}\n`);
252
+ if (activeSocket && !activeSocket.destroyed) {
253
+ try {
254
+ const errResp = { ok: false, error: `daemon rejection: ${msg}`, code: 'DRIVER_ERROR' };
255
+ activeSocket.write(JSON.stringify(errResp) + '\n');
256
+ activeSocket.end();
257
+ }
258
+ catch { }
259
+ }
260
+ const isDriverError = msg.includes('driver') || msg.includes('WebDriver') ||
261
+ msg.includes('Session') || msg.includes('geckodriver') || msg.includes('chromedriver');
262
+ if (isDriverError) {
263
+ try {
264
+ if (driver)
265
+ driver.quit();
266
+ }
267
+ catch { }
268
+ driver = null;
269
+ driverInitError = null;
270
+ }
271
+ else {
272
+ shutdown();
273
+ }
274
+ });
275
+ // Prevent broken-pipe errors on stdout/stderr from crashing the daemon.
276
+ // After the parent process unrefs the stdio pipes, writes may fail with
277
+ // EPIPE. Swallow these errors so the daemon stays alive.
278
+ process.stdout?.on?.('error', () => { });
279
+ process.stderr?.on?.('error', () => { });
280
+ process.on('SIGTERM', shutdown);
281
+ process.on('SIGINT', shutdown);
282
+ setInterval(() => {
283
+ if (Date.now() - lastActivity > 30 * 60 * 1000)
284
+ shutdown();
285
+ }, 60 * 1000);
286
+ // Heartbeat: periodically check driver health via getTitle()
287
+ setInterval(async () => {
288
+ if (!driver)
289
+ return;
290
+ try {
291
+ await driver.getTitle();
292
+ }
293
+ catch (e) {
294
+ process.stderr.write('heartbeat failed: ' + e.message + '\n');
295
+ // Don't immediately shut down on heartbeat failure — the error might
296
+ // be transient (e.g. page navigation in progress). Just log it.
297
+ // The next client command will fail with a proper error if the
298
+ // driver is truly dead.
299
+ }
300
+ }, 60 * 1000);
301
+ const config = {
302
+ name: sessionName,
303
+ version,
304
+ timestamp: Date.now(),
305
+ socketPath,
306
+ workspaceDir,
307
+ persistent: false,
308
+ browserName,
309
+ pid: process.pid,
310
+ };
311
+ registry.writeSession(wsHash, config);
312
+ server.on('error', (err) => {
313
+ process.stderr.write(`Server error: ${err.message}\n`);
314
+ shutdown();
315
+ });
316
+ // Remove stale socket file on POSIX
317
+ if (process.platform !== 'win32') {
318
+ try {
319
+ fs.unlinkSync(socketPath);
320
+ }
321
+ catch { }
322
+ }
323
+ // Pre-build the driver BEFORE listening so the first client command doesn't
324
+ // have to wait for driver initialization. On Windows CI, the first Chrome
325
+ // driver build can take >30s (Selenium Manager downloads the driver), which
326
+ // exceeds the client's sendAndClose timeout and causes spurious failures.
327
+ // If the build fails, we still start listening — the error is reported to
328
+ // the client on their first command via driverInitError.
329
+ (async () => {
330
+ try {
331
+ await buildDriver();
332
+ }
333
+ catch (e) {
334
+ driverInitError = `Failed to build ${browserName} driver: ${e.message}`;
335
+ process.stderr.write(driverInitError + '\n' + (e.stack || '') + '\n');
336
+ }
337
+ server.listen(socketPath, () => {
338
+ console.log(`Daemon listening on ${socketPath}`);
339
+ });
340
+ })();
341
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Response } from '../../response';
2
+ export declare function browser_check(driver: any, params: {
3
+ target: string;
4
+ }, response: Response): Promise<void>;
5
+ export declare function browser_uncheck(driver: any, params: {
6
+ target: string;
7
+ }, response: Response): Promise<void>;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.browser_check = browser_check;
4
+ exports.browser_uncheck = browser_uncheck;
5
+ const shared_1 = require("./shared");
6
+ async function browser_check(driver, params, response) {
7
+ const el = await (0, shared_1.findElement)(driver, params.target);
8
+ if (!(await el.isSelected()))
9
+ await el.click();
10
+ response.addCode(`const el = driver.findElement(${(0, shared_1.byToString)(params.target)}); if (!(await el.isSelected())) await el.click();`);
11
+ response.addResult('checked');
12
+ }
13
+ async function browser_uncheck(driver, params, response) {
14
+ const el = await (0, shared_1.findElement)(driver, params.target);
15
+ if (await el.isSelected())
16
+ await el.click();
17
+ response.addCode(`const el = driver.findElement(${(0, shared_1.byToString)(params.target)}); if (await el.isSelected()) await el.click();`);
18
+ response.addResult('unchecked');
19
+ }
20
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/daemon/tools/check.ts"],"names":[],"mappings":";;AAGA,sCAKC;AAED,0CAKC;AAdD,qCAAmD;AAE5C,KAAK,UAAU,aAAa,CAAC,MAAW,EAAE,MAA0B,EAAE,QAAkB;IAC7F,MAAM,EAAE,GAAG,MAAM,IAAA,oBAAW,EAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACpD,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,CAAC;QAAE,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;IAC/C,QAAQ,CAAC,OAAO,CAAC,iCAAiC,IAAA,mBAAU,EAAC,MAAM,CAAC,MAAM,CAAC,oDAAoD,CAAC,CAAC;IACjI,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AAChC,CAAC;AAEM,KAAK,UAAU,eAAe,CAAC,MAAW,EAAE,MAA0B,EAAE,QAAkB;IAC/F,MAAM,EAAE,GAAG,MAAM,IAAA,oBAAW,EAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACpD,IAAI,MAAM,EAAE,CAAC,UAAU,EAAE;QAAE,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;IAC5C,QAAQ,CAAC,OAAO,CAAC,iCAAiC,IAAA,mBAAU,EAAC,MAAM,CAAC,MAAM,CAAC,iDAAiD,CAAC,CAAC;IAC9H,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Response } from '../../response';
2
+ export declare function browser_click(driver: any, params: {
3
+ target: string;
4
+ }, response: Response): Promise<void>;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.browser_click = browser_click;
4
+ const shared_1 = require("./shared");
5
+ async function browser_click(driver, params, response) {
6
+ const el = await (0, shared_1.findElement)(driver, params.target);
7
+ await el.click();
8
+ const title = await driver.getTitle();
9
+ const url = await driver.getCurrentUrl();
10
+ response.addPage({ url, title });
11
+ response.addCode(`await driver.findElement(${(0, shared_1.byToString)(params.target)}).click();`);
12
+ response.addResult('clicked');
13
+ }
14
+ //# sourceMappingURL=click.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"click.js","sourceRoot":"","sources":["../../../src/daemon/tools/click.ts"],"names":[],"mappings":";;AAGA,sCAQC;AAVD,qCAAmD;AAE5C,KAAK,UAAU,aAAa,CAAC,MAAW,EAAE,MAA0B,EAAE,QAAkB;IAC7F,MAAM,EAAE,GAAG,MAAM,IAAA,oBAAW,EAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;IACjB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;IACtC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IACjC,QAAQ,CAAC,OAAO,CAAC,4BAA4B,IAAA,mBAAU,EAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACpF,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { Response } from '../../response';
2
+ export declare function browser_eval(driver: any, params: {
3
+ script: string;
4
+ target?: string;
5
+ }, response: Response): Promise<void>;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.browser_eval = browser_eval;
4
+ const shared_1 = require("./shared");
5
+ async function browser_eval(driver, params, response) {
6
+ let result;
7
+ if (params.target) {
8
+ const el = await (0, shared_1.findElement)(driver, params.target);
9
+ result = await driver.executeScript(params.script, el);
10
+ }
11
+ else {
12
+ result = await driver.executeScript(`return (${params.script});`);
13
+ }
14
+ const resultStr = typeof result === 'object' ? JSON.stringify(result) : String(result);
15
+ response.addCode(`await driver.executeScript(\`${params.script}\`);`);
16
+ response.addResult(resultStr);
17
+ }
18
+ //# sourceMappingURL=eval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval.js","sourceRoot":"","sources":["../../../src/daemon/tools/eval.ts"],"names":[],"mappings":";;AAGA,oCAeC;AAjBD,qCAAuC;AAEhC,KAAK,UAAU,YAAY,CAChC,MAAW,EACX,MAA2C,EAC3C,QAAkB;IAElB,IAAI,MAAW,CAAC;IAChB,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,EAAE,GAAG,MAAM,IAAA,oBAAW,EAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,WAAW,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACvF,QAAQ,CAAC,OAAO,CAAC,gCAAgC,MAAM,CAAC,MAAM,MAAM,CAAC,CAAC;IACtE,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Response } from '../../response';
2
+ export declare function browser_fill(driver: any, params: {
3
+ target: string;
4
+ value: string;
5
+ submit?: boolean;
6
+ }, response: Response): Promise<void>;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.browser_fill = browser_fill;
4
+ const shared_1 = require("./shared");
5
+ const selenium_webdriver_1 = require("selenium-webdriver");
6
+ async function browser_fill(driver, params, response) {
7
+ const el = await (0, shared_1.findElement)(driver, params.target);
8
+ // clear() can throw "invalid element state" on some inputs (e.g. React
9
+ // controlled inputs that aren't fully editable yet). Fall back to a
10
+ // select-all + delete sequence so we don't block on stubborn elements.
11
+ try {
12
+ await el.clear();
13
+ }
14
+ catch {
15
+ await el.sendKeys(selenium_webdriver_1.Key.CONTROL, 'a', selenium_webdriver_1.Key.NULL);
16
+ await el.sendKeys(selenium_webdriver_1.Key.DELETE);
17
+ }
18
+ await el.sendKeys(params.value);
19
+ if (params.submit) {
20
+ await el.sendKeys(selenium_webdriver_1.Key.ENTER);
21
+ }
22
+ response.addCode(`await driver.findElement(${(0, shared_1.byToString)(params.target)}).sendKeys('${params.value}');`);
23
+ response.addResult('filled');
24
+ }
25
+ //# sourceMappingURL=fill.js.map