@monoes/monobrowse 1.0.13 → 1.0.14

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 (107) hide show
  1. package/dist/src/__tests__/bridge-instruments.test.d.ts +2 -0
  2. package/dist/src/__tests__/bridge-instruments.test.d.ts.map +1 -0
  3. package/dist/src/__tests__/bridge-instruments.test.js +132 -0
  4. package/dist/src/__tests__/bridge-instruments.test.js.map +1 -0
  5. package/dist/src/__tests__/bridge-transport.test.d.ts +2 -0
  6. package/dist/src/__tests__/bridge-transport.test.d.ts.map +1 -0
  7. package/dist/src/__tests__/bridge-transport.test.js +287 -0
  8. package/dist/src/__tests__/bridge-transport.test.js.map +1 -0
  9. package/dist/src/__tests__/cdp-transport.test.d.ts +2 -0
  10. package/dist/src/__tests__/cdp-transport.test.d.ts.map +1 -0
  11. package/dist/src/__tests__/cdp-transport.test.js +167 -0
  12. package/dist/src/__tests__/cdp-transport.test.js.map +1 -0
  13. package/dist/src/browser/bridge.d.ts +119 -0
  14. package/dist/src/browser/bridge.d.ts.map +1 -0
  15. package/dist/src/browser/bridge.js +264 -0
  16. package/dist/src/browser/bridge.js.map +1 -0
  17. package/dist/src/browser/cdp.d.ts +11 -1
  18. package/dist/src/browser/cdp.d.ts.map +1 -1
  19. package/dist/src/browser/cdp.js +60 -56
  20. package/dist/src/browser/cdp.js.map +1 -1
  21. package/dist/src/browser/index.d.ts +2 -0
  22. package/dist/src/browser/index.d.ts.map +1 -1
  23. package/dist/src/browser/index.js +2 -0
  24. package/dist/src/browser/index.js.map +1 -1
  25. package/dist/src/browser/transport.d.ts +62 -0
  26. package/dist/src/browser/transport.d.ts.map +1 -0
  27. package/dist/src/browser/transport.js +65 -0
  28. package/dist/src/browser/transport.js.map +1 -0
  29. package/dist/src/cli/commander-adapter.d.ts +16 -0
  30. package/dist/src/cli/commander-adapter.d.ts.map +1 -0
  31. package/dist/src/cli/commander-adapter.js +68 -0
  32. package/dist/src/cli/commander-adapter.js.map +1 -0
  33. package/dist/src/cli/commands-context.d.ts +14 -0
  34. package/dist/src/cli/commands-context.d.ts.map +1 -0
  35. package/dist/src/cli/commands-context.js +351 -0
  36. package/dist/src/cli/commands-context.js.map +1 -0
  37. package/dist/src/cli/commands-data.d.ts +12 -0
  38. package/dist/src/cli/commands-data.d.ts.map +1 -0
  39. package/dist/src/cli/commands-data.js +246 -0
  40. package/dist/src/cli/commands-data.js.map +1 -0
  41. package/dist/src/cli/commands-element.d.ts +15 -0
  42. package/dist/src/cli/commands-element.d.ts.map +1 -0
  43. package/dist/src/cli/commands-element.js +262 -0
  44. package/dist/src/cli/commands-element.js.map +1 -0
  45. package/dist/src/cli/commands-files.d.ts +9 -0
  46. package/dist/src/cli/commands-files.d.ts.map +1 -0
  47. package/dist/src/cli/commands-files.js +207 -0
  48. package/dist/src/cli/commands-files.js.map +1 -0
  49. package/dist/src/cli/commands-input.d.ts +26 -0
  50. package/dist/src/cli/commands-input.d.ts.map +1 -0
  51. package/dist/src/cli/commands-input.js +399 -0
  52. package/dist/src/cli/commands-input.js.map +1 -0
  53. package/dist/src/cli/commands-navigate.d.ts +12 -0
  54. package/dist/src/cli/commands-navigate.d.ts.map +1 -0
  55. package/dist/src/cli/commands-navigate.js +389 -0
  56. package/dist/src/cli/commands-navigate.js.map +1 -0
  57. package/dist/src/cli/commands-page.d.ts +25 -0
  58. package/dist/src/cli/commands-page.d.ts.map +1 -0
  59. package/dist/src/cli/commands-page.js +377 -0
  60. package/dist/src/cli/commands-page.js.map +1 -0
  61. package/dist/src/cli/commands-report.d.ts +8 -0
  62. package/dist/src/cli/commands-report.d.ts.map +1 -0
  63. package/dist/src/cli/commands-report.js +256 -0
  64. package/dist/src/cli/commands-report.js.map +1 -0
  65. package/dist/src/cli/commands-script.d.ts +43 -0
  66. package/dist/src/cli/commands-script.d.ts.map +1 -0
  67. package/dist/src/cli/commands-script.js +168 -0
  68. package/dist/src/cli/commands-script.js.map +1 -0
  69. package/dist/src/cli/commands-session.d.ts +15 -0
  70. package/dist/src/cli/commands-session.d.ts.map +1 -0
  71. package/dist/src/cli/commands-session.js +357 -0
  72. package/dist/src/cli/commands-session.js.map +1 -0
  73. package/dist/src/cli/commands-trace.d.ts +12 -0
  74. package/dist/src/cli/commands-trace.d.ts.map +1 -0
  75. package/dist/src/cli/commands-trace.js +347 -0
  76. package/dist/src/cli/commands-trace.js.map +1 -0
  77. package/dist/src/cli/commands.d.ts +22 -42
  78. package/dist/src/cli/commands.d.ts.map +1 -1
  79. package/dist/src/cli/commands.js +42 -3648
  80. package/dist/src/cli/commands.js.map +1 -1
  81. package/dist/src/cli/session.d.ts +47 -0
  82. package/dist/src/cli/session.d.ts.map +1 -0
  83. package/dist/src/cli/session.js +343 -0
  84. package/dist/src/cli/session.js.map +1 -0
  85. package/dist/tsconfig.tsbuildinfo +1 -1
  86. package/package.json +1 -1
  87. package/src/__tests__/bridge-instruments.test.ts +180 -0
  88. package/src/__tests__/bridge-transport.test.ts +365 -0
  89. package/src/__tests__/cdp-transport.test.ts +198 -0
  90. package/src/browser/bridge.ts +354 -0
  91. package/src/browser/cdp.ts +57 -52
  92. package/src/browser/index.ts +2 -0
  93. package/src/browser/transport.ts +111 -0
  94. package/src/cli/commander-adapter.ts +65 -0
  95. package/src/cli/commands-context.ts +367 -0
  96. package/src/cli/commands-data.ts +248 -0
  97. package/src/cli/commands-element.ts +305 -0
  98. package/src/cli/commands-files.ts +248 -0
  99. package/src/cli/commands-input.ts +434 -0
  100. package/src/cli/commands-navigate.ts +442 -0
  101. package/src/cli/commands-page.ts +420 -0
  102. package/src/cli/commands-report.ts +275 -0
  103. package/src/cli/commands-script.ts +183 -0
  104. package/src/cli/commands-session.ts +376 -0
  105. package/src/cli/commands-trace.ts +349 -0
  106. package/src/cli/commands.ts +95 -3943
  107. package/src/cli/session.ts +412 -0
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Recording what the page does — network interception and capture, HAR export,
3
+ * video recording, DevTools traces, CPU profiles and Web Vitals.
4
+ */
5
+ import type { Command } from './types.js';
6
+ export declare const networkCommand: Command;
7
+ export declare const recordCommand: Command;
8
+ export declare const traceCommand: Command;
9
+ export declare const profilerCommand: Command;
10
+ export declare const vitalsCommand: Command;
11
+ export declare const harCommand: Command;
12
+ //# sourceMappingURL=commands-trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands-trace.d.ts","sourceRoot":"","sources":["../../../src/cli/commands-trace.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAiC,MAAM,YAAY,CAAC;AAEzE,eAAO,MAAM,cAAc,EAAE,OA6I5B,CAAC;AAQF,eAAO,MAAM,aAAa,EAAE,OAuD3B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,OAiC1B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,OAoC7B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,OAkB3B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,OAuCxB,CAAC"}
@@ -0,0 +1,347 @@
1
+ /**
2
+ * Recording what the page does — network interception and capture, HAR export,
3
+ * video recording, DevTools traces, CPU profiles and Web Vitals.
4
+ */
5
+ import { output } from './output.js';
6
+ import { ensureConnected, getBrowser, imageFormat, print, session } from './session.js';
7
+ export const networkCommand = {
8
+ name: 'network',
9
+ description: 'Network interception and cookie management',
10
+ options: [
11
+ { name: 'pattern', type: 'string', description: 'URL pattern for route (glob)' },
12
+ { name: 'abort', type: 'boolean', description: 'Abort matching requests' },
13
+ { name: 'fulfill', type: 'string', description: 'JSON response body' },
14
+ { name: 'status', type: 'number', description: 'HTTP status for fulfill', default: 200 },
15
+ { name: 'headers', type: 'string', description: 'JSON headers object' },
16
+ { name: 'json', type: 'boolean', description: 'Output as JSON', default: false },
17
+ {
18
+ name: 'filter',
19
+ type: 'string',
20
+ description: 'Filter requests by URL substring (for network requests)',
21
+ },
22
+ {
23
+ name: 'method',
24
+ type: 'string',
25
+ description: 'Filter by HTTP method, e.g. GET, POST (for network requests)',
26
+ },
27
+ {
28
+ name: 'status-code',
29
+ type: 'number',
30
+ description: 'Filter by HTTP status code (for network requests)',
31
+ },
32
+ {
33
+ name: 'type',
34
+ type: 'string',
35
+ description: 'Filter by resource type: xhr|fetch|document|script|stylesheet|image (for network requests)',
36
+ },
37
+ ],
38
+ action: async (ctx) => {
39
+ const { client, sessionId } = await ensureConnected(session.port);
40
+ const browser = await getBrowser();
41
+ const action = ctx.args[0];
42
+ if (!action)
43
+ throw new Error('Usage: monomind browse network route|unroute|cookies|headers|requests');
44
+ switch (action) {
45
+ case 'route': {
46
+ const pattern = ctx.flags.pattern;
47
+ if (!pattern)
48
+ throw new Error('--pattern required for network route');
49
+ const routes = [
50
+ {
51
+ pattern,
52
+ action: ctx.flags.abort ? 'abort' : ctx.flags.fulfill ? 'fulfill' : 'continue',
53
+ response: ctx.flags.fulfill
54
+ ? {
55
+ status: ctx.flags.status,
56
+ body: ctx.flags.fulfill,
57
+ headers: ctx.flags.headers ? JSON.parse(ctx.flags.headers) : {},
58
+ }
59
+ : undefined,
60
+ },
61
+ ];
62
+ await browser.setupRoutes(client, sessionId, routes);
63
+ output.printSuccess(`Network route set: ${pattern}`);
64
+ break;
65
+ }
66
+ case 'unroute':
67
+ await browser.disableInterception(client, sessionId);
68
+ output.printSuccess('Network interception disabled');
69
+ break;
70
+ case 'cookies': {
71
+ const cookies = await browser.getCookies(client, sessionId);
72
+ print(JSON.stringify(cookies, null, 2));
73
+ return { success: true, data: { cookies } };
74
+ }
75
+ case 'headers': {
76
+ const headers = ctx.flags.headers;
77
+ if (!headers)
78
+ throw new Error('--headers required (JSON string)');
79
+ await browser.setExtraHeaders(client, sessionId, JSON.parse(headers));
80
+ output.printSuccess('Extra headers set');
81
+ break;
82
+ }
83
+ case 'capture': {
84
+ const subAction = ctx.args[1] ?? 'start';
85
+ if (subAction === 'start') {
86
+ browser.startRequestCapture(client, sessionId);
87
+ output.printSuccess('Request capture started');
88
+ }
89
+ else if (subAction === 'stop') {
90
+ browser.stopRequestCapture(sessionId);
91
+ output.printSuccess('Request capture stopped');
92
+ }
93
+ else if (subAction === 'clear') {
94
+ browser.clearCapturedRequests(sessionId);
95
+ output.printSuccess('Captured requests cleared');
96
+ }
97
+ break;
98
+ }
99
+ case 'requests': {
100
+ let reqs = browser.getCapturedRequests(sessionId);
101
+ const filterUrl = ctx.flags.filter;
102
+ const filterMethod = ctx.flags.method;
103
+ const filterStatus = ctx.flags['status-code'];
104
+ const filterType = ctx.flags.type;
105
+ if (filterUrl)
106
+ reqs = reqs.filter((r) => r.url.includes(filterUrl));
107
+ if (filterMethod)
108
+ reqs = reqs.filter((r) => (r.method ?? 'GET').toUpperCase() === filterMethod.toUpperCase());
109
+ if (filterStatus)
110
+ reqs = reqs.filter((r) => r.status === filterStatus);
111
+ if (filterType)
112
+ reqs = reqs.filter((r) => r.resourceType === filterType ||
113
+ r.type === filterType);
114
+ if (ctx.flags.json)
115
+ print(JSON.stringify({ data: reqs }));
116
+ else {
117
+ if (reqs.length === 0) {
118
+ output.printInfo('No captured requests. Run: network capture start');
119
+ }
120
+ else
121
+ for (const r of reqs)
122
+ print(` ${r.method ?? 'GET'} ${r.status ?? '-'} ${r.url}`);
123
+ }
124
+ return { success: true, data: { requests: reqs } };
125
+ }
126
+ case 'request': {
127
+ const reqId = ctx.args[1];
128
+ if (!reqId)
129
+ throw new Error('Usage: monomind browse network request <requestId>');
130
+ const reqs = browser.getCapturedRequests(sessionId);
131
+ const req = reqs.find((r) => r.requestId === reqId ||
132
+ r.id === reqId);
133
+ if (!req) {
134
+ output.printWarning(`Request not found: ${reqId}`);
135
+ return { success: false };
136
+ }
137
+ if (ctx.flags.json)
138
+ print(JSON.stringify({ data: req }));
139
+ else
140
+ print(JSON.stringify(req, null, 2));
141
+ return { success: true, data: { request: req } };
142
+ }
143
+ default:
144
+ throw new Error(`Unknown: ${action}. Use: route|unroute|cookies|headers|capture|requests|request`);
145
+ }
146
+ return { success: true };
147
+ },
148
+ };
149
+ // Default output cap for eval when --max-output isn't passed explicitly —
150
+ // print(String(result)) had NO limit at all (unlike snapshot's --max-output),
151
+ // so e.g. `eval "document.documentElement.outerHTML"` could dump megabytes
152
+ // straight into an agent's context. An explicit --max-output still overrides
153
+ // this default.
154
+ export const recordCommand = {
155
+ name: 'record',
156
+ description: 'Screen recording. Usage: monomind browse record start|stop|restart|status [path]',
157
+ options: [
158
+ { name: 'format', type: 'string', description: 'jpeg|png', default: 'jpeg' },
159
+ { name: 'quality', type: 'number', description: 'Quality 0-100', default: 80 },
160
+ { name: 'json', type: 'boolean', description: 'Output as JSON', default: false },
161
+ ],
162
+ action: async (ctx) => {
163
+ const { client, sessionId } = await ensureConnected(session.port);
164
+ const browser = await getBrowser();
165
+ const action = ctx.args[0];
166
+ if (!action)
167
+ throw new Error('Usage: monomind browse record start|stop|restart|status');
168
+ switch (action) {
169
+ case 'start':
170
+ await browser.startRecording(client, sessionId, {
171
+ format: imageFormat(ctx.flags.format, ['jpeg', 'png'], 'jpeg'),
172
+ quality: ctx.flags.quality,
173
+ });
174
+ output.printSuccess('Recording started');
175
+ return { success: true };
176
+ case 'stop': {
177
+ const path = await browser.stopRecording(client, sessionId, ctx.args[1]);
178
+ if (ctx.flags.json)
179
+ print(JSON.stringify({ data: { path } }));
180
+ else
181
+ output.printSuccess(`Recording saved: ${path}`);
182
+ return { success: true, data: { path } };
183
+ }
184
+ case 'restart': {
185
+ const prevStatus = browser.getRecordingStatus(sessionId);
186
+ let prevPath;
187
+ if (prevStatus.recording || prevStatus.autoStopped) {
188
+ prevPath = await browser.stopRecording(client, sessionId, ctx.args[1]);
189
+ output.printInfo(`Previous recording saved: ${prevPath}`);
190
+ }
191
+ await browser.startRecording(client, sessionId, {
192
+ format: imageFormat(ctx.flags.format, ['jpeg', 'png'], 'jpeg'),
193
+ quality: ctx.flags.quality,
194
+ });
195
+ output.printSuccess('Recording restarted');
196
+ return { success: true, data: { previous: prevPath } };
197
+ }
198
+ case 'status': {
199
+ const status = browser.getRecordingStatus(sessionId);
200
+ if (ctx.flags.json)
201
+ print(JSON.stringify({ data: status }));
202
+ else
203
+ print(`Recording: ${status.recording} | Frames: ${status.frames}${status.autoStopped ? ' (auto-stopped: buffer limit reached — run "record stop" to save)' : ''}`);
204
+ return { success: true, data: status };
205
+ }
206
+ default:
207
+ throw new Error('Usage: monomind browse record start|stop|restart|status [path]');
208
+ }
209
+ },
210
+ };
211
+ export const traceCommand = {
212
+ name: 'trace',
213
+ description: 'CDP performance trace. Usage: monomind browse trace start|stop [path]',
214
+ options: [
215
+ { name: 'screenshots', type: 'boolean', description: 'Include screenshots', default: false },
216
+ { name: 'json', type: 'boolean', description: 'Output as JSON', default: false },
217
+ ],
218
+ action: async (ctx) => {
219
+ const { client, sessionId } = await ensureConnected(session.port);
220
+ const browser = await getBrowser();
221
+ const action = ctx.args[0];
222
+ if (!action)
223
+ throw new Error('Usage: monomind browse trace start|stop [path]');
224
+ switch (action) {
225
+ case 'start':
226
+ await browser.startTrace(client, sessionId, {
227
+ screenshots: ctx.flags.screenshots,
228
+ });
229
+ output.printSuccess('Trace started');
230
+ return { success: true };
231
+ case 'stop': {
232
+ const path = await browser.stopTrace(client, sessionId, ctx.args[1]);
233
+ if (ctx.flags.json)
234
+ print(JSON.stringify({ data: { path } }));
235
+ else
236
+ output.printSuccess(`Trace saved: ${path}`);
237
+ return { success: true, data: { path } };
238
+ }
239
+ case 'status':
240
+ print(browser.getTraceStatus(sessionId) ? 'Tracing active' : 'Not tracing');
241
+ return { success: true };
242
+ default:
243
+ throw new Error('Usage: monomind browse trace start|stop|status [path]');
244
+ }
245
+ },
246
+ };
247
+ export const profilerCommand = {
248
+ name: 'profiler',
249
+ description: 'CPU profiler. Usage: monomind browse profiler start|stop|heap [path]',
250
+ options: [
251
+ { name: 'interval', type: 'number', description: 'Sampling interval µs', default: 1000 },
252
+ { name: 'json', type: 'boolean', description: 'Output as JSON', default: false },
253
+ ],
254
+ action: async (ctx) => {
255
+ const { client, sessionId } = await ensureConnected(session.port);
256
+ const browser = await getBrowser();
257
+ const action = ctx.args[0];
258
+ if (!action)
259
+ throw new Error('Usage: monomind browse profiler start|stop|heap [path]');
260
+ switch (action) {
261
+ case 'start':
262
+ await browser.startCpuProfile(client, sessionId, {
263
+ samplingInterval: ctx.flags.interval,
264
+ });
265
+ output.printSuccess('CPU profiler started');
266
+ return { success: true };
267
+ case 'stop': {
268
+ const path = await browser.stopCpuProfile(client, sessionId, ctx.args[1]);
269
+ if (ctx.flags.json)
270
+ print(JSON.stringify({ data: { path } }));
271
+ else
272
+ output.printSuccess(`Profile saved: ${path}`);
273
+ return { success: true, data: { path } };
274
+ }
275
+ case 'heap': {
276
+ const path = await browser.startHeapSnapshot(client, sessionId, ctx.args[1]);
277
+ if (ctx.flags.json)
278
+ print(JSON.stringify({ data: { path } }));
279
+ else
280
+ output.printSuccess(`Heap snapshot saved: ${path}`);
281
+ return { success: true, data: { path } };
282
+ }
283
+ default:
284
+ throw new Error('Usage: monomind browse profiler start|stop|heap [path]');
285
+ }
286
+ },
287
+ };
288
+ export const vitalsCommand = {
289
+ name: 'vitals',
290
+ description: 'Collect Core Web Vitals. Usage: monomind browse vitals [--wait 2000]',
291
+ options: [
292
+ { name: 'wait', type: 'number', description: 'Wait ms for observers', default: 2000 },
293
+ { name: 'json', type: 'boolean', description: 'Output as JSON', default: false },
294
+ ],
295
+ action: async (ctx) => {
296
+ const { client, sessionId } = await ensureConnected(session.port);
297
+ const browser = await getBrowser();
298
+ const vitals = await browser.collectVitals(client, sessionId, ctx.flags.wait);
299
+ if (ctx.flags.json) {
300
+ print(JSON.stringify({ data: vitals }));
301
+ }
302
+ else {
303
+ print(browser.formatVitals(vitals));
304
+ }
305
+ return { success: true, data: vitals };
306
+ },
307
+ };
308
+ export const harCommand = {
309
+ name: 'har',
310
+ description: 'HAR network recording. Usage: monomind browse har start|stop|status [path]',
311
+ options: [
312
+ { name: 'bodies', type: 'boolean', description: 'Capture response bodies', default: false },
313
+ { name: 'json', type: 'boolean', description: 'Output as JSON', default: false },
314
+ ],
315
+ action: async (ctx) => {
316
+ const { client, sessionId } = await ensureConnected(session.port);
317
+ const browser = await getBrowser();
318
+ const action = ctx.args[0];
319
+ if (!action)
320
+ throw new Error('Usage: monomind browse har start|stop|status [path]');
321
+ switch (action) {
322
+ case 'start':
323
+ await browser.startHarRecording(client, sessionId);
324
+ output.printSuccess('HAR recording started');
325
+ return { success: true };
326
+ case 'stop': {
327
+ const path = await browser.stopHarRecording(client, sessionId, ctx.args[1], ctx.flags.bodies);
328
+ if (ctx.flags.json)
329
+ print(JSON.stringify({ data: { path } }));
330
+ else
331
+ output.printSuccess(`HAR saved: ${path}`);
332
+ return { success: true, data: { path } };
333
+ }
334
+ case 'status': {
335
+ const status = browser.getHarStatus(sessionId);
336
+ if (ctx.flags.json)
337
+ print(JSON.stringify({ data: status }));
338
+ else
339
+ print(`Recording: ${status.recording} | Requests: ${status.requestCount}`);
340
+ return { success: true, data: status };
341
+ }
342
+ default:
343
+ throw new Error('Usage: monomind browse har start|stop|status [path]');
344
+ }
345
+ },
346
+ };
347
+ //# sourceMappingURL=commands-trace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands-trace.js","sourceRoot":"","sources":["../../../src/cli/commands-trace.ts"],"names":[],"mappings":"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"}
@@ -1,51 +1,31 @@
1
1
  /**
2
2
  * Browse Command — Native browser automation via Chrome DevTools Protocol
3
3
  * Provides ref-based element model and token-efficient accessibility snapshots
4
- */
5
- import type { Command } from './types.js';
6
- /**
7
- * Splits one line of a `batch` command string into a subcommand name, its
8
- * args, and any recognized leading flags.
9
4
  *
10
- * `eval` is special-cased: its sole argument is a raw JS expression, which
11
- * legitimately contains its own string-literal quotes (e.g.
12
- * `eval document.querySelector('a')`). tokenizeBatchCommand's shell-style
13
- * word-splitting treats `'...'`/`"..."` as grouping delimiters and discards
14
- * them — correct for a value like `fill @e1 "some text"`, but for `eval` it
15
- * silently deletes the expression's own quotes, turning a string literal
16
- * into a bare (undefined) identifier reference and producing a
17
- * ReferenceError instead of evaluating the intended expression. For `eval`,
18
- * only its own known --flags are consumed from the front; everything after
19
- * them is taken verbatim as one argument, untouched by tokenization.
5
+ * This file is the command CATALOGUE: it assembles the `browse` root command
6
+ * from the subcommand modules beside it and stays the single import point for
7
+ * the package. The subcommands themselves are grouped by what the user is
8
+ * doing:
20
9
  *
21
- /**
22
- * `get box`'s output shape: browser.getElementBox() returns the element's
23
- * CENTER point under x/y (correct for internal click-target callers), but
24
- * `get box` is a bounding-box accessor where x/y conventionally means the
25
- * top-left origin a caller computing its own center as `box.x + width/2`
26
- * would otherwise double-offset away from the element (issue #15). Expose
27
- * both conventions, explicitly labeled, so neither is ambiguous.
28
- *
29
- * Exported for direct unit testing — not part of the CLI's public API.
10
+ * - `session.ts` the live CDP session every subcommand acts on,
11
+ * plus the shared flag/output helpers.
12
+ * - `commands-session.ts` open / connect / close / resize.
13
+ * - `commands-context.ts` frame / tab / window / state.
14
+ * - `commands-page.ts` snapshot / get / diff.
15
+ * - `commands-navigate.ts` wait / scroll / navigate / set / pushstate.
16
+ * - `commands-input.ts` mouse, keyboard, touch and drag input.
17
+ * - `commands-element.ts` find / is / isvisible / isenabled / ischecked /
18
+ * highlight.
19
+ * - `commands-files.ts` screenshot / pdf / upload / download.
20
+ * - `commands-data.ts` storage / cookies / clipboard / dialog /
21
+ * console / errors.
22
+ * - `commands-trace.ts` network / record / trace / profiler / vitals / har.
23
+ * - `commands-script.ts` eval / batch / init scripts.
24
+ * - `commands-report.ts` the one-command page report.
30
25
  */
31
- export declare function deriveBoxOutput(center: {
32
- x: number;
33
- y: number;
34
- width: number;
35
- height: number;
36
- } | null): {
37
- x: number;
38
- y: number;
39
- width: number;
40
- height: number;
41
- centerX: number;
42
- centerY: number;
43
- } | null;
44
- export declare function parseBatchCommandLine(cmdStr: string): {
45
- subName: string;
46
- subArgs: string[];
47
- flags: Record<string, unknown>;
48
- };
26
+ import type { Command } from './types.js';
27
+ export { deriveBoxOutput } from './commands-page.js';
28
+ export { parseBatchCommandLine } from './commands-script.js';
49
29
  declare const browseCommand: Command;
50
30
  export default browseCommand;
51
31
  //# sourceMappingURL=commands.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAiC,MAAM,YAAY,CAAC;AA+4GzE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GACrE;IACD,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,IAAI,CAUP;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC,CA4BA;AA4fD,QAAA,MAAM,aAAa,EAAE,OA+JpB,CAAC;eAEa,aAAa"}
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAoEH,OAAO,KAAK,EAAE,OAAO,EAAiC,MAAM,YAAY,CAAC;AAIzE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAyH7D,QAAA,MAAM,aAAa,EAAE,OA+JpB,CAAC;eAEa,aAAa"}