@vforsh/argus-watcher 0.5.2 → 0.5.4

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 (49) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/cdp/ffmpeg.d.ts +22 -6
  3. package/dist/cdp/ffmpeg.d.ts.map +1 -1
  4. package/dist/cdp/ffmpeg.js +90 -30
  5. package/dist/cdp/ffmpeg.js.map +1 -1
  6. package/dist/cdp/recording.d.ts +3 -1
  7. package/dist/cdp/recording.d.ts.map +1 -1
  8. package/dist/cdp/recording.js +237 -132
  9. package/dist/cdp/recording.js.map +1 -1
  10. package/dist/cdp/recordingSession.d.ts +97 -0
  11. package/dist/cdp/recordingSession.d.ts.map +1 -0
  12. package/dist/cdp/recordingSession.js +157 -0
  13. package/dist/cdp/recordingSession.js.map +1 -0
  14. package/dist/cdp/scenarioBridge.d.ts +2 -0
  15. package/dist/cdp/scenarioBridge.d.ts.map +1 -1
  16. package/dist/cdp/scenarioBridge.js +49 -3
  17. package/dist/cdp/scenarioBridge.js.map +1 -1
  18. package/dist/cdp/screenshot.d.ts.map +1 -1
  19. package/dist/cdp/screenshot.js +3 -2
  20. package/dist/cdp/screenshot.js.map +1 -1
  21. package/dist/cdp/visualCapture.d.ts +20 -0
  22. package/dist/cdp/visualCapture.d.ts.map +1 -1
  23. package/dist/cdp/visualCapture.js +53 -42
  24. package/dist/cdp/visualCapture.js.map +1 -1
  25. package/dist/http/endpoints.d.ts +1 -1
  26. package/dist/http/endpoints.d.ts.map +1 -1
  27. package/dist/http/endpoints.js +1 -0
  28. package/dist/http/endpoints.js.map +1 -1
  29. package/dist/http/routes/getStatus.js +1 -0
  30. package/dist/http/routes/getStatus.js.map +1 -1
  31. package/dist/http/routes/postEval.d.ts.map +1 -1
  32. package/dist/http/routes/postEval.js +1 -0
  33. package/dist/http/routes/postEval.js.map +1 -1
  34. package/dist/http/routes/postRecord.d.ts.map +1 -1
  35. package/dist/http/routes/postRecord.js +9 -0
  36. package/dist/http/routes/postRecord.js.map +1 -1
  37. package/dist/internal.d.ts +1 -0
  38. package/dist/internal.d.ts.map +1 -1
  39. package/dist/internal.js +1 -0
  40. package/dist/internal.js.map +1 -1
  41. package/dist/sourcemaps/scriptFetcher.d.ts +27 -0
  42. package/dist/sourcemaps/scriptFetcher.d.ts.map +1 -0
  43. package/dist/sourcemaps/scriptFetcher.js +69 -0
  44. package/dist/sourcemaps/scriptFetcher.js.map +1 -0
  45. package/dist/sourcemaps/sourcemapResolver.d.ts +4 -1
  46. package/dist/sourcemaps/sourcemapResolver.d.ts.map +1 -1
  47. package/dist/sourcemaps/sourcemapResolver.js +5 -14
  48. package/dist/sourcemaps/sourcemapResolver.js.map +1 -1
  49. package/package.json +1 -1
@@ -0,0 +1,157 @@
1
+ import { tryEvaluateInPage } from './pageState.js';
2
+ import { delay } from '@vforsh/argus-core';
3
+ /**
4
+ * Scroll a selector target into view before the capture plan measures it.
5
+ *
6
+ * A screencast only ever carries the visible viewport, so an element below the fold has no pixels
7
+ * to crop. `Page.captureScreenshot` has no such limit, which is why `screenshot --selector` works
8
+ * on an off-screen element and `record --selector` cannot — it used to silently emit a 2px sliver.
9
+ *
10
+ * Best-effort: a selector that matches nothing is reported by the capture plan, which produces a
11
+ * better message than anything this could throw.
12
+ */
13
+ export const scrollSelectorIntoView = async (session, selector) => {
14
+ await tryEvaluateInPage(session, `document.querySelector(${JSON.stringify(selector)})?.scrollIntoView({ block: 'center', inline: 'center', behavior: 'instant' })`, { timeoutMs: 5_000 });
15
+ // Let scroll-linked layout settle before the box model is read.
16
+ await delay(100);
17
+ };
18
+ /** Smallest visible edge, in CSS pixels, that still makes a recordable region. */
19
+ const MIN_VISIBLE_EXTENT_PX = 2;
20
+ /**
21
+ * Reject a crop the screencast cannot actually deliver.
22
+ *
23
+ * The encoder clamps an out-of-frame rectangle to the nearest legal one, so an off-screen target
24
+ * used to encode cleanly as a 2-pixel sliver and only look wrong when someone played the file.
25
+ *
26
+ * @throws {Error} When the crop lies (almost) entirely outside the captured viewport.
27
+ */
28
+ export const assertClipIsVisible = (clip, viewport, subject) => {
29
+ if (!viewport) {
30
+ return;
31
+ }
32
+ const visibleWidth = Math.min(clip.x + clip.width, viewport.width) - Math.max(clip.x, 0);
33
+ const visibleHeight = Math.min(clip.y + clip.height, viewport.height) - Math.max(clip.y, 0);
34
+ if (visibleWidth >= MIN_VISIBLE_EXTENT_PX && visibleHeight >= MIN_VISIBLE_EXTENT_PX) {
35
+ return;
36
+ }
37
+ throw new Error(`${subject} is outside the visible viewport (${Math.round(clip.width)}x${Math.round(clip.height)} at ${Math.round(clip.x)},${Math.round(clip.y)}; viewport is ${Math.round(viewport.width)}x${Math.round(viewport.height)}). ` +
38
+ 'Recordings capture only what the page is showing — scroll the target into view, or record the viewport and crop later.');
39
+ };
40
+ /**
41
+ * Start (or restart) Chrome's screencast for this recording.
42
+ *
43
+ * Called once at start and again after every top-frame navigation: Chrome tears the screencast
44
+ * down on a cross-process navigation and never says so, which used to leave the encoder repeating
45
+ * the last pre-navigation frame for the rest of the capture.
46
+ */
47
+ export const armScreencast = async (state) => {
48
+ await state.session.sendAndWait('Page.startScreencast', {
49
+ format: state.frameCodec,
50
+ quality: state.frameCodec === 'jpeg' ? state.quality : undefined,
51
+ everyNthFrame: 1,
52
+ });
53
+ };
54
+ /** Subscribe to screencast frames and top-frame navigations for the lifetime of the recording. */
55
+ export const subscribeToScreencast = (state) => {
56
+ state.removeFrameHandler = state.session.onEvent('Page.screencastFrame', (params) => {
57
+ handleScreencastFrame(state, params);
58
+ });
59
+ state.removeNavigationHandler = state.session.onEvent('Page.frameNavigated', (params) => {
60
+ // Subframe navigations do not disturb the screencast; only the top frame does.
61
+ if (params.frame?.parentId) {
62
+ return;
63
+ }
64
+ if (state.state !== 'recording' && state.state !== 'starting') {
65
+ return;
66
+ }
67
+ state.navigations += 1;
68
+ void armScreencast(state).catch(() => {
69
+ // The renderer may still be swapping; the next navigation or stop reports the gap.
70
+ });
71
+ });
72
+ };
73
+ const handleScreencastFrame = (state, params) => {
74
+ if (typeof params.data !== 'string') {
75
+ return;
76
+ }
77
+ const frame = Buffer.from(params.data, 'base64');
78
+ state.latestFrame = frame;
79
+ state.resolveFirstFrame(frame);
80
+ if (typeof params.sessionId === 'number') {
81
+ void state.session.sendAndWait('Page.screencastFrameAck', { sessionId: params.sessionId }).catch(() => { });
82
+ }
83
+ };
84
+ /**
85
+ * Frames wall-clock time says should exist by now.
86
+ *
87
+ * Recomputed from elapsed time rather than incremented once per timer tick: `setInterval` drifts
88
+ * under load and silently under-delivers, so a counter produced files whose duration did not match
89
+ * the capture window — a 5s recording that played back as 3.4s.
90
+ */
91
+ const targetFrameCount = (state, elapsedMs) => Math.max(1, Math.round((elapsedMs / 1000) * state.fps));
92
+ /**
93
+ * Write frames until the encoder has `target` of them.
94
+ *
95
+ * The deficit left by backpressure is never dropped — it is paid down over successive calls — but
96
+ * one call writes at most a second's worth, so a stalled encoder cannot make us buffer an unbounded
97
+ * burst of full frames in its stdin.
98
+ */
99
+ const writeFramesUpTo = (state, target) => {
100
+ if (!state.latestFrame || !state.ffmpeg || state.pumpBlocked || state.ffmpeg.child.stdin.destroyed) {
101
+ return;
102
+ }
103
+ let budget = Math.max(1, state.fps);
104
+ while (state.frameCount < target && budget > 0) {
105
+ budget -= 1;
106
+ state.frameCount += 1;
107
+ const ready = state.ffmpeg.child.stdin.write(state.latestFrame);
108
+ if (!ready) {
109
+ state.pumpBlocked = true;
110
+ state.ffmpeg.child.stdin.once('drain', () => {
111
+ state.pumpBlocked = false;
112
+ writeFramesUpTo(state, target);
113
+ });
114
+ return;
115
+ }
116
+ }
117
+ };
118
+ /** Bring the encoder up to date with how long the recording has been running. */
119
+ export const pumpFrames = (state) => {
120
+ writeFramesUpTo(state, targetFrameCount(state, Math.max(0, Date.now() - state.startedAt)));
121
+ };
122
+ /** Write the frames the final capture window still owes, then wait for the encoder to drain them. */
123
+ export const flushFrames = async (state, elapsedMs) => {
124
+ const target = targetFrameCount(state, elapsedMs);
125
+ writeFramesUpTo(state, target);
126
+ while (state.frameCount < target || state.pumpBlocked) {
127
+ if (!state.ffmpeg || state.ffmpeg.child.stdin.destroyed) {
128
+ return;
129
+ }
130
+ await delay(10);
131
+ writeFramesUpTo(state, target);
132
+ }
133
+ };
134
+ /** Clear every timer the recording owns. Safe to call more than once. */
135
+ export const clearRecordingTimers = (state) => {
136
+ if (state.firstFrameTimer) {
137
+ clearTimeout(state.firstFrameTimer);
138
+ state.firstFrameTimer = null;
139
+ }
140
+ if (state.sampleTimer) {
141
+ clearInterval(state.sampleTimer);
142
+ state.sampleTimer = null;
143
+ }
144
+ if (state.maxDurationTimer) {
145
+ clearTimeout(state.maxDurationTimer);
146
+ state.maxDurationTimer = null;
147
+ }
148
+ if (state.endTimer) {
149
+ clearTimeout(state.endTimer);
150
+ state.endTimer = null;
151
+ }
152
+ if (state.untilTimer) {
153
+ clearInterval(state.untilTimer);
154
+ state.untilTimer = null;
155
+ }
156
+ };
157
+ //# sourceMappingURL=recordingSession.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recordingSession.js","sourceRoot":"","sources":["../../src/cdp/recordingSession.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,12 @@
1
1
  import type { LogBuffer } from '../buffer/LogBuffer.js';
2
2
  import type { Screenshotter } from './screenshot.js';
3
+ import type { Recorder } from './recording.js';
3
4
  import type { CdpSessionHandle } from './connection.js';
4
5
  /** Host services exposed to a bundled scenario for the lifetime of one eval. */
5
6
  export type ScenarioBridgeServices = {
6
7
  buffer: LogBuffer;
7
8
  screenshotter: Screenshotter;
9
+ recorder: Recorder;
8
10
  };
9
11
  /** A scenario-wrapped expression plus cleanup for its temporary CDP binding. */
10
12
  export type InstalledScenarioBridge = {
@@ -1 +1 @@
1
- {"version":3,"file":"scenarioBridge.d.ts","sourceRoot":"","sources":["../../src/cdp/scenarioBridge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,wBAAwB,CAAA;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,KAAK,EAAgB,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAsBrE,gFAAgF;AAChF,MAAM,MAAM,sBAAsB,GAAG;IACpC,MAAM,EAAE,SAAS,CAAA;IACjB,aAAa,EAAE,aAAa,CAAA;CAC5B,CAAA;AAED,gFAAgF;AAChF,MAAM,MAAM,uBAAuB,GAAG;IACrC,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC5B,CAAA;AAED,6GAA6G;AAC7G,eAAO,MAAM,qBAAqB,GACjC,SAAS,gBAAgB,EACzB,YAAY,MAAM,EAClB,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EACxC,UAAU,sBAAsB,EAChC,YAAY,MAAM,KAChB,OAAO,CAAC,uBAAuB,CAwCjC,CAAA"}
1
+ {"version":3,"file":"scenarioBridge.d.ts","sourceRoot":"","sources":["../../src/cdp/scenarioBridge.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,wBAAwB,CAAA;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,EAAgB,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAsBrE,gFAAgF;AAChF,MAAM,MAAM,sBAAsB,GAAG;IACpC,MAAM,EAAE,SAAS,CAAA;IACjB,aAAa,EAAE,aAAa,CAAA;IAC5B,QAAQ,EAAE,QAAQ,CAAA;CAClB,CAAA;AAED,gFAAgF;AAChF,MAAM,MAAM,uBAAuB,GAAG;IACrC,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC5B,CAAA;AAED,6GAA6G;AAC7G,eAAO,MAAM,qBAAqB,GACjC,SAAS,gBAAgB,EACzB,YAAY,MAAM,EAClB,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EACxC,UAAU,sBAAsB,EAChC,YAAY,MAAM,KAChB,OAAO,CAAC,uBAAuB,CAwCjC,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import { randomUUID } from 'node:crypto';
2
- import { LOG_LEVELS } from '@vforsh/argus-core';
2
+ import { LOG_LEVELS, RECORD_FORMATS, } from '@vforsh/argus-core';
3
3
  import { formatError } from '@vforsh/argus-core';
4
4
  const SCENARIO_ACTION_TIMEOUT_MS = 30_000;
5
5
  const DEFAULT_LOG_LIMIT = 500;
@@ -89,6 +89,16 @@ const handleBridgeRequest = async (request, services) => {
89
89
  const fileName = name.endsWith('.png') ? name : `${name}.png`;
90
90
  return services.screenshotter.capture({ ...options, outFile: `scenarios/checkpoints/${fileName}` });
91
91
  }
92
+ case 'record.start': {
93
+ const payload = requireRecord(request.payload, 'record.start payload');
94
+ const name = parseArtifactName(payload.name, 'recording name');
95
+ const options = parseRecordOptions(payload.options);
96
+ const format = options.format ?? 'mp4';
97
+ const fileName = name.endsWith(`.${format}`) ? name : `${name}.${format}`;
98
+ return services.recorder.start({ ...options, format, outFile: `scenarios/recordings/${fileName}` });
99
+ }
100
+ case 'record.stop':
101
+ return services.recorder.stop({});
92
102
  case 'logs.cursor':
93
103
  return { cursor: services.buffer.beginLogEpoch() };
94
104
  case 'logs.read':
@@ -126,9 +136,40 @@ const parseClip = (value) => {
126
136
  return { x, y, width, height };
127
137
  };
128
138
  const isFiniteNumber = (value) => typeof value === 'number' && Number.isFinite(value);
129
- const parseCheckpointName = (value) => {
139
+ const parseCheckpointName = (value) => parseArtifactName(value, 'checkpoint name');
140
+ /** Artifact names are path segments the scenario chooses, so they may not traverse or nest. */
141
+ const parseArtifactName = (value, label) => {
130
142
  if (typeof value !== 'string' || !/^[A-Za-z0-9][A-Za-z0-9._-]{0,99}$/.test(value)) {
131
- throw new Error('checkpoint name must be 1-100 characters using letters, numbers, dot, underscore, or dash');
143
+ throw new Error(`${label} must be 1-100 characters using letters, numbers, dot, underscore, or dash`);
144
+ }
145
+ return value;
146
+ };
147
+ const parseRecordOptions = (value) => {
148
+ if (value == null)
149
+ return {};
150
+ const record = requireRecord(value, 'record options');
151
+ const { selector, clip } = parseScreenshotOptions(record);
152
+ return {
153
+ selector,
154
+ clip,
155
+ fps: parseBoundedNumber(record.fps, 'fps', 1, 60),
156
+ quality: parseBoundedNumber(record.quality, 'quality', 1, 100),
157
+ maxDurationMs: parseBoundedNumber(record.maxDurationMs, 'maxDurationMs', 1, Number.MAX_SAFE_INTEGER),
158
+ format: parseRecordFormat(record.format),
159
+ };
160
+ };
161
+ const parseRecordFormat = (value) => {
162
+ if (value == null)
163
+ return undefined;
164
+ if (typeof value === 'string' && RECORD_FORMATS.includes(value))
165
+ return value;
166
+ throw new Error(`format must be one of ${RECORD_FORMATS.join(', ')}`);
167
+ };
168
+ const parseBoundedNumber = (value, label, min, max) => {
169
+ if (value == null)
170
+ return undefined;
171
+ if (!isFiniteNumber(value) || value < min || value > max) {
172
+ throw new Error(`${label} must be a number from ${min} to ${max}`);
132
173
  }
133
174
  return value;
134
175
  };
@@ -262,11 +303,16 @@ const buildScenarioExpression = (expression, options) => `(async () => {
262
303
  });
263
304
  },
264
305
  });
306
+ const record = Object.freeze({
307
+ start: (name, recordOptions) => request('record.start', { name, options: recordOptions }),
308
+ stop: () => request('record.stop'),
309
+ });
265
310
  const context = Object.freeze({
266
311
  args: Object.freeze(${JSON.stringify(options.args)}),
267
312
  screenshot: (screenshotOptions) => request('screenshot', screenshotOptions),
268
313
  checkpoint: (name, screenshotOptions) => request('checkpoint', { name, options: screenshotOptions }),
269
314
  logs,
315
+ record,
270
316
  });
271
317
  return {
272
318
  context,
@@ -1 +1 @@
1
- {"version":3,"file":"scenarioBridge.js","sourceRoot":"","sources":["../../src/cdp/scenarioBridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scenarioBridge.js","sourceRoot":"","sources":["../../src/cdp/scenarioBridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EACN,UAAU,EACV,cAAc,GAMd,MAAM,oBAAoB,CAAA;AAK3B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEhD,MAAM,0BAA0B,GAAG,MAAM,CAAA;AACzC,MAAM,iBAAiB,GAAG,GAAG,CAAA;AAC7B,MAAM,aAAa,GAAG,KAAK,CAAA;AA8B3B,6GAA6G;AAC7G,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EACzC,OAAyB,EACzB,UAAkB,EAClB,IAAwC,EACxC,QAAgC,EAChC,SAAkB,EACiB,EAAE;IACrC,MAAM,KAAK,GAAG,UAAU,EAAE,CAAA;IAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IACxC,MAAM,WAAW,GAAG,uBAAuB,MAAM,EAAE,CAAA;IACnD,MAAM,YAAY,GAAG,0BAA0B,MAAM,EAAE,CAAA;IACvD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE;QACvE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,QAA8B,CAAA;QAC5E,IAAI,IAAI,KAAK,WAAW,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,kBAAkB,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC5I,OAAM;QACP,CAAC;QAED,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QAClD,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,OAAM;QACP,CAAC;QAED,KAAK,sBAAsB,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,IAAI,EAAE,SAAS,CAAC,CAAA;IAC3G,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC;QACJ,MAAM,OAAO,CAAC,WAAW,CAAC,oBAAoB,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;IACtF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,GAAG,EAAE,CAAA;QACL,MAAM,KAAK,CAAA;IACZ,CAAC;IAED,IAAI,QAAQ,GAAG,KAAK,CAAA;IACpB,OAAO;QACN,UAAU,EAAE,uBAAuB,CAAC,UAAU,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;QACvG,OAAO,EAAE,KAAK,IAAI,EAAE;YACnB,IAAI,QAAQ;gBAAE,OAAM;YACpB,QAAQ,GAAG,IAAI,CAAA;YACf,GAAG,EAAE,CAAA;YACL,IAAI,CAAC;gBACJ,MAAM,OAAO,CAAC,WAAW,CAAC,uBAAuB,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;YACzF,CAAC;YAAC,MAAM,CAAC;gBACR,wDAAwD;YACzD,CAAC;QACF,CAAC;KACD,CAAA;AACF,CAAC,CAAA;AAED,MAAM,kBAAkB,GAAG,CAAC,OAAe,EAAE,KAAa,EAAgC,EAAE;IAC3F,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY,CAAA;QAC7C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3E,OAAO,IAAI,CAAA;QACZ,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,MAAiC,CAAA;QACtG,IAAI,YAAY,KAAK,KAAK,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YACvH,OAAO,IAAI,CAAA;QACZ,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,CAAA;IACpE,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAA;IACZ,CAAC;AACF,CAAC,CAAA;AAED,MAAM,sBAAsB,GAAG,KAAK,EACnC,OAAyB,EACzB,YAAoB,EACpB,OAA8B,EAC9B,QAAgC,EAChC,kBAA0B,EAC1B,IAAkB,EAClB,SAAkB,EACF,EAAE;IAClB,IAAI,QAAwB,CAAA;IAC5B,IAAI,CAAC;QACJ,QAAQ,GAAG,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAA;IAC9F,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,QAAQ,GAAG,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAA;IACpE,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,kBAAkB,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,kBAAkB,EAAE,IAAI,EAAE,SAAS,CAAC,CAAA;IAC/F,CAAC;IAAC,MAAM,CAAC;QACR,0EAA0E;IAC3E,CAAC;AACF,CAAC,CAAA;AAED,MAAM,mBAAmB,GAAG,KAAK,EAAE,OAA8B,EAAE,QAAgC,EAAoB,EAAE;IACxH,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;QACxB,KAAK,YAAY,CAAC,CAAC,CAAC;YACnB,MAAM,OAAO,GAAG,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;YACvD,OAAO,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QAC/C,CAAC;QACD,KAAK,YAAY,CAAC,CAAC,CAAC;YACnB,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAA;YACpE,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YAC9C,MAAM,OAAO,GAAG,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;YACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,CAAA;YAC7D,OAAO,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,yBAAyB,QAAQ,EAAE,EAAE,CAAC,CAAA;QACpG,CAAC;QACD,KAAK,cAAc,CAAC,CAAC,CAAC;YACrB,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAA;YACtE,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAA;YAC9D,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;YACnD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAA;YACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,MAAM,EAAE,CAAA;YACzE,OAAO,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,QAAQ,EAAE,EAAE,CAAC,CAAA;QACpG,CAAC;QACD,KAAK,aAAa;YACjB,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAClC,KAAK,aAAa;YACjB,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,CAAA;QACnD,KAAK,WAAW;YACf,OAAO,gBAAgB,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;QAC1D;YACC,MAAM,IAAI,KAAK,CAAC,gCAAgC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IACnE,CAAC;AACF,CAAC,CAAA;AAED,MAAM,sBAAsB,GAAG,CAAC,KAAc,EAAkC,EAAE;IACjF,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,EAAE,CAAA;IAC5B,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAA;IACzD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAA;IAChC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;IAExB,IAAI,QAAQ,IAAI,IAAI,IAAI,CAAC,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;IACvD,CAAC;IACD,IAAI,QAAQ,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;IAC5D,CAAC;IAED,OAAO;QACN,QAAQ,EAAE,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;QAC7D,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC;KAChD,CAAA;AACF,CAAC,CAAA;AAED,MAAM,SAAS,GAAG,CAAC,KAAc,EAAuD,EAAE;IACzF,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IACzC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IACpC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QACnG,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAA;IACtF,CAAC;IACD,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;IACrE,CAAC;IACD,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;AAC/B,CAAC,CAAA;AAED,MAAM,cAAc,GAAG,CAAC,KAAc,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AAE/G,MAAM,mBAAmB,GAAG,CAAC,KAAc,EAAU,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAA;AAEnG,+FAA+F;AAC/F,MAAM,iBAAiB,GAAG,CAAC,KAAc,EAAE,KAAa,EAAU,EAAE;IACnE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,mCAAmC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACnF,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,4EAA4E,CAAC,CAAA;IACtG,CAAC;IACD,OAAO,KAAK,CAAA;AACb,CAAC,CAAA;AAED,MAAM,kBAAkB,GAAG,CAAC,KAAc,EAA8B,EAAE;IACzE,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,EAAE,CAAA;IAC5B,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAA;IACrD,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAA;IAEzD,OAAO;QACN,QAAQ;QACR,IAAI;QACJ,GAAG,EAAE,kBAAkB,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,OAAO,EAAE,kBAAkB,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,CAAC;QAC9D,aAAa,EAAE,kBAAkB,CAAC,MAAM,CAAC,aAAa,EAAE,eAAe,EAAE,CAAC,EAAE,MAAM,CAAC,gBAAgB,CAAC;QACpG,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC;KACxC,CAAA;AACF,CAAC,CAAA;AAED,MAAM,iBAAiB,GAAG,CAAC,KAAc,EAA4B,EAAE;IACtE,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,SAAS,CAAA;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,cAAc,CAAC,QAAQ,CAAC,KAAqB,CAAC;QAAE,OAAO,KAAqB,CAAA;IAC7G,MAAM,IAAI,KAAK,CAAC,yBAAyB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AACtE,CAAC,CAAA;AAED,MAAM,kBAAkB,GAAG,CAAC,KAAc,EAAE,KAAa,EAAE,GAAW,EAAE,GAAW,EAAsB,EAAE;IAC1G,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,SAAS,CAAA;IACnC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,0BAA0B,GAAG,OAAO,GAAG,EAAE,CAAC,CAAA;IACnE,CAAC;IACD,OAAO,KAAK,CAAA;AACb,CAAC,CAAA;AAED,MAAM,gBAAgB,GAAG,CAAC,MAAiB,EAAE,KAAc,EAA2B,EAAE;IACvF,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAA;IACzD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;IAC7B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;IAChE,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAC3D,OAAO,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;AACrD,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,CAAC,KAAc,EAA0C,EAAE;IAClF,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAA;IACnE,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC,CAAA;IACnD,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAC7C,MAAM,SAAS,GAAG,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IACtD,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;IACvD,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAC7C,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAE1C,OAAO;QACN,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;QAClC,KAAK;KACL,CAAA;AACF,CAAC,CAAA;AAED,MAAM,cAAc,GAAG,CAAC,KAAc,EAA0B,EAAE;IACjE,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,SAAS,CAAA;IACnC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAA;IACjE,MAAM,IAAI,KAAK,CAAC,6BAA6B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AACtE,CAAC,CAAA;AAED,MAAM,UAAU,GAAG,CAAC,KAAc,EAAqB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAiB,CAAC,CAAA;AAI7H,MAAM,iBAAiB,GAAG,CAAC,KAAc,EAAgB,EAAE;IAC1D,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,WAAW;QAAE,OAAO,WAAW,CAAA;IAC9D,IAAI,KAAK,KAAK,aAAa;QAAE,OAAO,KAAK,CAAA;IACzC,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;AAC9D,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,CAAC,KAAc,EAAE,SAAuB,EAAwB,EAAE;IACzF,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,SAAS,CAAA;IACnC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IACvD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IAC3C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAA;IAClF,CAAC;IAED,IAAI,CAAC;QACJ,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,SAAS,KAAK,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAA;IACrG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,iCAAiC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IACvE,CAAC;AACF,CAAC,CAAA;AAED,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAA;AAE3G,MAAM,cAAc,GAAG,CAAC,KAAc,EAAsB,EAAE;IAC7D,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,SAAS,CAAA;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,KAAK,CAAA;IAC3D,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;AACrD,CAAC,CAAA;AAED,MAAM,aAAa,GAAG,CAAC,KAAc,EAAU,EAAE;IAChD,MAAM,KAAK,GAAG,KAAK,IAAI,iBAAiB,CAAA;IACxC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,aAAa;QAAE,OAAO,KAAK,CAAA;IAC9G,MAAM,IAAI,KAAK,CAAC,sCAAsC,aAAa,EAAE,CAAC,CAAA;AACvE,CAAC,CAAA;AAED,MAAM,aAAa,GAAG,CAAC,KAAc,EAAE,KAAa,EAA2B,EAAE;IAChF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,oBAAoB,CAAC,CAAA;IAC9C,CAAC;IACD,OAAO,KAAgC,CAAA;AACxC,CAAC,CAAA;AAED,MAAM,kBAAkB,GAAG,KAAK,EAC/B,OAAyB,EACzB,YAAoB,EACpB,QAAwB,EACxB,kBAA0B,EAC1B,IAAkB,EAClB,SAAkB,EACF,EAAE;IAClB,MAAM,OAAO,CAAC,WAAW,CACxB,kBAAkB,EAClB;QACC,UAAU,EAAE,cAAc,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG;QACxF,SAAS,EAAE,kBAAkB;QAC7B,aAAa,EAAE,IAAI;QACnB,MAAM,EAAE,IAAI;KACZ,EACD,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,SAAS,EAAE,CACrD,CAAA;AACF,CAAC,CAAA;AAED,MAAM,uBAAuB,GAAG,CAC/B,UAAkB,EAClB,OAAmG,EAC1F,EAAE,CAAC;;8BAEiB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC;;;;0BAIvC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC;;;;;;;;;;;;;;;;kEAgBI,0BAA0B;WACjF,0BAA0B;;;uCAGE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;4BA2BxC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;oBAoBpC,UAAU;;;;;KAKzB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../src/cdp/screenshot.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAC/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAYvD,MAAM,MAAM,aAAa,GAAG;IAC3B,OAAO,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAA;CACpE,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,SAAS;IAAE,OAAO,EAAE,gBAAgB,CAAC;IAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,KAAG,aAuBlI,CAAA"}
1
+ {"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../src/cdp/screenshot.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAC/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAYvD,MAAM,MAAM,aAAa,GAAG;IAC3B,OAAO,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAA;CACpE,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,SAAS;IAAE,OAAO,EAAE,gBAAgB,CAAC;IAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,KAAG,aAwBlI,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import { ensureArtifactsDir, ensureParentDir, resolveArtifactPath } from '../artifacts.js';
3
- import { createVisualCapturePlan } from './visualCapture.js';
3
+ import { createVisualCapturePlan, toPageClip } from './visualCapture.js';
4
4
  const SCREENSHOT_CDP_TIMEOUT_MS = 20_000;
5
5
  const SCREENSHOT_CDP_MAX_ATTEMPTS = 2;
6
6
  export const createScreenshotter = (options) => {
@@ -16,7 +16,8 @@ export const createScreenshotter = (options) => {
16
16
  const capturePlan = await createVisualCapturePlan(options.session, options.pageSession, request);
17
17
  const result = await captureScreenshot(capturePlan.session, {
18
18
  format,
19
- clip: capturePlan.clip,
19
+ // `Page.captureScreenshot` clips in document coordinates, not viewport ones.
20
+ clip: capturePlan.clip && toPageClip(capturePlan.clip, capturePlan.pageOffset),
20
21
  });
21
22
  await fs.writeFile(absolutePath, Buffer.from(result.data, 'base64'));
22
23
  return { ok: true, outFile: absolutePath, clipped: result.clipped };
@@ -1 +1 @@
1
- {"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../src/cdp/screenshot.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../src/cdp/screenshot.ts"],"names":[],"mappings":"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"}
@@ -24,11 +24,31 @@ export type VisualCaptureRequest = {
24
24
  selector?: string;
25
25
  clip?: ScreenshotClipRegion;
26
26
  };
27
+ /**
28
+ * A resolved capture target.
29
+ *
30
+ * `clip` is always **viewport-relative** CSS pixels — the space `DOM.getBoxModel` reports and the
31
+ * space a screencast frame lives in. `Page.captureScreenshot` instead wants document coordinates,
32
+ * so a screenshot adds {@link VisualCapturePlan.pageOffset} before it sends the clip. Keeping one
33
+ * space here and converting at the one call site that needs the other is what stops the two
34
+ * consumers from disagreeing about what a clip means.
35
+ */
27
36
  export type VisualCapturePlan = {
28
37
  session: CdpSessionHandle;
38
+ /** Crop rectangle in viewport-relative CSS pixels. */
29
39
  clip?: VisualCaptureClip;
30
40
  viewport?: VisualCaptureViewport;
41
+ /** Scroll offset of the captured viewport within the document. Set whenever `clip` is. */
42
+ pageOffset?: {
43
+ x: number;
44
+ y: number;
45
+ };
31
46
  };
47
+ /** Translate a viewport-relative clip into the document coordinates `Page.captureScreenshot` expects. */
48
+ export declare const toPageClip: (clip: VisualCaptureClip, pageOffset: {
49
+ x: number;
50
+ y: number;
51
+ } | undefined) => VisualCaptureClip;
32
52
  /**
33
53
  * Resolve a viewport/selector/clip request into the top-level page session that can capture pixels.
34
54
  * Frame targets use their selected frame session for DOM lookup, then translate the clip to page pixels.
@@ -1 +1 @@
1
- {"version":3,"file":"visualCapture.d.ts","sourceRoot":"","sources":["../../src/cdp/visualCapture.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAoB,MAAM,iBAAiB,CAAA;AAGzE,MAAM,MAAM,iBAAiB,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAEtG,MAAM,MAAM,qBAAqB,GAAG;IACnC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,oBAAoB,CAAA;CAAE,CAAA;AAE/I,MAAM,MAAM,oBAAoB,GAAG;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,oBAAoB,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC/B,OAAO,EAAE,gBAAgB,CAAA;IACzB,IAAI,CAAC,EAAE,iBAAiB,CAAA;IACxB,QAAQ,CAAC,EAAE,qBAAqB,CAAA;CAChC,CAAA;AAID;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GACnC,SAAS,gBAAgB,EACzB,aAAa,gBAAgB,GAAG,SAAS,EACzC,SAAS,oBAAoB,KAC3B,OAAO,CAAC,iBAAiB,CAsB3B,CAAA;AA0DD,eAAO,MAAM,2BAA2B,GAAI,SAAS,oBAAoB,KAAG,oBAQ3E,CAAA"}
1
+ {"version":3,"file":"visualCapture.d.ts","sourceRoot":"","sources":["../../src/cdp/visualCapture.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAoB,MAAM,iBAAiB,CAAA;AAGzE,MAAM,MAAM,iBAAiB,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAEtG,MAAM,MAAM,qBAAqB,GAAG;IACnC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,oBAAoB,CAAA;CAAE,CAAA;AAE/I,MAAM,MAAM,oBAAoB,GAAG;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,oBAAoB,CAAA;CAC3B,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC/B,OAAO,EAAE,gBAAgB,CAAA;IACzB,sDAAsD;IACtD,IAAI,CAAC,EAAE,iBAAiB,CAAA;IACxB,QAAQ,CAAC,EAAE,qBAAqB,CAAA;IAChC,0FAA0F;IAC1F,UAAU,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CACrC,CAAA;AAED,yGAAyG;AACzG,eAAO,MAAM,UAAU,GAAI,MAAM,iBAAiB,EAAE,YAAY;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,KAAG,iBAIrG,CAAA;AAIF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GACnC,SAAS,gBAAgB,EACzB,aAAa,gBAAgB,GAAG,SAAS,EACzC,SAAS,oBAAoB,KAC3B,OAAO,CAAC,iBAAiB,CAwB3B,CAAA;AAqED,eAAO,MAAM,2BAA2B,GAAI,SAAS,oBAAoB,KAAG,oBAQ3E,CAAA"}
@@ -1,5 +1,11 @@
1
1
  import { evaluateInPage } from './pageState.js';
2
2
  import { resolveFirstSelectorNodeId } from './dom/selector.js';
3
+ /** Translate a viewport-relative clip into the document coordinates `Page.captureScreenshot` expects. */
4
+ export const toPageClip = (clip, pageOffset) => ({
5
+ ...clip,
6
+ x: clip.x + (pageOffset?.x ?? 0),
7
+ y: clip.y + (pageOffset?.y ?? 0),
8
+ });
3
9
  /**
4
10
  * Resolve a viewport/selector/clip request into the top-level page session that can capture pixels.
5
11
  * Frame targets use their selected frame session for DOM lookup, then translate the clip to page pixels.
@@ -15,58 +21,65 @@ export const createVisualCapturePlan = async (session, pageSession, request) =>
15
21
  subject,
16
22
  });
17
23
  }
18
- const clip = await resolveSubjectClip(session, subject);
19
- if (!clip) {
24
+ // Whole-viewport capture needs no geometry at all, so it costs no round-trips.
25
+ if (subject.kind === 'viewport') {
20
26
  return { session };
21
27
  }
28
+ const viewport = await resolveViewportState(session);
22
29
  return {
23
30
  session,
24
- clip,
25
- viewport: await resolveViewportSize(session),
31
+ clip: await resolveSubjectClip(session, subject, viewport),
32
+ viewport: viewport.size,
33
+ pageOffset: viewport.offset,
26
34
  };
27
35
  };
28
36
  const createFrameCapturePlan = async (options) => {
29
- const frameClip = await resolveFrameViewportClip(options.pageSession, options.frameContext.frameId);
30
- const pageViewport = await resolveViewportSize(options.pageSession);
31
- const subjectClip = await resolveSubjectClip(options.frameSession, options.subject);
32
- if (!subjectClip) {
37
+ const pageViewport = await resolveViewportState(options.pageSession);
38
+ const frameClip = await resolveFrameViewportClip(options.pageSession, options.frameContext.frameId, pageViewport);
39
+ if (options.subject.kind === 'viewport') {
33
40
  return {
34
41
  session: options.pageSession,
35
42
  clip: frameClip,
36
- viewport: pageViewport,
43
+ viewport: pageViewport.size,
44
+ pageOffset: pageViewport.offset,
37
45
  };
38
46
  }
47
+ const frameViewport = await resolveViewportState(options.frameSession);
48
+ const subjectClip = await resolveSubjectClip(options.frameSession, options.subject, frameViewport);
39
49
  return {
40
50
  session: options.pageSession,
51
+ // Both are viewport-relative to their own document, so the sum lands in page-viewport space.
41
52
  clip: offsetClip(frameClip, subjectClip),
42
- viewport: pageViewport,
53
+ viewport: pageViewport.size,
54
+ pageOffset: pageViewport.offset,
43
55
  };
44
56
  };
45
- const resolveFrameViewportClip = async (pageSession, frameId) => {
57
+ const resolveFrameViewportClip = async (pageSession, frameId, viewport) => {
46
58
  const owner = await pageSession.sendAndWait('DOM.getFrameOwner', {
47
59
  frameId,
48
60
  });
49
61
  if (owner.backendNodeId == null && owner.nodeId == null) {
50
62
  throw new Error(`Unable to resolve iframe owner for frame: ${frameId}`);
51
63
  }
52
- return resolveNodeClip(pageSession, owner);
64
+ return resolveNodeClip(pageSession, owner, viewport);
53
65
  };
54
- const resolveSelectorClip = async (session, selector) => {
66
+ const resolveSelectorClip = async (session, selector, viewport) => {
55
67
  const nodeId = await resolveFirstSelectorNodeId(session, selector);
56
68
  if (!nodeId) {
57
69
  throw new Error(`No element found for selector: ${selector}`);
58
70
  }
59
- return resolveNodeClip(session, { nodeId });
71
+ return resolveNodeClip(session, { nodeId }, viewport);
60
72
  };
61
- const resolveSubjectClip = async (session, subject) => {
62
- switch (subject.kind) {
63
- case 'viewport':
64
- return null;
65
- case 'selector':
66
- return resolveSelectorClip(session, subject.selector);
67
- case 'clip':
68
- return resolveViewportRectClip(session, subject.clip);
73
+ /** Resolve a crop subject. Viewport subjects never reach here — they have no rectangle to resolve. */
74
+ const resolveSubjectClip = async (session, subject, viewport) => {
75
+ if (subject.kind === 'selector') {
76
+ return resolveSelectorClip(session, subject.selector, viewport);
69
77
  }
78
+ return {
79
+ ...subject.clip,
80
+ // CDP clip rectangles always need the current viewport scale, even when x/y are already viewport-relative.
81
+ scale: viewport.scale,
82
+ };
70
83
  };
71
84
  export const resolveVisualCaptureSubject = (request) => {
72
85
  if (request.selector) {
@@ -77,18 +90,7 @@ export const resolveVisualCaptureSubject = (request) => {
77
90
  }
78
91
  return { kind: 'viewport' };
79
92
  };
80
- const resolveViewportRectClip = async (session, clip) => {
81
- const viewport = await resolveVisualViewport(session);
82
- return {
83
- x: clip.x,
84
- y: clip.y,
85
- width: clip.width,
86
- height: clip.height,
87
- // CDP clip rectangles always need the current viewport scale, even when x/y are already viewport-relative.
88
- scale: viewport?.scale ?? 1,
89
- };
90
- };
91
- const resolveNodeClip = async (session, target) => {
93
+ const resolveNodeClip = async (session, target, viewport) => {
92
94
  const boxResult = await session.sendAndWait('DOM.getBoxModel', target.nodeId != null ? { nodeId: target.nodeId } : { backendNodeId: target.backendNodeId });
93
95
  const quad = boxResult.model?.content ??
94
96
  boxResult.model?.border;
@@ -99,16 +101,18 @@ const resolveNodeClip = async (session, target) => {
99
101
  if (rect.width <= 0 || rect.height <= 0) {
100
102
  throw new Error('Element has zero area');
101
103
  }
102
- const viewport = await resolveVisualViewport(session);
103
- const pageX = viewport?.pageX ?? 0;
104
- const pageY = viewport?.pageY ?? 0;
105
- const scale = viewport?.scale ?? 1;
104
+ /**
105
+ * No scroll offset is subtracted here: `DOM.getBoxModel` already reports viewport-relative CSS
106
+ * pixels, matching `getBoundingClientRect`. Subtracting `pageY` as well double-counted the
107
+ * scroll, which was invisible at scroll offset 0 and put the crop entirely off-frame anywhere
108
+ * else — a blank screenshot, or a 2px-tall recording.
109
+ */
106
110
  return {
107
- x: rect.x - pageX,
108
- y: rect.y - pageY,
111
+ x: rect.x,
112
+ y: rect.y,
109
113
  width: rect.width,
110
114
  height: rect.height,
111
- scale,
115
+ scale: viewport.scale,
112
116
  };
113
117
  };
114
118
  const resolveVisualViewport = async (session) => {
@@ -116,8 +120,15 @@ const resolveVisualViewport = async (session) => {
116
120
  const payload = metrics;
117
121
  return payload.cssVisualViewport ?? payload.visualViewport;
118
122
  };
119
- const resolveViewportSize = async (session) => {
123
+ const resolveViewportState = async (session) => {
120
124
  const viewport = await resolveVisualViewport(session);
125
+ return {
126
+ size: await resolveViewportSize(session, viewport),
127
+ offset: { x: viewport?.pageX ?? 0, y: viewport?.pageY ?? 0 },
128
+ scale: viewport?.scale ?? 1,
129
+ };
130
+ };
131
+ const resolveViewportSize = async (session, viewport) => {
121
132
  if (isPositiveFiniteNumber(viewport?.clientWidth) && isPositiveFiniteNumber(viewport?.clientHeight)) {
122
133
  return { width: viewport.clientWidth, height: viewport.clientHeight };
123
134
  }
@@ -1 +1 @@
1
- {"version":3,"file":"visualCapture.js","sourceRoot":"","sources":["../../src/cdp/visualCapture.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"visualCapture.js","sourceRoot":"","sources":["../../src/cdp/visualCapture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAG/C,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAA;AAkC9D,yGAAyG;AACzG,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAuB,EAAE,UAAgD,EAAqB,EAAE,CAAC,CAAC;IAC5H,GAAG,IAAI;IACP,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC;CAChC,CAAC,CAAA;AAIF;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,EAC3C,OAAyB,EACzB,WAAyC,EACzC,OAA6B,EACA,EAAE;IAC/B,MAAM,OAAO,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAA;IACpD,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,qBAAqB,EAAE,CAAA;IAC3D,IAAI,aAAa,EAAE,IAAI,KAAK,OAAO,IAAI,WAAW,EAAE,CAAC;QACpD,OAAO,sBAAsB,CAAC;YAC7B,YAAY,EAAE,OAAO;YACrB,WAAW;YACX,YAAY,EAAE,aAAa;YAC3B,OAAO;SACP,CAAC,CAAA;IACH,CAAC;IAED,+EAA+E;IAC/E,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACjC,OAAO,EAAE,OAAO,EAAE,CAAA;IACnB,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAA;IACpD,OAAO;QACN,OAAO;QACP,IAAI,EAAE,MAAM,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC;QAC1D,QAAQ,EAAE,QAAQ,CAAC,IAAI;QACvB,UAAU,EAAE,QAAQ,CAAC,MAAM;KAC3B,CAAA;AACF,CAAC,CAAA;AAED,MAAM,sBAAsB,GAAG,KAAK,EAAE,OAKrC,EAA8B,EAAE;IAChC,MAAM,YAAY,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IACpE,MAAM,SAAS,GAAG,MAAM,wBAAwB,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;IACjH,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACzC,OAAO;YACN,OAAO,EAAE,OAAO,CAAC,WAAW;YAC5B,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,YAAY,CAAC,IAAI;YAC3B,UAAU,EAAE,YAAY,CAAC,MAAM;SAC/B,CAAA;IACF,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IACtE,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;IAElG,OAAO;QACN,OAAO,EAAE,OAAO,CAAC,WAAW;QAC5B,6FAA6F;QAC7F,IAAI,EAAE,UAAU,CAAC,SAAS,EAAE,WAAW,CAAC;QACxC,QAAQ,EAAE,YAAY,CAAC,IAAI;QAC3B,UAAU,EAAE,YAAY,CAAC,MAAM;KAC/B,CAAA;AACF,CAAC,CAAA;AAED,MAAM,wBAAwB,GAAG,KAAK,EAAE,WAA6B,EAAE,OAAe,EAAE,QAAuB,EAA8B,EAAE;IAC9I,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,mBAAmB,EAAE;QAChE,OAAO;KACP,CAAC,CAAA;IAEF,IAAI,KAAK,CAAC,aAAa,IAAI,IAAI,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,6CAA6C,OAAO,EAAE,CAAC,CAAA;IACxE,CAAC;IAED,OAAO,eAAe,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;AACrD,CAAC,CAAA;AAED,MAAM,mBAAmB,GAAG,KAAK,EAAE,OAAyB,EAAE,QAAgB,EAAE,QAAuB,EAA8B,EAAE;IACtI,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IAClE,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,kCAAkC,QAAQ,EAAE,CAAC,CAAA;IAC9D,CAAC;IAED,OAAO,eAAe,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAA;AACtD,CAAC,CAAA;AAED,sGAAsG;AACtG,MAAM,kBAAkB,GAAG,KAAK,EAC/B,OAAyB,EACzB,OAA4D,EAC5D,QAAuB,EACM,EAAE;IAC/B,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACjC,OAAO,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IAChE,CAAC;IAED,OAAO;QACN,GAAG,OAAO,CAAC,IAAI;QACf,2GAA2G;QAC3G,KAAK,EAAE,QAAQ,CAAC,KAAK;KACrB,CAAA;AACF,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,OAA6B,EAAwB,EAAE;IAClG,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACtB,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAA;IACxD,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAA;IAC5C,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAA;AAC5B,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,KAAK,EAC5B,OAAyB,EACzB,MAAmD,EACnD,QAAuB,EACM,EAAE;IAC/B,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,WAAW,CAC1C,iBAAiB,EACjB,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,CAC3F,CAAA;IACD,MAAM,IAAI,GACR,SAAmE,CAAC,KAAK,EAAE,OAAO;QAClF,SAA+C,CAAC,KAAK,EAAE,MAAM,CAAA;IAE/D,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;IACvD,CAAC;IAED,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IAC7B,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAA;IACzC,CAAC;IAED;;;;;OAKG;IACH,OAAO;QACN,CAAC,EAAE,IAAI,CAAC,CAAC;QACT,CAAC,EAAE,IAAI,CAAC,CAAC;QACT,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,QAAQ,CAAC,KAAK;KACrB,CAAA;AACF,CAAC,CAAA;AAED,MAAM,qBAAqB,GAAG,KAAK,EAAE,OAAyB,EAAuC,EAAE;IACtG,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAA;IAClE,MAAM,OAAO,GAAG,OAAkF,CAAA;IAClG,OAAO,OAAO,CAAC,iBAAiB,IAAI,OAAO,CAAC,cAAc,CAAA;AAC3D,CAAC,CAAA;AAgBD,MAAM,oBAAoB,GAAG,KAAK,EAAE,OAAyB,EAA0B,EAAE;IACxF,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,CAAA;IAErD,OAAO;QACN,IAAI,EAAE,MAAM,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC;QAClD,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE;QAC5D,KAAK,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC;KAC3B,CAAA;AACF,CAAC,CAAA;AAED,MAAM,mBAAmB,GAAG,KAAK,EAAE,OAAyB,EAAE,QAAoC,EAAkC,EAAE;IACrI,IAAI,sBAAsB,CAAC,QAAQ,EAAE,WAAW,CAAC,IAAI,sBAAsB,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,CAAC;QACrG,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,YAAY,EAAE,CAAA;IACtE,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,cAAc,CACrC,OAAO,EACP,2HAA2H,CAC3H,CAAA;IACD,MAAM,KAAK,GAAG,SAAS,EAAE,KAAK,CAAA;IAC9B,MAAM,MAAM,GAAG,SAAS,EAAE,MAAM,CAAA;IAChC,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;IACnD,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;AACzB,CAAC,CAAA;AAED,MAAM,sBAAsB,GAAG,CAAC,KAAc,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAA;AAEpI,MAAM,UAAU,GAAG,CAAC,KAAwB,EAAE,KAAwB,EAAqB,EAAE,CAAC,CAAC;IAC9F,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;IACpB,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;IACpB,KAAK,EAAE,KAAK,CAAC,KAAK;IAClB,MAAM,EAAE,KAAK,CAAC,MAAM;IACpB,KAAK,EAAE,KAAK,CAAC,KAAK;CAClB,CAAC,CAAA;AAEF,MAAM,UAAU,GAAG,CAAC,IAAc,EAA2D,EAAE;IAC9F,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/C,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAA;IAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAA;IAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAA;IAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAA;IAE5B,OAAO;QACN,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,IAAI;QACP,KAAK,EAAE,IAAI,GAAG,IAAI;QAClB,MAAM,EAAE,IAAI,GAAG,IAAI;KACnB,CAAA;AACF,CAAC,CAAA"}
@@ -6,7 +6,7 @@ import type { LogLevel, NetParty, NetRequestBodyPart, NetScope } from '@vforsh/a
6
6
  * used to be hand-maintained in both files, so adding a route meant editing the same 61 literals
7
7
  * twice or emitting an endpoint the public event could not name.
8
8
  */
9
- export declare const WATCHER_ENDPOINTS: readonly ["logs", "tail", "net", "net/requests", "net/request", "net/request/body", "net/tail", "net/clear", "net/mock", "net/mock/add", "net/mock/remove", "net/mock/clear", "net/ws", "net/ws/connection", "net/sse", "auth/cookies", "auth/cookies/get", "auth/cookies/set", "auth/cookies/delete", "auth/cookies/clear", "auth/state", "auth/state/load", "eval", "trace/start", "trace/stop", "record", "record/start", "record/stop", "screenshot", "snapshot", "locate/role", "locate/text", "locate/label", "code/list", "code/read", "code/grep", "code/edit", "dom/tree", "dom/info", "dom/hover", "dom/click", "dom/drag", "dom/keydown", "dom/add", "dom/remove", "dom/modify", "dom/set-file", "dom/focus", "dom/fill", "dom/scroll", "dom/scroll-to", "emulation", "throttle", "dialog/status", "dialog/handle", "visibility", "storage/local", "storage/session", "reload", "shutdown", "tabs", "extension/diagnostics", "targets", "attach", "detach"];
9
+ export declare const WATCHER_ENDPOINTS: readonly ["logs", "tail", "net", "net/requests", "net/request", "net/request/body", "net/tail", "net/clear", "net/mock", "net/mock/add", "net/mock/remove", "net/mock/clear", "net/ws", "net/ws/connection", "net/sse", "auth/cookies", "auth/cookies/get", "auth/cookies/set", "auth/cookies/delete", "auth/cookies/clear", "auth/state", "auth/state/load", "eval", "trace/start", "trace/stop", "record", "record/start", "record/stop", "record/status", "screenshot", "snapshot", "locate/role", "locate/text", "locate/label", "code/list", "code/read", "code/grep", "code/edit", "dom/tree", "dom/info", "dom/hover", "dom/click", "dom/drag", "dom/keydown", "dom/add", "dom/remove", "dom/modify", "dom/set-file", "dom/focus", "dom/fill", "dom/scroll", "dom/scroll-to", "emulation", "throttle", "dialog/status", "dialog/handle", "visibility", "storage/local", "storage/session", "reload", "shutdown", "tabs", "extension/diagnostics", "targets", "attach", "detach"];
10
10
  /** An endpoint the watcher serves. */
11
11
  export type WatcherEndpoint = (typeof WATCHER_ENDPOINTS)[number];
12
12
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"endpoints.d.ts","sourceRoot":"","sources":["../../src/http/endpoints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAE1F;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,w6BAkEpB,CAAA;AAEV,sCAAsC;AACtC,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAA;AAEhE;;;;;;;GAOG;AACH,MAAM,MAAM,mBAAmB,GAAG;IACjC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,kBAAkB,CAAA;IACzB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,SAAS,CAAC,EAAE,WAAW,GAAG,aAAa,CAAA;IACvC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,OAAO,CAAA;CACvB,CAAA"}
1
+ {"version":3,"file":"endpoints.d.ts","sourceRoot":"","sources":["../../src/http/endpoints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAE1F;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,y7BAmEpB,CAAA;AAEV,sCAAsC;AACtC,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAA;AAEhE;;;;;;;GAOG;AACH,MAAM,MAAM,mBAAmB,GAAG;IACjC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,kBAAkB,CAAA;IACzB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,SAAS,CAAC,EAAE,WAAW,GAAG,aAAa,CAAA;IACvC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,OAAO,CAAA;CACvB,CAAA"}