versioncam 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +94 -0
- package/LICENSE.md +105 -0
- package/README.md +463 -0
- package/bin/versioncam.js +29 -0
- package/dist/.types-render/render-page/draw.d.ts +28 -0
- package/dist/.types-render/render-page/main.d.ts +24 -0
- package/dist/.types-render/render-page/theme.d.ts +37 -0
- package/dist/app-server.d.ts +59 -0
- package/dist/app-server.js +328 -0
- package/dist/app-server.js.map +1 -0
- package/dist/cli/app.d.ts +13 -0
- package/dist/cli/app.js +21 -0
- package/dist/cli/app.js.map +1 -0
- package/dist/cli/commands/check.d.ts +8 -0
- package/dist/cli/commands/check.js +51 -0
- package/dist/cli/commands/check.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +8 -0
- package/dist/cli/commands/doctor.js +130 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/dsl.d.ts +16 -0
- package/dist/cli/commands/dsl.js +22 -0
- package/dist/cli/commands/dsl.js.map +1 -0
- package/dist/cli/commands/frame.d.ts +8 -0
- package/dist/cli/commands/frame.js +72 -0
- package/dist/cli/commands/frame.js.map +1 -0
- package/dist/cli/commands/init.d.ts +23 -0
- package/dist/cli/commands/init.js +109 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/inspect.d.ts +1 -0
- package/dist/cli/commands/inspect.js +32 -0
- package/dist/cli/commands/inspect.js.map +1 -0
- package/dist/cli/commands/install.d.ts +33 -0
- package/dist/cli/commands/install.js +66 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/login.d.ts +10 -0
- package/dist/cli/commands/login.js +49 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/commands/measure.d.ts +1 -0
- package/dist/cli/commands/measure.js +36 -0
- package/dist/cli/commands/measure.js.map +1 -0
- package/dist/cli/commands/open-app.d.ts +14 -0
- package/dist/cli/commands/open-app.js +45 -0
- package/dist/cli/commands/open-app.js.map +1 -0
- package/dist/cli/commands/preview.d.ts +8 -0
- package/dist/cli/commands/preview.js +55 -0
- package/dist/cli/commands/preview.js.map +1 -0
- package/dist/cli/commands/record.d.ts +10 -0
- package/dist/cli/commands/record.js +86 -0
- package/dist/cli/commands/record.js.map +1 -0
- package/dist/cli/commands/render.d.ts +1 -0
- package/dist/cli/commands/render.js +93 -0
- package/dist/cli/commands/render.js.map +1 -0
- package/dist/cli/commands/review.d.ts +6 -0
- package/dist/cli/commands/review.js +89 -0
- package/dist/cli/commands/review.js.map +1 -0
- package/dist/cli/commands/sheet.d.ts +1 -0
- package/dist/cli/commands/sheet.js +48 -0
- package/dist/cli/commands/sheet.js.map +1 -0
- package/dist/cli/commands/stability.d.ts +14 -0
- package/dist/cli/commands/stability.js +110 -0
- package/dist/cli/commands/stability.js.map +1 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +69 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/usage.d.ts +10 -0
- package/dist/cli/usage.js +46 -0
- package/dist/cli/usage.js.map +1 -0
- package/dist/config.d.ts +250 -0
- package/dist/config.js +154 -0
- package/dist/config.js.map +1 -0
- package/dist/core/camera.d.ts +30 -0
- package/dist/core/camera.js +94 -0
- package/dist/core/camera.js.map +1 -0
- package/dist/core/compose.d.ts +38 -0
- package/dist/core/compose.js +81 -0
- package/dist/core/compose.js.map +1 -0
- package/dist/core/cursor.d.ts +38 -0
- package/dist/core/cursor.js +103 -0
- package/dist/core/cursor.js.map +1 -0
- package/dist/core/easing.d.ts +15 -0
- package/dist/core/easing.js +33 -0
- package/dist/core/easing.js.map +1 -0
- package/dist/core/loop.d.ts +30 -0
- package/dist/core/loop.js +96 -0
- package/dist/core/loop.js.map +1 -0
- package/dist/core/motion-defaults.d.ts +61 -0
- package/dist/core/motion-defaults.js +62 -0
- package/dist/core/motion-defaults.js.map +1 -0
- package/dist/core/rng.d.ts +13 -0
- package/dist/core/rng.js +27 -0
- package/dist/core/rng.js.map +1 -0
- package/dist/core/sse.d.ts +15 -0
- package/dist/core/sse.js +16 -0
- package/dist/core/sse.js.map +1 -0
- package/dist/core/timeline.d.ts +146 -0
- package/dist/core/timeline.js +81 -0
- package/dist/core/timeline.js.map +1 -0
- package/dist/core/timing.d.ts +31 -0
- package/dist/core/timing.js +29 -0
- package/dist/core/timing.js.map +1 -0
- package/dist/core/typing.d.ts +12 -0
- package/dist/core/typing.js +35 -0
- package/dist/core/typing.js.map +1 -0
- package/dist/driver/clip.d.ts +71 -0
- package/dist/driver/clip.js +120 -0
- package/dist/driver/clip.js.map +1 -0
- package/dist/driver/compare.d.ts +34 -0
- package/dist/driver/compare.js +40 -0
- package/dist/driver/compare.js.map +1 -0
- package/dist/driver/gate.d.ts +36 -0
- package/dist/driver/gate.js +27 -0
- package/dist/driver/gate.js.map +1 -0
- package/dist/driver/launch.d.ts +43 -0
- package/dist/driver/launch.js +47 -0
- package/dist/driver/launch.js.map +1 -0
- package/dist/driver/page-hooks.d.ts +72 -0
- package/dist/driver/page-hooks.js +129 -0
- package/dist/driver/page-hooks.js.map +1 -0
- package/dist/driver/reports.d.ts +34 -0
- package/dist/driver/reports.js +42 -0
- package/dist/driver/reports.js.map +1 -0
- package/dist/driver/session.d.ts +285 -0
- package/dist/driver/session.js +773 -0
- package/dist/driver/session.js.map +1 -0
- package/dist/driver/settle.d.ts +41 -0
- package/dist/driver/settle.js +82 -0
- package/dist/driver/settle.js.map +1 -0
- package/dist/env.d.ts +11 -0
- package/dist/env.js +41 -0
- package/dist/env.js.map +1 -0
- package/dist/fixtures.d.ts +13 -0
- package/dist/fixtures.js +13 -0
- package/dist/fixtures.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/inspect/inspect.d.ts +70 -0
- package/dist/inspect/inspect.js +176 -0
- package/dist/inspect/inspect.js.map +1 -0
- package/dist/inspect/measure.d.ts +40 -0
- package/dist/inspect/measure.js +107 -0
- package/dist/inspect/measure.js.map +1 -0
- package/dist/loader.d.ts +28 -0
- package/dist/loader.js +143 -0
- package/dist/loader.js.map +1 -0
- package/dist/page/assets/index-DUom5amc.js +1 -0
- package/dist/page/index.html +18 -0
- package/dist/render/encode.d.ts +40 -0
- package/dist/render/encode.js +183 -0
- package/dist/render/encode.js.map +1 -0
- package/dist/render/ffmpeg.d.ts +13 -0
- package/dist/render/ffmpeg.js +72 -0
- package/dist/render/ffmpeg.js.map +1 -0
- package/dist/render/presentation.d.ts +19 -0
- package/dist/render/presentation.js +27 -0
- package/dist/render/presentation.js.map +1 -0
- package/dist/render/render.d.ts +59 -0
- package/dist/render/render.js +144 -0
- package/dist/render/render.js.map +1 -0
- package/dist/render/sampling.d.ts +47 -0
- package/dist/render/sampling.js +129 -0
- package/dist/render/sampling.js.map +1 -0
- package/dist/render/sequence.d.ts +24 -0
- package/dist/render/sequence.js +105 -0
- package/dist/render/sequence.js.map +1 -0
- package/dist/render/serve.d.ts +35 -0
- package/dist/render/serve.js +124 -0
- package/dist/render/serve.js.map +1 -0
- package/dist/review/review.d.ts +54 -0
- package/dist/review/review.js +229 -0
- package/dist/review/review.js.map +1 -0
- package/dist/scene.d.ts +23 -0
- package/dist/scene.js +2 -0
- package/dist/scene.js.map +1 -0
- package/dsl.md +119 -0
- package/package.json +76 -0
- package/plugin/.claude-plugin/plugin.json +9 -0
- package/plugin/README.md +105 -0
- package/plugin/agents/versioncam-reviewer.md +63 -0
- package/plugin/skills/versioncam/SKILL.md +235 -0
- package/plugin/skills/versioncam/authoring.md +226 -0
- package/plugin/skills/versioncam/onboarding.md +199 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/driver/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { Page } from "playwright";
|
|
2
|
+
export type SettleOptions = {
|
|
3
|
+
/** How long the page must be quiet before we call it settled, in ms of ticks. */
|
|
4
|
+
quietMs?: number;
|
|
5
|
+
/** Real-time cap. Exceeding it logs loudly rather than failing the clip. */
|
|
6
|
+
timeoutMs?: number;
|
|
7
|
+
/** Extra condition, e.g. "the map has finished loading tiles". */
|
|
8
|
+
hook?: () => Promise<boolean>;
|
|
9
|
+
/** Named in the log line so a slow settle is diagnosable. */
|
|
10
|
+
label?: string;
|
|
11
|
+
/**
|
|
12
|
+
* Real milliseconds to yield per tick. See the note on `settlePage`: fake
|
|
13
|
+
* time alone does not let the network or the renderer do anything.
|
|
14
|
+
*/
|
|
15
|
+
yieldMs?: number;
|
|
16
|
+
};
|
|
17
|
+
export type SettleReport = {
|
|
18
|
+
label: string;
|
|
19
|
+
elapsedMs: number;
|
|
20
|
+
ticks: number;
|
|
21
|
+
timedOut: boolean;
|
|
22
|
+
lastBlocker: string;
|
|
23
|
+
};
|
|
24
|
+
/** One step of the page's clock whenever the recorder waits on the page. */
|
|
25
|
+
export declare const TICK_MS = 16;
|
|
26
|
+
/**
|
|
27
|
+
* Advance the page's clock until nothing is happening any more.
|
|
28
|
+
*
|
|
29
|
+
* Nothing is captured while this runs, which is what lets a clip show a
|
|
30
|
+
* DuckDB query "returning instantly": the wait happens, it just never reaches
|
|
31
|
+
* the timeline. The cost of getting this wrong is a frame captured mid-update,
|
|
32
|
+
* so the checks are deliberately conservative — DOM quiet *and* no network in
|
|
33
|
+
* flight *and* fonts loaded *and* whatever the clip adds.
|
|
34
|
+
*
|
|
35
|
+
* Each iteration advances fake time *and* yields real time. `clock.runFor()`
|
|
36
|
+
* only moves the page's own timeline: it fires due timers and resolves, but it
|
|
37
|
+
* does not wait, so a loop built from it alone burns its entire timeout in
|
|
38
|
+
* milliseconds while the app has had no opportunity to answer a fetch or paint
|
|
39
|
+
* a tile. Both clocks have to move for a settle to mean anything.
|
|
40
|
+
*/
|
|
41
|
+
export declare function settlePage(page: Page, inFlightRequests: () => number, options?: SettleOptions): Promise<SettleReport>;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { setTimeout as sleep } from "node:timers/promises";
|
|
2
|
+
/** One step of the page's clock whenever the recorder waits on the page. */
|
|
3
|
+
export const TICK_MS = 16;
|
|
4
|
+
const DEFAULT_YIELD_MS = 20;
|
|
5
|
+
/**
|
|
6
|
+
* Advance the page's clock until nothing is happening any more.
|
|
7
|
+
*
|
|
8
|
+
* Nothing is captured while this runs, which is what lets a clip show a
|
|
9
|
+
* DuckDB query "returning instantly": the wait happens, it just never reaches
|
|
10
|
+
* the timeline. The cost of getting this wrong is a frame captured mid-update,
|
|
11
|
+
* so the checks are deliberately conservative — DOM quiet *and* no network in
|
|
12
|
+
* flight *and* fonts loaded *and* whatever the clip adds.
|
|
13
|
+
*
|
|
14
|
+
* Each iteration advances fake time *and* yields real time. `clock.runFor()`
|
|
15
|
+
* only moves the page's own timeline: it fires due timers and resolves, but it
|
|
16
|
+
* does not wait, so a loop built from it alone burns its entire timeout in
|
|
17
|
+
* milliseconds while the app has had no opportunity to answer a fetch or paint
|
|
18
|
+
* a tile. Both clocks have to move for a settle to mean anything.
|
|
19
|
+
*/
|
|
20
|
+
export async function settlePage(page, inFlightRequests, options = {}) {
|
|
21
|
+
const quietMs = options.quietMs ?? 150;
|
|
22
|
+
const timeoutMs = options.timeoutMs ?? 15_000;
|
|
23
|
+
const label = options.label ?? "settle";
|
|
24
|
+
const ticksNeeded = Math.max(1, Math.ceil(quietMs / TICK_MS));
|
|
25
|
+
const started = Date.now();
|
|
26
|
+
let quietTicks = 0;
|
|
27
|
+
let ticks = 0;
|
|
28
|
+
let lastMutations = -1;
|
|
29
|
+
let lastBlocker = "none";
|
|
30
|
+
for (;;) {
|
|
31
|
+
const probe = await page.evaluate(() => ({
|
|
32
|
+
mutations: window.__recorder?.mutations ?? 0,
|
|
33
|
+
fontsLoaded: document.fonts ? document.fonts.status === "loaded" : true,
|
|
34
|
+
}));
|
|
35
|
+
const requests = inFlightRequests();
|
|
36
|
+
const hookOk = options.hook ? await options.hook() : true;
|
|
37
|
+
const quiet = probe.mutations === lastMutations &&
|
|
38
|
+
requests === 0 &&
|
|
39
|
+
probe.fontsLoaded &&
|
|
40
|
+
hookOk;
|
|
41
|
+
if (!quiet) {
|
|
42
|
+
if (probe.mutations !== lastMutations)
|
|
43
|
+
lastBlocker = "dom";
|
|
44
|
+
else if (requests > 0)
|
|
45
|
+
lastBlocker = `requests(${requests})`;
|
|
46
|
+
else if (!probe.fontsLoaded)
|
|
47
|
+
lastBlocker = "fonts";
|
|
48
|
+
else
|
|
49
|
+
lastBlocker = "hook";
|
|
50
|
+
}
|
|
51
|
+
lastMutations = probe.mutations;
|
|
52
|
+
quietTicks = quiet ? quietTicks + 1 : 0;
|
|
53
|
+
if (quietTicks >= ticksNeeded) {
|
|
54
|
+
return {
|
|
55
|
+
label,
|
|
56
|
+
elapsedMs: Date.now() - started,
|
|
57
|
+
ticks,
|
|
58
|
+
timedOut: false,
|
|
59
|
+
lastBlocker,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
if (Date.now() - started > timeoutMs) {
|
|
63
|
+
// Not an error: a clip that ends on a still of a half-loaded panel is
|
|
64
|
+
// a better failure than one that dies at frame 300. The log line is how
|
|
65
|
+
// it gets noticed.
|
|
66
|
+
console.warn(`[recorder] ${label} gave up waiting after ${timeoutMs}ms ` +
|
|
67
|
+
`(still ${lastBlocker}) and carried on — what follows may show a ` +
|
|
68
|
+
`half-loaded page`);
|
|
69
|
+
return {
|
|
70
|
+
label,
|
|
71
|
+
elapsedMs: Date.now() - started,
|
|
72
|
+
ticks,
|
|
73
|
+
timedOut: true,
|
|
74
|
+
lastBlocker,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
await page.clock.runFor(TICK_MS);
|
|
78
|
+
await sleep(options.yieldMs ?? DEFAULT_YIELD_MS);
|
|
79
|
+
ticks += 1;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=settle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settle.js","sourceRoot":"","sources":["../../src/driver/settle.ts"],"names":[],"mappings":"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"}
|
package/dist/env.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Load `.env.recording`, then `.env`, before anything reads the environment.
|
|
3
|
+
*
|
|
4
|
+
* Two files because the credentials a recording uses are usually not the ones
|
|
5
|
+
* the app's own `.env` carries, and keeping them apart means the recording
|
|
6
|
+
* file can hold a session token without that leaking into how the app runs.
|
|
7
|
+
* Neither overrides a variable the shell already set.
|
|
8
|
+
*/
|
|
9
|
+
export declare function loadEnvFiles(cwd: string): void;
|
|
10
|
+
/** `process.env` as the shell handed it over: what a child should inherit. */
|
|
11
|
+
export declare function inheritedEnv(): NodeJS.ProcessEnv;
|
package/dist/env.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* The names this process took from `.env.recording` or `.env`, as opposed to
|
|
5
|
+
* inheriting from the shell that ran it.
|
|
6
|
+
*
|
|
7
|
+
* Kept because the two kinds go to different places. The recorder's own
|
|
8
|
+
* sign-in hook reads the files' values; the app's dev server, which the
|
|
9
|
+
* recorder may now start itself, must not see them. The recording credentials
|
|
10
|
+
* are the reason `.env.recording` is a separate file at all, and Vite gives a
|
|
11
|
+
* variable already in its environment priority over the app's own `.env` —
|
|
12
|
+
* so a value the recorder loaded for itself would quietly change how the app
|
|
13
|
+
* it is filming behaves.
|
|
14
|
+
*/
|
|
15
|
+
const fromFiles = new Set();
|
|
16
|
+
/**
|
|
17
|
+
* Load `.env.recording`, then `.env`, before anything reads the environment.
|
|
18
|
+
*
|
|
19
|
+
* Two files because the credentials a recording uses are usually not the ones
|
|
20
|
+
* the app's own `.env` carries, and keeping them apart means the recording
|
|
21
|
+
* file can hold a session token without that leaking into how the app runs.
|
|
22
|
+
* Neither overrides a variable the shell already set.
|
|
23
|
+
*/
|
|
24
|
+
export function loadEnvFiles(cwd) {
|
|
25
|
+
for (const name of [".env.recording", ".env"]) {
|
|
26
|
+
const file = resolve(cwd, name);
|
|
27
|
+
if (!existsSync(file))
|
|
28
|
+
continue;
|
|
29
|
+
const before = new Set(Object.keys(process.env));
|
|
30
|
+
process.loadEnvFile(file);
|
|
31
|
+
for (const key of Object.keys(process.env)) {
|
|
32
|
+
if (!before.has(key))
|
|
33
|
+
fromFiles.add(key);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** `process.env` as the shell handed it over: what a child should inherit. */
|
|
38
|
+
export function inheritedEnv() {
|
|
39
|
+
return Object.fromEntries(Object.entries(process.env).filter(([key]) => !fromFiles.has(key)));
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=env.js.map
|
package/dist/env.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;;;;;;;;;;GAWG;AACH,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;AAEpC;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,KAAK,MAAM,IAAI,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QAChC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC1B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,YAAY;IAC1B,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CACnE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The pure helpers, with nothing behind them.
|
|
3
|
+
*
|
|
4
|
+
* The package's main entry reaches for Playwright, esbuild and the filesystem,
|
|
5
|
+
* because recording needs all three. A consumer's unit test does not: checking
|
|
6
|
+
* that a scripted response parses with the app's own reader is a jsdom test
|
|
7
|
+
* that wants a function and no browser at all. Importing the main entry there
|
|
8
|
+
* drags a bundler into a jsdom environment, where it does not run.
|
|
9
|
+
*
|
|
10
|
+
* import { sseBody } from "versioncam/fixtures";
|
|
11
|
+
*/
|
|
12
|
+
export { sseBody } from "./core/sse.js";
|
|
13
|
+
export type { SseFixtureEvent } from "./core/sse.js";
|
package/dist/fixtures.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The pure helpers, with nothing behind them.
|
|
3
|
+
*
|
|
4
|
+
* The package's main entry reaches for Playwright, esbuild and the filesystem,
|
|
5
|
+
* because recording needs all three. A consumer's unit test does not: checking
|
|
6
|
+
* that a scripted response parses with the app's own reader is a jsdom test
|
|
7
|
+
* that wants a function and no browser at all. Importing the main entry there
|
|
8
|
+
* drags a bundler into a jsdom environment, where it does not run.
|
|
9
|
+
*
|
|
10
|
+
* import { sseBody } from "versioncam/fixtures";
|
|
11
|
+
*/
|
|
12
|
+
export { sseBody } from "./core/sse.js";
|
|
13
|
+
//# sourceMappingURL=fixtures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../src/fixtures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export { defineRecorder, outputSize, resolveConfig } from "./config.js";
|
|
2
|
+
export type { AuthConfig, CaptureConfig, CursorStart, ReviewConfig, Motion, Presentation, RecorderConfig, RenderConfig, ResolvedConfig, ResolvedWebServer, SettleConfig, WebServerConfig, } from "./config.js";
|
|
3
|
+
export { ensureApp, withApp } from "./app-server.js";
|
|
4
|
+
export type { AppHandle } from "./app-server.js";
|
|
5
|
+
export { clip, runClip } from "./driver/clip.js";
|
|
6
|
+
export type { RunClipOptions } from "./driver/clip.js";
|
|
7
|
+
export type { ClipBody, ClipDefinition, ClipOptions, RunClipResult, } from "./driver/clip.js";
|
|
8
|
+
export type { RecordingSession, SessionOptions } from "./driver/session.js";
|
|
9
|
+
export { createGate } from "./driver/gate.js";
|
|
10
|
+
export type { Gate } from "./driver/gate.js";
|
|
11
|
+
export type { SettleOptions, SettleReport } from "./driver/settle.js";
|
|
12
|
+
export { launchBrowser, DETERMINISTIC_ARGS } from "./driver/launch.js";
|
|
13
|
+
export { formatTiming } from "./core/timing.js";
|
|
14
|
+
export type { RecordingTiming } from "./core/timing.js";
|
|
15
|
+
export { loop, catmullRomClosed, resampleByArcLength } from "./core/loop.js";
|
|
16
|
+
export type { LoopPlanner, LoopOptions } from "./core/loop.js";
|
|
17
|
+
export { sseBody } from "./core/sse.js";
|
|
18
|
+
export type { SseFixtureEvent } from "./core/sse.js";
|
|
19
|
+
export { MOTION } from "./core/motion-defaults.js";
|
|
20
|
+
export type { Caption, CameraKey, Highlight, HighlightStyle, Mark, PointerAction, Rect, Timeline, Vec2, } from "./core/timeline.js";
|
|
21
|
+
export type { Scene, Size } from "./scene.js";
|
|
22
|
+
export { loadClips, loadConfig, loadSceneIds, bundleScenes } from "./loader.js";
|
|
23
|
+
export { contactSheet, renderFrame, renderRecording, renderScene, withBrowser, readTimeline, } from "./render/render.js";
|
|
24
|
+
export type { RenderOutcome, RenderTarget } from "./render/render.js";
|
|
25
|
+
export { beatFrame, frameAtMark, markedFrames, uniformFrames, SHEET_TILES, } from "./render/sampling.js";
|
|
26
|
+
export { compareRecordings, frameHashes, readRecording, stateFileAt, } from "./driver/compare.js";
|
|
27
|
+
export type { Comparison, RecordingRef } from "./driver/compare.js";
|
|
28
|
+
export { formatReview, reviewRecording, DEFAULT_BOUNDS, } from "./review/review.js";
|
|
29
|
+
export type { Beat, ReviewBounds, ReviewInput, ReviewItem, ReviewResult, } from "./review/review.js";
|
|
30
|
+
export { buildSequence } from "./render/sequence.js";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export { defineRecorder, outputSize, resolveConfig } from "./config.js";
|
|
2
|
+
export { ensureApp, withApp } from "./app-server.js";
|
|
3
|
+
export { clip, runClip } from "./driver/clip.js";
|
|
4
|
+
export { createGate } from "./driver/gate.js";
|
|
5
|
+
export { launchBrowser, DETERMINISTIC_ARGS } from "./driver/launch.js";
|
|
6
|
+
export { formatTiming } from "./core/timing.js";
|
|
7
|
+
export { loop, catmullRomClosed, resampleByArcLength } from "./core/loop.js";
|
|
8
|
+
export { sseBody } from "./core/sse.js";
|
|
9
|
+
export { MOTION } from "./core/motion-defaults.js";
|
|
10
|
+
export { loadClips, loadConfig, loadSceneIds, bundleScenes } from "./loader.js";
|
|
11
|
+
export { contactSheet, renderFrame, renderRecording, renderScene, withBrowser, readTimeline, } from "./render/render.js";
|
|
12
|
+
export { beatFrame, frameAtMark, markedFrames, uniformFrames, SHEET_TILES, } from "./render/sampling.js";
|
|
13
|
+
export { compareRecordings, frameHashes, readRecording, stateFileAt, } from "./driver/compare.js";
|
|
14
|
+
export { formatReview, reviewRecording, DEFAULT_BOUNDS, } from "./review/review.js";
|
|
15
|
+
export { buildSequence } from "./render/sequence.js";
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAexE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAGrD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AASjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE7E,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAenD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EACL,YAAY,EACZ,WAAW,EACX,eAAe,EACf,WAAW,EACX,WAAW,EACX,YAAY,GACb,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,SAAS,EACT,WAAW,EACX,YAAY,EACZ,aAAa,EACb,WAAW,GACZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,YAAY,EACZ,eAAe,EACf,cAAc,GACf,MAAM,oBAAoB,CAAC;AAQ5B,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { Page } from "playwright";
|
|
2
|
+
/**
|
|
3
|
+
* What can a clip actually click?
|
|
4
|
+
*
|
|
5
|
+
* Choreography written from an app's source keeps reaching for controls that
|
|
6
|
+
* are conditional, renamed, or — the case that cost a whole recording run —
|
|
7
|
+
* never rendered at all. Every clip that worked was written after looking at
|
|
8
|
+
* the running app instead. This is that look, as a function: the inventory an
|
|
9
|
+
* author needs before writing a beat.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Where an element's name came from — which is to say, which locator finds it.
|
|
13
|
+
*
|
|
14
|
+
* Reported because two fields can print the same name and need different
|
|
15
|
+
* locators: `byLabel` finds an `aria-label` or a `<label>` and not a
|
|
16
|
+
* placeholder, which `byPlaceholder` finds instead. An agent that could not
|
|
17
|
+
* tell them apart spent a whole recording learning which one it had. `label`
|
|
18
|
+
* covers `aria-labelledby` too, since `byLabel` reads that the same way; `name`
|
|
19
|
+
* is the form attribute, which neither finds; `none` means there was nothing.
|
|
20
|
+
*/
|
|
21
|
+
export type NameSource = "aria-label" | "label" | "placeholder" | "text" | "name" | "none";
|
|
22
|
+
export type Control = {
|
|
23
|
+
role: "button" | "link" | "menuitem" | "tab" | "option";
|
|
24
|
+
/** Accessible name: aria-label, else trimmed text. */
|
|
25
|
+
name: string;
|
|
26
|
+
nameSource: NameSource;
|
|
27
|
+
testId: string | null;
|
|
28
|
+
box: {
|
|
29
|
+
x: number;
|
|
30
|
+
y: number;
|
|
31
|
+
w: number;
|
|
32
|
+
h: number;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
export type Field = {
|
|
36
|
+
kind: "input" | "textarea" | "select";
|
|
37
|
+
/** aria-labelledby or aria-label, else a `<label>`, else placeholder, else name. */
|
|
38
|
+
name: string;
|
|
39
|
+
nameSource: NameSource;
|
|
40
|
+
testId: string | null;
|
|
41
|
+
box: {
|
|
42
|
+
x: number;
|
|
43
|
+
y: number;
|
|
44
|
+
w: number;
|
|
45
|
+
h: number;
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
export type Inventory = {
|
|
49
|
+
url: string;
|
|
50
|
+
title: string;
|
|
51
|
+
viewport: {
|
|
52
|
+
width: number;
|
|
53
|
+
height: number;
|
|
54
|
+
};
|
|
55
|
+
controls: Control[];
|
|
56
|
+
fields: Field[];
|
|
57
|
+
testIds: string[];
|
|
58
|
+
/**
|
|
59
|
+
* Observable Plot labels a mark group by its mark type, so a bar chart's
|
|
60
|
+
* group is `bar` and a histogram's is `rect`. Reporting the counts saves an
|
|
61
|
+
* author guessing which — a guess that silently matches nothing.
|
|
62
|
+
*/
|
|
63
|
+
plotMarks: {
|
|
64
|
+
label: string;
|
|
65
|
+
drawn: number;
|
|
66
|
+
}[];
|
|
67
|
+
};
|
|
68
|
+
export declare function inspectPage(page: Page): Promise<Inventory>;
|
|
69
|
+
/** The inventory as something a person reads in a terminal. */
|
|
70
|
+
export declare function formatInventory(inventory: Inventory): string;
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
export async function inspectPage(page) {
|
|
2
|
+
return page.evaluate(() => {
|
|
3
|
+
const visible = (el) => {
|
|
4
|
+
const r = el.getBoundingClientRect();
|
|
5
|
+
return r.width > 0 && r.height > 0;
|
|
6
|
+
};
|
|
7
|
+
const boxOf = (el) => {
|
|
8
|
+
const r = el.getBoundingClientRect();
|
|
9
|
+
return {
|
|
10
|
+
x: Math.round(r.x),
|
|
11
|
+
y: Math.round(r.y),
|
|
12
|
+
w: Math.round(r.width),
|
|
13
|
+
h: Math.round(r.height),
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
// Whitespace collapsed: a button whose label spans three indented lines of
|
|
17
|
+
// markup is still one name on screen, and one line in the listing.
|
|
18
|
+
const tidy = (text) => (text ?? "").replace(/\s+/g, " ").trim();
|
|
19
|
+
const controlName = (el) => {
|
|
20
|
+
const aria = tidy(el.getAttribute("aria-label"));
|
|
21
|
+
if (aria)
|
|
22
|
+
return [aria, "aria-label"];
|
|
23
|
+
const text = tidy(el.textContent);
|
|
24
|
+
return text ? [text, "text"] : ["(unnamed)", "none"];
|
|
25
|
+
};
|
|
26
|
+
// The accessible-name order, as far as a locator cares about it.
|
|
27
|
+
const fieldName = (el) => {
|
|
28
|
+
const labelledBy = (el.getAttribute("aria-labelledby") ?? "")
|
|
29
|
+
.split(/\s+/)
|
|
30
|
+
.map((id) => tidy(id && document.getElementById(id)?.textContent))
|
|
31
|
+
.filter(Boolean)
|
|
32
|
+
.join(" ");
|
|
33
|
+
if (labelledBy)
|
|
34
|
+
return [labelledBy, "label"];
|
|
35
|
+
const aria = tidy(el.getAttribute("aria-label"));
|
|
36
|
+
if (aria)
|
|
37
|
+
return [aria, "aria-label"];
|
|
38
|
+
// A `<label>` that wraps its control would otherwise read the control
|
|
39
|
+
// too — every `<option>` of a select, after the label's own words.
|
|
40
|
+
const labels = el.labels;
|
|
41
|
+
let label = "";
|
|
42
|
+
if (labels && labels.length > 0) {
|
|
43
|
+
const copy = labels[0].cloneNode(true);
|
|
44
|
+
for (const inner of Array.from(copy.querySelectorAll("input, select, textarea"))) {
|
|
45
|
+
inner.remove();
|
|
46
|
+
}
|
|
47
|
+
label = tidy(copy.textContent);
|
|
48
|
+
}
|
|
49
|
+
if (label)
|
|
50
|
+
return [label, "label"];
|
|
51
|
+
const placeholder = tidy(el.getAttribute("placeholder"));
|
|
52
|
+
if (placeholder)
|
|
53
|
+
return [placeholder, "placeholder"];
|
|
54
|
+
const name = tidy(el.getAttribute("name"));
|
|
55
|
+
return name ? [name, "name"] : ["(unnamed)", "none"];
|
|
56
|
+
};
|
|
57
|
+
const controls = [];
|
|
58
|
+
const selectors = [
|
|
59
|
+
["button", "button"],
|
|
60
|
+
['[role="button"]', "button"],
|
|
61
|
+
["a[href]", "link"],
|
|
62
|
+
['[role="menuitem"]', "menuitem"],
|
|
63
|
+
['[role="tab"]', "tab"],
|
|
64
|
+
['[role="option"]', "option"],
|
|
65
|
+
];
|
|
66
|
+
const seen = new Set();
|
|
67
|
+
for (const [selector, role] of selectors) {
|
|
68
|
+
for (const el of Array.from(document.querySelectorAll(selector))) {
|
|
69
|
+
if (seen.has(el) || !visible(el))
|
|
70
|
+
continue;
|
|
71
|
+
seen.add(el);
|
|
72
|
+
const [name, nameSource] = controlName(el);
|
|
73
|
+
controls.push({
|
|
74
|
+
role,
|
|
75
|
+
name,
|
|
76
|
+
nameSource,
|
|
77
|
+
testId: el.getAttribute("data-testid"),
|
|
78
|
+
box: boxOf(el),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const fields = [];
|
|
83
|
+
for (const el of Array.from(document.querySelectorAll("input, textarea, select"))) {
|
|
84
|
+
if (!visible(el))
|
|
85
|
+
continue;
|
|
86
|
+
const [name, nameSource] = fieldName(el);
|
|
87
|
+
fields.push({
|
|
88
|
+
kind: el.tagName.toLowerCase(),
|
|
89
|
+
name,
|
|
90
|
+
nameSource,
|
|
91
|
+
testId: el.getAttribute("data-testid"),
|
|
92
|
+
box: boxOf(el),
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
const testIds = [
|
|
96
|
+
...new Set(Array.from(document.querySelectorAll("[data-testid]"))
|
|
97
|
+
.filter(visible)
|
|
98
|
+
.map((el) => el.getAttribute("data-testid") ?? "")),
|
|
99
|
+
].filter(Boolean);
|
|
100
|
+
const plotMarks = [];
|
|
101
|
+
const groups = new Map();
|
|
102
|
+
for (const group of Array.from(document.querySelectorAll("[aria-label]"))) {
|
|
103
|
+
const label = group.getAttribute("aria-label") ?? "";
|
|
104
|
+
// Plot's mark groups are short type names and contain drawn shapes.
|
|
105
|
+
if (label.length > 12 || !/^[a-z]+$/.test(label))
|
|
106
|
+
continue;
|
|
107
|
+
const drawn = Array.from(group.querySelectorAll("rect, path, circle")).filter((s) => {
|
|
108
|
+
const r = s.getBoundingClientRect();
|
|
109
|
+
return r.width > 1 && r.height > 1;
|
|
110
|
+
}).length;
|
|
111
|
+
if (drawn > 0)
|
|
112
|
+
groups.set(label, (groups.get(label) ?? 0) + drawn);
|
|
113
|
+
}
|
|
114
|
+
for (const [label, drawn] of groups)
|
|
115
|
+
plotMarks.push({ label, drawn });
|
|
116
|
+
return {
|
|
117
|
+
url: location.href,
|
|
118
|
+
title: document.title,
|
|
119
|
+
viewport: { width: window.innerWidth, height: window.innerHeight },
|
|
120
|
+
controls,
|
|
121
|
+
fields,
|
|
122
|
+
testIds,
|
|
123
|
+
plotMarks,
|
|
124
|
+
};
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* How many controls the text form prints.
|
|
129
|
+
*
|
|
130
|
+
* An application page can carry several hundred, and this inventory is read
|
|
131
|
+
* by something with a context budget: a wall of button geometry crowds out
|
|
132
|
+
* the page it was meant to describe. Sixty is about a screen and a half, and
|
|
133
|
+
* enough to find the beat's target on every page we have measured. The count
|
|
134
|
+
* of what was left out is printed, so a trimmed list is never mistaken for
|
|
135
|
+
* the whole page, and `--json` is never trimmed.
|
|
136
|
+
*/
|
|
137
|
+
const MAX_PRINTED_CONTROLS = 60;
|
|
138
|
+
/** The inventory as something a person reads in a terminal. */
|
|
139
|
+
export function formatInventory(inventory) {
|
|
140
|
+
const lines = [
|
|
141
|
+
`${inventory.title} — ${inventory.url}`,
|
|
142
|
+
`viewport ${inventory.viewport.width}x${inventory.viewport.height}`,
|
|
143
|
+
"",
|
|
144
|
+
// The bracket after a name is where it came from; the second is the test
|
|
145
|
+
// id. Said once, up front, because the two look alike.
|
|
146
|
+
"name [where the name came from] [test id] @ x,y wxh",
|
|
147
|
+
"",
|
|
148
|
+
`controls (${inventory.controls.length}):`,
|
|
149
|
+
];
|
|
150
|
+
const printed = inventory.controls.slice(0, MAX_PRINTED_CONTROLS);
|
|
151
|
+
for (const c of printed) {
|
|
152
|
+
const id = c.testId ? ` [${c.testId}]` : "";
|
|
153
|
+
lines.push(` ${c.role.padEnd(8)} ${c.name} [${c.nameSource}]${id} @ ${c.box.x},${c.box.y} ${c.box.w}x${c.box.h}`);
|
|
154
|
+
}
|
|
155
|
+
const dropped = inventory.controls.length - printed.length;
|
|
156
|
+
if (dropped > 0) {
|
|
157
|
+
lines.push(` … ${dropped} more not shown; \`--json\` lists all of them.`);
|
|
158
|
+
}
|
|
159
|
+
lines.push("", `fields (${inventory.fields.length}):`);
|
|
160
|
+
// With geometry, like the controls: a field is a click target before it is a
|
|
161
|
+
// typing target, and without a box an author cannot tell which of two
|
|
162
|
+
// similarly named inputs is the one on screen.
|
|
163
|
+
for (const f of inventory.fields) {
|
|
164
|
+
const id = f.testId ? ` [${f.testId}]` : "";
|
|
165
|
+
lines.push(` ${f.kind.padEnd(8)} ${f.name} [${f.nameSource}]${id} @ ${f.box.x},${f.box.y} ${f.box.w}x${f.box.h}`);
|
|
166
|
+
}
|
|
167
|
+
if (inventory.plotMarks.length > 0) {
|
|
168
|
+
lines.push("", "plot mark groups:");
|
|
169
|
+
for (const m of inventory.plotMarks) {
|
|
170
|
+
lines.push(` aria-label="${m.label}" ${m.drawn} drawn`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
lines.push("", `test ids: ${inventory.testIds.join(" · ") || "(none)"}`);
|
|
174
|
+
return lines.join("\n");
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=inspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/inspect/inspect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { Page } from "playwright";
|
|
2
|
+
import type { Rect } from "../core/timeline.js";
|
|
3
|
+
export type Measurement = {
|
|
4
|
+
selector: string;
|
|
5
|
+
count: number;
|
|
6
|
+
/**
|
|
7
|
+
* Each match's own box, while there are few enough to read. Empty above
|
|
8
|
+
* `MAX_LISTED`, where `bounds` and `grid` are what a stroke is planned from.
|
|
9
|
+
*/
|
|
10
|
+
boxes: Rect[];
|
|
11
|
+
/**
|
|
12
|
+
* What each listed match says, trimmed, beside its box — so a status line
|
|
13
|
+
* can be read before a beat promises what it will say. `inspect` names
|
|
14
|
+
* controls and fields and says nothing of the text around them, which left
|
|
15
|
+
* an author opening the app by hand to learn what "1 of 12" looked like.
|
|
16
|
+
*/
|
|
17
|
+
texts: string[];
|
|
18
|
+
/** Union of every match's box, in viewport pixels. */
|
|
19
|
+
bounds: {
|
|
20
|
+
x0: number;
|
|
21
|
+
y0: number;
|
|
22
|
+
x1: number;
|
|
23
|
+
y1: number;
|
|
24
|
+
} | null;
|
|
25
|
+
/** The same, as fractions of the viewport, which is how strokes are written. */
|
|
26
|
+
fractions: {
|
|
27
|
+
x0: number;
|
|
28
|
+
y0: number;
|
|
29
|
+
x1: number;
|
|
30
|
+
y1: number;
|
|
31
|
+
} | null;
|
|
32
|
+
viewport: {
|
|
33
|
+
width: number;
|
|
34
|
+
height: number;
|
|
35
|
+
};
|
|
36
|
+
/** Counts over a 12x8 grid, so the dense region is obvious without a screenshot. */
|
|
37
|
+
grid: number[][];
|
|
38
|
+
};
|
|
39
|
+
export declare function measureSelector(page: Page, selector: string): Promise<Measurement>;
|
|
40
|
+
export declare function formatMeasurement(m: Measurement): string;
|