craftdriver 0.1.0 → 0.2.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 (186) hide show
  1. package/CHANGELOG.md +111 -0
  2. package/README.md +157 -45
  3. package/bin/craftdriver.mjs +26 -0
  4. package/dist/cli/client.d.ts +17 -0
  5. package/dist/cli/client.d.ts.map +1 -0
  6. package/dist/cli/client.js +88 -0
  7. package/dist/cli/client.js.map +1 -0
  8. package/dist/cli/daemon.d.ts +15 -0
  9. package/dist/cli/daemon.d.ts.map +1 -0
  10. package/dist/cli/daemon.js +145 -0
  11. package/dist/cli/daemon.js.map +1 -0
  12. package/dist/cli/defaults.d.ts +10 -0
  13. package/dist/cli/defaults.d.ts.map +1 -0
  14. package/dist/cli/defaults.js +42 -0
  15. package/dist/cli/defaults.js.map +1 -0
  16. package/dist/cli/dispatcher.d.ts +28 -0
  17. package/dist/cli/dispatcher.d.ts.map +1 -0
  18. package/dist/cli/dispatcher.js +319 -0
  19. package/dist/cli/dispatcher.js.map +1 -0
  20. package/dist/cli/index.d.ts +2 -0
  21. package/dist/cli/index.d.ts.map +1 -0
  22. package/dist/cli/index.js +404 -0
  23. package/dist/cli/index.js.map +1 -0
  24. package/dist/cli/init.d.ts +24 -0
  25. package/dist/cli/init.d.ts.map +1 -0
  26. package/dist/cli/init.js +192 -0
  27. package/dist/cli/init.js.map +1 -0
  28. package/dist/cli/mcp/artifacts.d.ts +43 -0
  29. package/dist/cli/mcp/artifacts.d.ts.map +1 -0
  30. package/dist/cli/mcp/artifacts.js +104 -0
  31. package/dist/cli/mcp/artifacts.js.map +1 -0
  32. package/dist/cli/mcp/server.d.ts +34 -0
  33. package/dist/cli/mcp/server.d.ts.map +1 -0
  34. package/dist/cli/mcp/server.js +214 -0
  35. package/dist/cli/mcp/server.js.map +1 -0
  36. package/dist/cli/mcp/tools.d.ts +34 -0
  37. package/dist/cli/mcp/tools.d.ts.map +1 -0
  38. package/dist/cli/mcp/tools.js +236 -0
  39. package/dist/cli/mcp/tools.js.map +1 -0
  40. package/dist/cli/parseArgs.d.ts +37 -0
  41. package/dist/cli/parseArgs.d.ts.map +1 -0
  42. package/dist/cli/parseArgs.js +215 -0
  43. package/dist/cli/parseArgs.js.map +1 -0
  44. package/dist/cli/protocol.d.ts +34 -0
  45. package/dist/cli/protocol.d.ts.map +1 -0
  46. package/dist/cli/protocol.js +2 -0
  47. package/dist/cli/protocol.js.map +1 -0
  48. package/dist/cli/selector.d.ts +29 -0
  49. package/dist/cli/selector.d.ts.map +1 -0
  50. package/dist/cli/selector.js +100 -0
  51. package/dist/cli/selector.js.map +1 -0
  52. package/dist/cli/snapshot.d.ts +48 -0
  53. package/dist/cli/snapshot.d.ts.map +1 -0
  54. package/dist/cli/snapshot.js +179 -0
  55. package/dist/cli/snapshot.js.map +1 -0
  56. package/dist/index.d.ts +14 -2
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +15 -1
  59. package/dist/index.js.map +1 -1
  60. package/dist/lib/a11y.d.ts +81 -0
  61. package/dist/lib/a11y.d.ts.map +1 -0
  62. package/dist/lib/a11y.js +171 -0
  63. package/dist/lib/a11y.js.map +1 -0
  64. package/dist/lib/bidi/index.d.ts +26 -1
  65. package/dist/lib/bidi/index.d.ts.map +1 -1
  66. package/dist/lib/bidi/index.js +49 -0
  67. package/dist/lib/bidi/index.js.map +1 -1
  68. package/dist/lib/bidi/logs.d.ts +2 -2
  69. package/dist/lib/bidi/logs.d.ts.map +1 -1
  70. package/dist/lib/bidi/logs.js +2 -2
  71. package/dist/lib/bidi/logs.js.map +1 -1
  72. package/dist/lib/bidi/network.d.ts +74 -1
  73. package/dist/lib/bidi/network.d.ts.map +1 -1
  74. package/dist/lib/bidi/network.js +222 -4
  75. package/dist/lib/bidi/network.js.map +1 -1
  76. package/dist/lib/bidi/storage.d.ts +5 -3
  77. package/dist/lib/bidi/storage.d.ts.map +1 -1
  78. package/dist/lib/bidi/storage.js +14 -7
  79. package/dist/lib/bidi/storage.js.map +1 -1
  80. package/dist/lib/bidi/types.d.ts +27 -6
  81. package/dist/lib/bidi/types.d.ts.map +1 -1
  82. package/dist/lib/browser.d.ts +637 -16
  83. package/dist/lib/browser.d.ts.map +1 -1
  84. package/dist/lib/browser.js +1428 -102
  85. package/dist/lib/browser.js.map +1 -1
  86. package/dist/lib/browserContext.d.ts +486 -0
  87. package/dist/lib/browserContext.d.ts.map +1 -0
  88. package/dist/lib/browserContext.js +937 -0
  89. package/dist/lib/browserContext.js.map +1 -0
  90. package/dist/lib/builder.d.ts +3 -0
  91. package/dist/lib/builder.d.ts.map +1 -1
  92. package/dist/lib/builder.js +31 -4
  93. package/dist/lib/builder.js.map +1 -1
  94. package/dist/lib/by.d.ts +18 -2
  95. package/dist/lib/by.d.ts.map +1 -1
  96. package/dist/lib/by.js +20 -2
  97. package/dist/lib/by.js.map +1 -1
  98. package/dist/lib/chrome.d.ts +13 -1
  99. package/dist/lib/chrome.d.ts.map +1 -1
  100. package/dist/lib/chrome.js +13 -17
  101. package/dist/lib/chrome.js.map +1 -1
  102. package/dist/lib/clock.d.ts +115 -0
  103. package/dist/lib/clock.d.ts.map +1 -0
  104. package/dist/lib/clock.js +407 -0
  105. package/dist/lib/clock.js.map +1 -0
  106. package/dist/lib/driver.d.ts +43 -0
  107. package/dist/lib/driver.d.ts.map +1 -1
  108. package/dist/lib/driver.js +120 -0
  109. package/dist/lib/driver.js.map +1 -1
  110. package/dist/lib/driverManager.d.ts +25 -0
  111. package/dist/lib/driverManager.d.ts.map +1 -0
  112. package/dist/lib/driverManager.js +399 -0
  113. package/dist/lib/driverManager.js.map +1 -0
  114. package/dist/lib/elementHandle.d.ts +67 -3
  115. package/dist/lib/elementHandle.d.ts.map +1 -1
  116. package/dist/lib/elementHandle.js +209 -67
  117. package/dist/lib/elementHandle.js.map +1 -1
  118. package/dist/lib/errors.d.ts +71 -0
  119. package/dist/lib/errors.d.ts.map +1 -0
  120. package/dist/lib/errors.js +73 -0
  121. package/dist/lib/errors.js.map +1 -0
  122. package/dist/lib/expect.d.ts +6 -1
  123. package/dist/lib/expect.d.ts.map +1 -1
  124. package/dist/lib/expect.js +55 -37
  125. package/dist/lib/expect.js.map +1 -1
  126. package/dist/lib/firefox.d.ts +18 -0
  127. package/dist/lib/firefox.d.ts.map +1 -0
  128. package/dist/lib/firefox.js +33 -0
  129. package/dist/lib/firefox.js.map +1 -0
  130. package/dist/lib/frame.d.ts +57 -0
  131. package/dist/lib/frame.d.ts.map +1 -0
  132. package/dist/lib/frame.js +277 -0
  133. package/dist/lib/frame.js.map +1 -0
  134. package/dist/lib/keyboard.d.ts +1 -1
  135. package/dist/lib/keyboard.d.ts.map +1 -1
  136. package/dist/lib/keyboard.js +1 -1
  137. package/dist/lib/keyboard.js.map +1 -1
  138. package/dist/lib/locator.d.ts +71 -2
  139. package/dist/lib/locator.d.ts.map +1 -1
  140. package/dist/lib/locator.js +289 -31
  141. package/dist/lib/locator.js.map +1 -1
  142. package/dist/lib/mouse.d.ts +1 -1
  143. package/dist/lib/mouse.d.ts.map +1 -1
  144. package/dist/lib/mouse.js +1 -1
  145. package/dist/lib/mouse.js.map +1 -1
  146. package/dist/lib/page.d.ts +107 -0
  147. package/dist/lib/page.d.ts.map +1 -0
  148. package/dist/lib/page.js +388 -0
  149. package/dist/lib/page.js.map +1 -0
  150. package/dist/lib/tracing.d.ts +128 -0
  151. package/dist/lib/tracing.d.ts.map +1 -0
  152. package/dist/lib/tracing.js +272 -0
  153. package/dist/lib/tracing.js.map +1 -0
  154. package/dist/lib/wait.d.ts.map +1 -1
  155. package/dist/lib/wait.js +14 -1
  156. package/dist/lib/wait.js.map +1 -1
  157. package/dist/lib/webelement.d.ts +2 -0
  158. package/dist/lib/webelement.d.ts.map +1 -1
  159. package/dist/lib/webelement.js +18 -0
  160. package/dist/lib/webelement.js.map +1 -1
  161. package/docs/accessibility.md +177 -0
  162. package/docs/api-reference.md +71 -0
  163. package/docs/assertions.md +182 -0
  164. package/docs/bidi-features.md +462 -0
  165. package/docs/browser-api.md +673 -0
  166. package/docs/browser-context.md +522 -0
  167. package/docs/cli.md +233 -0
  168. package/docs/clock.md +245 -0
  169. package/docs/dialogs.md +143 -0
  170. package/docs/driver-configuration.md +64 -0
  171. package/docs/element-api.md +219 -0
  172. package/docs/emulation.md +155 -0
  173. package/docs/error-codes.md +67 -0
  174. package/docs/getting-started.md +168 -0
  175. package/docs/keyboard-mouse.md +250 -0
  176. package/docs/mcp.md +250 -0
  177. package/docs/mobile-emulation.md +194 -0
  178. package/docs/screenshots.md +146 -0
  179. package/docs/selectors.md +382 -0
  180. package/docs/session-management.md +229 -0
  181. package/docs/tracing.md +282 -0
  182. package/package.json +26 -8
  183. package/skills/craftdriver/SKILL.md +84 -0
  184. package/skills/craftdriver/cheatsheet.md +194 -0
  185. package/skills/craftdriver/cli.md +104 -0
  186. package/skills/craftdriver/patterns.md +139 -0
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Daemon process: long-lived browser exposed over a Unix domain socket.
3
+ *
4
+ * - Listens on `~/.craftdriver/sock` (override with `$CRAFTDRIVER_SOCKET`).
5
+ * - Line-delimited JSON request/response, one connection per CLI call.
6
+ * - Lazy browser launch: the first request that needs a browser starts
7
+ * one. Subsequent requests reuse it.
8
+ * - Writes its PID to `~/.craftdriver/pid` so `daemon status/stop` can
9
+ * find it. PID file is cleaned up on graceful exit.
10
+ *
11
+ * Run as a child process via `craftdriver daemon start`.
12
+ */
13
+ import net from 'net';
14
+ import fs from 'fs';
15
+ import path from 'path';
16
+ import { Browser } from '../lib/browser.js';
17
+ import { CraftdriverError, ErrorCode } from '../lib/errors.js';
18
+ import { DAEMON_SOCKET_PATH, DAEMON_PID_PATH } from './defaults.js';
19
+ import { createBrowserHandle, dispatch } from './dispatcher.js';
20
+ export async function runDaemon(opts) {
21
+ const socketPath = opts.socketPath ?? DAEMON_SOCKET_PATH;
22
+ const pidPath = opts.pidPath ?? DAEMON_PID_PATH;
23
+ await fs.promises.mkdir(path.dirname(socketPath), { recursive: true });
24
+ await fs.promises.mkdir(path.dirname(pidPath), { recursive: true });
25
+ // If a stale socket exists from a crashed previous daemon, remove it.
26
+ try {
27
+ await fs.promises.unlink(socketPath);
28
+ }
29
+ catch { /* ignore */ }
30
+ const handle = createBrowserHandle(() => Browser.launch(opts.launch));
31
+ const server = net.createServer((sock) => {
32
+ let buf = '';
33
+ sock.on('data', async (chunk) => {
34
+ buf += chunk.toString('utf8');
35
+ let idx;
36
+ while ((idx = buf.indexOf('\n')) >= 0) {
37
+ const line = buf.slice(0, idx);
38
+ buf = buf.slice(idx + 1);
39
+ if (!line.trim())
40
+ continue;
41
+ let req;
42
+ try {
43
+ req = JSON.parse(line);
44
+ }
45
+ catch (e) {
46
+ writeResp(sock, {
47
+ id: -1,
48
+ ok: false,
49
+ error: {
50
+ code: ErrorCode.INVALID_ARGUMENT,
51
+ message: 'invalid JSON request: ' + e.message,
52
+ },
53
+ });
54
+ continue;
55
+ }
56
+ try {
57
+ // Built-in daemon control commands handled here.
58
+ if (req.cmd === 'daemon:ping') {
59
+ writeResp(sock, { id: req.id, ok: true, result: { pong: true, pid: process.pid } });
60
+ continue;
61
+ }
62
+ if (req.cmd === 'daemon:stop') {
63
+ writeResp(sock, { id: req.id, ok: true, result: { stopping: true, pid: process.pid } });
64
+ // Defer shutdown so the response flushes.
65
+ setImmediate(() => void shutdown(0));
66
+ continue;
67
+ }
68
+ const result = await dispatch({ handle, launchOptions: opts.launch }, req.cmd, req.args ?? {});
69
+ writeResp(sock, { id: req.id, ok: true, result });
70
+ }
71
+ catch (err) {
72
+ writeResp(sock, { id: req.id, ok: false, error: toWireError(err) });
73
+ }
74
+ }
75
+ });
76
+ sock.on('error', () => { });
77
+ });
78
+ await new Promise((resolve, reject) => {
79
+ server.once('error', reject);
80
+ server.listen(socketPath, () => {
81
+ server.off('error', reject);
82
+ try {
83
+ fs.chmodSync(socketPath, 0o600);
84
+ }
85
+ catch { /* not fatal */ }
86
+ resolve();
87
+ });
88
+ });
89
+ await fs.promises.writeFile(pidPath, String(process.pid), 'utf8');
90
+ let shuttingDown = false;
91
+ async function shutdown(code) {
92
+ if (shuttingDown)
93
+ return;
94
+ shuttingDown = true;
95
+ try {
96
+ server.close();
97
+ }
98
+ catch { /* ignore */ }
99
+ await handle.close();
100
+ try {
101
+ await fs.promises.unlink(socketPath);
102
+ }
103
+ catch { /* ignore */ }
104
+ try {
105
+ await fs.promises.unlink(pidPath);
106
+ }
107
+ catch { /* ignore */ }
108
+ process.exit(code);
109
+ }
110
+ process.on('SIGINT', () => void shutdown(0));
111
+ process.on('SIGTERM', () => void shutdown(0));
112
+ process.on('uncaughtException', (e) => {
113
+ process.stderr.write('daemon uncaughtException: ' + (e?.stack ?? String(e)) + '\n');
114
+ void shutdown(1);
115
+ });
116
+ // Block the caller forever; the daemon shuts down via signal or
117
+ // `daemon:stop`, both of which call `process.exit()` directly.
118
+ await new Promise(() => { });
119
+ }
120
+ function writeResp(sock, resp) {
121
+ try {
122
+ sock.write(JSON.stringify(resp) + '\n');
123
+ }
124
+ catch {
125
+ /* socket may have closed; ignore */
126
+ }
127
+ }
128
+ export function toWireError(err) {
129
+ if (err instanceof CraftdriverError) {
130
+ const out = {
131
+ code: err.code,
132
+ message: err.message,
133
+ };
134
+ if (err.hint)
135
+ out.hint = err.hint;
136
+ if (err.detail)
137
+ out.detail = err.detail;
138
+ return out;
139
+ }
140
+ if (err instanceof Error) {
141
+ return { code: ErrorCode.DRIVER_ERROR, message: err.message };
142
+ }
143
+ return { code: ErrorCode.DRIVER_ERROR, message: String(err) };
144
+ }
145
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAsB,MAAM,iBAAiB,CAAC;AASpF,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAmB;IACjD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,kBAAkB,CAAC;IACzD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC;IAEhD,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,sEAAsE;IACtE,IAAI,CAAC;QAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAEpE,MAAM,MAAM,GAAkB,mBAAmB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAErF,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE;QACvC,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YAC9B,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC9B,IAAI,GAAW,CAAC;YAChB,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBAC/B,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;oBAAE,SAAS;gBAC3B,IAAI,GAAY,CAAC;gBACjB,IAAI,CAAC;oBACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;gBACpC,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,SAAS,CAAC,IAAI,EAAE;wBACd,EAAE,EAAE,CAAC,CAAC;wBACN,EAAE,EAAE,KAAK;wBACT,KAAK,EAAE;4BACL,IAAI,EAAE,SAAS,CAAC,gBAAgB;4BAChC,OAAO,EAAE,wBAAwB,GAAI,CAAW,CAAC,OAAO;yBACzD;qBACF,CAAC,CAAC;oBACH,SAAS;gBACX,CAAC;gBACD,IAAI,CAAC;oBACH,iDAAiD;oBACjD,IAAI,GAAG,CAAC,GAAG,KAAK,aAAa,EAAE,CAAC;wBAC9B,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;wBACpF,SAAS;oBACX,CAAC;oBACD,IAAI,GAAG,CAAC,GAAG,KAAK,aAAa,EAAE,CAAC;wBAC9B,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;wBACxF,0CAA0C;wBAC1C,YAAY,CAAC,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;wBACrC,SAAS;oBACX,CAAC;oBACD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,MAAM,EAAE,EACtC,GAAG,CAAC,GAAG,EACP,GAAG,CAAC,IAAI,IAAI,EAAE,CACf,CAAC;oBACF,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBACpD,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACtE,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAmC,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE;YAC7B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5B,IAAI,CAAC;gBAAC,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;YAClE,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;IAElE,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,KAAK,UAAU,QAAQ,CAAC,IAAY;QAClC,IAAI,YAAY;YAAE,OAAO;QACzB,YAAY,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC;YAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAC9C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC;YAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACpE,IAAI,CAAC;YAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAED,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE,EAAE;QACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,GAAG,CAAE,CAAW,EAAE,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC/F,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,gEAAgE;IAChE,+DAA+D;IAC/D,MAAM,IAAI,OAAO,CAAO,GAAG,EAAE,GAAwB,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,SAAS,CAAC,IAAgB,EAAE,IAAc;IACjD,IAAI,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;IACtC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,IAAI,GAAG,YAAY,gBAAgB,EAAE,CAAC;QACpC,MAAM,GAAG,GAAuF;YAC9F,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC;QACF,IAAI,GAAG,CAAC,IAAI;YAAE,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QAClC,IAAI,GAAG,CAAC,MAAM;YAAE,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QACxC,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,YAAY,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;IAChE,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AAChE,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare const AGENT_DEFAULT_TIMEOUT_MS: number;
2
+ /** Default `--limit` for list-returning commands. */
3
+ export declare const AGENT_DEFAULT_LIMIT = 20;
4
+ /** Path to the daemon's Unix socket. */
5
+ export declare const DAEMON_SOCKET_PATH: string;
6
+ /** PID file written by the daemon so `daemon status/stop` can find it. */
7
+ export declare const DAEMON_PID_PATH: string;
8
+ /** Idle browser shutdown delay (ms) when daemon receives no requests. */
9
+ export declare const DAEMON_IDLE_SHUTDOWN_MS = 0;
10
+ //# sourceMappingURL=defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/cli/defaults.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,wBAAwB,QAKjC,CAAC;AAEL,qDAAqD;AACrD,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC,wCAAwC;AACxC,eAAO,MAAM,kBAAkB,QAI3B,CAAC;AAEL,0EAA0E;AAC1E,eAAO,MAAM,eAAe,QAIxB,CAAC;AAEL,yEAAyE;AACzE,eAAO,MAAM,uBAAuB,IAAI,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Constants for the CLI / MCP agent surface.
3
+ *
4
+ * The **library** keeps its 30 s auto-wait — that's right for stable
5
+ * tests written by humans. The **agent surface** (this CLI and the
6
+ * future MCP server) lowers the default to 5 s because agents probe
7
+ * with hallucinated selectors and should learn from failures fast.
8
+ *
9
+ * Override per call with `--timeout`, globally with the
10
+ * `CRAFTDRIVER_AGENT_TIMEOUT` environment variable.
11
+ *
12
+ * Never import these constants from `src/lib/*`. The agent-surface
13
+ * defaults must stay out of the library hot path.
14
+ */
15
+ import os from 'os';
16
+ import path from 'path';
17
+ export const AGENT_DEFAULT_TIMEOUT_MS = (() => {
18
+ const raw = process.env.CRAFTDRIVER_AGENT_TIMEOUT;
19
+ if (raw === undefined || raw === '')
20
+ return 5_000;
21
+ const n = Number(raw);
22
+ return Number.isFinite(n) && n >= 0 ? n : 5_000;
23
+ })();
24
+ /** Default `--limit` for list-returning commands. */
25
+ export const AGENT_DEFAULT_LIMIT = 20;
26
+ /** Path to the daemon's Unix socket. */
27
+ export const DAEMON_SOCKET_PATH = (() => {
28
+ const override = process.env.CRAFTDRIVER_SOCKET;
29
+ if (override)
30
+ return override;
31
+ return path.join(os.homedir(), '.craftdriver', 'sock');
32
+ })();
33
+ /** PID file written by the daemon so `daemon status/stop` can find it. */
34
+ export const DAEMON_PID_PATH = (() => {
35
+ const override = process.env.CRAFTDRIVER_PID;
36
+ if (override)
37
+ return override;
38
+ return path.join(os.homedir(), '.craftdriver', 'pid');
39
+ })();
40
+ /** Idle browser shutdown delay (ms) when daemon receives no requests. */
41
+ export const DAEMON_IDLE_SHUTDOWN_MS = 0; // 0 = never auto-shutdown
42
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/cli/defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,GAAG,EAAE;IAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;IAClD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IAClD,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAClD,CAAC,CAAC,EAAE,CAAC;AAEL,qDAAqD;AACrD,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAEtC,wCAAwC;AACxC,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE;IACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAChD,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;AACzD,CAAC,CAAC,EAAE,CAAC;AAEL,0EAA0E;AAC1E,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE;IACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAC7C,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;AACxD,CAAC,CAAC,EAAE,CAAC;AAEL,yEAAyE;AACzE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,CAAC,0BAA0B"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Command dispatcher — single source of truth for "what each CLI
3
+ * command does to a Browser instance".
4
+ *
5
+ * Pure logic: takes a `cmd` name + `args` object, returns either a
6
+ * JSON-serializable result or throws `CraftdriverError`. The daemon
7
+ * and the ephemeral runner both call into this; an MCP server can
8
+ * reuse it later (different response shape, same dispatch table).
9
+ *
10
+ * Side effects (browser launch / shutdown) live in the caller.
11
+ */
12
+ import { Browser, type LaunchOptions } from '../lib/browser.js';
13
+ /** Lazy-initialized browser handle shared by all commands in a session. */
14
+ export interface BrowserHandle {
15
+ /** Returns a connected browser, launching it on first call. */
16
+ get(): Promise<Browser>;
17
+ /** Returns the current instance without launching (null if not yet up). */
18
+ peek(): Browser | null;
19
+ /** Close the browser if it has been launched. */
20
+ close(): Promise<void>;
21
+ }
22
+ export declare function createBrowserHandle(launch: () => Promise<Browser>): BrowserHandle;
23
+ export interface DispatchContext {
24
+ handle: BrowserHandle;
25
+ launchOptions: LaunchOptions;
26
+ }
27
+ export declare function dispatch(ctx: DispatchContext, cmd: string, args?: Record<string, unknown>): Promise<unknown>;
28
+ //# sourceMappingURL=dispatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/cli/dispatcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAMhE,2EAA2E;AAC3E,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACxB,2EAA2E;IAC3E,IAAI,IAAI,OAAO,GAAG,IAAI,CAAC;IACvB,iDAAiD;IACjD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,aAAa,CAgBjF;AAiDD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,aAAa,CAAC;IACtB,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,OAAO,CAAC,CA6SlB"}
@@ -0,0 +1,319 @@
1
+ import { CraftdriverError, ErrorCode } from '../lib/errors.js';
2
+ import { parseSelector, describeSelector } from './selector.js';
3
+ import { takeSnapshot } from './snapshot.js';
4
+ import { AGENT_DEFAULT_TIMEOUT_MS, AGENT_DEFAULT_LIMIT } from './defaults.js';
5
+ export function createBrowserHandle(launch) {
6
+ let inst = null;
7
+ let pending = null;
8
+ return {
9
+ async get() {
10
+ if (inst)
11
+ return inst;
12
+ if (!pending)
13
+ pending = launch().then((b) => { inst = b; pending = null; return b; });
14
+ return pending;
15
+ },
16
+ peek() { return inst; },
17
+ async close() {
18
+ const b = inst;
19
+ inst = null;
20
+ if (b)
21
+ await b.quit().catch(() => { });
22
+ },
23
+ };
24
+ }
25
+ function ms(args, key = 'timeout') {
26
+ // Validate-or-fallback to bound timer durations (defends against resource
27
+ // exhaustion from hostile socket input). CodeQL does not treat Math.min
28
+ // as a sanitizer, so we use explicit range checks.
29
+ const MAX_TIMEOUT_MS = 300_000;
30
+ const v = args?.[key];
31
+ if (typeof v === 'number' && Number.isFinite(v) && v >= 0 && v <= MAX_TIMEOUT_MS)
32
+ return v;
33
+ if (typeof v === 'string' && /^\d+$/.test(v)) {
34
+ const n = Number(v);
35
+ if (n >= 0 && n <= MAX_TIMEOUT_MS)
36
+ return n;
37
+ }
38
+ return AGENT_DEFAULT_TIMEOUT_MS;
39
+ }
40
+ function str(args, key) {
41
+ const v = args?.[key];
42
+ if (typeof v !== 'string' || v.length === 0) {
43
+ throw new CraftdriverError(ErrorCode.INVALID_ARGUMENT, `dispatcher: missing required argument "${key}"`);
44
+ }
45
+ return v;
46
+ }
47
+ function optStr(args, key) {
48
+ const v = args?.[key];
49
+ return typeof v === 'string' && v.length > 0 ? v : undefined;
50
+ }
51
+ function bool(args, key) {
52
+ return args?.[key] === true || args?.[key] === 'true';
53
+ }
54
+ function int(args, key, dflt) {
55
+ const v = args?.[key];
56
+ if (typeof v === 'number' && Number.isInteger(v))
57
+ return v;
58
+ if (typeof v === 'string' && /^-?\d+$/.test(v))
59
+ return Number(v);
60
+ return dflt;
61
+ }
62
+ /** Best-effort short text snippet for `find` output. */
63
+ function snippet(s, max = 60) {
64
+ const trimmed = s.replace(/\s+/g, ' ').trim();
65
+ return trimmed.length > max ? trimmed.slice(0, max - 1) + '…' : trimmed;
66
+ }
67
+ export async function dispatch(ctx, cmd, args = {}) {
68
+ switch (cmd) {
69
+ // ---- session ---------------------------------------------------------
70
+ case 'status': {
71
+ const b = ctx.handle.peek();
72
+ if (!b)
73
+ return { browser: null, pid: process.pid, ready: false };
74
+ const page = await b.activePage().catch(() => null);
75
+ const url = page ? await page.url().catch(() => '') : '';
76
+ return {
77
+ browser: ctx.launchOptions.browserName ?? 'chrome',
78
+ pid: process.pid,
79
+ ready: true,
80
+ activeUrl: url,
81
+ };
82
+ }
83
+ case 'quit': {
84
+ await ctx.handle.close();
85
+ return { ok: true };
86
+ }
87
+ // ---- navigation ------------------------------------------------------
88
+ case 'go': {
89
+ const url = str(args, 'url');
90
+ const b = await ctx.handle.get();
91
+ await b.navigateTo(url);
92
+ const page = await b.activePage();
93
+ return { url: await page.url(), title: await page.title() };
94
+ }
95
+ case 'back': {
96
+ const b = await ctx.handle.get();
97
+ const page = await b.activePage();
98
+ await page.goBack();
99
+ return { url: await page.url() };
100
+ }
101
+ case 'forward': {
102
+ const b = await ctx.handle.get();
103
+ const page = await b.activePage();
104
+ await page.goForward();
105
+ return { url: await page.url() };
106
+ }
107
+ case 'reload': {
108
+ const b = await ctx.handle.get();
109
+ const page = await b.activePage();
110
+ await page.reload();
111
+ return { url: await page.url() };
112
+ }
113
+ // ---- find ------------------------------------------------------------
114
+ case 'find': {
115
+ const by = parseSelector(str(args, 'selector'));
116
+ const all = bool(args, 'all');
117
+ const limit = int(args, 'limit', AGENT_DEFAULT_LIMIT);
118
+ const offset = int(args, 'offset', 0);
119
+ const b = await ctx.handle.get();
120
+ const els = await b.findAll(by);
121
+ const total = els.length;
122
+ if (!all) {
123
+ if (total === 0) {
124
+ throw new CraftdriverError(ErrorCode.NO_MATCH, `find: no element matches ${describeSelector(by)}`, { detail: { selector: describeSelector(by) } });
125
+ }
126
+ const first = els[0];
127
+ return {
128
+ count: total,
129
+ truncated: total > 1,
130
+ matches: [
131
+ {
132
+ tag: await first.tagName().catch(() => ''),
133
+ text: snippet(await first.text().catch(() => '')),
134
+ visible: await first.isVisible().catch(() => false),
135
+ },
136
+ ],
137
+ };
138
+ }
139
+ const slice = els.slice(offset, offset + limit);
140
+ const matches = await Promise.all(slice.map(async (el, i) => ({
141
+ index: offset + i,
142
+ tag: await el.tagName().catch(() => ''),
143
+ text: snippet(await el.text().catch(() => '')),
144
+ visible: await el.isVisible().catch(() => false),
145
+ })));
146
+ return {
147
+ count: total,
148
+ offset,
149
+ limit,
150
+ truncated: offset + slice.length < total,
151
+ total,
152
+ next_offset: offset + slice.length < total ? offset + slice.length : null,
153
+ matches,
154
+ };
155
+ }
156
+ case 'exists': {
157
+ const by = parseSelector(str(args, 'selector'));
158
+ const b = await ctx.handle.get();
159
+ const els = await b.findAll(by);
160
+ return { exists: els.length > 0, count: els.length };
161
+ }
162
+ // ---- actions ---------------------------------------------------------
163
+ case 'click': {
164
+ const by = parseSelector(str(args, 'selector'));
165
+ const b = await ctx.handle.get();
166
+ await b.click(by, { timeout: ms(args) });
167
+ return { ok: true, selector: describeSelector(by) };
168
+ }
169
+ case 'fill': {
170
+ const by = parseSelector(str(args, 'selector'));
171
+ const value = str(args, 'value');
172
+ const b = await ctx.handle.get();
173
+ await b.fill(by, value, { timeout: ms(args) });
174
+ return { ok: true, selector: describeSelector(by) };
175
+ }
176
+ case 'press': {
177
+ const key = str(args, 'key');
178
+ const b = await ctx.handle.get();
179
+ const sel = optStr(args, 'selector');
180
+ if (sel) {
181
+ const by = parseSelector(sel);
182
+ const els = await b.findAll(by);
183
+ if (els.length === 0) {
184
+ throw new CraftdriverError(ErrorCode.NO_MATCH, `press: no element matches ${describeSelector(by)}`, { detail: { selector: describeSelector(by) } });
185
+ }
186
+ await els[0].click();
187
+ }
188
+ await b.keyboard.press(key);
189
+ return { ok: true, key };
190
+ }
191
+ case 'hover': {
192
+ const by = parseSelector(str(args, 'selector'));
193
+ const b = await ctx.handle.get();
194
+ const els = await b.findAll(by);
195
+ if (els.length === 0) {
196
+ throw new CraftdriverError(ErrorCode.NO_MATCH, `hover: no element matches ${describeSelector(by)}`, { detail: { selector: describeSelector(by) } });
197
+ }
198
+ await els[0].hover({ timeout: ms(args) });
199
+ return { ok: true, selector: describeSelector(by) };
200
+ }
201
+ // ---- read ------------------------------------------------------------
202
+ case 'text': {
203
+ const sel = optStr(args, 'selector');
204
+ const b = await ctx.handle.get();
205
+ if (!sel) {
206
+ const page = await b.activePage();
207
+ const body = await page.evaluate('return document.body ? document.body.innerText : "";');
208
+ const limit = int(args, 'limit', 2000);
209
+ const text = String(body);
210
+ return { text: text.length > limit ? text.slice(0, limit) + '…' : text, truncated: text.length > limit, total: text.length };
211
+ }
212
+ const by = parseSelector(sel);
213
+ const els = await b.findAll(by);
214
+ if (els.length === 0) {
215
+ throw new CraftdriverError(ErrorCode.NO_MATCH, `text: no element matches ${describeSelector(by)}`, { detail: { selector: describeSelector(by) } });
216
+ }
217
+ return { text: await els[0].text() };
218
+ }
219
+ case 'attr': {
220
+ const by = parseSelector(str(args, 'selector'));
221
+ const name = str(args, 'name');
222
+ const b = await ctx.handle.get();
223
+ const value = await b.getAttribute(by, name, { timeout: ms(args) });
224
+ return { name, value };
225
+ }
226
+ case 'value': {
227
+ const by = parseSelector(str(args, 'selector'));
228
+ const b = await ctx.handle.get();
229
+ return { value: await b.getValue(by, { timeout: ms(args) }) };
230
+ }
231
+ case 'is': {
232
+ const what = str(args, 'what');
233
+ const by = parseSelector(str(args, 'selector'));
234
+ const b = await ctx.handle.get();
235
+ const els = await b.findAll(by);
236
+ if (els.length === 0) {
237
+ if (what === 'visible')
238
+ return { result: false };
239
+ throw new CraftdriverError(ErrorCode.NO_MATCH, `is ${what}: no element matches ${describeSelector(by)}`, { detail: { selector: describeSelector(by) } });
240
+ }
241
+ const el = els[0];
242
+ switch (what) {
243
+ case 'visible': return { result: await el.isVisible() };
244
+ case 'enabled': return { result: await el.isEnabled() };
245
+ case 'checked': return { result: await el.isChecked() };
246
+ default:
247
+ throw new CraftdriverError(ErrorCode.INVALID_ARGUMENT, `is: unknown state "${what}". Expected: visible | enabled | checked`);
248
+ }
249
+ }
250
+ // ---- wait ------------------------------------------------------------
251
+ case 'wait': {
252
+ const target = str(args, 'target');
253
+ const kind = optStr(args, 'kind') ?? 'selector';
254
+ const b = await ctx.handle.get();
255
+ if (kind === 'selector') {
256
+ const state = (optStr(args, 'state') ?? 'visible');
257
+ await b.waitFor(parseSelector(target), { state, timeout: ms(args) });
258
+ return { ok: true, state };
259
+ }
260
+ if (kind === 'load') {
261
+ await b.waitForLoadState(optStr(args, 'state') ?? 'load', { timeout: ms(args) });
262
+ return { ok: true };
263
+ }
264
+ throw new CraftdriverError(ErrorCode.INVALID_ARGUMENT, `wait: unknown kind "${kind}". Expected: selector | load`);
265
+ }
266
+ // ---- pages / screenshot ---------------------------------------------
267
+ case 'pages': {
268
+ const b = await ctx.handle.get();
269
+ const pages = await b.pages();
270
+ const out = await Promise.all(pages.map(async (p, i) => ({
271
+ index: i,
272
+ id: p.id(),
273
+ url: await p.url().catch(() => ''),
274
+ title: await p.title().catch(() => ''),
275
+ })));
276
+ return { pages: out, count: out.length };
277
+ }
278
+ case 'screenshot': {
279
+ const b = await ctx.handle.get();
280
+ const fullPage = bool(args, 'fullPage');
281
+ const sel = optStr(args, 'selector');
282
+ const path = optStr(args, 'path');
283
+ const buf = await b.screenshot({
284
+ ...(path ? { path } : {}),
285
+ ...(sel ? { selector: parseSelector(sel) } : {}),
286
+ ...(fullPage ? { fullPage: true } : {}),
287
+ timeout: ms(args),
288
+ });
289
+ return { ok: true, path: path ?? null, bytes: buf.length };
290
+ }
291
+ // ---- snapshot --------------------------------------------------------
292
+ // Sanitized accessibility-tree summary of the active page. Each
293
+ // visible interactive node gets a stable ref (`eN`) which can be
294
+ // used as a selector via `ref=eN` for the next command. Refs
295
+ // invalidate on the next snapshot or on navigation.
296
+ case 'snapshot': {
297
+ const b = await ctx.handle.get();
298
+ const snap = await takeSnapshot(b);
299
+ if (!snap) {
300
+ return { url: '', title: '', lines: [], note: 'no snapshot available' };
301
+ }
302
+ return { url: snap.url, title: snap.title, lines: snap.lines };
303
+ }
304
+ // ---- eval (advanced) -------------------------------------------------
305
+ case 'eval': {
306
+ const code = str(args, 'js');
307
+ const b = await ctx.handle.get();
308
+ const page = await b.activePage();
309
+ // Wrap as function body so callers can pass either an expression
310
+ // ("document.title") or a statement list ("return foo + 1;").
311
+ const body = /\breturn\b/.test(code) ? code : `return (${code});`;
312
+ const result = await page.evaluate(body);
313
+ return { result };
314
+ }
315
+ default:
316
+ throw new CraftdriverError(ErrorCode.INVALID_ARGUMENT, `unknown command "${cmd}"`, { hint: 'run `craftdriver --help` for the command list' });
317
+ }
318
+ }
319
+ //# sourceMappingURL=dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../src/cli/dispatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function main(argv: string[]): Promise<number>;
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AA4BA,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAyE1D"}