@relauts/spotcheck-service 1.0.0

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 (124) hide show
  1. package/LICENSE +661 -0
  2. package/NOTICE +19 -0
  3. package/README.md +169 -0
  4. package/dist/api/auth.d.ts +11 -0
  5. package/dist/api/auth.js +32 -0
  6. package/dist/api/auth.js.map +1 -0
  7. package/dist/api/history.d.ts +46 -0
  8. package/dist/api/history.js +172 -0
  9. package/dist/api/history.js.map +1 -0
  10. package/dist/api/saved-run.d.ts +35 -0
  11. package/dist/api/saved-run.js +234 -0
  12. package/dist/api/saved-run.js.map +1 -0
  13. package/dist/api/saved.d.ts +33 -0
  14. package/dist/api/saved.js +209 -0
  15. package/dist/api/saved.js.map +1 -0
  16. package/dist/api/server.d.ts +23 -0
  17. package/dist/api/server.js +852 -0
  18. package/dist/api/server.js.map +1 -0
  19. package/dist/computer-use/actions.d.ts +14 -0
  20. package/dist/computer-use/actions.js +212 -0
  21. package/dist/computer-use/actions.js.map +1 -0
  22. package/dist/computer-use/args.d.ts +11 -0
  23. package/dist/computer-use/args.js +74 -0
  24. package/dist/computer-use/args.js.map +1 -0
  25. package/dist/computer-use/cli.d.ts +1 -0
  26. package/dist/computer-use/cli.js +8 -0
  27. package/dist/computer-use/cli.js.map +1 -0
  28. package/dist/computer-use/client.d.ts +3 -0
  29. package/dist/computer-use/client.js +68 -0
  30. package/dist/computer-use/client.js.map +1 -0
  31. package/dist/computer-use/coords.d.ts +5 -0
  32. package/dist/computer-use/coords.js +21 -0
  33. package/dist/computer-use/coords.js.map +1 -0
  34. package/dist/computer-use/history.d.ts +11 -0
  35. package/dist/computer-use/history.js +59 -0
  36. package/dist/computer-use/history.js.map +1 -0
  37. package/dist/computer-use/index.d.ts +17 -0
  38. package/dist/computer-use/index.js +75 -0
  39. package/dist/computer-use/index.js.map +1 -0
  40. package/dist/computer-use/keys.d.ts +3 -0
  41. package/dist/computer-use/keys.js +50 -0
  42. package/dist/computer-use/keys.js.map +1 -0
  43. package/dist/computer-use/loop.d.ts +22 -0
  44. package/dist/computer-use/loop.js +90 -0
  45. package/dist/computer-use/loop.js.map +1 -0
  46. package/dist/computer-use/safety.d.ts +15 -0
  47. package/dist/computer-use/safety.js +45 -0
  48. package/dist/computer-use/safety.js.map +1 -0
  49. package/dist/computer-use/screenshot.d.ts +5 -0
  50. package/dist/computer-use/screenshot.js +16 -0
  51. package/dist/computer-use/screenshot.js.map +1 -0
  52. package/dist/computer-use/system-prompt.d.ts +11 -0
  53. package/dist/computer-use/system-prompt.js +41 -0
  54. package/dist/computer-use/system-prompt.js.map +1 -0
  55. package/dist/computer-use/types.d.ts +83 -0
  56. package/dist/computer-use/types.js +31 -0
  57. package/dist/computer-use/types.js.map +1 -0
  58. package/dist/playwright/actions.d.ts +81 -0
  59. package/dist/playwright/actions.js +170 -0
  60. package/dist/playwright/actions.js.map +1 -0
  61. package/dist/playwright/chromium.d.ts +10 -0
  62. package/dist/playwright/chromium.js +27 -0
  63. package/dist/playwright/chromium.js.map +1 -0
  64. package/dist/playwright/index.d.ts +2 -0
  65. package/dist/playwright/index.js +64 -0
  66. package/dist/playwright/index.js.map +1 -0
  67. package/dist/playwright/processed.d.ts +11 -0
  68. package/dist/playwright/processed.js +183 -0
  69. package/dist/playwright/processed.js.map +1 -0
  70. package/dist/playwright/session.d.ts +28 -0
  71. package/dist/playwright/session.js +165 -0
  72. package/dist/playwright/session.js.map +1 -0
  73. package/dist/shared/config.d.ts +38 -0
  74. package/dist/shared/config.js +227 -0
  75. package/dist/shared/config.js.map +1 -0
  76. package/dist/shared/cost.d.ts +15 -0
  77. package/dist/shared/cost.js +40 -0
  78. package/dist/shared/cost.js.map +1 -0
  79. package/dist/shared/logger.d.ts +4 -0
  80. package/dist/shared/logger.js +10 -0
  81. package/dist/shared/logger.js.map +1 -0
  82. package/dist/shared/main-module.d.ts +1 -0
  83. package/dist/shared/main-module.js +19 -0
  84. package/dist/shared/main-module.js.map +1 -0
  85. package/dist/shared/models.d.ts +12 -0
  86. package/dist/shared/models.js +40 -0
  87. package/dist/shared/models.js.map +1 -0
  88. package/dist/shared/telemetry.d.ts +9 -0
  89. package/dist/shared/telemetry.js +43 -0
  90. package/dist/shared/telemetry.js.map +1 -0
  91. package/files/model.json +26 -0
  92. package/files/system_prompt.txt +15 -0
  93. package/openapi.yaml +901 -0
  94. package/package.json +60 -0
  95. package/relauts-spotcheck-service-config.example.json +19 -0
  96. package/src/api/auth.ts +40 -0
  97. package/src/api/history.ts +251 -0
  98. package/src/api/saved-run.ts +346 -0
  99. package/src/api/saved.ts +275 -0
  100. package/src/api/server.ts +1198 -0
  101. package/src/computer-use/actions.ts +273 -0
  102. package/src/computer-use/args.ts +97 -0
  103. package/src/computer-use/cli.ts +8 -0
  104. package/src/computer-use/client.ts +81 -0
  105. package/src/computer-use/coords.ts +26 -0
  106. package/src/computer-use/history.ts +80 -0
  107. package/src/computer-use/index.ts +121 -0
  108. package/src/computer-use/keys.ts +54 -0
  109. package/src/computer-use/loop.ts +140 -0
  110. package/src/computer-use/safety.ts +59 -0
  111. package/src/computer-use/screenshot.ts +20 -0
  112. package/src/computer-use/system-prompt.ts +65 -0
  113. package/src/computer-use/types.ts +126 -0
  114. package/src/playwright/actions.ts +332 -0
  115. package/src/playwright/chromium.ts +30 -0
  116. package/src/playwright/index.ts +77 -0
  117. package/src/playwright/processed.ts +253 -0
  118. package/src/playwright/session.ts +220 -0
  119. package/src/shared/config.ts +320 -0
  120. package/src/shared/cost.ts +58 -0
  121. package/src/shared/logger.ts +9 -0
  122. package/src/shared/main-module.ts +20 -0
  123. package/src/shared/models.ts +62 -0
  124. package/src/shared/telemetry.ts +63 -0
@@ -0,0 +1,170 @@
1
+ import { createProcessedScreenshotSaver } from "./processed.js";
2
+ export const PLAYWRIGHT_ACTION_NAMES = [
3
+ "goto",
4
+ "goBack",
5
+ "goForward",
6
+ "reload",
7
+ "setContent",
8
+ "click",
9
+ "dblclick",
10
+ "tap",
11
+ "fill",
12
+ "clear",
13
+ "type",
14
+ "pressSequentially",
15
+ "press",
16
+ "check",
17
+ "uncheck",
18
+ "setChecked",
19
+ "selectOption",
20
+ "selectText",
21
+ "hover",
22
+ "focus",
23
+ "blur",
24
+ "dragTo",
25
+ "setInputFiles",
26
+ "scrollIntoViewIfNeeded",
27
+ "highlight",
28
+ "screenshot",
29
+ "dispatchEvent",
30
+ "keyboard",
31
+ "mouse",
32
+ "touchscreen",
33
+ ];
34
+ export function isCoordinates(value) {
35
+ if (typeof value !== "object" || value === null) {
36
+ return false;
37
+ }
38
+ const record = value;
39
+ return (typeof record.x === "number" &&
40
+ Number.isFinite(record.x) &&
41
+ typeof record.y === "number" &&
42
+ Number.isFinite(record.y) &&
43
+ typeof record.click !== "function");
44
+ }
45
+ function toLocator(page, target) {
46
+ return typeof target === "string" ? page.locator(target) : target;
47
+ }
48
+ function splitPointTarget(targetOrX, yOrOptions, maybeOptions) {
49
+ if (typeof targetOrX === "number") {
50
+ if (typeof yOrOptions !== "number" || !Number.isFinite(yOrOptions)) {
51
+ throw new Error("Y coordinate is required when X is a number");
52
+ }
53
+ return { kind: "point", x: targetOrX, y: yOrOptions, options: maybeOptions };
54
+ }
55
+ if (isCoordinates(targetOrX)) {
56
+ return { kind: "point", x: targetOrX.x, y: targetOrX.y, options: yOrOptions };
57
+ }
58
+ return { kind: "locator", target: targetOrX, options: yOrOptions };
59
+ }
60
+ async function pointFromTarget(page, target) {
61
+ if (isCoordinates(target)) {
62
+ return target;
63
+ }
64
+ const box = await toLocator(page, target).boundingBox();
65
+ if (!box) {
66
+ throw new Error("Cannot read coordinates; element has no bounding box");
67
+ }
68
+ return {
69
+ x: box.x + box.width / 2,
70
+ y: box.y + box.height / 2,
71
+ };
72
+ }
73
+ export function createPageActions(page, directory) {
74
+ const locator = (target) => toLocator(page, target);
75
+ const saveScreenshot = createProcessedScreenshotSaver(page, directory);
76
+ async function afterAction(actionName, run) {
77
+ const result = await run();
78
+ await saveScreenshot(actionName);
79
+ return result;
80
+ }
81
+ return {
82
+ goto: (...args) => afterAction("goto", () => page.goto(...args)),
83
+ goBack: (...args) => afterAction("goBack", () => page.goBack(...args)),
84
+ goForward: (...args) => afterAction("goForward", () => page.goForward(...args)),
85
+ reload: (...args) => afterAction("reload", () => page.reload(...args)),
86
+ setContent: (...args) => afterAction("setContent", () => page.setContent(...args)),
87
+ click: async (targetOrX, yOrOptions, maybeOptions) => afterAction("click", async () => {
88
+ const target = splitPointTarget(targetOrX, yOrOptions, maybeOptions);
89
+ if (target.kind === "point") {
90
+ await page.mouse.click(target.x, target.y, target.options);
91
+ return;
92
+ }
93
+ await locator(target.target).click(target.options);
94
+ }),
95
+ dblclick: async (targetOrX, yOrOptions, maybeOptions) => afterAction("dblclick", async () => {
96
+ const target = splitPointTarget(targetOrX, yOrOptions, maybeOptions);
97
+ if (target.kind === "point") {
98
+ await page.mouse.dblclick(target.x, target.y, target.options);
99
+ return;
100
+ }
101
+ await locator(target.target).dblclick(target.options);
102
+ }),
103
+ tap: async (targetOrX, yOrOptions) => afterAction("tap", async () => {
104
+ const target = splitPointTarget(targetOrX, yOrOptions);
105
+ if (target.kind === "point") {
106
+ await page.touchscreen.tap(target.x, target.y);
107
+ return;
108
+ }
109
+ await locator(target.target).tap(target.options);
110
+ }),
111
+ fill: (target, ...args) => afterAction("fill", () => locator(target).fill(...args)),
112
+ clear: (target, ...args) => afterAction("clear", () => locator(target).clear(...args)),
113
+ type: (target, ...args) => afterAction("type", () => locator(target).type(...args)),
114
+ pressSequentially: (target, ...args) => afterAction("pressSequentially", () => locator(target).pressSequentially(...args)),
115
+ press: (target, ...args) => afterAction("press", () => locator(target).press(...args)),
116
+ check: (target, ...args) => afterAction("check", () => locator(target).check(...args)),
117
+ uncheck: (target, ...args) => afterAction("uncheck", () => locator(target).uncheck(...args)),
118
+ setChecked: (target, ...args) => afterAction("setChecked", () => locator(target).setChecked(...args)),
119
+ selectOption: (target, ...args) => afterAction("selectOption", () => locator(target).selectOption(...args)),
120
+ selectText: (target, ...args) => afterAction("selectText", () => locator(target).selectText(...args)),
121
+ hover: async (targetOrX, yOrOptions, maybeOptions) => afterAction("hover", async () => {
122
+ const target = splitPointTarget(targetOrX, yOrOptions, maybeOptions);
123
+ if (target.kind === "point") {
124
+ await page.mouse.move(target.x, target.y, target.options);
125
+ return;
126
+ }
127
+ await locator(target.target).hover(target.options);
128
+ }),
129
+ focus: (target, ...args) => afterAction("focus", () => locator(target).focus(...args)),
130
+ blur: (target, ...args) => afterAction("blur", () => locator(target).blur(...args)),
131
+ dragTo: async (source, target, options) => afterAction("dragTo", async () => {
132
+ if (!isCoordinates(source) && !isCoordinates(target) && options) {
133
+ await locator(source).dragTo(locator(target), options);
134
+ return;
135
+ }
136
+ const from = await pointFromTarget(page, source);
137
+ const to = await pointFromTarget(page, target);
138
+ await page.mouse.move(from.x, from.y);
139
+ await page.mouse.down();
140
+ await page.mouse.move(to.x, to.y);
141
+ await page.mouse.up();
142
+ }),
143
+ setInputFiles: (target, ...args) => afterAction("setInputFiles", () => locator(target).setInputFiles(...args)),
144
+ scrollIntoViewIfNeeded: (target, ...args) => afterAction("scrollIntoViewIfNeeded", () => locator(target).scrollIntoViewIfNeeded(...args)),
145
+ highlight: (target, ...args) => afterAction("highlight", async () => {
146
+ await locator(target).highlight(...args);
147
+ }),
148
+ screenshot: (target, options) => afterAction("screenshot", () => target === undefined ? page.screenshot() : locator(target).screenshot(options)),
149
+ dispatchEvent: (target, ...args) => afterAction("dispatchEvent", () => locator(target).dispatchEvent(...args)),
150
+ keyboard: {
151
+ down: (...args) => afterAction("keyboard-down", () => page.keyboard.down(...args)),
152
+ up: (...args) => afterAction("keyboard-up", () => page.keyboard.up(...args)),
153
+ insertText: (...args) => afterAction("keyboard-insertText", () => page.keyboard.insertText(...args)),
154
+ type: (...args) => afterAction("keyboard-type", () => page.keyboard.type(...args)),
155
+ press: (...args) => afterAction("keyboard-press", () => page.keyboard.press(...args)),
156
+ },
157
+ mouse: {
158
+ move: (...args) => afterAction("mouse-move", () => page.mouse.move(...args)),
159
+ down: (...args) => afterAction("mouse-down", () => page.mouse.down(...args)),
160
+ up: (...args) => afterAction("mouse-up", () => page.mouse.up(...args)),
161
+ click: (...args) => afterAction("mouse-click", () => page.mouse.click(...args)),
162
+ dblclick: (...args) => afterAction("mouse-dblclick", () => page.mouse.dblclick(...args)),
163
+ wheel: (...args) => afterAction("mouse-wheel", () => page.mouse.wheel(...args)),
164
+ },
165
+ touchscreen: {
166
+ tap: (...args) => afterAction("touchscreen-tap", () => page.touchscreen.tap(...args)),
167
+ },
168
+ };
169
+ }
170
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/playwright/actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type Browser, type LaunchOptions } from "playwright";
2
+ import type { AppConfig } from "../shared/config.js";
3
+ /**
4
+ * Playwright Chromium defaults only. Extra flags (--no-sandbox, --no-zygote,
5
+ * GPU off, site-isolation off) are unsafe or break launch/screenshots on some OSes.
6
+ * Set CHROMIUM_SANDBOX=false only in Linux containers that run as root.
7
+ */
8
+ export declare function getChromiumLaunchOptions(config: AppConfig): LaunchOptions;
9
+ export declare function launchLightChromium(config: AppConfig): Promise<Browser>;
10
+ export declare function closeBrowser(browser: Browser | undefined): Promise<void>;
@@ -0,0 +1,27 @@
1
+ import { chromium } from "playwright";
2
+ /**
3
+ * Playwright Chromium defaults only. Extra flags (--no-sandbox, --no-zygote,
4
+ * GPU off, site-isolation off) are unsafe or break launch/screenshots on some OSes.
5
+ * Set CHROMIUM_SANDBOX=false only in Linux containers that run as root.
6
+ */
7
+ export function getChromiumLaunchOptions(config) {
8
+ return {
9
+ headless: config.headless,
10
+ chromiumSandbox: config.chromiumSandbox,
11
+ };
12
+ }
13
+ export async function launchLightChromium(config) {
14
+ return chromium.launch(getChromiumLaunchOptions(config));
15
+ }
16
+ export async function closeBrowser(browser) {
17
+ if (!browser) {
18
+ return;
19
+ }
20
+ try {
21
+ await browser.close();
22
+ }
23
+ catch {
24
+ // Browser may already be closed during shutdown.
25
+ }
26
+ }
27
+ //# sourceMappingURL=chromium.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chromium.js","sourceRoot":"","sources":["../../src/playwright/chromium.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAoC,MAAM,YAAY,CAAC;AAGxE;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,eAAe,EAAE,MAAM,CAAC,eAAe;KACxC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAAiB;IACzD,OAAO,QAAQ,CAAC,MAAM,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAA4B;IAC7D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,iDAAiD;IACnD,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { type AppConfig } from "../shared/config.js";
2
+ export declare function runApp(config?: AppConfig): Promise<string>;
@@ -0,0 +1,64 @@
1
+ import { loadConfig } from "../shared/config.js";
2
+ import { logger } from "../shared/logger.js";
3
+ import { isMainModule } from "../shared/main-module.js";
4
+ import { closeBrowser, launchLightChromium } from "./chromium.js";
5
+ import { createPageActions } from "./actions.js";
6
+ let activeBrowser;
7
+ let shuttingDown = false;
8
+ async function shutdown(exitCode, reason) {
9
+ if (shuttingDown) {
10
+ process.exit(exitCode);
11
+ }
12
+ shuttingDown = true;
13
+ logger.info(reason);
14
+ await closeBrowser(activeBrowser);
15
+ activeBrowser = undefined;
16
+ process.exit(exitCode);
17
+ }
18
+ export async function runApp(config = loadConfig()) {
19
+ logger.info(`Launching Chromium (headless=${config.headless}, sandbox=${config.chromiumSandbox}, viewport=${config.viewportWidth}x${config.viewportHeight})`);
20
+ activeBrowser = await launchLightChromium(config);
21
+ try {
22
+ const page = await activeBrowser.newPage({
23
+ viewport: {
24
+ width: config.viewportWidth,
25
+ height: config.viewportHeight,
26
+ },
27
+ });
28
+ page.setDefaultNavigationTimeout(config.navigationTimeoutMs);
29
+ const actions = createPageActions(page, config.processedDir);
30
+ logger.info(`Navigating to ${config.targetUrl}`);
31
+ await actions.goto(config.targetUrl, {
32
+ waitUntil: "domcontentloaded",
33
+ timeout: config.navigationTimeoutMs,
34
+ });
35
+ logger.info("Clicking xpath=//a");
36
+ await actions.click("xpath=//a");
37
+ const loadedUrl = page.url();
38
+ logger.info(`Loaded ${loadedUrl}`);
39
+ return loadedUrl;
40
+ }
41
+ finally {
42
+ await closeBrowser(activeBrowser);
43
+ activeBrowser = undefined;
44
+ logger.info("Browser closed");
45
+ }
46
+ }
47
+ function registerShutdownHandlers() {
48
+ const onSignal = (signal) => {
49
+ void shutdown(0, `Received ${signal}, shutting down`);
50
+ };
51
+ process.once("SIGINT", onSignal);
52
+ process.once("SIGTERM", onSignal);
53
+ }
54
+ async function main() {
55
+ registerShutdownHandlers();
56
+ await runApp();
57
+ }
58
+ if (isMainModule(import.meta.url)) {
59
+ main().catch((error) => {
60
+ logger.error("Fatal error", error);
61
+ void shutdown(1, "Exiting after fatal error");
62
+ });
63
+ }
64
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/playwright/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Page } from "playwright";
2
+ export declare const PROCESSED_DIR: string;
3
+ export declare const SAVED_RUNS_SUBDIR = "saved-runs";
4
+ export declare function getLatestWebpPath(directory?: string): Promise<string | undefined>;
5
+ export declare function savedRunScreenshotStem(historyFile: string): string;
6
+ export declare function getSavedRunScreenshotRelPath(processedDir: string, historyFile: string): Promise<string>;
7
+ export declare function savedRunQuestionFolder(sequence: number, id: string): string;
8
+ export declare function savedRunItemScreenshotDir(processedDir: string, historyFile: string, sequence: number, id: string): string;
9
+ export declare function getSavedRunItemScreenshotRelPaths(processedDir: string, historyFile: string, sequence: number, id: string): Promise<string[]>;
10
+ export declare function waitForScreenshotReady(page: Page): Promise<void>;
11
+ export declare function createProcessedScreenshotSaver(page: Page, directory?: string): (actionName: string) => Promise<string>;
@@ -0,0 +1,183 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ export const PROCESSED_DIR = path.resolve(process.cwd(), "processed");
4
+ export const SAVED_RUNS_SUBDIR = "saved-runs";
5
+ export async function getLatestWebpPath(directory = PROCESSED_DIR) {
6
+ let entries;
7
+ try {
8
+ entries = await fs.readdir(directory, { withFileTypes: true });
9
+ }
10
+ catch (error) {
11
+ if (error.code === "ENOENT") {
12
+ return undefined;
13
+ }
14
+ throw error;
15
+ }
16
+ const webpFiles = entries.filter((entry) => entry.isFile() && entry.name.toLowerCase().endsWith(".webp"));
17
+ if (webpFiles.length === 0) {
18
+ return undefined;
19
+ }
20
+ const ranked = await Promise.all(webpFiles.map(async (entry) => {
21
+ const filePath = path.join(directory, entry.name);
22
+ const stats = await fs.stat(filePath);
23
+ return { filePath, mtimeMs: stats.mtimeMs, name: entry.name };
24
+ }));
25
+ ranked.sort((left, right) => {
26
+ if (right.mtimeMs !== left.mtimeMs) {
27
+ return right.mtimeMs - left.mtimeMs;
28
+ }
29
+ return right.name.localeCompare(left.name);
30
+ });
31
+ return ranked[0]?.filePath;
32
+ }
33
+ async function latestWebpFrom(filePaths) {
34
+ if (filePaths.length === 0) {
35
+ return undefined;
36
+ }
37
+ const ranked = await Promise.all(filePaths.map(async (filePath) => {
38
+ const stats = await fs.stat(filePath);
39
+ return { filePath, mtimeMs: stats.mtimeMs, name: path.basename(filePath) };
40
+ }));
41
+ ranked.sort((left, right) => {
42
+ if (right.mtimeMs !== left.mtimeMs) {
43
+ return right.mtimeMs - left.mtimeMs;
44
+ }
45
+ return right.name.localeCompare(left.name);
46
+ });
47
+ return ranked[0]?.filePath;
48
+ }
49
+ function isSafeEntryName(name) {
50
+ return name !== "." && name !== ".." && !name.includes("/") && !name.includes("\\");
51
+ }
52
+ export function savedRunScreenshotStem(historyFile) {
53
+ return historyFile.replace(/\.json$/i, "");
54
+ }
55
+ export async function getSavedRunScreenshotRelPath(processedDir, historyFile) {
56
+ const stem = savedRunScreenshotStem(historyFile);
57
+ const runDir = path.join(processedDir, SAVED_RUNS_SUBDIR, stem);
58
+ let entries;
59
+ try {
60
+ entries = await fs.readdir(runDir, { withFileTypes: true });
61
+ }
62
+ catch (error) {
63
+ if (error.code === "ENOENT") {
64
+ return "";
65
+ }
66
+ throw error;
67
+ }
68
+ const files = [];
69
+ for (const entry of entries) {
70
+ if (!isSafeEntryName(entry.name)) {
71
+ continue;
72
+ }
73
+ if (entry.isFile() && entry.name.toLowerCase().endsWith(".webp")) {
74
+ files.push(path.join(runDir, entry.name));
75
+ continue;
76
+ }
77
+ if (entry.isDirectory()) {
78
+ const nested = await getLatestWebpPath(path.join(runDir, entry.name));
79
+ if (nested) {
80
+ files.push(nested);
81
+ }
82
+ }
83
+ }
84
+ const latest = await latestWebpFrom(files);
85
+ if (!latest) {
86
+ return "";
87
+ }
88
+ const rel = path.relative(runDir, latest).split(path.sep).join("/");
89
+ if (!rel || rel.startsWith("..") || path.isAbsolute(rel)) {
90
+ return "";
91
+ }
92
+ return `${stem}/${rel}`;
93
+ }
94
+ function sanitizePathSegment(value) {
95
+ const cleaned = value
96
+ .trim()
97
+ .replace(/[^a-zA-Z0-9_-]+/g, "-")
98
+ .replace(/-+/g, "-")
99
+ .replace(/^-|-$/g, "");
100
+ if (!cleaned || cleaned === "." || cleaned === "..") {
101
+ return "id";
102
+ }
103
+ return cleaned;
104
+ }
105
+ export function savedRunQuestionFolder(sequence, id) {
106
+ return `${String(sequence).padStart(4, "0")}-${sanitizePathSegment(id)}`;
107
+ }
108
+ export function savedRunItemScreenshotDir(processedDir, historyFile, sequence, id) {
109
+ return path.join(processedDir, SAVED_RUNS_SUBDIR, savedRunScreenshotStem(historyFile), savedRunQuestionFolder(sequence, id));
110
+ }
111
+ export async function getSavedRunItemScreenshotRelPaths(processedDir, historyFile, sequence, id) {
112
+ const stem = savedRunScreenshotStem(historyFile);
113
+ const folder = savedRunQuestionFolder(sequence, id);
114
+ const dir = savedRunItemScreenshotDir(processedDir, historyFile, sequence, id);
115
+ let entries;
116
+ try {
117
+ entries = await fs.readdir(dir, { withFileTypes: true });
118
+ }
119
+ catch (error) {
120
+ if (error.code === "ENOENT") {
121
+ return [];
122
+ }
123
+ throw error;
124
+ }
125
+ return entries
126
+ .filter((entry) => entry.isFile() &&
127
+ isSafeEntryName(entry.name) &&
128
+ entry.name.toLowerCase().endsWith(".webp"))
129
+ .map((entry) => entry.name)
130
+ .sort((left, right) => left.localeCompare(right))
131
+ .map((name) => `${stem}/${folder}/${name}`);
132
+ }
133
+ const SCREENSHOT_LOAD_TIMEOUT_MS = 5_000;
134
+ const SCREENSHOT_PAINT_SETTLE_MS = 200;
135
+ function sanitizeActionName(actionName) {
136
+ return actionName.replace(/[^a-zA-Z0-9._-]+/g, "-");
137
+ }
138
+ function timestamp() {
139
+ return new Date().toISOString().replace(/[:.]/g, "-");
140
+ }
141
+ async function ignoreFailure(run) {
142
+ try {
143
+ await run();
144
+ }
145
+ catch {
146
+ // Still capture whatever is on screen.
147
+ }
148
+ }
149
+ export async function waitForScreenshotReady(page) {
150
+ if (page.isClosed()) {
151
+ return;
152
+ }
153
+ await ignoreFailure(() => page.waitForLoadState("load", { timeout: SCREENSHOT_LOAD_TIMEOUT_MS }));
154
+ await ignoreFailure(() => page.evaluate(`(settleMs) => new Promise((resolve) => {
155
+ const finish = () => {
156
+ void document.documentElement.offsetHeight;
157
+ requestAnimationFrame(() => {
158
+ requestAnimationFrame(() => {
159
+ window.setTimeout(resolve, settleMs);
160
+ });
161
+ });
162
+ };
163
+ if (document.readyState === "complete") {
164
+ finish();
165
+ return;
166
+ }
167
+ window.addEventListener("load", finish, { once: true });
168
+ window.setTimeout(finish, 1000);
169
+ })`, SCREENSHOT_PAINT_SETTLE_MS));
170
+ }
171
+ export function createProcessedScreenshotSaver(page, directory = PROCESSED_DIR) {
172
+ let sequence = 0;
173
+ return async function saveProcessedScreenshot(actionName) {
174
+ sequence += 1;
175
+ await fs.mkdir(directory, { recursive: true });
176
+ const fileName = `${timestamp()}-${String(sequence).padStart(4, "0")}-${sanitizeActionName(actionName)}.webp`;
177
+ const filePath = path.join(directory, fileName);
178
+ await waitForScreenshotReady(page);
179
+ await page.screenshot({ path: filePath, type: "webp" });
180
+ return filePath;
181
+ };
182
+ }
183
+ //# sourceMappingURL=processed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processed.js","sourceRoot":"","sources":["../../src/playwright/processed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { Browser, Page } from "playwright";
2
+ import type { AppConfig } from "../shared/config.js";
3
+ export declare const BROWSER_SESSION_RESET_MESSAGE = "Browser session was reset. Started a new browser.";
4
+ export interface PageEnsureResult {
5
+ readonly page: Page;
6
+ readonly sessionReset: boolean;
7
+ }
8
+ export interface SessionStatus {
9
+ readonly open: boolean;
10
+ readonly url: string;
11
+ }
12
+ export declare class BrowserClosedError extends Error {
13
+ constructor(message?: string);
14
+ }
15
+ export interface BrowserSession {
16
+ isOpen(): boolean;
17
+ getStatus(): SessionStatus;
18
+ ensurePage(config: AppConfig): Promise<PageEnsureResult>;
19
+ close(): Promise<void>;
20
+ goBack(): Promise<SessionStatus>;
21
+ goForward(): Promise<SessionStatus>;
22
+ reload(): Promise<SessionStatus>;
23
+ }
24
+ export interface BrowserSessionDeps {
25
+ launch?(config: AppConfig): Promise<Browser>;
26
+ screenshotDir?: string;
27
+ }
28
+ export declare function createBrowserSession(deps?: BrowserSessionDeps): BrowserSession;