@monoes/monobrowse 1.0.12 → 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.
- package/dist/src/__tests__/bridge-instruments.test.d.ts +2 -0
- package/dist/src/__tests__/bridge-instruments.test.d.ts.map +1 -0
- package/dist/src/__tests__/bridge-instruments.test.js +132 -0
- package/dist/src/__tests__/bridge-instruments.test.js.map +1 -0
- package/dist/src/__tests__/bridge-transport.test.d.ts +2 -0
- package/dist/src/__tests__/bridge-transport.test.d.ts.map +1 -0
- package/dist/src/__tests__/bridge-transport.test.js +287 -0
- package/dist/src/__tests__/bridge-transport.test.js.map +1 -0
- package/dist/src/__tests__/cdp-transport.test.d.ts +2 -0
- package/dist/src/__tests__/cdp-transport.test.d.ts.map +1 -0
- package/dist/src/__tests__/cdp-transport.test.js +167 -0
- package/dist/src/__tests__/cdp-transport.test.js.map +1 -0
- package/dist/src/__tests__/profiler-heap.test.d.ts +2 -0
- package/dist/src/__tests__/profiler-heap.test.d.ts.map +1 -0
- package/dist/src/__tests__/profiler-heap.test.js +154 -0
- package/dist/src/__tests__/profiler-heap.test.js.map +1 -0
- package/dist/src/__tests__/report-a11y.test.d.ts +2 -0
- package/dist/src/__tests__/report-a11y.test.d.ts.map +1 -0
- package/dist/src/__tests__/report-a11y.test.js +147 -0
- package/dist/src/__tests__/report-a11y.test.js.map +1 -0
- package/dist/src/__tests__/report-analyze.test.d.ts +2 -0
- package/dist/src/__tests__/report-analyze.test.d.ts.map +1 -0
- package/dist/src/__tests__/report-analyze.test.js +157 -0
- package/dist/src/__tests__/report-analyze.test.js.map +1 -0
- package/dist/src/__tests__/report-budget.test.d.ts +2 -0
- package/dist/src/__tests__/report-budget.test.d.ts.map +1 -0
- package/dist/src/__tests__/report-budget.test.js +80 -0
- package/dist/src/__tests__/report-budget.test.js.map +1 -0
- package/dist/src/__tests__/report-diff.test.d.ts +2 -0
- package/dist/src/__tests__/report-diff.test.d.ts.map +1 -0
- package/dist/src/__tests__/report-diff.test.js +231 -0
- package/dist/src/__tests__/report-diff.test.js.map +1 -0
- package/dist/src/__tests__/report-evidence.test.d.ts +2 -0
- package/dist/src/__tests__/report-evidence.test.d.ts.map +1 -0
- package/dist/src/__tests__/report-evidence.test.js +214 -0
- package/dist/src/__tests__/report-evidence.test.js.map +1 -0
- package/dist/src/__tests__/report-flake.test.d.ts +2 -0
- package/dist/src/__tests__/report-flake.test.d.ts.map +1 -0
- package/dist/src/__tests__/report-flake.test.js +182 -0
- package/dist/src/__tests__/report-flake.test.js.map +1 -0
- package/dist/src/__tests__/report-history.test.d.ts +2 -0
- package/dist/src/__tests__/report-history.test.d.ts.map +1 -0
- package/dist/src/__tests__/report-history.test.js +229 -0
- package/dist/src/__tests__/report-history.test.js.map +1 -0
- package/dist/src/__tests__/report-output.test.d.ts +2 -0
- package/dist/src/__tests__/report-output.test.d.ts.map +1 -0
- package/dist/src/__tests__/report-output.test.js +169 -0
- package/dist/src/__tests__/report-output.test.js.map +1 -0
- package/dist/src/__tests__/report-png.test.d.ts +2 -0
- package/dist/src/__tests__/report-png.test.d.ts.map +1 -0
- package/dist/src/__tests__/report-png.test.js +84 -0
- package/dist/src/__tests__/report-png.test.js.map +1 -0
- package/dist/src/__tests__/report-render-extras.test.d.ts +2 -0
- package/dist/src/__tests__/report-render-extras.test.d.ts.map +1 -0
- package/dist/src/__tests__/report-render-extras.test.js +285 -0
- package/dist/src/__tests__/report-render-extras.test.js.map +1 -0
- package/dist/src/__tests__/report-render.test.d.ts +2 -0
- package/dist/src/__tests__/report-render.test.d.ts.map +1 -0
- package/dist/src/__tests__/report-render.test.js +143 -0
- package/dist/src/__tests__/report-render.test.js.map +1 -0
- package/dist/src/__tests__/report-run.test.d.ts +2 -0
- package/dist/src/__tests__/report-run.test.d.ts.map +1 -0
- package/dist/src/__tests__/report-run.test.js +234 -0
- package/dist/src/__tests__/report-run.test.js.map +1 -0
- package/dist/src/browser/bridge.d.ts +119 -0
- package/dist/src/browser/bridge.d.ts.map +1 -0
- package/dist/src/browser/bridge.js +264 -0
- package/dist/src/browser/bridge.js.map +1 -0
- package/dist/src/browser/cdp.d.ts +11 -1
- package/dist/src/browser/cdp.d.ts.map +1 -1
- package/dist/src/browser/cdp.js +60 -56
- package/dist/src/browser/cdp.js.map +1 -1
- package/dist/src/browser/index.d.ts +3 -0
- package/dist/src/browser/index.d.ts.map +1 -1
- package/dist/src/browser/index.js +3 -0
- package/dist/src/browser/index.js.map +1 -1
- package/dist/src/browser/profiler.d.ts.map +1 -1
- package/dist/src/browser/profiler.js +19 -22
- package/dist/src/browser/profiler.js.map +1 -1
- package/dist/src/browser/transport.d.ts +62 -0
- package/dist/src/browser/transport.d.ts.map +1 -0
- package/dist/src/browser/transport.js +65 -0
- package/dist/src/browser/transport.js.map +1 -0
- package/dist/src/cli/commander-adapter.d.ts +16 -0
- package/dist/src/cli/commander-adapter.d.ts.map +1 -0
- package/dist/src/cli/commander-adapter.js +68 -0
- package/dist/src/cli/commander-adapter.js.map +1 -0
- package/dist/src/cli/commands-context.d.ts +14 -0
- package/dist/src/cli/commands-context.d.ts.map +1 -0
- package/dist/src/cli/commands-context.js +351 -0
- package/dist/src/cli/commands-context.js.map +1 -0
- package/dist/src/cli/commands-data.d.ts +12 -0
- package/dist/src/cli/commands-data.d.ts.map +1 -0
- package/dist/src/cli/commands-data.js +246 -0
- package/dist/src/cli/commands-data.js.map +1 -0
- package/dist/src/cli/commands-element.d.ts +15 -0
- package/dist/src/cli/commands-element.d.ts.map +1 -0
- package/dist/src/cli/commands-element.js +262 -0
- package/dist/src/cli/commands-element.js.map +1 -0
- package/dist/src/cli/commands-files.d.ts +9 -0
- package/dist/src/cli/commands-files.d.ts.map +1 -0
- package/dist/src/cli/commands-files.js +207 -0
- package/dist/src/cli/commands-files.js.map +1 -0
- package/dist/src/cli/commands-input.d.ts +26 -0
- package/dist/src/cli/commands-input.d.ts.map +1 -0
- package/dist/src/cli/commands-input.js +399 -0
- package/dist/src/cli/commands-input.js.map +1 -0
- package/dist/src/cli/commands-navigate.d.ts +12 -0
- package/dist/src/cli/commands-navigate.d.ts.map +1 -0
- package/dist/src/cli/commands-navigate.js +389 -0
- package/dist/src/cli/commands-navigate.js.map +1 -0
- package/dist/src/cli/commands-page.d.ts +25 -0
- package/dist/src/cli/commands-page.d.ts.map +1 -0
- package/dist/src/cli/commands-page.js +377 -0
- package/dist/src/cli/commands-page.js.map +1 -0
- package/dist/src/cli/commands-report.d.ts +8 -0
- package/dist/src/cli/commands-report.d.ts.map +1 -0
- package/dist/src/cli/commands-report.js +256 -0
- package/dist/src/cli/commands-report.js.map +1 -0
- package/dist/src/cli/commands-script.d.ts +43 -0
- package/dist/src/cli/commands-script.d.ts.map +1 -0
- package/dist/src/cli/commands-script.js +168 -0
- package/dist/src/cli/commands-script.js.map +1 -0
- package/dist/src/cli/commands-session.d.ts +15 -0
- package/dist/src/cli/commands-session.d.ts.map +1 -0
- package/dist/src/cli/commands-session.js +357 -0
- package/dist/src/cli/commands-session.js.map +1 -0
- package/dist/src/cli/commands-trace.d.ts +12 -0
- package/dist/src/cli/commands-trace.d.ts.map +1 -0
- package/dist/src/cli/commands-trace.js +347 -0
- package/dist/src/cli/commands-trace.js.map +1 -0
- package/dist/src/cli/commands.d.ts +22 -42
- package/dist/src/cli/commands.d.ts.map +1 -1
- package/dist/src/cli/commands.js +48 -3400
- package/dist/src/cli/commands.js.map +1 -1
- package/dist/src/cli/session.d.ts +47 -0
- package/dist/src/cli/session.d.ts.map +1 -0
- package/dist/src/cli/session.js +343 -0
- package/dist/src/cli/session.js.map +1 -0
- package/dist/src/report/a11y.d.ts +52 -0
- package/dist/src/report/a11y.d.ts.map +1 -0
- package/dist/src/report/a11y.js +231 -0
- package/dist/src/report/a11y.js.map +1 -0
- package/dist/src/report/analyze.d.ts +20 -0
- package/dist/src/report/analyze.d.ts.map +1 -0
- package/dist/src/report/analyze.js +136 -0
- package/dist/src/report/analyze.js.map +1 -0
- package/dist/src/report/budget.d.ts +27 -0
- package/dist/src/report/budget.d.ts.map +1 -0
- package/dist/src/report/budget.js +143 -0
- package/dist/src/report/budget.js.map +1 -0
- package/dist/src/report/collect-a11y.d.ts +25 -0
- package/dist/src/report/collect-a11y.d.ts.map +1 -0
- package/dist/src/report/collect-a11y.js +154 -0
- package/dist/src/report/collect-a11y.js.map +1 -0
- package/dist/src/report/collect.d.ts +45 -0
- package/dist/src/report/collect.d.ts.map +1 -0
- package/dist/src/report/collect.js +275 -0
- package/dist/src/report/collect.js.map +1 -0
- package/dist/src/report/evidence.d.ts +80 -0
- package/dist/src/report/evidence.d.ts.map +1 -0
- package/dist/src/report/evidence.js +279 -0
- package/dist/src/report/evidence.js.map +1 -0
- package/dist/src/report/flake.d.ts +88 -0
- package/dist/src/report/flake.d.ts.map +1 -0
- package/dist/src/report/flake.js +232 -0
- package/dist/src/report/flake.js.map +1 -0
- package/dist/src/report/history.d.ts +85 -0
- package/dist/src/report/history.d.ts.map +1 -0
- package/dist/src/report/history.js +176 -0
- package/dist/src/report/history.js.map +1 -0
- package/dist/src/report/index.d.ts +102 -0
- package/dist/src/report/index.d.ts.map +1 -0
- package/dist/src/report/index.js +216 -0
- package/dist/src/report/index.js.map +1 -0
- package/dist/src/report/pixel-diff.d.ts +30 -0
- package/dist/src/report/pixel-diff.d.ts.map +1 -0
- package/dist/src/report/pixel-diff.js +175 -0
- package/dist/src/report/pixel-diff.js.map +1 -0
- package/dist/src/report/png.d.ts +28 -0
- package/dist/src/report/png.d.ts.map +1 -0
- package/dist/src/report/png.js +259 -0
- package/dist/src/report/png.js.map +1 -0
- package/dist/src/report/render-evidence.d.ts +16 -0
- package/dist/src/report/render-evidence.d.ts.map +1 -0
- package/dist/src/report/render-evidence.js +174 -0
- package/dist/src/report/render-evidence.js.map +1 -0
- package/dist/src/report/render-trend.d.ts +16 -0
- package/dist/src/report/render-trend.d.ts.map +1 -0
- package/dist/src/report/render-trend.js +194 -0
- package/dist/src/report/render-trend.js.map +1 -0
- package/dist/src/report/render.d.ts +21 -0
- package/dist/src/report/render.d.ts.map +1 -0
- package/dist/src/report/render.js +286 -0
- package/dist/src/report/render.js.map +1 -0
- package/dist/src/report/run-diff.d.ts +18 -0
- package/dist/src/report/run-diff.d.ts.map +1 -0
- package/dist/src/report/run-diff.js +51 -0
- package/dist/src/report/run-diff.js.map +1 -0
- package/dist/src/report/structure.d.ts +41 -0
- package/dist/src/report/structure.d.ts.map +1 -0
- package/dist/src/report/structure.js +210 -0
- package/dist/src/report/structure.js.map +1 -0
- package/dist/src/report/trend.d.ts +26 -0
- package/dist/src/report/trend.d.ts.map +1 -0
- package/dist/src/report/trend.js +164 -0
- package/dist/src/report/trend.js.map +1 -0
- package/dist/src/report/types.d.ts +320 -0
- package/dist/src/report/types.d.ts.map +1 -0
- package/dist/src/report/types.js +11 -0
- package/dist/src/report/types.js.map +1 -0
- package/dist/src/report/util.d.ts +17 -0
- package/dist/src/report/util.d.ts.map +1 -0
- package/dist/src/report/util.js +45 -0
- package/dist/src/report/util.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/__tests__/bridge-instruments.test.ts +180 -0
- package/src/__tests__/bridge-transport.test.ts +365 -0
- package/src/__tests__/cdp-transport.test.ts +198 -0
- package/src/__tests__/profiler-heap.test.ts +191 -0
- package/src/__tests__/report-a11y.test.ts +180 -0
- package/src/__tests__/report-analyze.test.ts +202 -0
- package/src/__tests__/report-budget.test.ts +92 -0
- package/src/__tests__/report-diff.test.ts +272 -0
- package/src/__tests__/report-evidence.test.ts +276 -0
- package/src/__tests__/report-flake.test.ts +214 -0
- package/src/__tests__/report-history.test.ts +293 -0
- package/src/__tests__/report-output.test.ts +210 -0
- package/src/__tests__/report-png.test.ts +95 -0
- package/src/__tests__/report-render-extras.test.ts +315 -0
- package/src/__tests__/report-render.test.ts +175 -0
- package/src/__tests__/report-run.test.ts +264 -0
- package/src/browser/bridge.ts +354 -0
- package/src/browser/cdp.ts +57 -52
- package/src/browser/index.ts +3 -0
- package/src/browser/profiler.ts +28 -21
- package/src/browser/transport.ts +111 -0
- package/src/cli/commander-adapter.ts +65 -0
- package/src/cli/commands-context.ts +367 -0
- package/src/cli/commands-data.ts +248 -0
- package/src/cli/commands-element.ts +305 -0
- package/src/cli/commands-files.ts +248 -0
- package/src/cli/commands-input.ts +434 -0
- package/src/cli/commands-navigate.ts +442 -0
- package/src/cli/commands-page.ts +420 -0
- package/src/cli/commands-report.ts +275 -0
- package/src/cli/commands-script.ts +183 -0
- package/src/cli/commands-session.ts +376 -0
- package/src/cli/commands-trace.ts +349 -0
- package/src/cli/commands.ts +101 -3677
- package/src/cli/session.ts +412 -0
- package/src/report/a11y.ts +242 -0
- package/src/report/analyze.ts +181 -0
- package/src/report/budget.ts +155 -0
- package/src/report/collect-a11y.ts +200 -0
- package/src/report/collect.ts +408 -0
- package/src/report/evidence.ts +379 -0
- package/src/report/flake.ts +303 -0
- package/src/report/history.ts +219 -0
- package/src/report/index.ts +307 -0
- package/src/report/pixel-diff.ts +197 -0
- package/src/report/png.ts +290 -0
- package/src/report/render-evidence.ts +194 -0
- package/src/report/render-trend.ts +225 -0
- package/src/report/render.ts +314 -0
- package/src/report/run-diff.ts +63 -0
- package/src/report/structure.ts +212 -0
- package/src/report/trend.ts +189 -0
- package/src/report/types.ts +356 -0
- package/src/report/util.ts +48 -0
|
@@ -0,0 +1,349 @@
|
|
|
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
|
+
|
|
6
|
+
import type { NetworkRoute } from '../index.js';
|
|
7
|
+
import { output } from './output.js';
|
|
8
|
+
import { ensureConnected, getBrowser, imageFormat, print, session } from './session.js';
|
|
9
|
+
import type { Command, CommandContext, CommandResult } from './types.js';
|
|
10
|
+
|
|
11
|
+
export const networkCommand: Command = {
|
|
12
|
+
name: 'network',
|
|
13
|
+
description: 'Network interception and cookie management',
|
|
14
|
+
options: [
|
|
15
|
+
{ name: 'pattern', type: 'string', description: 'URL pattern for route (glob)' },
|
|
16
|
+
{ name: 'abort', type: 'boolean', description: 'Abort matching requests' },
|
|
17
|
+
{ name: 'fulfill', type: 'string', description: 'JSON response body' },
|
|
18
|
+
{ name: 'status', type: 'number', description: 'HTTP status for fulfill', default: 200 },
|
|
19
|
+
{ name: 'headers', type: 'string', description: 'JSON headers object' },
|
|
20
|
+
{ name: 'json', type: 'boolean', description: 'Output as JSON', default: false },
|
|
21
|
+
{
|
|
22
|
+
name: 'filter',
|
|
23
|
+
type: 'string',
|
|
24
|
+
description: 'Filter requests by URL substring (for network requests)',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'method',
|
|
28
|
+
type: 'string',
|
|
29
|
+
description: 'Filter by HTTP method, e.g. GET, POST (for network requests)',
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: 'status-code',
|
|
33
|
+
type: 'number',
|
|
34
|
+
description: 'Filter by HTTP status code (for network requests)',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: 'type',
|
|
38
|
+
type: 'string',
|
|
39
|
+
description:
|
|
40
|
+
'Filter by resource type: xhr|fetch|document|script|stylesheet|image (for network requests)',
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
action: async (ctx: CommandContext): Promise<CommandResult> => {
|
|
44
|
+
const { client, sessionId } = await ensureConnected(session.port);
|
|
45
|
+
const browser = await getBrowser();
|
|
46
|
+
const action = ctx.args[0] as string;
|
|
47
|
+
if (!action)
|
|
48
|
+
throw new Error('Usage: monomind browse network route|unroute|cookies|headers|requests');
|
|
49
|
+
|
|
50
|
+
switch (action) {
|
|
51
|
+
case 'route': {
|
|
52
|
+
const pattern = ctx.flags.pattern as string;
|
|
53
|
+
if (!pattern) throw new Error('--pattern required for network route');
|
|
54
|
+
const routes: NetworkRoute[] = [
|
|
55
|
+
{
|
|
56
|
+
pattern,
|
|
57
|
+
action: ctx.flags.abort ? 'abort' : ctx.flags.fulfill ? 'fulfill' : 'continue',
|
|
58
|
+
response: ctx.flags.fulfill
|
|
59
|
+
? {
|
|
60
|
+
status: ctx.flags.status as number,
|
|
61
|
+
body: ctx.flags.fulfill as string,
|
|
62
|
+
headers: ctx.flags.headers ? JSON.parse(ctx.flags.headers as string) : {},
|
|
63
|
+
}
|
|
64
|
+
: undefined,
|
|
65
|
+
},
|
|
66
|
+
];
|
|
67
|
+
await browser.setupRoutes(client, sessionId, routes);
|
|
68
|
+
output.printSuccess(`Network route set: ${pattern}`);
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
case 'unroute':
|
|
72
|
+
await browser.disableInterception(client, sessionId);
|
|
73
|
+
output.printSuccess('Network interception disabled');
|
|
74
|
+
break;
|
|
75
|
+
case 'cookies': {
|
|
76
|
+
const cookies = await browser.getCookies(client, sessionId);
|
|
77
|
+
print(JSON.stringify(cookies, null, 2));
|
|
78
|
+
return { success: true, data: { cookies } };
|
|
79
|
+
}
|
|
80
|
+
case 'headers': {
|
|
81
|
+
const headers = ctx.flags.headers as string;
|
|
82
|
+
if (!headers) throw new Error('--headers required (JSON string)');
|
|
83
|
+
await browser.setExtraHeaders(client, sessionId, JSON.parse(headers));
|
|
84
|
+
output.printSuccess('Extra headers set');
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
case 'capture': {
|
|
88
|
+
const subAction = (ctx.args[1] as string) ?? 'start';
|
|
89
|
+
if (subAction === 'start') {
|
|
90
|
+
browser.startRequestCapture(client, sessionId);
|
|
91
|
+
output.printSuccess('Request capture started');
|
|
92
|
+
} else if (subAction === 'stop') {
|
|
93
|
+
browser.stopRequestCapture(sessionId);
|
|
94
|
+
output.printSuccess('Request capture stopped');
|
|
95
|
+
} else if (subAction === 'clear') {
|
|
96
|
+
browser.clearCapturedRequests(sessionId);
|
|
97
|
+
output.printSuccess('Captured requests cleared');
|
|
98
|
+
}
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
case 'requests': {
|
|
102
|
+
let reqs = browser.getCapturedRequests(sessionId);
|
|
103
|
+
const filterUrl = ctx.flags.filter as string | undefined;
|
|
104
|
+
const filterMethod = ctx.flags.method as string | undefined;
|
|
105
|
+
const filterStatus = ctx.flags['status-code'] as number | undefined;
|
|
106
|
+
const filterType = ctx.flags.type as string | undefined;
|
|
107
|
+
if (filterUrl) reqs = reqs.filter((r) => r.url.includes(filterUrl));
|
|
108
|
+
if (filterMethod)
|
|
109
|
+
reqs = reqs.filter(
|
|
110
|
+
(r) => (r.method ?? 'GET').toUpperCase() === filterMethod.toUpperCase(),
|
|
111
|
+
);
|
|
112
|
+
if (filterStatus) reqs = reqs.filter((r) => r.status === filterStatus);
|
|
113
|
+
if (filterType)
|
|
114
|
+
reqs = reqs.filter(
|
|
115
|
+
(r) =>
|
|
116
|
+
(r as Record<string, unknown>).resourceType === filterType ||
|
|
117
|
+
(r as Record<string, unknown>).type === filterType,
|
|
118
|
+
);
|
|
119
|
+
if (ctx.flags.json) print(JSON.stringify({ data: reqs }));
|
|
120
|
+
else {
|
|
121
|
+
if (reqs.length === 0) {
|
|
122
|
+
output.printInfo('No captured requests. Run: network capture start');
|
|
123
|
+
} else for (const r of reqs) print(` ${r.method ?? 'GET'} ${r.status ?? '-'} ${r.url}`);
|
|
124
|
+
}
|
|
125
|
+
return { success: true, data: { requests: reqs } };
|
|
126
|
+
}
|
|
127
|
+
case 'request': {
|
|
128
|
+
const reqId = ctx.args[1] as string;
|
|
129
|
+
if (!reqId) throw new Error('Usage: monomind browse network request <requestId>');
|
|
130
|
+
const reqs = browser.getCapturedRequests(sessionId);
|
|
131
|
+
const req = reqs.find(
|
|
132
|
+
(r) =>
|
|
133
|
+
(r as Record<string, unknown>).requestId === reqId ||
|
|
134
|
+
(r as Record<string, unknown>).id === reqId,
|
|
135
|
+
);
|
|
136
|
+
if (!req) {
|
|
137
|
+
output.printWarning(`Request not found: ${reqId}`);
|
|
138
|
+
return { success: false };
|
|
139
|
+
}
|
|
140
|
+
if (ctx.flags.json) print(JSON.stringify({ data: req }));
|
|
141
|
+
else print(JSON.stringify(req, null, 2));
|
|
142
|
+
return { success: true, data: { request: req } };
|
|
143
|
+
}
|
|
144
|
+
default:
|
|
145
|
+
throw new Error(
|
|
146
|
+
`Unknown: ${action}. Use: route|unroute|cookies|headers|capture|requests|request`,
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return { success: true };
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
// Default output cap for eval when --max-output isn't passed explicitly —
|
|
155
|
+
// print(String(result)) had NO limit at all (unlike snapshot's --max-output),
|
|
156
|
+
// so e.g. `eval "document.documentElement.outerHTML"` could dump megabytes
|
|
157
|
+
// straight into an agent's context. An explicit --max-output still overrides
|
|
158
|
+
// this default.
|
|
159
|
+
|
|
160
|
+
export const recordCommand: Command = {
|
|
161
|
+
name: 'record',
|
|
162
|
+
description: 'Screen recording. Usage: monomind browse record start|stop|restart|status [path]',
|
|
163
|
+
options: [
|
|
164
|
+
{ name: 'format', type: 'string', description: 'jpeg|png', default: 'jpeg' },
|
|
165
|
+
{ name: 'quality', type: 'number', description: 'Quality 0-100', default: 80 },
|
|
166
|
+
{ name: 'json', type: 'boolean', description: 'Output as JSON', default: false },
|
|
167
|
+
],
|
|
168
|
+
action: async (ctx: CommandContext): Promise<CommandResult> => {
|
|
169
|
+
const { client, sessionId } = await ensureConnected(session.port);
|
|
170
|
+
const browser = await getBrowser();
|
|
171
|
+
const action = ctx.args[0] as string;
|
|
172
|
+
if (!action) throw new Error('Usage: monomind browse record start|stop|restart|status');
|
|
173
|
+
|
|
174
|
+
switch (action) {
|
|
175
|
+
case 'start':
|
|
176
|
+
await browser.startRecording(client, sessionId, {
|
|
177
|
+
format: imageFormat(ctx.flags.format, ['jpeg', 'png'] as const, 'jpeg'),
|
|
178
|
+
quality: ctx.flags.quality as number,
|
|
179
|
+
});
|
|
180
|
+
output.printSuccess('Recording started');
|
|
181
|
+
return { success: true };
|
|
182
|
+
case 'stop': {
|
|
183
|
+
const path = await browser.stopRecording(client, sessionId, ctx.args[1] as string);
|
|
184
|
+
if (ctx.flags.json) print(JSON.stringify({ data: { path } }));
|
|
185
|
+
else output.printSuccess(`Recording saved: ${path}`);
|
|
186
|
+
return { success: true, data: { path } };
|
|
187
|
+
}
|
|
188
|
+
case 'restart': {
|
|
189
|
+
const prevStatus = browser.getRecordingStatus(sessionId);
|
|
190
|
+
let prevPath: string | undefined;
|
|
191
|
+
if (prevStatus.recording || prevStatus.autoStopped) {
|
|
192
|
+
prevPath = await browser.stopRecording(client, sessionId, ctx.args[1] as string);
|
|
193
|
+
output.printInfo(`Previous recording saved: ${prevPath}`);
|
|
194
|
+
}
|
|
195
|
+
await browser.startRecording(client, sessionId, {
|
|
196
|
+
format: imageFormat(ctx.flags.format, ['jpeg', 'png'] as const, 'jpeg'),
|
|
197
|
+
quality: ctx.flags.quality as number,
|
|
198
|
+
});
|
|
199
|
+
output.printSuccess('Recording restarted');
|
|
200
|
+
return { success: true, data: { previous: prevPath } };
|
|
201
|
+
}
|
|
202
|
+
case 'status': {
|
|
203
|
+
const status = browser.getRecordingStatus(sessionId);
|
|
204
|
+
if (ctx.flags.json) print(JSON.stringify({ data: status }));
|
|
205
|
+
else
|
|
206
|
+
print(
|
|
207
|
+
`Recording: ${status.recording} | Frames: ${status.frames}${status.autoStopped ? ' (auto-stopped: buffer limit reached — run "record stop" to save)' : ''}`,
|
|
208
|
+
);
|
|
209
|
+
return { success: true, data: status };
|
|
210
|
+
}
|
|
211
|
+
default:
|
|
212
|
+
throw new Error('Usage: monomind browse record start|stop|restart|status [path]');
|
|
213
|
+
}
|
|
214
|
+
},
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
export const traceCommand: Command = {
|
|
218
|
+
name: 'trace',
|
|
219
|
+
description: 'CDP performance trace. Usage: monomind browse trace start|stop [path]',
|
|
220
|
+
options: [
|
|
221
|
+
{ name: 'screenshots', type: 'boolean', description: 'Include screenshots', default: false },
|
|
222
|
+
{ name: 'json', type: 'boolean', description: 'Output as JSON', default: false },
|
|
223
|
+
],
|
|
224
|
+
action: async (ctx: CommandContext): Promise<CommandResult> => {
|
|
225
|
+
const { client, sessionId } = await ensureConnected(session.port);
|
|
226
|
+
const browser = await getBrowser();
|
|
227
|
+
const action = ctx.args[0] as string;
|
|
228
|
+
if (!action) throw new Error('Usage: monomind browse trace start|stop [path]');
|
|
229
|
+
|
|
230
|
+
switch (action) {
|
|
231
|
+
case 'start':
|
|
232
|
+
await browser.startTrace(client, sessionId, {
|
|
233
|
+
screenshots: ctx.flags.screenshots as boolean,
|
|
234
|
+
});
|
|
235
|
+
output.printSuccess('Trace started');
|
|
236
|
+
return { success: true };
|
|
237
|
+
case 'stop': {
|
|
238
|
+
const path = await browser.stopTrace(client, sessionId, ctx.args[1] as string);
|
|
239
|
+
if (ctx.flags.json) print(JSON.stringify({ data: { path } }));
|
|
240
|
+
else output.printSuccess(`Trace saved: ${path}`);
|
|
241
|
+
return { success: true, data: { path } };
|
|
242
|
+
}
|
|
243
|
+
case 'status':
|
|
244
|
+
print(browser.getTraceStatus(sessionId) ? 'Tracing active' : 'Not tracing');
|
|
245
|
+
return { success: true };
|
|
246
|
+
default:
|
|
247
|
+
throw new Error('Usage: monomind browse trace start|stop|status [path]');
|
|
248
|
+
}
|
|
249
|
+
},
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
export const profilerCommand: Command = {
|
|
253
|
+
name: 'profiler',
|
|
254
|
+
description: 'CPU profiler. Usage: monomind browse profiler start|stop|heap [path]',
|
|
255
|
+
options: [
|
|
256
|
+
{ name: 'interval', type: 'number', description: 'Sampling interval µs', default: 1000 },
|
|
257
|
+
{ name: 'json', type: 'boolean', description: 'Output as JSON', default: false },
|
|
258
|
+
],
|
|
259
|
+
action: async (ctx: CommandContext): Promise<CommandResult> => {
|
|
260
|
+
const { client, sessionId } = await ensureConnected(session.port);
|
|
261
|
+
const browser = await getBrowser();
|
|
262
|
+
const action = ctx.args[0] as string;
|
|
263
|
+
if (!action) throw new Error('Usage: monomind browse profiler start|stop|heap [path]');
|
|
264
|
+
|
|
265
|
+
switch (action) {
|
|
266
|
+
case 'start':
|
|
267
|
+
await browser.startCpuProfile(client, sessionId, {
|
|
268
|
+
samplingInterval: ctx.flags.interval as number,
|
|
269
|
+
});
|
|
270
|
+
output.printSuccess('CPU profiler started');
|
|
271
|
+
return { success: true };
|
|
272
|
+
case 'stop': {
|
|
273
|
+
const path = await browser.stopCpuProfile(client, sessionId, ctx.args[1] as string);
|
|
274
|
+
if (ctx.flags.json) print(JSON.stringify({ data: { path } }));
|
|
275
|
+
else output.printSuccess(`Profile saved: ${path}`);
|
|
276
|
+
return { success: true, data: { path } };
|
|
277
|
+
}
|
|
278
|
+
case 'heap': {
|
|
279
|
+
const path = await browser.startHeapSnapshot(client, sessionId, ctx.args[1] as string);
|
|
280
|
+
if (ctx.flags.json) print(JSON.stringify({ data: { path } }));
|
|
281
|
+
else output.printSuccess(`Heap snapshot saved: ${path}`);
|
|
282
|
+
return { success: true, data: { path } };
|
|
283
|
+
}
|
|
284
|
+
default:
|
|
285
|
+
throw new Error('Usage: monomind browse profiler start|stop|heap [path]');
|
|
286
|
+
}
|
|
287
|
+
},
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
export const vitalsCommand: Command = {
|
|
291
|
+
name: 'vitals',
|
|
292
|
+
description: 'Collect Core Web Vitals. Usage: monomind browse vitals [--wait 2000]',
|
|
293
|
+
options: [
|
|
294
|
+
{ name: 'wait', type: 'number', description: 'Wait ms for observers', default: 2000 },
|
|
295
|
+
{ name: 'json', type: 'boolean', description: 'Output as JSON', default: false },
|
|
296
|
+
],
|
|
297
|
+
action: async (ctx: CommandContext): Promise<CommandResult> => {
|
|
298
|
+
const { client, sessionId } = await ensureConnected(session.port);
|
|
299
|
+
const browser = await getBrowser();
|
|
300
|
+
const vitals = await browser.collectVitals(client, sessionId, ctx.flags.wait as number);
|
|
301
|
+
if (ctx.flags.json) {
|
|
302
|
+
print(JSON.stringify({ data: vitals }));
|
|
303
|
+
} else {
|
|
304
|
+
print(browser.formatVitals(vitals));
|
|
305
|
+
}
|
|
306
|
+
return { success: true, data: vitals };
|
|
307
|
+
},
|
|
308
|
+
};
|
|
309
|
+
|
|
310
|
+
export const harCommand: Command = {
|
|
311
|
+
name: 'har',
|
|
312
|
+
description: 'HAR network recording. Usage: monomind browse har start|stop|status [path]',
|
|
313
|
+
options: [
|
|
314
|
+
{ name: 'bodies', type: 'boolean', description: 'Capture response bodies', default: false },
|
|
315
|
+
{ name: 'json', type: 'boolean', description: 'Output as JSON', default: false },
|
|
316
|
+
],
|
|
317
|
+
action: async (ctx: CommandContext): Promise<CommandResult> => {
|
|
318
|
+
const { client, sessionId } = await ensureConnected(session.port);
|
|
319
|
+
const browser = await getBrowser();
|
|
320
|
+
const action = ctx.args[0] as string;
|
|
321
|
+
if (!action) throw new Error('Usage: monomind browse har start|stop|status [path]');
|
|
322
|
+
|
|
323
|
+
switch (action) {
|
|
324
|
+
case 'start':
|
|
325
|
+
await browser.startHarRecording(client, sessionId);
|
|
326
|
+
output.printSuccess('HAR recording started');
|
|
327
|
+
return { success: true };
|
|
328
|
+
case 'stop': {
|
|
329
|
+
const path = await browser.stopHarRecording(
|
|
330
|
+
client,
|
|
331
|
+
sessionId,
|
|
332
|
+
ctx.args[1] as string,
|
|
333
|
+
ctx.flags.bodies as boolean,
|
|
334
|
+
);
|
|
335
|
+
if (ctx.flags.json) print(JSON.stringify({ data: { path } }));
|
|
336
|
+
else output.printSuccess(`HAR saved: ${path}`);
|
|
337
|
+
return { success: true, data: { path } };
|
|
338
|
+
}
|
|
339
|
+
case 'status': {
|
|
340
|
+
const status = browser.getHarStatus(sessionId);
|
|
341
|
+
if (ctx.flags.json) print(JSON.stringify({ data: status }));
|
|
342
|
+
else print(`Recording: ${status.recording} | Requests: ${status.requestCount}`);
|
|
343
|
+
return { success: true, data: status };
|
|
344
|
+
}
|
|
345
|
+
default:
|
|
346
|
+
throw new Error('Usage: monomind browse har start|stop|status [path]');
|
|
347
|
+
}
|
|
348
|
+
},
|
|
349
|
+
};
|