recordable 0.3.0 → 0.5.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 (102) hide show
  1. package/README.md +198 -44
  2. package/dist/actions.d.ts +8 -0
  3. package/dist/actions.d.ts.map +1 -1
  4. package/dist/actions.js +11 -5
  5. package/dist/actions.js.map +1 -1
  6. package/dist/audio/track.d.ts +10 -0
  7. package/dist/audio/track.d.ts.map +1 -1
  8. package/dist/audio/track.js +19 -0
  9. package/dist/audio/track.js.map +1 -1
  10. package/dist/browser/cursor.d.ts +8 -6
  11. package/dist/browser/cursor.d.ts.map +1 -1
  12. package/dist/browser/cursor.js +32 -21
  13. package/dist/browser/cursor.js.map +1 -1
  14. package/dist/browser/dom.d.ts +33 -13
  15. package/dist/browser/dom.d.ts.map +1 -1
  16. package/dist/browser/dom.js +158 -56
  17. package/dist/browser/dom.js.map +1 -1
  18. package/dist/browser/page-zoom.d.ts +11 -0
  19. package/dist/browser/page-zoom.d.ts.map +1 -0
  20. package/dist/browser/page-zoom.js +37 -0
  21. package/dist/browser/page-zoom.js.map +1 -0
  22. package/dist/browser/play-button.d.ts.map +1 -1
  23. package/dist/browser/play-button.js.map +1 -1
  24. package/dist/browser/runtime.d.ts +1 -0
  25. package/dist/browser/runtime.d.ts.map +1 -1
  26. package/dist/browser/runtime.js +22 -14
  27. package/dist/browser/runtime.js.map +1 -1
  28. package/dist/browser/targets.d.ts.map +1 -0
  29. package/dist/{targets.js → browser/targets.js} +3 -2
  30. package/dist/browser/targets.js.map +1 -0
  31. package/dist/compose/boundaries.d.ts +13 -0
  32. package/dist/compose/boundaries.d.ts.map +1 -0
  33. package/dist/compose/boundaries.js +49 -0
  34. package/dist/compose/boundaries.js.map +1 -0
  35. package/dist/compose/mix.d.ts +3 -2
  36. package/dist/compose/mix.d.ts.map +1 -1
  37. package/dist/compose/mix.js +9 -4
  38. package/dist/compose/mix.js.map +1 -1
  39. package/dist/compose/recordable.d.ts +28 -3
  40. package/dist/compose/recordable.d.ts.map +1 -1
  41. package/dist/compose/recordable.js +75 -18
  42. package/dist/compose/recordable.js.map +1 -1
  43. package/dist/compose/session.d.ts +20 -8
  44. package/dist/compose/session.d.ts.map +1 -1
  45. package/dist/compose/session.js +120 -38
  46. package/dist/compose/session.js.map +1 -1
  47. package/dist/config.d.ts.map +1 -1
  48. package/dist/config.js +4 -3
  49. package/dist/config.js.map +1 -1
  50. package/dist/errors.d.ts +1 -1
  51. package/dist/errors.d.ts.map +1 -1
  52. package/dist/errors.js.map +1 -1
  53. package/dist/ffmpeg.d.ts +3 -0
  54. package/dist/ffmpeg.d.ts.map +1 -1
  55. package/dist/ffmpeg.js +22 -4
  56. package/dist/ffmpeg.js.map +1 -1
  57. package/dist/formats/json.d.ts +2 -1
  58. package/dist/formats/json.d.ts.map +1 -1
  59. package/dist/formats/json.js.map +1 -1
  60. package/dist/formats/markdown/method.d.ts.map +1 -1
  61. package/dist/formats/markdown/method.js +4 -3
  62. package/dist/formats/markdown/method.js.map +1 -1
  63. package/dist/fs.d.ts +16 -0
  64. package/dist/fs.d.ts.map +1 -1
  65. package/dist/fs.js +33 -4
  66. package/dist/fs.js.map +1 -1
  67. package/dist/index.d.ts +1 -0
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/logger.d.ts.map +1 -1
  70. package/dist/logger.js +3 -1
  71. package/dist/logger.js.map +1 -1
  72. package/dist/result.d.ts +30 -0
  73. package/dist/result.d.ts.map +1 -0
  74. package/dist/result.js +8 -0
  75. package/dist/result.js.map +1 -0
  76. package/dist/timing.d.ts +2 -0
  77. package/dist/timing.d.ts.map +1 -1
  78. package/dist/timing.js +10 -4
  79. package/dist/timing.js.map +1 -1
  80. package/dist/validate.d.ts.map +1 -1
  81. package/dist/validate.js +11 -10
  82. package/dist/validate.js.map +1 -1
  83. package/dist/video/recorder.d.ts +26 -3
  84. package/dist/video/recorder.d.ts.map +1 -1
  85. package/dist/video/recorder.js +50 -32
  86. package/dist/video/recorder.js.map +1 -1
  87. package/dist/video/stitch.js +3 -17
  88. package/dist/video/stitch.js.map +1 -1
  89. package/dist/voiceover/compile.d.ts.map +1 -1
  90. package/dist/voiceover/compile.js +42 -24
  91. package/dist/voiceover/compile.js.map +1 -1
  92. package/dist/voiceover/elevenlabs.d.ts.map +1 -1
  93. package/dist/voiceover/elevenlabs.js +41 -11
  94. package/dist/voiceover/elevenlabs.js.map +1 -1
  95. package/dist/voiceover/mock.d.ts.map +1 -1
  96. package/dist/voiceover/mock.js +38 -15
  97. package/dist/voiceover/mock.js.map +1 -1
  98. package/package.json +20 -6
  99. package/recordable.schema.json +81 -0
  100. package/dist/targets.d.ts.map +0 -1
  101. package/dist/targets.js.map +0 -1
  102. /package/dist/{targets.d.ts → browser/targets.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/browser/runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/browser/runtime.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { sleep, truncate } from "../utils.js";
2
- import { resolveTarget, parseOptionSpec } from "../targets.js";
2
+ import { resolveTarget, parseOptionSpec } from "./targets.js";
3
3
  import { RecordableError } from "../errors.js";
4
- import { getElementCenter, originToCoords, scrollIntoView, smoothScrollToTarget, } from "./dom.js";
4
+ import { getElementCenter, getHandle, originToCoords, scrollIntoView, smoothScrollToTarget, } from "./dom.js";
5
5
  import { Cursor } from "./cursor.js";
6
6
  import { jitter, typingDuration, typingGaps, PRE_CLICK_MS } from "../timing.js";
7
7
  import { playButtonScript, PLAY_BINDING, PLAY_BUTTON_ID, } from "./play-button.js";
@@ -36,7 +36,7 @@ export class Runtime {
36
36
  /** (Re-)inject the cursor overlay at the carried position, if enabled. */
37
37
  async injectCursor(page) {
38
38
  if (this.getCfg().cursor)
39
- await this.cursor.inject(page, this.zoom, this.getCfg().pageZoom);
39
+ await this.cursor.inject(page, this.zoom);
40
40
  }
41
41
  /** Snapshot the cursor position (on pause) so a later resume() can restore it,
42
42
  * ignoring any off-camera moves between pause and resume. */
@@ -47,7 +47,7 @@ export class Runtime {
47
47
  * segment opens with the cursor exactly where the paused one left it. */
48
48
  async restoreCursor(page) {
49
49
  if (this.getCfg().cursor)
50
- await this.cursor.unpark(page, this.zoom, this.getCfg().pageZoom);
50
+ await this.cursor.unpark(page, this.zoom);
51
51
  }
52
52
  // ─── Navigation ────────────────────────────────────────────────────────────
53
53
  async visit(page, url, options) {
@@ -155,22 +155,28 @@ export class Runtime {
155
155
  await this._scrollIntoView(page, target);
156
156
  const { x, y } = await getElementCenter(page, target);
157
157
  if (this.getCfg().cursor) {
158
- await this.cursor.moveTo(page, x, y, this.zoom, this.getCfg().pageZoom);
158
+ await this.cursor.moveTo(page, x, y, this.zoom);
159
159
  await sleep(jitter(PRE_CLICK_MS));
160
160
  await this.cursor.clickEffect(page);
161
161
  }
162
- await page.select(resolveTarget(target), await this._optionValue(page, target, value));
162
+ // Resolve the handle through getHandle (frame-aware) and act on it directly —
163
+ // page.select() / page.$eval() only see the main frame, so a <select> inside
164
+ // an iframe (e.g. a dialog) would miss it or hit a same-id placeholder.
165
+ const el = await getHandle(page, target);
166
+ await el.select(await this._optionValue(el, target, value));
163
167
  }
164
168
  // Map a select value-spec to the concrete option `value` Puppeteer expects.
165
169
  // Literal values pass through; `:option-index/-label(...)` read the live
166
- // `<select>` (no native pseudo exists for them).
167
- async _optionValue(page, target, value) {
170
+ // `<select>` via the element's own frame.
171
+ async _optionValue(el, target, value) {
168
172
  const spec = parseOptionSpec(value);
169
173
  if (!spec)
170
174
  return value;
171
- const resolved = await page.$eval(resolveTarget(target), (el, spec) => {
172
- const opts = [...el.options];
173
- const hit = "index" in spec ? opts[spec.index - 1] : opts.find((o) => o.textContent?.trim() === spec.label);
175
+ const resolved = await el.evaluate((node, spec) => {
176
+ const opts = [...node.options];
177
+ const hit = "index" in spec
178
+ ? opts[spec.index - 1]
179
+ : opts.find((o) => o.textContent?.trim() === spec.label);
174
180
  return hit?.value;
175
181
  }, spec);
176
182
  if (resolved == null) {
@@ -196,7 +202,9 @@ export class Runtime {
196
202
  this.log("Scroll", String(target));
197
203
  if (typeof target === "string" && target !== "top" && target !== "bottom")
198
204
  await this.checkAmbiguous(page, target);
199
- await smoothScrollToTarget(page, target, options.duration ?? this.getCfg().scrollDuration);
205
+ if (options.container)
206
+ await this.checkAmbiguous(page, options.container);
207
+ await smoothScrollToTarget(page, target, options.duration ?? this.getCfg().scrollDuration, options.container);
200
208
  }
201
209
  // ─── Zoom ──────────────────────────────────────────────────────────────────
202
210
  async zoomTo(page, level, options = {}) {
@@ -240,7 +248,7 @@ export class Runtime {
240
248
  await this._scrollIntoView(page, target);
241
249
  const { x, y } = await getElementCenter(page, target);
242
250
  if (this.getCfg().cursor) {
243
- await this.cursor.moveTo(page, x, y, this.zoom, this.getCfg().pageZoom);
251
+ await this.cursor.moveTo(page, x, y, this.zoom);
244
252
  await sleep(jitter(PRE_CLICK_MS));
245
253
  await this.cursor.clickEffect(page);
246
254
  }
@@ -272,7 +280,7 @@ export class Runtime {
272
280
  /** Move to viewport coords, animating the overlay when the cursor is enabled. */
273
281
  async _moveTo(page, x, y) {
274
282
  if (this.getCfg().cursor)
275
- await this.cursor.moveTo(page, x, y, this.zoom, this.getCfg().pageZoom);
283
+ await this.cursor.moveTo(page, x, y, this.zoom);
276
284
  else
277
285
  await page.mouse.move(x, y);
278
286
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/browser/runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/browser/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"targets.d.ts","sourceRoot":"","sources":["../../src/browser/targets.ts"],"names":[],"mappings":"AASA;;;;;mEAKmE;AACnE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGpD;AASD;sEACsE;AACtE,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,GACX;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAM9C;AAMD,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEtD"}
@@ -33,9 +33,10 @@ export function parseOptionSpec(spec) {
33
33
  return { label: label[1].trim() };
34
34
  return null;
35
35
  }
36
+ // One/two CSS position keywords or percentages. Non-global: `.test` is reused.
37
+ const POSITION_VALUE = /^(top|bottom|left|right|center|\d+%)(\s+(top|bottom|left|right|center|\d+%))?$/i;
36
38
  /** Returns true if the string is a CSS position keyword or percentage. */
37
39
  export function isPositionValue(value) {
38
- const token = "(top|bottom|left|right|center|\\d+%)";
39
- return new RegExp(`^${token}(\\s+${token})?$`, "i").test(value.trim());
40
+ return POSITION_VALUE.test(value.trim());
40
41
  }
41
42
  //# sourceMappingURL=targets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"targets.js","sourceRoot":"","sources":["../../src/browser/targets.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,yDAAyD;AAEzD,gFAAgF;AAChF,6EAA6E;AAC7E,8EAA8E;AAC9E,mEAAmE;AACnE,MAAM,WAAW,GAAG,mBAAmB,CAAC;AAExC;;;;;mEAKmE;AACnE,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,aAAa,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;IACvE,OAAO,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,aAAa,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAC/E,CAAC;AAED,4EAA4E;AAC5E,gFAAgF;AAChF,gFAAgF;AAChF,4EAA4E;AAC5E,MAAM,YAAY,GAAG,0BAA0B,CAAC;AAChD,MAAM,YAAY,GAAG,4BAA4B,CAAC;AAElD;sEACsE;AACtE,MAAM,UAAU,eAAe,CAC7B,IAAY;IAEZ,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACrC,IAAI,GAAG;QAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,uBAAuB;IAClE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACvC,IAAI,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IAC7C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+EAA+E;AAC/E,MAAM,cAAc,GAClB,iFAAiF,CAAC;AAEpF,0EAA0E;AAC1E,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,13 @@
1
+ /** Control actions whose ordering the state machine cares about. Plain actions
2
+ * (click, type, visit, …) are legal anywhere and aren't tracked. */
3
+ export type QueueKind = "start" | "end" | "split" | "pause" | "resume" | "insert" | "audio";
4
+ /**
5
+ * Walk the ordered control `kinds` and throw on the first illegal transition.
6
+ *
7
+ * Boundaries default to the script edges: with no explicit `start()` the file is
8
+ * open from the top (records top-to-bottom as before); an explicit `start()`
9
+ * means content before it is off-camera, so the file opens closed. An unmatched
10
+ * `start()` gets an implicit end at the bottom — finalisation closes it, no error.
11
+ */
12
+ export declare function validateBoundaries(kinds: readonly QueueKind[]): void;
13
+ //# sourceMappingURL=boundaries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boundaries.d.ts","sourceRoot":"","sources":["../../src/compose/boundaries.ts"],"names":[],"mappings":"AAWA;qEACqE;AACrE,MAAM,MAAM,SAAS,GACjB,OAAO,GACP,KAAK,GACL,OAAO,GACP,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,OAAO,CAAC;AAIZ;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,CAwCpE"}
@@ -0,0 +1,49 @@
1
+ import { RecordableError } from "../errors.js";
2
+ const err = (message) => new RecordableError("CONFIG_INVALID", message);
3
+ /**
4
+ * Walk the ordered control `kinds` and throw on the first illegal transition.
5
+ *
6
+ * Boundaries default to the script edges: with no explicit `start()` the file is
7
+ * open from the top (records top-to-bottom as before); an explicit `start()`
8
+ * means content before it is off-camera, so the file opens closed. An unmatched
9
+ * `start()` gets an implicit end at the bottom — finalisation closes it, no error.
10
+ */
11
+ export function validateBoundaries(kinds) {
12
+ // The only state that gates legality is whether a file is open. pause/resume
13
+ // toggle the camera *within* an open file, so they never change it; split/end
14
+ // are allowed even while paused — so paused-ness needs no separate tracking.
15
+ let fileOpen = !kinds.includes("start"); // implicit start at top when none given
16
+ for (const k of kinds) {
17
+ switch (k) {
18
+ case "start":
19
+ if (fileOpen)
20
+ throw err("start() while a recording is already open — call end() or split() first");
21
+ fileOpen = true;
22
+ break;
23
+ case "end":
24
+ if (!fileOpen)
25
+ throw err("end() with no open recording — call start() first");
26
+ fileOpen = false; // sealed; allowed while paused
27
+ break;
28
+ case "split":
29
+ if (!fileOpen)
30
+ throw err("split() with no open recording — call start() first");
31
+ break; // end+start fused: stays open, new file rolls (allowed while paused)
32
+ case "pause":
33
+ if (!fileOpen)
34
+ throw err("pause() with no open recording to pause");
35
+ break; // redundant pause is a no-op, not an error
36
+ case "resume":
37
+ if (!fileOpen)
38
+ throw err("resume() with no open recording to resume");
39
+ break; // redundant resume is a no-op, not an error
40
+ case "insert":
41
+ case "audio":
42
+ if (!fileOpen)
43
+ throw err(`${k}() needs an open recording — it can't run in an off-camera gap; ` +
44
+ `call start() first`);
45
+ break;
46
+ }
47
+ }
48
+ }
49
+ //# sourceMappingURL=boundaries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boundaries.js","sourceRoot":"","sources":["../../src/compose/boundaries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAsB/C,MAAM,GAAG,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,IAAI,eAAe,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;AAEhF;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAA2B;IAC5D,6EAA6E;IAC7E,8EAA8E;IAC9E,6EAA6E;IAC7E,IAAI,QAAQ,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,wCAAwC;IAEjF,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,QAAQ,CAAC,EAAE,CAAC;YACV,KAAK,OAAO;gBACV,IAAI,QAAQ;oBACV,MAAM,GAAG,CACP,yEAAyE,CAC1E,CAAC;gBACJ,QAAQ,GAAG,IAAI,CAAC;gBAChB,MAAM;YACR,KAAK,KAAK;gBACR,IAAI,CAAC,QAAQ;oBACX,MAAM,GAAG,CAAC,mDAAmD,CAAC,CAAC;gBACjE,QAAQ,GAAG,KAAK,CAAC,CAAC,+BAA+B;gBACjD,MAAM;YACR,KAAK,OAAO;gBACV,IAAI,CAAC,QAAQ;oBACX,MAAM,GAAG,CAAC,qDAAqD,CAAC,CAAC;gBACnE,MAAM,CAAC,qEAAqE;YAC9E,KAAK,OAAO;gBACV,IAAI,CAAC,QAAQ;oBAAE,MAAM,GAAG,CAAC,yCAAyC,CAAC,CAAC;gBACpE,MAAM,CAAC,2CAA2C;YACpD,KAAK,QAAQ;gBACX,IAAI,CAAC,QAAQ;oBAAE,MAAM,GAAG,CAAC,2CAA2C,CAAC,CAAC;gBACtE,MAAM,CAAC,4CAA4C;YACrD,KAAK,QAAQ,CAAC;YACd,KAAK,OAAO;gBACV,IAAI,CAAC,QAAQ;oBACX,MAAM,GAAG,CACP,GAAG,CAAC,kEAAkE;wBACpE,oBAAoB,CACvB,CAAC;gBACJ,MAAM;QACV,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -7,7 +7,8 @@ import type { Logger } from "../logger.js";
7
7
  *
8
8
  * Per the timing contract the video defines the length: a clip that runs past
9
9
  * the end is the author's cue to add a trailing `wait()`, so we warn and let
10
- * `-t` truncate it rather than padding the video.
10
+ * `-t` truncate it rather than padding the video. Returns the overrun warnings
11
+ * (also logged) so the caller can surface them on the run result.
11
12
  */
12
- export declare function addAudio(videoPath: string, clips: readonly AudioClip[], out: string, log: Logger): Promise<void>;
13
+ export declare function addAudio(videoPath: string, clips: readonly AudioClip[], out: string, log: Logger): Promise<string[]>;
13
14
  //# sourceMappingURL=mix.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mix.d.ts","sourceRoot":"","sources":["../../src/compose/mix.ts"],"names":[],"mappings":"AACA,OAAO,EAAmC,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACpF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAU3C;;;;;;;;GAQG;AACH,wBAAsB,QAAQ,CAC5B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,SAAS,SAAS,EAAE,EAC3B,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CAkCf"}
1
+ {"version":3,"file":"mix.d.ts","sourceRoot":"","sources":["../../src/compose/mix.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,SAAS,EACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAU3C;;;;;;;;;GASG;AACH,wBAAsB,QAAQ,CAC5B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,SAAS,SAAS,EAAE,EAC3B,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,EAAE,CAAC,CAoCnB"}
@@ -1,5 +1,5 @@
1
1
  import { getDuration, runFfmpeg } from "../ffmpeg.js";
2
- import { audioFilterGraph, audioOverruns } from "../audio/track.js";
2
+ import { audioFilterGraph, audioOverruns, } from "../audio/track.js";
3
3
  // ─── Compose layer: combining audio onto the video ───────────────────────────
4
4
  //
5
5
  // `addAudio` lays the finished audio track onto the silent video — combining the
@@ -14,13 +14,17 @@ import { audioFilterGraph, audioOverruns } from "../audio/track.js";
14
14
  *
15
15
  * Per the timing contract the video defines the length: a clip that runs past
16
16
  * the end is the author's cue to add a trailing `wait()`, so we warn and let
17
- * `-t` truncate it rather than padding the video.
17
+ * `-t` truncate it rather than padding the video. Returns the overrun warnings
18
+ * (also logged) so the caller can surface them on the run result.
18
19
  */
19
20
  export async function addAudio(videoPath, clips, out, log) {
20
21
  const videoMs = (await getDuration(videoPath)) * 1000;
22
+ const warnings = [];
21
23
  for (const { path, overMs } of audioOverruns(clips, videoMs)) {
22
- log("Audio", `warning: "${path}" runs ${overMs}ms past the video end and will be cut — ` +
23
- `add a trailing wait() to give it room`);
24
+ const msg = `"${path}" runs ${overMs}ms past the video end and will be cut — ` +
25
+ `add a trailing wait() to give it room`;
26
+ warnings.push(msg);
27
+ log("Audio", `warning: ${msg}`);
24
28
  }
25
29
  const { filters, mapLabel } = audioFilterGraph(clips);
26
30
  await runFfmpeg([
@@ -46,5 +50,6 @@ export async function addAudio(videoPath, clips, out, log) {
46
50
  out,
47
51
  ]);
48
52
  log("Audio", `mixed ${clips.length} audio clip(s)`);
53
+ return warnings;
49
54
  }
50
55
  //# sourceMappingURL=mix.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mix.js","sourceRoot":"","sources":["../../src/compose/mix.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAkB,MAAM,mBAAmB,CAAC;AAGpF,gFAAgF;AAChF,EAAE;AACF,iFAAiF;AACjF,kFAAkF;AAClF,gFAAgF;AAChF,+EAA+E;AAC/E,aAAa;AAEb;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,SAAiB,EACjB,KAA2B,EAC3B,GAAW,EACX,GAAW;IAEX,MAAM,OAAO,GAAG,CAAC,MAAM,WAAW,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC;IACtD,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;QAC7D,GAAG,CACD,OAAO,EACP,aAAa,IAAI,UAAU,MAAM,0CAA0C;YACzE,uCAAuC,CAC1C,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,SAAS,CAAC;QACd,IAAI;QACJ,IAAI;QACJ,SAAS;QACT,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACvC,iBAAiB;QACjB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;QACjB,MAAM;QACN,KAAK;QACL,MAAM;QACN,IAAI,QAAQ,GAAG;QACf,MAAM;QACN,MAAM;QACN,MAAM;QACN,KAAK;QACL,6EAA6E;QAC7E,2EAA2E;QAC3E,+DAA+D;QAC/D,IAAI;QACJ,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3B,GAAG;KACJ,CAAC,CAAC;IACH,GAAG,CAAC,OAAO,EAAE,SAAS,KAAK,CAAC,MAAM,gBAAgB,CAAC,CAAC;AACtD,CAAC"}
1
+ {"version":3,"file":"mix.js","sourceRoot":"","sources":["../../src/compose/mix.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EACL,gBAAgB,EAChB,aAAa,GAEd,MAAM,mBAAmB,CAAC;AAG3B,gFAAgF;AAChF,EAAE;AACF,iFAAiF;AACjF,kFAAkF;AAClF,gFAAgF;AAChF,+EAA+E;AAC/E,aAAa;AAEb;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,SAAiB,EACjB,KAA2B,EAC3B,GAAW,EACX,GAAW;IAEX,MAAM,OAAO,GAAG,CAAC,MAAM,WAAW,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC;IACtD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;QAC7D,MAAM,GAAG,GACP,IAAI,IAAI,UAAU,MAAM,0CAA0C;YAClE,uCAAuC,CAAC;QAC1C,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,GAAG,CAAC,OAAO,EAAE,YAAY,GAAG,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,SAAS,CAAC;QACd,IAAI;QACJ,IAAI;QACJ,SAAS;QACT,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACvC,iBAAiB;QACjB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;QACjB,MAAM;QACN,KAAK;QACL,MAAM;QACN,IAAI,QAAQ,GAAG;QACf,MAAM;QACN,MAAM;QACN,MAAM;QACN,KAAK;QACL,6EAA6E;QAC7E,2EAA2E;QAC3E,+DAA+D;QAC/D,IAAI;QACJ,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3B,GAAG;KACJ,CAAC,CAAC;IACH,GAAG,CAAC,OAAO,EAAE,SAAS,KAAK,CAAC,MAAM,gBAAgB,CAAC,CAAC;IACpD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { type GoToOptions } from "puppeteer";
2
2
  import { type AudioOptions, type ClickOptions, type InsertOptions, type RecordableConfig, type WaitForOptions } from "../config.js";
3
3
  import { type Script } from "../script.js";
4
+ import { type RecordableResult } from "../result.js";
4
5
  export declare class Recordable {
5
6
  private cfg;
6
7
  private readonly userConfig;
@@ -28,6 +29,26 @@ export declare class Recordable {
28
29
  private _stageVoiceover;
29
30
  /** Merge config mid-sequence — enqueued so it takes effect at this point. */
30
31
  setConfig(config: RecordableConfig): this;
32
+ /**
33
+ * Open an output file (the opening boundary). Content *before* the first
34
+ * `start()` runs off-camera; absent, recording opens at the top. Pass an
35
+ * optional `name` to label the file (`start("intro")` → `…-intro.mp4`).
36
+ * Pair with `end()`, or leave it to close implicitly at the bottom.
37
+ */
38
+ start(name?: string): this;
39
+ /**
40
+ * Close the current output file (the closing boundary). Content *after* `end()`
41
+ * runs off-camera (cleanup is common, so no warning); absent, recording closes
42
+ * at the bottom. Open another file with `start()` for a second output.
43
+ */
44
+ end(): this;
45
+ /**
46
+ * Split the output here: close the current file and open the next in one move,
47
+ * camera still rolling (`split() ≡ end() + start()` fused, no gap). Pass an
48
+ * optional `name` to label the new file. For two files with an off-camera gap
49
+ * between them, use `end()` … `start()` instead.
50
+ */
51
+ split(name?: string): this;
31
52
  /**
32
53
  * Stop capturing. The chain keeps running — anything between `pause()` and the
33
54
  * next resume executes off-camera (page loads, logins, data setup) and is
@@ -127,9 +148,12 @@ export declare class Recordable {
127
148
  /**
128
149
  * Smooth-scroll to an element or position: `"top"`/`"bottom"`, a CSS selector or
129
150
  * plain text (centred), or a number (absolute Y). `duration` (ms) overrides the
130
- * default animation length.
151
+ * default animation length. Pass `container` (a selector) to scroll *within* that
152
+ * scroll container — `target` is then resolved against it (extremes, absolute
153
+ * scrollTop, or a child centred in the container) instead of the window.
131
154
  */
132
155
  scroll(target: string | number, options?: {
156
+ container?: string;
133
157
  duration?: number;
134
158
  }): this;
135
159
  /**
@@ -148,8 +172,9 @@ export declare class Recordable {
148
172
  }): this;
149
173
  /** Pause the sequence for `ms` milliseconds. */
150
174
  wait(ms: number): this;
151
- /** Execute the queued action sequence, then finalise the recording. */
152
- run(): Promise<void>;
175
+ /** Execute the queued action sequence, then finalise the recording. Resolves to
176
+ * a {@link RecordableResult} describing the written file(s). */
177
+ run(): Promise<RecordableResult>;
153
178
  /** Resolve a local asset path (insert/audio clip) against `baseDir` so a
154
179
  * Markdown/JSON script and its clips travel together; absolute paths pass
155
180
  * through. `baseDir` empty → resolve against cwd (the programmatic default). */
@@ -1 +1 @@
1
- {"version":3,"file":"recordable.d.ts","sourceRoot":"","sources":["../../src/compose/recordable.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"recordable.d.ts","sourceRoot":"","sources":["../../src/compose/recordable.ts"],"names":[],"mappings":"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"}
@@ -7,9 +7,11 @@ import { Recorder } from "../video/recorder.js";
7
7
  import { AudioTrack } from "../audio/track.js";
8
8
  import { Runtime } from "../browser/runtime.js";
9
9
  import { Session } from "./session.js";
10
+ import { validateBoundaries } from "./boundaries.js";
10
11
  import { buildArgs, validateAction } from "../actions.js";
11
12
  import { resolveVisitUrls, splitScript } from "../script.js";
12
13
  import { extractActions, parseMarkdown } from "../formats/markdown/parse.js";
14
+ import { RecordableError } from "../errors.js";
13
15
  // ─── Compose layer: the builder ──────────────────────────────────────────────
14
16
  //
15
17
  // The public fluent API. Chain methods *describe* a recording by enqueuing
@@ -45,7 +47,7 @@ export class Recordable {
45
47
  const parsed = typeof script === "string" ? JSON.parse(script) : script;
46
48
  const { config, actions } = splitScript(parsed);
47
49
  if (!Array.isArray(actions))
48
- throw new Error("Script must be an array of actions, or { actions: [...] }");
50
+ throw new RecordableError("CONFIG_INVALID", "Script must be an array of actions, or { actions: [...] }");
49
51
  this._applyContentConfig(config ?? {});
50
52
  this._loadActions(actions);
51
53
  return this;
@@ -105,9 +107,47 @@ export class Recordable {
105
107
  }
106
108
  // ─── Recording control ───────────────────────────────────────────────────────
107
109
  //
108
- // Recording is ON from the top by default and finalises automatically when
109
- // run() endsthere is no start()/stop(). Use pause()/resume() to carve
110
- // off-camera gaps; every captured segment is stitched into one seamless MP4.
110
+ // Two axes (ROADMAP §6). pause()/resume() carve off-camera gaps *within* one
111
+ // output filethe gap is stitched out, the clip stays continuous.
112
+ // start()/end()/split() move the *file* boundaries, producing separate files.
113
+ // Boundaries default to the script edges: with neither, recording runs ON from
114
+ // the top and finalises into one MP4 at run() end — add only the bookend you need.
115
+ /**
116
+ * Open an output file (the opening boundary). Content *before* the first
117
+ * `start()` runs off-camera; absent, recording opens at the top. Pass an
118
+ * optional `name` to label the file (`start("intro")` → `…-intro.mp4`).
119
+ * Pair with `end()`, or leave it to close implicitly at the bottom.
120
+ */
121
+ start(name) {
122
+ return this._enqueue(async () => {
123
+ this.recorder.openFile(name ?? null);
124
+ }, true, "start");
125
+ }
126
+ /**
127
+ * Close the current output file (the closing boundary). Content *after* `end()`
128
+ * runs off-camera (cleanup is common, so no warning); absent, recording closes
129
+ * at the bottom. Open another file with `start()` for a second output.
130
+ */
131
+ end() {
132
+ return this._enqueue(async () => {
133
+ await this.recorder.closeFile();
134
+ }, true, "end");
135
+ }
136
+ /**
137
+ * Split the output here: close the current file and open the next in one move,
138
+ * camera still rolling (`split() ≡ end() + start()` fused, no gap). Pass an
139
+ * optional `name` to label the new file. For two files with an off-camera gap
140
+ * between them, use `end()` … `start()` instead.
141
+ */
142
+ split(name) {
143
+ return this._enqueue(async (page) => {
144
+ await this.recorder.closeFile();
145
+ this.recorder.openFile(name ?? null);
146
+ // Keep rolling: begin the next file's first segment now (no off-camera gap).
147
+ if (this.recording)
148
+ await this.recorder.begin(page);
149
+ }, true, "split");
150
+ }
111
151
  /**
112
152
  * Stop capturing. The chain keeps running — anything between `pause()` and the
113
153
  * next resume executes off-camera (page loads, logins, data setup) and is
@@ -118,7 +158,7 @@ export class Recordable {
118
158
  this.recording = false;
119
159
  this.runtime.parkCursor(); // remember where the cursor is for resume()
120
160
  await this.recorder.end();
121
- }, true);
161
+ }, true, "pause");
122
162
  }
123
163
  /** Resume capturing in a fresh segment, immediately. Restores the cursor to its
124
164
  * pause() position (a manual step may have navigated away and wiped the overlay,
@@ -128,7 +168,7 @@ export class Recordable {
128
168
  this.recording = true;
129
169
  await this.recorder.begin(page);
130
170
  await this.runtime.restoreCursor(page);
131
- }, true);
171
+ }, true, "resume");
132
172
  }
133
173
  /**
134
174
  * Block the chain until the user *plays* — clicks the in-page ▶ Play button (or
@@ -165,7 +205,7 @@ export class Recordable {
165
205
  const file = this._resolveFile(path);
166
206
  this.log("Insert", file);
167
207
  await this.recorder.insert(file, options);
168
- }, true);
208
+ }, true, "insert");
169
209
  }
170
210
  /**
171
211
  * Lay an existing audio file (mp3/wav) onto the timeline at this point —
@@ -182,11 +222,13 @@ export class Recordable {
182
222
  // Pin the clip to where we are in recorded time (the video timeline), then
183
223
  // hand it to the audio layer to probe + collect for the final mix.
184
224
  const startMs = this.recorder.currentTimelineMs();
185
- const { durationMs } = await this.audioTrack.add(file, startMs, { volume });
225
+ const { durationMs } = await this.audioTrack.add(file, startMs, {
226
+ volume,
227
+ });
186
228
  this.log("Audio", `${truncate(file)} @ ${Math.round(startMs)}ms (${Math.round(durationMs)}ms)`);
187
229
  if (wait)
188
230
  await sleep(durationMs);
189
- });
231
+ }, false, "audio");
190
232
  }
191
233
  // ─── Navigation ────────────────────────────────────────────────────────────
192
234
  /** Navigate to a URL and wait for the page to settle. */
@@ -260,7 +302,9 @@ export class Recordable {
260
302
  /**
261
303
  * Smooth-scroll to an element or position: `"top"`/`"bottom"`, a CSS selector or
262
304
  * plain text (centred), or a number (absolute Y). `duration` (ms) overrides the
263
- * default animation length.
305
+ * default animation length. Pass `container` (a selector) to scroll *within* that
306
+ * scroll container — `target` is then resolved against it (extremes, absolute
307
+ * scrollTop, or a child centred in the container) instead of the window.
264
308
  */
265
309
  scroll(target, options = {}) {
266
310
  return this._enqueue((page) => this.runtime.scroll(page, target, options));
@@ -288,12 +332,18 @@ export class Recordable {
288
332
  });
289
333
  }
290
334
  // ─── Execution ─────────────────────────────────────────────────────────────
291
- /** Execute the queued action sequence, then finalise the recording. */
335
+ /** Execute the queued action sequence, then finalise the recording. Resolves to
336
+ * a {@link RecordableResult} describing the written file(s). */
292
337
  async run() {
293
338
  // Finish any deferred load work (voiceover synthesis) before recording.
294
339
  for (const job of this.pending)
295
340
  await job();
296
341
  this.pending = [];
342
+ // Validate the recording-control state machine up front (ROADMAP §6), so an
343
+ // illegal start/end/split/pause sequence fails before the browser launches.
344
+ validateBoundaries(this.queue
345
+ .map((i) => i.kind)
346
+ .filter((k) => k !== undefined));
297
347
  // Expose just what the session needs; cfg/recording are read live via arrow
298
348
  // getters (this instance mutates them as control actions run).
299
349
  const comp = {
@@ -303,12 +353,15 @@ export class Recordable {
303
353
  audioTrack: this.audioTrack,
304
354
  runtime: this.runtime,
305
355
  };
306
- Object.defineProperty(comp, "cfg", { get: () => this.cfg, enumerable: true });
356
+ Object.defineProperty(comp, "cfg", {
357
+ get: () => this.cfg,
358
+ enumerable: true,
359
+ });
307
360
  Object.defineProperty(comp, "recording", {
308
361
  get: () => this.recording,
309
362
  enumerable: true,
310
363
  });
311
- await new Session(comp).run();
364
+ return new Session(comp).run();
312
365
  }
313
366
  // ─── Private ───────────────────────────────────────────────────────────────
314
367
  /** Resolve a local asset path (insert/audio clip) against `baseDir` so a
@@ -317,14 +370,18 @@ export class Recordable {
317
370
  _resolveFile(path) {
318
371
  return isAbsolute(path) ? path : resolve(this.cfg.baseDir, path);
319
372
  }
320
- _enqueue(run, control = false) {
321
- this.queue.push({ run, control });
373
+ _enqueue(run, control = false, kind) {
374
+ this.queue.push({ run, control, kind });
322
375
  return this;
323
376
  }
324
377
  /** Recompute `cfg` as defaults < content config < constructor config, then
325
378
  * resolve a relative `outputDir`/`assetsDir` against `baseDir`. */
326
379
  _applyContentConfig(content) {
327
- this.cfg = { ...DEFAULT_CONFIG, ...parseConfig(content), ...this.userConfig };
380
+ this.cfg = {
381
+ ...DEFAULT_CONFIG,
382
+ ...parseConfig(content),
383
+ ...this.userConfig,
384
+ };
328
385
  const base = this.cfg.baseDir;
329
386
  if (base) {
330
387
  if (!isAbsolute(this.cfg.outputDir))
@@ -340,12 +397,12 @@ export class Recordable {
340
397
  actions.forEach((step, i) => {
341
398
  const where = `step ${i} (${step?.action ?? "?"})`;
342
399
  if (!step || typeof step !== "object")
343
- throw new Error(`${where}: not an object`);
400
+ throw new RecordableError("CONFIG_INVALID", `${where}: not an object`);
344
401
  try {
345
402
  validateAction(step);
346
403
  }
347
404
  catch (err) {
348
- throw new Error(`${where}: ${err.message}`, { cause: err });
405
+ throw new RecordableError("CONFIG_INVALID", `${where}: ${err.message}`, { cause: err });
349
406
  }
350
407
  this[step.action](...buildArgs(step, step.action));
351
408
  });