deio-scroll 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 (205) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +21 -0
  3. package/dist/api/server.d.ts +3 -0
  4. package/dist/api/server.d.ts.map +1 -0
  5. package/dist/api/server.js +393 -0
  6. package/dist/api/server.js.map +1 -0
  7. package/dist/artifacts/store.d.ts +24 -0
  8. package/dist/artifacts/store.d.ts.map +1 -0
  9. package/dist/artifacts/store.js +43 -0
  10. package/dist/artifacts/store.js.map +1 -0
  11. package/dist/browser/componentInteraction.d.ts +24 -0
  12. package/dist/browser/componentInteraction.d.ts.map +1 -0
  13. package/dist/browser/componentInteraction.js +328 -0
  14. package/dist/browser/componentInteraction.js.map +1 -0
  15. package/dist/browser/composition.d.ts +42 -0
  16. package/dist/browser/composition.d.ts.map +1 -0
  17. package/dist/browser/composition.js +132 -0
  18. package/dist/browser/composition.js.map +1 -0
  19. package/dist/browser/cookies.d.ts +3 -0
  20. package/dist/browser/cookies.d.ts.map +1 -0
  21. package/dist/browser/cookies.js +20 -0
  22. package/dist/browser/cookies.js.map +1 -0
  23. package/dist/browser/curves.d.ts +4 -0
  24. package/dist/browser/curves.d.ts.map +1 -0
  25. package/dist/browser/curves.js +35 -0
  26. package/dist/browser/curves.js.map +1 -0
  27. package/dist/browser/detectScrollMode.d.ts +5 -0
  28. package/dist/browser/detectScrollMode.d.ts.map +1 -0
  29. package/dist/browser/detectScrollMode.js +61 -0
  30. package/dist/browser/detectScrollMode.js.map +1 -0
  31. package/dist/browser/directionGuardrails.d.ts +22 -0
  32. package/dist/browser/directionGuardrails.d.ts.map +1 -0
  33. package/dist/browser/directionGuardrails.js +99 -0
  34. package/dist/browser/directionGuardrails.js.map +1 -0
  35. package/dist/browser/goto.d.ts +9 -0
  36. package/dist/browser/goto.d.ts.map +1 -0
  37. package/dist/browser/goto.js +62 -0
  38. package/dist/browser/goto.js.map +1 -0
  39. package/dist/browser/hydrate.d.ts +8 -0
  40. package/dist/browser/hydrate.d.ts.map +1 -0
  41. package/dist/browser/hydrate.js +73 -0
  42. package/dist/browser/hydrate.js.map +1 -0
  43. package/dist/browser/mediaClock.d.ts +9 -0
  44. package/dist/browser/mediaClock.d.ts.map +1 -0
  45. package/dist/browser/mediaClock.js +86 -0
  46. package/dist/browser/mediaClock.js.map +1 -0
  47. package/dist/browser/motion.d.ts +21 -0
  48. package/dist/browser/motion.d.ts.map +1 -0
  49. package/dist/browser/motion.js +42 -0
  50. package/dist/browser/motion.js.map +1 -0
  51. package/dist/browser/networkPolicy.d.ts +11 -0
  52. package/dist/browser/networkPolicy.d.ts.map +1 -0
  53. package/dist/browser/networkPolicy.js +119 -0
  54. package/dist/browser/networkPolicy.js.map +1 -0
  55. package/dist/browser/prime.d.ts +3 -0
  56. package/dist/browser/prime.d.ts.map +1 -0
  57. package/dist/browser/prime.js +13 -0
  58. package/dist/browser/prime.js.map +1 -0
  59. package/dist/browser/sanitize.d.ts +3 -0
  60. package/dist/browser/sanitize.d.ts.map +1 -0
  61. package/dist/browser/sanitize.js +37 -0
  62. package/dist/browser/sanitize.js.map +1 -0
  63. package/dist/browser/scroll.d.ts +29 -0
  64. package/dist/browser/scroll.d.ts.map +1 -0
  65. package/dist/browser/scroll.js +420 -0
  66. package/dist/browser/scroll.js.map +1 -0
  67. package/dist/browser/scrollEasing.d.ts +5 -0
  68. package/dist/browser/scrollEasing.d.ts.map +1 -0
  69. package/dist/browser/scrollEasing.js +40 -0
  70. package/dist/browser/scrollEasing.js.map +1 -0
  71. package/dist/browser/scrollReadiness.d.ts +25 -0
  72. package/dist/browser/scrollReadiness.d.ts.map +1 -0
  73. package/dist/browser/scrollReadiness.js +105 -0
  74. package/dist/browser/scrollReadiness.js.map +1 -0
  75. package/dist/browser/urlGuard.d.ts +4 -0
  76. package/dist/browser/urlGuard.d.ts.map +1 -0
  77. package/dist/browser/urlGuard.js +22 -0
  78. package/dist/browser/urlGuard.js.map +1 -0
  79. package/dist/browser/virtualScroll.d.ts +19 -0
  80. package/dist/browser/virtualScroll.d.ts.map +1 -0
  81. package/dist/browser/virtualScroll.js +50 -0
  82. package/dist/browser/virtualScroll.js.map +1 -0
  83. package/dist/capture/detectMargins.d.ts +6 -0
  84. package/dist/capture/detectMargins.d.ts.map +1 -0
  85. package/dist/capture/detectMargins.js +145 -0
  86. package/dist/capture/detectMargins.js.map +1 -0
  87. package/dist/capture/frameRecorder.d.ts +29 -0
  88. package/dist/capture/frameRecorder.d.ts.map +1 -0
  89. package/dist/capture/frameRecorder.js +74 -0
  90. package/dist/capture/frameRecorder.js.map +1 -0
  91. package/dist/capture/stitchFrames.d.ts +9 -0
  92. package/dist/capture/stitchFrames.d.ts.map +1 -0
  93. package/dist/capture/stitchFrames.js +62 -0
  94. package/dist/capture/stitchFrames.js.map +1 -0
  95. package/dist/cli.d.ts +3 -0
  96. package/dist/cli.d.ts.map +1 -0
  97. package/dist/cli.js +329 -0
  98. package/dist/cli.js.map +1 -0
  99. package/dist/config/browserLaunch.d.ts +13 -0
  100. package/dist/config/browserLaunch.d.ts.map +1 -0
  101. package/dist/config/browserLaunch.js +63 -0
  102. package/dist/config/browserLaunch.js.map +1 -0
  103. package/dist/config/recordingProfile.d.ts +10 -0
  104. package/dist/config/recordingProfile.d.ts.map +1 -0
  105. package/dist/config/recordingProfile.js +25 -0
  106. package/dist/config/recordingProfile.js.map +1 -0
  107. package/dist/config/runtimeMode.d.ts +2 -0
  108. package/dist/config/runtimeMode.d.ts.map +1 -0
  109. package/dist/config/runtimeMode.js +4 -0
  110. package/dist/config/runtimeMode.js.map +1 -0
  111. package/dist/config/virtualScroll.d.ts +8 -0
  112. package/dist/config/virtualScroll.d.ts.map +1 -0
  113. package/dist/config/virtualScroll.js +19 -0
  114. package/dist/config/virtualScroll.js.map +1 -0
  115. package/dist/contracts.d.ts +157 -0
  116. package/dist/contracts.d.ts.map +1 -0
  117. package/dist/contracts.js +136 -0
  118. package/dist/contracts.js.map +1 -0
  119. package/dist/editor/compileVideo.d.ts +21 -0
  120. package/dist/editor/compileVideo.d.ts.map +1 -0
  121. package/dist/editor/compileVideo.js +104 -0
  122. package/dist/editor/compileVideo.js.map +1 -0
  123. package/dist/editor/composeComparison.d.ts +30 -0
  124. package/dist/editor/composeComparison.d.ts.map +1 -0
  125. package/dist/editor/composeComparison.js +315 -0
  126. package/dist/editor/composeComparison.js.map +1 -0
  127. package/dist/editor/composeResponsiveness.d.ts +19 -0
  128. package/dist/editor/composeResponsiveness.d.ts.map +1 -0
  129. package/dist/editor/composeResponsiveness.js +198 -0
  130. package/dist/editor/composeResponsiveness.js.map +1 -0
  131. package/dist/editor/frameVideo.d.ts +11 -0
  132. package/dist/editor/frameVideo.d.ts.map +1 -0
  133. package/dist/editor/frameVideo.js +181 -0
  134. package/dist/editor/frameVideo.js.map +1 -0
  135. package/dist/index.d.ts +3 -0
  136. package/dist/index.d.ts.map +1 -0
  137. package/dist/index.js +2 -0
  138. package/dist/index.js.map +1 -0
  139. package/dist/inspection/inspectWebsite.d.ts +21 -0
  140. package/dist/inspection/inspectWebsite.d.ts.map +1 -0
  141. package/dist/inspection/inspectWebsite.js +412 -0
  142. package/dist/inspection/inspectWebsite.js.map +1 -0
  143. package/dist/jobs/manager.d.ts +123 -0
  144. package/dist/jobs/manager.d.ts.map +1 -0
  145. package/dist/jobs/manager.js +378 -0
  146. package/dist/jobs/manager.js.map +1 -0
  147. package/dist/jobs/store.d.ts +150 -0
  148. package/dist/jobs/store.d.ts.map +1 -0
  149. package/dist/jobs/store.js +446 -0
  150. package/dist/jobs/store.js.map +1 -0
  151. package/dist/jobs/thumbnail.d.ts +2 -0
  152. package/dist/jobs/thumbnail.d.ts.map +1 -0
  153. package/dist/jobs/thumbnail.js +36 -0
  154. package/dist/jobs/thumbnail.js.map +1 -0
  155. package/dist/pipeline/processRecordingRequest.d.ts +4 -0
  156. package/dist/pipeline/processRecordingRequest.d.ts.map +1 -0
  157. package/dist/pipeline/processRecordingRequest.js +17 -0
  158. package/dist/pipeline/processRecordingRequest.js.map +1 -0
  159. package/dist/pipeline/recordComparison.d.ts +4 -0
  160. package/dist/pipeline/recordComparison.d.ts.map +1 -0
  161. package/dist/pipeline/recordComparison.js +99 -0
  162. package/dist/pipeline/recordComparison.js.map +1 -0
  163. package/dist/pipeline/recordResponsiveness.d.ts +4 -0
  164. package/dist/pipeline/recordResponsiveness.d.ts.map +1 -0
  165. package/dist/pipeline/recordResponsiveness.js +122 -0
  166. package/dist/pipeline/recordResponsiveness.js.map +1 -0
  167. package/dist/pipeline/recordWebsite.d.ts +11 -0
  168. package/dist/pipeline/recordWebsite.d.ts.map +1 -0
  169. package/dist/pipeline/recordWebsite.js +446 -0
  170. package/dist/pipeline/recordWebsite.js.map +1 -0
  171. package/dist/pipeline/styleRecording.d.ts +12 -0
  172. package/dist/pipeline/styleRecording.d.ts.map +1 -0
  173. package/dist/pipeline/styleRecording.js +59 -0
  174. package/dist/pipeline/styleRecording.js.map +1 -0
  175. package/dist/transcode/ffmpeg.d.ts +4 -0
  176. package/dist/transcode/ffmpeg.d.ts.map +1 -0
  177. package/dist/transcode/ffmpeg.js +62 -0
  178. package/dist/transcode/ffmpeg.js.map +1 -0
  179. package/dist/transcode/probe.d.ts +7 -0
  180. package/dist/transcode/probe.d.ts.map +1 -0
  181. package/dist/transcode/probe.js +91 -0
  182. package/dist/transcode/probe.js.map +1 -0
  183. package/dist/transcode/quality.d.ts +8 -0
  184. package/dist/transcode/quality.d.ts.map +1 -0
  185. package/dist/transcode/quality.js +13 -0
  186. package/dist/transcode/quality.js.map +1 -0
  187. package/dist/types.d.ts +302 -0
  188. package/dist/types.d.ts.map +1 -0
  189. package/dist/types.js +2 -0
  190. package/dist/types.js.map +1 -0
  191. package/dist/worker.d.ts +3 -0
  192. package/dist/worker.d.ts.map +1 -0
  193. package/dist/worker.js +22 -0
  194. package/dist/worker.js.map +1 -0
  195. package/package.json +63 -0
  196. package/public/assets/index-C63t4P1L.css +1 -0
  197. package/public/assets/index-Sfgf7dSH.js +9 -0
  198. package/public/background_presets/gray_noise_gradient.png +0 -0
  199. package/public/background_presets/paper_blue.png +0 -0
  200. package/public/background_presets/red_blocks_gradient.png +0 -0
  201. package/public/deio-scroll-mark.svg +12 -0
  202. package/public/favicon.svg +1 -0
  203. package/public/icons.svg +24 -0
  204. package/public/index.html +16 -0
  205. package/public/scrollizard-mark.png +0 -0
@@ -0,0 +1,91 @@
1
+ import { spawn } from "node:child_process";
2
+ export async function probeVideoDurationMs(inputPath) {
3
+ return new Promise((resolve) => {
4
+ const child = spawn("ffprobe", [
5
+ "-v",
6
+ "error",
7
+ "-show_entries",
8
+ "format=duration",
9
+ "-of",
10
+ "default=noprint_wrappers=1:nokey=1",
11
+ inputPath,
12
+ ]);
13
+ let stdout = "";
14
+ child.stdout.on("data", (chunk) => {
15
+ stdout += chunk.toString();
16
+ });
17
+ child.on("error", () => resolve(null));
18
+ child.on("close", (code) => {
19
+ if (code !== 0)
20
+ return resolve(null);
21
+ const seconds = Number(stdout.trim());
22
+ if (!Number.isFinite(seconds) || seconds <= 0)
23
+ return resolve(null);
24
+ resolve(Math.round(seconds * 1000));
25
+ });
26
+ });
27
+ }
28
+ export async function probeVideoSize(inputPath) {
29
+ return new Promise((resolve) => {
30
+ const child = spawn("ffprobe", [
31
+ "-v",
32
+ "error",
33
+ "-select_streams",
34
+ "v:0",
35
+ "-show_entries",
36
+ "stream=width,height",
37
+ "-of",
38
+ "csv=p=0:s=x",
39
+ inputPath,
40
+ ]);
41
+ let stdout = "";
42
+ child.stdout.on("data", (chunk) => {
43
+ stdout += chunk.toString();
44
+ });
45
+ child.on("error", () => resolve(null));
46
+ child.on("close", (code) => {
47
+ if (code !== 0)
48
+ return resolve(null);
49
+ const [width, height] = stdout.trim().split("x").map(Number);
50
+ if (!width || !height)
51
+ return resolve(null);
52
+ resolve({ width, height });
53
+ });
54
+ });
55
+ }
56
+ export async function probeVideoFps(inputPath) {
57
+ return new Promise((resolve) => {
58
+ const child = spawn("ffprobe", [
59
+ "-v",
60
+ "error",
61
+ "-select_streams",
62
+ "v:0",
63
+ "-show_entries",
64
+ "stream=r_frame_rate",
65
+ "-of",
66
+ "default=noprint_wrappers=1:nokey=1",
67
+ inputPath,
68
+ ]);
69
+ let stdout = "";
70
+ child.stdout.on("data", (chunk) => {
71
+ stdout += chunk.toString();
72
+ });
73
+ child.on("error", () => resolve(60));
74
+ child.on("close", (code) => {
75
+ if (code !== 0)
76
+ return resolve(60);
77
+ const parts = stdout.trim().split("/");
78
+ if (parts.length === 2) {
79
+ const num = Number(parts[0]);
80
+ const den = Number(parts[1]);
81
+ if (num && den)
82
+ return resolve(Math.round(num / den));
83
+ }
84
+ const val = Number(stdout.trim());
85
+ if (Number.isFinite(val) && val > 0)
86
+ return resolve(Math.round(val));
87
+ resolve(60);
88
+ });
89
+ });
90
+ }
91
+ //# sourceMappingURL=probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"probe.js","sourceRoot":"","sources":["../../src/transcode/probe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export type QualityPreset = 'high' | 'medium' | 'low';
2
+ export interface EncodeSettings {
3
+ crf: number;
4
+ preset: string;
5
+ deviceScaleFactor: number;
6
+ }
7
+ export declare function resolveEncodeSettings(qualityPreset?: QualityPreset, requestedScaleFactor?: number): EncodeSettings;
8
+ //# sourceMappingURL=quality.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quality.d.ts","sourceRoot":"","sources":["../../src/transcode/quality.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAA;AAErD,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,iBAAiB,EAAE,MAAM,CAAA;CAC1B;AAED,wBAAgB,qBAAqB,CACnC,aAAa,GAAE,aAAsB,EACrC,oBAAoB,CAAC,EAAE,MAAM,GAC5B,cAAc,CAYhB"}
@@ -0,0 +1,13 @@
1
+ export function resolveEncodeSettings(qualityPreset = 'high', requestedScaleFactor) {
2
+ const presets = {
3
+ high: { crf: 15, preset: 'slow', deviceScaleFactor: 2 },
4
+ medium: { crf: 20, preset: 'medium', deviceScaleFactor: 1 },
5
+ low: { crf: 26, preset: 'fast', deviceScaleFactor: 1 },
6
+ };
7
+ const settings = presets[qualityPreset];
8
+ return {
9
+ ...settings,
10
+ deviceScaleFactor: requestedScaleFactor ?? settings.deviceScaleFactor,
11
+ };
12
+ }
13
+ //# sourceMappingURL=quality.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quality.js","sourceRoot":"","sources":["../../src/transcode/quality.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,qBAAqB,CACnC,gBAA+B,MAAM,EACrC,oBAA6B;IAE7B,MAAM,OAAO,GAA0C;QACrD,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,EAAE;QACvD,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC,EAAE;QAC3D,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,EAAE;KACvD,CAAA;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;IACvC,OAAO;QACL,GAAG,QAAQ;QACX,iBAAiB,EAAE,oBAAoB,IAAI,QAAQ,CAAC,iBAAiB;KACtE,CAAA;AACH,CAAC"}
@@ -0,0 +1,302 @@
1
+ export interface ViewportConfig {
2
+ width: number;
3
+ height: number;
4
+ deviceScaleFactor?: number;
5
+ }
6
+ export interface PauseTrigger {
7
+ selector: string;
8
+ durationMs: number;
9
+ }
10
+ export type MotionTarget = {
11
+ type: "selector";
12
+ selector: string;
13
+ align?: "top" | "center" | "bottom";
14
+ offsetPx?: number;
15
+ /** Last measured page progress, used when a dynamic selector goes stale. */
16
+ fallbackProgress?: number;
17
+ } | {
18
+ type: "progress";
19
+ value: number;
20
+ } | {
21
+ type: "page-end";
22
+ };
23
+ export interface MotionBeat {
24
+ target: MotionTarget;
25
+ transitionMs: number;
26
+ curve?: ScrollCurve;
27
+ holdMs?: number;
28
+ interaction?: ComponentInteraction;
29
+ }
30
+ export type ComponentInteractionAction = "hover" | "focus" | "click";
31
+ export interface ComponentInteraction {
32
+ action: ComponentInteractionAction;
33
+ /** Inspection identity retained for diagnostics. */
34
+ candidateId?: string;
35
+ /** Semantic fallback used when a live page changes its DOM path. */
36
+ label?: string;
37
+ /** ARIA or element role used with label during selector recovery. */
38
+ role?: string;
39
+ /** Maximum camera scale while the component is active. */
40
+ zoomScale?: number;
41
+ /** Show and animate a rendered cursor toward the component. */
42
+ showCursor?: boolean;
43
+ }
44
+ export interface MotionDirection {
45
+ startHoldMs?: number;
46
+ beats: MotionBeat[];
47
+ }
48
+ export declare const DEFAULT_DIRECTED_START_HOLD_MS = 1500;
49
+ export interface VideoConfig {
50
+ framerate?: number;
51
+ qualityPreset?: "high" | "medium" | "low";
52
+ viewport: ViewportConfig;
53
+ }
54
+ export type ScrollCurvePreset = "linear" | "ease-in" | "ease-out" | "ease-in-out" | "ease-in-cubic" | "ease-out-cubic" | "ease-in-out-cubic" | "custom";
55
+ export interface ScrollCurve {
56
+ preset?: ScrollCurvePreset;
57
+ /** CSS cubic-bezier control points [x1, y1, x2, y2]. Required when preset is "custom". */
58
+ bezier?: [number, number, number, number];
59
+ }
60
+ export type ScrollMode = "auto" | "document" | "virtual";
61
+ export interface AnimationConfig {
62
+ pixelsPerFrame?: number;
63
+ preRecordingDelayMs?: number;
64
+ removeOverlayElements?: boolean;
65
+ pauseTriggers?: PauseTrigger[];
66
+ scrollCurve?: ScrollCurve;
67
+ /** Target scroll duration in milliseconds. Applies to both document and virtual scroll. */
68
+ durationMs?: number;
69
+ /** Capture the top of the page before scrolling, allowing dynamic hero content to settle. */
70
+ heroHoldMs?: number;
71
+ /**
72
+ * How to drive scrolling. `auto` picks document scrolling or virtual wheel
73
+ * scrolling based on page layout (fixed viewport / infinite scroll sites).
74
+ */
75
+ scrollMode?: ScrollMode;
76
+ /** Virtual-scroll only: viewport-heights worth of wheel input to replay. */
77
+ virtualScrollCycles?: number;
78
+ /** Virtual-scroll only: total capture duration in milliseconds. */
79
+ virtualScrollDurationMs?: number;
80
+ /** Skip deep hydration, scroll faster, and use quick encoding. */
81
+ fastMode?: boolean;
82
+ /** Capture mode: 'preview' (fast, video) or 'export' (high-quality, screenshots) */
83
+ captureMode?: "preview" | "export";
84
+ /** Ordered, section-level direction. Takes precedence over legacy global motion settings. */
85
+ direction?: MotionDirection;
86
+ scrollSync?: {
87
+ refMaxScroll: number;
88
+ refDurationMs: number;
89
+ };
90
+ }
91
+ export interface RecordRequest {
92
+ targetUrl: string;
93
+ exportFormat?: "mp4";
94
+ videoConfig: VideoConfig;
95
+ animationConfig?: AnimationConfig;
96
+ /** Image placed behind a contained recording in the completed capture. */
97
+ backgroundPreset?: BackgroundPreset;
98
+ /** Add a soft drop shadow to the contained recording. */
99
+ addShadow?: boolean;
100
+ /** Round the contained recording's corners. */
101
+ roundedCorners?: boolean;
102
+ /** Capture a second page with the same motion settings and export a paired video. */
103
+ comparison?: ComparisonConfig;
104
+ responsiveness?: ResponsivenessConfig;
105
+ }
106
+ export interface ResponsivenessConfig {
107
+ desktopLabel?: string;
108
+ mobileLabel?: string;
109
+ desktopWidth?: number;
110
+ desktopHeight?: number;
111
+ mobileWidth?: number;
112
+ mobileHeight?: number;
113
+ }
114
+ export interface ComparisonConfig {
115
+ targetUrl: string;
116
+ primaryLabel: string;
117
+ secondaryLabel: string;
118
+ layout?: "side-by-side";
119
+ primaryLogo?: string;
120
+ secondaryLogo?: string;
121
+ /** Base64 data URI (PNG/JPEG/WebP/SVG) for the primary side logo image. Max 512 KB. */
122
+ primaryLogoDataUrl?: string;
123
+ /** Base64 data URI (PNG/JPEG/WebP/SVG) for the secondary side logo image. Max 512 KB. */
124
+ secondaryLogoDataUrl?: string;
125
+ }
126
+ export interface StyleRequest {
127
+ jobId: string;
128
+ backgroundPreset?: BackgroundPreset;
129
+ addShadow?: boolean;
130
+ roundedCorners?: boolean;
131
+ }
132
+ export interface StyleResult {
133
+ jobId: string;
134
+ videoUrl: string;
135
+ mp4Path: string;
136
+ }
137
+ export type ResolvedScrollStrategy = "document" | "virtual";
138
+ export interface RecordResult {
139
+ jobId: string;
140
+ outputDir: string;
141
+ rawVideoPath: string;
142
+ mp4Path: string;
143
+ durationMs: number;
144
+ renderTimeMs: number;
145
+ viewport: ViewportConfig;
146
+ scrollStrategy: ResolvedScrollStrategy;
147
+ motionPlan?: ResolvedMotionPlan;
148
+ }
149
+ export interface ResolvedMotionBeat {
150
+ target: MotionTarget;
151
+ position: number;
152
+ transitionMs: number;
153
+ holdMs: number;
154
+ curve: ScrollCurve;
155
+ interaction?: ComponentInteraction;
156
+ framing?: ResolvedBeatFraming;
157
+ }
158
+ export interface ResolvedBeatFraming {
159
+ selector: string;
160
+ align: "top" | "center" | "bottom";
161
+ targetY: number;
162
+ safeTopPx: number;
163
+ safeBottomPx: number;
164
+ verified: boolean;
165
+ }
166
+ export interface ResolvedMotionPlan {
167
+ mode: ResolvedScrollStrategy;
168
+ startHoldMs: number;
169
+ durationMs: number;
170
+ beats: ResolvedMotionBeat[];
171
+ adjustments: MotionPlanAdjustment[];
172
+ }
173
+ export interface MotionPlanAdjustment {
174
+ beatIndex: number;
175
+ code: "promoted-progress-target" | "merged-nearby-beat" | "replaced-boundary-curve" | "stretched-transition" | "corrected-pause-framing";
176
+ message: string;
177
+ requested?: number | string | MotionTarget;
178
+ resolved?: number | string | MotionTarget;
179
+ }
180
+ export type BackgroundPreset = "none" | "gray_noise_gradient" | "paper_blue" | "red_blocks_gradient";
181
+ export interface WebsiteSection {
182
+ label: string;
183
+ selector: string;
184
+ kind: "heading" | "landmark";
185
+ imageIndex?: number;
186
+ y: number;
187
+ progress: number;
188
+ height: number;
189
+ targetY: number;
190
+ distanceFromPrevious: number;
191
+ recommendedTransitionMs: number;
192
+ recommendedTarget: Extract<MotionTarget, {
193
+ type: "selector";
194
+ }>;
195
+ }
196
+ export interface StoryboardFrame {
197
+ imageIndex: number;
198
+ target: Extract<MotionTarget, {
199
+ type: "progress";
200
+ }>;
201
+ y?: number;
202
+ }
203
+ export interface WebsiteInspection {
204
+ url: string;
205
+ title: string;
206
+ pageHeight: number;
207
+ viewport: {
208
+ width: number;
209
+ height: number;
210
+ };
211
+ scrollMode: ResolvedScrollStrategy;
212
+ safeViewport: {
213
+ topInsetPx: number;
214
+ bottomInsetPx: number;
215
+ };
216
+ sections: WebsiteSection[];
217
+ interactions: WebsiteInteractionCandidate[];
218
+ storyboard: StoryboardFrame[];
219
+ screenshots: string[];
220
+ warnings: string[];
221
+ }
222
+ export interface WebsiteInteractionCandidate {
223
+ id: string;
224
+ selector: string;
225
+ label: string;
226
+ tag: string;
227
+ role: string;
228
+ actions: ComponentInteractionAction[];
229
+ rect: {
230
+ x: number;
231
+ y: number;
232
+ width: number;
233
+ height: number;
234
+ };
235
+ recommendedTarget: Extract<MotionTarget, {
236
+ type: "selector";
237
+ }>;
238
+ recommendedHoldMs: number;
239
+ recommendedZoomScale: number;
240
+ recommendedInteraction: ComponentInteraction;
241
+ }
242
+ export type RecordingJobStatus = "queued" | "running" | "completed" | "failed" | "cancelled" | "interrupted";
243
+ export type RecordingJobStage = "queued" | "preparing" | "capturing" | "encoding" | "styling" | "finalizing" | "completed" | "failed" | "cancelled" | "interrupted";
244
+ export interface RecordingJobProgress {
245
+ stage: RecordingJobStage;
246
+ percent: number;
247
+ message: string;
248
+ }
249
+ export interface RecordingJobResult {
250
+ videoUrl: string;
251
+ sourceVideoUrl?: string;
252
+ thumbnailUrl?: string;
253
+ durationMs: number;
254
+ renderTimeMs: number;
255
+ sizeBytes: number;
256
+ viewport: ViewportConfig;
257
+ scrollStrategy: ResolvedScrollStrategy;
258
+ motionPlan?: ResolvedMotionPlan;
259
+ canRestyle: boolean;
260
+ comparison?: {
261
+ primaryUrl: string;
262
+ secondaryUrl: string;
263
+ primaryLabel: string;
264
+ secondaryLabel: string;
265
+ layout: "side-by-side";
266
+ primaryLogo?: string;
267
+ secondaryLogo?: string;
268
+ primaryLogoDataUrl?: string;
269
+ secondaryLogoDataUrl?: string;
270
+ };
271
+ responsiveness?: {
272
+ desktopLabel: string;
273
+ mobileLabel: string;
274
+ desktopWidth: number;
275
+ desktopHeight: number;
276
+ mobileWidth: number;
277
+ mobileHeight: number;
278
+ };
279
+ }
280
+ export interface RecordingJobManifest {
281
+ schemaVersion: 1;
282
+ jobId: string;
283
+ /** Stable tenancy seams used by the local SQLite store and future hosted adapters. */
284
+ workspaceId?: string;
285
+ projectId?: string;
286
+ targetUrl: string;
287
+ title?: string;
288
+ createdAt: string;
289
+ updatedAt: string;
290
+ status: RecordingJobStatus;
291
+ progress: RecordingJobProgress;
292
+ request?: RecordRequest;
293
+ result?: RecordingJobResult;
294
+ error?: {
295
+ stage: RecordingJobStage;
296
+ message: string;
297
+ };
298
+ attempt: number;
299
+ parentJobId?: string;
300
+ legacy?: boolean;
301
+ }
302
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export const DEFAULT_DIRECTED_START_HOLD_MS = 1_500;
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAoDA,MAAM,CAAC,MAAM,8BAA8B,GAAG,KAAK,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import "dotenv/config";
3
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC"}
package/dist/worker.js ADDED
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env node
2
+ import "dotenv/config";
3
+ import path from "node:path";
4
+ import { RecordingJobManager } from "./jobs/manager.js";
5
+ const outputRoot = path.resolve(process.env.OUTPUT_DIR ?? "./outputs");
6
+ const worker = new RecordingJobManager(outputRoot, {
7
+ processJobs: true,
8
+ recoverRunning: "requeue",
9
+ workerId: process.env.WORKER_ID,
10
+ });
11
+ await worker.initialize();
12
+ console.log(`Deio Scroll capture worker listening for jobs in ${outputRoot}`);
13
+ // The manager's poll timer is deliberately unreferenced for embedded CLI/MCP use.
14
+ const keepAlive = setInterval(() => undefined, 60_000);
15
+ const shutdown = async () => {
16
+ clearInterval(keepAlive);
17
+ await worker.shutdown();
18
+ process.exit(0);
19
+ };
20
+ process.once("SIGINT", () => void shutdown());
21
+ process.once("SIGTERM", () => void shutdown());
22
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AACvB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,WAAW,CAAC,CAAC;AACvE,MAAM,MAAM,GAAG,IAAI,mBAAmB,CAAC,UAAU,EAAE;IACjD,WAAW,EAAE,IAAI;IACjB,cAAc,EAAE,SAAS;IACzB,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS;CAChC,CAAC,CAAC;AAEH,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;AAC1B,OAAO,CAAC,GAAG,CAAC,oDAAoD,UAAU,EAAE,CAAC,CAAC;AAE9E,kFAAkF;AAClF,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAEvD,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;IAC1B,aAAa,CAAC,SAAS,CAAC,CAAC;IACzB,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;IACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC;AAEF,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;AAC9C,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "deio-scroll",
3
+ "version": "1.0.0",
4
+ "description": "Deio Scroll API and worker for directed website scroll videos",
5
+ "license": "MIT",
6
+ "author": "ken-rl (https://github.com/ken-rl)",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/ken-rl/website_recorder.git"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/ken-rl/website_recorder/issues"
13
+ },
14
+ "homepage": "https://github.com/ken-rl/website_recorder#readme",
15
+ "keywords": [
16
+ "playwright",
17
+ "screen-recording",
18
+ "video",
19
+ "webpage",
20
+ "scroll",
21
+ "mp4",
22
+ "ffmpeg",
23
+ "website-recorder"
24
+ ],
25
+ "engines": {
26
+ "node": ">=20"
27
+ },
28
+ "type": "module",
29
+ "bin": {
30
+ "deio": "dist/cli.js"
31
+ },
32
+ "files": [
33
+ "dist",
34
+ "public",
35
+ "README.md",
36
+ "LICENSE"
37
+ ],
38
+ "scripts": {
39
+ "start": "tsx src/api/server.ts",
40
+ "start:watch": "tsx watch src/api/server.ts",
41
+ "worker": "tsx src/worker.ts",
42
+ "worker:watch": "tsx watch src/worker.ts",
43
+ "record": "tsx src/cli.ts",
44
+ "build:web": "pnpm --dir ../web build",
45
+ "clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
46
+ "build": "pnpm run build:web && pnpm run clean && tsc -p tsconfig.build.json",
47
+ "prepack": "pnpm run build",
48
+ "test": "tsx --test \"src/**/*.test.ts\"",
49
+ "typecheck": "tsc --noEmit"
50
+ },
51
+ "dependencies": {
52
+ "better-sqlite3": "^12.11.1",
53
+ "dotenv": "^16.4.7",
54
+ "playwright": "^1.40.0",
55
+ "zod": "^4.4.3"
56
+ },
57
+ "devDependencies": {
58
+ "@types/better-sqlite3": "^7.6.13",
59
+ "@types/node": "^20.0.0",
60
+ "tsx": "^4.0.0",
61
+ "typescript": "^5.0.0"
62
+ }
63
+ }