screenci 0.0.75 → 0.0.78

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 (226) hide show
  1. package/dist/cli.d.ts +62 -1
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +699 -229
  4. package/dist/cli.js.map +1 -1
  5. package/dist/docs/manifest.d.ts +277 -91
  6. package/dist/docs/manifest.d.ts.map +1 -1
  7. package/dist/docs/manifest.js +101 -30
  8. package/dist/docs/manifest.js.map +1 -1
  9. package/dist/docs/video-sources/camera-and-zooming.screenci.d.ts +2 -0
  10. package/dist/docs/video-sources/camera-and-zooming.screenci.d.ts.map +1 -0
  11. package/dist/docs/video-sources/camera-and-zooming.screenci.js +57 -0
  12. package/dist/docs/video-sources/camera-and-zooming.screenci.js.map +1 -0
  13. package/dist/docs/video-sources/installation.screenci.js +19 -10
  14. package/dist/docs/video-sources/installation.screenci.js.map +1 -1
  15. package/dist/docs/video-sources/landing.screenci.js +6 -8
  16. package/dist/docs/video-sources/landing.screenci.js.map +1 -1
  17. package/dist/docs/video-sources/languages.screenci.d.ts +2 -0
  18. package/dist/docs/video-sources/languages.screenci.d.ts.map +1 -0
  19. package/dist/docs/video-sources/languages.screenci.js +68 -0
  20. package/dist/docs/video-sources/languages.screenci.js.map +1 -0
  21. package/dist/docs/video-sources/locator-highlight-animated.screenci.js +4 -5
  22. package/dist/docs/video-sources/locator-highlight-animated.screenci.js.map +1 -1
  23. package/dist/docs/video-sources/locator-highlight-still.screenci.js +3 -4
  24. package/dist/docs/video-sources/locator-highlight-still.screenci.js.map +1 -1
  25. package/dist/docs/video-sources/narration.screenci.d.ts +2 -0
  26. package/dist/docs/video-sources/narration.screenci.d.ts.map +1 -0
  27. package/dist/docs/video-sources/narration.screenci.js +71 -0
  28. package/dist/docs/video-sources/narration.screenci.js.map +1 -0
  29. package/dist/docs/video-sources/public-urls-and-embeds.screenci.d.ts +2 -0
  30. package/dist/docs/video-sources/public-urls-and-embeds.screenci.d.ts.map +1 -0
  31. package/dist/docs/video-sources/public-urls-and-embeds.screenci.js +60 -0
  32. package/dist/docs/video-sources/public-urls-and-embeds.screenci.js.map +1 -0
  33. package/dist/docs/video-sources/speaking-style.screenci.d.ts +2 -0
  34. package/dist/docs/video-sources/speaking-style.screenci.d.ts.map +1 -0
  35. package/dist/docs/video-sources/speaking-style.screenci.js +76 -0
  36. package/dist/docs/video-sources/speaking-style.screenci.js.map +1 -0
  37. package/dist/docs/video-sources/studio.screenci.js +8 -10
  38. package/dist/docs/video-sources/studio.screenci.js.map +1 -1
  39. package/dist/docs/video-sources/vertical-video.screenci.d.ts +2 -0
  40. package/dist/docs/video-sources/vertical-video.screenci.d.ts.map +1 -0
  41. package/dist/docs/video-sources/vertical-video.screenci.js +58 -0
  42. package/dist/docs/video-sources/vertical-video.screenci.js.map +1 -0
  43. package/dist/docs/videos.d.ts +20 -0
  44. package/dist/docs/videos.d.ts.map +1 -1
  45. package/dist/docs/videos.js +25 -0
  46. package/dist/docs/videos.js.map +1 -1
  47. package/dist/e2e/instrument.e2e.js +60 -1
  48. package/dist/e2e/instrument.e2e.js.map +1 -1
  49. package/dist/e2e/redact.e2e.d.ts +2 -0
  50. package/dist/e2e/redact.e2e.d.ts.map +1 -0
  51. package/dist/e2e/redact.e2e.js +161 -0
  52. package/dist/e2e/redact.e2e.js.map +1 -0
  53. package/dist/index.d.ts +12 -6
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +8 -2
  56. package/dist/index.js.map +1 -1
  57. package/dist/src/asset.d.ts +174 -14
  58. package/dist/src/asset.d.ts.map +1 -1
  59. package/dist/src/asset.js +320 -39
  60. package/dist/src/asset.js.map +1 -1
  61. package/dist/src/assetHash.d.ts +27 -0
  62. package/dist/src/assetHash.d.ts.map +1 -0
  63. package/dist/src/assetHash.js +0 -0
  64. package/dist/src/assetHash.js.map +1 -0
  65. package/dist/src/audio.d.ts +20 -1
  66. package/dist/src/audio.d.ts.map +1 -1
  67. package/dist/src/audio.js +126 -24
  68. package/dist/src/audio.js.map +1 -1
  69. package/dist/src/autoZoom.d.ts.map +1 -1
  70. package/dist/src/autoZoom.js +3 -1
  71. package/dist/src/autoZoom.js.map +1 -1
  72. package/dist/src/browserLaunchOptions.d.ts +24 -2
  73. package/dist/src/browserLaunchOptions.d.ts.map +1 -1
  74. package/dist/src/browserLaunchOptions.js +57 -3
  75. package/dist/src/browserLaunchOptions.js.map +1 -1
  76. package/dist/src/builder.d.ts +229 -136
  77. package/dist/src/builder.d.ts.map +1 -1
  78. package/dist/src/builder.js +264 -77
  79. package/dist/src/builder.js.map +1 -1
  80. package/dist/src/callerFile.d.ts +12 -0
  81. package/dist/src/callerFile.d.ts.map +1 -0
  82. package/dist/src/callerFile.js +46 -0
  83. package/dist/src/callerFile.js.map +1 -0
  84. package/dist/src/changeFocus.d.ts.map +1 -1
  85. package/dist/src/changeFocus.js +109 -36
  86. package/dist/src/changeFocus.js.map +1 -1
  87. package/dist/src/config.d.ts.map +1 -1
  88. package/dist/src/config.js +15 -0
  89. package/dist/src/config.js.map +1 -1
  90. package/dist/src/cue.d.ts +29 -17
  91. package/dist/src/cue.d.ts.map +1 -1
  92. package/dist/src/cue.js +138 -61
  93. package/dist/src/cue.js.map +1 -1
  94. package/dist/src/declare.d.ts +63 -0
  95. package/dist/src/declare.d.ts.map +1 -0
  96. package/dist/src/declare.js +111 -0
  97. package/dist/src/declare.js.map +1 -0
  98. package/dist/src/defaults.d.ts +23 -0
  99. package/dist/src/defaults.d.ts.map +1 -1
  100. package/dist/src/defaults.js +27 -3
  101. package/dist/src/defaults.js.map +1 -1
  102. package/dist/src/events.d.ts +339 -25
  103. package/dist/src/events.d.ts.map +1 -1
  104. package/dist/src/events.js +250 -26
  105. package/dist/src/events.js.map +1 -1
  106. package/dist/src/htmlRasterizer.d.ts +10 -0
  107. package/dist/src/htmlRasterizer.d.ts.map +1 -1
  108. package/dist/src/htmlRasterizer.js +12 -2
  109. package/dist/src/htmlRasterizer.js.map +1 -1
  110. package/dist/src/init.d.ts +2 -0
  111. package/dist/src/init.d.ts.map +1 -1
  112. package/dist/src/init.js +81 -33
  113. package/dist/src/init.js.map +1 -1
  114. package/dist/src/instrument.d.ts.map +1 -1
  115. package/dist/src/instrument.js +164 -8
  116. package/dist/src/instrument.js.map +1 -1
  117. package/dist/src/locales.d.ts.map +1 -1
  118. package/dist/src/locales.js +1 -0
  119. package/dist/src/locales.js.map +1 -1
  120. package/dist/src/localize.d.ts +26 -17
  121. package/dist/src/localize.d.ts.map +1 -1
  122. package/dist/src/localize.js +19 -11
  123. package/dist/src/localize.js.map +1 -1
  124. package/dist/src/localizeRuntime.d.ts +29 -33
  125. package/dist/src/localizeRuntime.d.ts.map +1 -1
  126. package/dist/src/localizeRuntime.js +74 -49
  127. package/dist/src/localizeRuntime.js.map +1 -1
  128. package/dist/src/logger.d.ts +5 -0
  129. package/dist/src/logger.d.ts.map +1 -1
  130. package/dist/src/logger.js +7 -0
  131. package/dist/src/logger.js.map +1 -1
  132. package/dist/src/manualZoom.d.ts.map +1 -1
  133. package/dist/src/manualZoom.js +8 -5
  134. package/dist/src/manualZoom.js.map +1 -1
  135. package/dist/src/narrationVisibility.d.ts +19 -0
  136. package/dist/src/narrationVisibility.d.ts.map +1 -0
  137. package/dist/src/narrationVisibility.js +26 -0
  138. package/dist/src/narrationVisibility.js.map +1 -0
  139. package/dist/src/openBrowser.d.ts +34 -0
  140. package/dist/src/openBrowser.d.ts.map +1 -0
  141. package/dist/src/openBrowser.js +62 -0
  142. package/dist/src/openBrowser.js.map +1 -0
  143. package/dist/src/recordingData.d.ts +27 -0
  144. package/dist/src/recordingData.d.ts.map +1 -1
  145. package/dist/src/recordingSize.d.ts +32 -0
  146. package/dist/src/recordingSize.d.ts.map +1 -0
  147. package/dist/src/recordingSize.js +54 -0
  148. package/dist/src/recordingSize.js.map +1 -0
  149. package/dist/src/redact.d.ts +68 -0
  150. package/dist/src/redact.d.ts.map +1 -0
  151. package/dist/src/redact.js +138 -0
  152. package/dist/src/redact.js.map +1 -0
  153. package/dist/src/redactController.d.ts +61 -0
  154. package/dist/src/redactController.d.ts.map +1 -0
  155. package/dist/src/redactController.js +232 -0
  156. package/dist/src/redactController.js.map +1 -0
  157. package/dist/src/runtimeContext.d.ts +32 -0
  158. package/dist/src/runtimeContext.d.ts.map +1 -1
  159. package/dist/src/runtimeContext.js +21 -0
  160. package/dist/src/runtimeContext.js.map +1 -1
  161. package/dist/src/runtimeMode.d.ts +15 -7
  162. package/dist/src/runtimeMode.d.ts.map +1 -1
  163. package/dist/src/runtimeMode.js +17 -6
  164. package/dist/src/runtimeMode.js.map +1 -1
  165. package/dist/src/screenAudio.d.ts +88 -0
  166. package/dist/src/screenAudio.d.ts.map +1 -0
  167. package/dist/src/screenAudio.js +0 -0
  168. package/dist/src/screenAudio.js.map +1 -0
  169. package/dist/src/screenAudioSink.d.ts +46 -0
  170. package/dist/src/screenAudioSink.d.ts.map +1 -0
  171. package/dist/src/screenAudioSink.js +77 -0
  172. package/dist/src/screenAudioSink.js.map +1 -0
  173. package/dist/src/screenshot.d.ts +27 -29
  174. package/dist/src/screenshot.d.ts.map +1 -1
  175. package/dist/src/screenshot.js +39 -24
  176. package/dist/src/screenshot.js.map +1 -1
  177. package/dist/src/sourceTrim.d.ts +29 -0
  178. package/dist/src/sourceTrim.d.ts.map +1 -0
  179. package/dist/src/sourceTrim.js +76 -0
  180. package/dist/src/sourceTrim.js.map +1 -0
  181. package/dist/src/stillCapture.d.ts +5 -0
  182. package/dist/src/stillCapture.d.ts.map +1 -1
  183. package/dist/src/stillCapture.js +11 -1
  184. package/dist/src/stillCapture.js.map +1 -1
  185. package/dist/src/studio.d.ts +69 -57
  186. package/dist/src/studio.d.ts.map +1 -1
  187. package/dist/src/studio.js +16 -38
  188. package/dist/src/studio.js.map +1 -1
  189. package/dist/src/timelineOffset.d.ts +46 -0
  190. package/dist/src/timelineOffset.d.ts.map +1 -0
  191. package/dist/src/timelineOffset.js +66 -0
  192. package/dist/src/timelineOffset.js.map +1 -0
  193. package/dist/src/titleValidation.d.ts +38 -0
  194. package/dist/src/titleValidation.d.ts.map +1 -1
  195. package/dist/src/titleValidation.js +42 -0
  196. package/dist/src/titleValidation.js.map +1 -1
  197. package/dist/src/types.d.ts +218 -2
  198. package/dist/src/types.d.ts.map +1 -1
  199. package/dist/src/types.js +1 -1
  200. package/dist/src/types.js.map +1 -1
  201. package/dist/src/video.d.ts +74 -60
  202. package/dist/src/video.d.ts.map +1 -1
  203. package/dist/src/video.js +201 -39
  204. package/dist/src/video.js.map +1 -1
  205. package/dist/src/voiceSampleAudio.d.ts +34 -0
  206. package/dist/src/voiceSampleAudio.d.ts.map +1 -0
  207. package/dist/src/voiceSampleAudio.js +105 -0
  208. package/dist/src/voiceSampleAudio.js.map +1 -0
  209. package/dist/src/voices.d.ts +2 -2
  210. package/dist/src/voices.d.ts.map +1 -1
  211. package/dist/src/voices.js +8 -3
  212. package/dist/src/voices.js.map +1 -1
  213. package/dist/src/zoom.d.ts +1 -0
  214. package/dist/src/zoom.d.ts.map +1 -1
  215. package/dist/src/zoom.js +3 -0
  216. package/dist/src/zoom.js.map +1 -1
  217. package/dist/tsconfig.tsbuildinfo +1 -1
  218. package/package.json +3 -2
  219. package/skills/screenci/SKILL.md +2 -2
  220. package/skills/screenci/references/init.md +4 -3
  221. package/skills/screenci/references/record.md +1 -1
  222. package/templates/recordings/assets/logo.png +0 -0
  223. package/dist/docs/video-sources/public-urls.screenci.d.ts +0 -2
  224. package/dist/docs/video-sources/public-urls.screenci.d.ts.map +0 -1
  225. package/dist/docs/video-sources/public-urls.screenci.js +0 -41
  226. package/dist/docs/video-sources/public-urls.screenci.js.map +0 -1
package/dist/src/video.js CHANGED
@@ -2,41 +2,88 @@ import { test as base } from '@playwright/test';
2
2
  import { mkdir, rm } from 'fs/promises';
3
3
  import { join, relative } from 'path';
4
4
  import { attachRecorder } from 'playwright-recorder-plus';
5
- import { studioOptionFlags } from './studio.js';
5
+ import { ScreenciError } from './errors.js';
6
+ import { isStudioMarker } from './studio.js';
6
7
  export { getDimensions } from './dimensions.js';
7
8
  import { getDimensions, getViewportCenter } from './dimensions.js';
8
9
  import { resetCueChain } from './cue.js';
9
10
  import { setActiveCueRecorder } from './cue.js';
10
- import { createVideoBuilder } from './builder.js';
11
- import { buildNarrationMarkers, buildTextDeclaration, buildTextValues, narrationVoiceConfigFromRenderOptions, } from './localizeRuntime.js';
11
+ import { createVideoBuilder, } from './builder.js';
12
+ import { buildNarrationMarkers, buildValuesDeclaration, buildValues, narrationVoiceConfigFromRenderOptions, } from './localizeRuntime.js';
12
13
  import { setActiveHideRecorder } from './hide.js';
13
14
  import { setActiveAutoZoomRecorder, setActiveZoomPage } from './autoZoom.js';
14
- import { setActiveAssetRecorder, buildStudioOverlays, } from './asset.js';
15
+ import { setActiveAssetRecorder, buildOverlays, validateRegisteredAssetPaths, } from './asset.js';
15
16
  import { flushPendingOverlays } from './overlayFlush.js';
16
- import { setActiveAudioRecorder, buildStudioAudioTracks, } from './audio.js';
17
+ import { setActiveAudioRecorder, buildAudio, validateRegisteredAudioPaths, } from './audio.js';
17
18
  import { DEFAULT_VIDEO_OPTIONS, DEFAULT_ASPECT_RATIO, DEFAULT_QUALITY, DEFAULT_FPS, DEFAULT_VIDEO_ENCODER, } from './defaults.js';
18
19
  import { EventRecorder } from './events.js';
19
20
  import { bindClickRecorderToPage, instrumentBrowser, instrumentContext, setActiveClickRecorder, } from './instrument.js';
20
21
  import { logger } from './logger.js';
21
22
  import { setMousePosition } from './mouse.js';
22
- import { getChromiumLaunchOptions } from './browserLaunchOptions.js';
23
+ import { captureRequestedButNotEnabled, getChromiumLaunchOptions, isCaptureAudioEnabled, } from './browserLaunchOptions.js';
23
24
  import { createScreenCIRuntimeContext, runWithScreenCIRuntimeContext, setActiveScreenCIRuntimeContext, setRuntimeAssetRecorder, setRuntimeAudioRecorder, setRuntimeAutoZoomRecorder, setRuntimeClickRecorder, setRuntimeCueRecorder, setRuntimeHideRecorder, setRuntimePage, } from './runtimeContext.js';
25
+ import { installRedactController } from './redact.js';
24
26
  import { escapeFileSystemPathSegment } from './fileSystemName.js';
25
- import { resolveRecordingTimingDuration, parseTextOverrides, parseRecordOptions, mergeStudioRecordOptions, } from './runtimeMode.js';
27
+ import { resolveRecordingTimingDuration, parseValuesOverrides, parseRecordOptions, mergeStudioRecordOptions, } from './runtimeMode.js';
26
28
  import { buildScreenCIContextOptions } from './contextOptions.js';
27
29
  import { bindStillCaptureToPage } from './stillCapture.js';
30
+ import { startScreenAudioCapture, isScreenAudioSupported, screenAudioUnsupportedMessage, setActiveCaptureDevice, SCREEN_AUDIO_DOCS_URL, } from './screenAudio.js';
31
+ import { assertScreenAudioCaptureReady, createNullSink, unloadNullSink, workerSinkName, } from './screenAudioSink.js';
28
32
  export const POST_VIDEO_PAUSE = 500;
33
+ /** The old `'studio'` string sentinel is retired: use `studio()` / `studio({...})`. */
34
+ function assertNotLegacyStudioString(value, option) {
35
+ if (value === 'studio') {
36
+ throw new ScreenciError(`use({ ${option}: 'studio' }) is no longer supported. Use ${option}: studio() ` +
37
+ `to hand the options to the web app, or studio({ ... }) to seed them, ` +
38
+ `imported from 'screenci'.`);
39
+ }
40
+ }
29
41
  /**
30
42
  * The record options actually used for the capture: when record options are
31
- * deferred to Studio (`video.studio({ recordOptions: true })`), the values
32
- * fetched before recording (keyed by video name) override the code-declared
43
+ * deferred to Studio (`use({ recordOptions: studio() })`), the values fetched
44
+ * before recording (keyed by video name) override the base (seeded or default)
33
45
  * aspect ratio, quality, and fps. Otherwise the code values are used as-is.
34
46
  */
35
- export function resolveEffectiveRecordOptions(recordOptions, studio, videoName) {
36
- if (!studioOptionFlags(studio).recordOptions)
47
+ export function resolveEffectiveRecordOptions(recordOptions, studioRecordOptions, videoName) {
48
+ if (!studioRecordOptions)
37
49
  return recordOptions;
38
50
  return mergeStudioRecordOptions(recordOptions, parseRecordOptions()?.[videoName]);
39
51
  }
52
+ /**
53
+ * Resolve the `recordOptions` option, which may be `studio()` / `studio({...})`
54
+ * (`use({ recordOptions: studio() })`) deferring the capture options to the web
55
+ * app. Returns the base options to record with (the seed merged over defaults
56
+ * when seeded, plain defaults when blank) and whether the bag is Studio-managed.
57
+ */
58
+ export function resolveStudioRecordOptions(recordOptions) {
59
+ assertNotLegacyStudioString(recordOptions, 'recordOptions');
60
+ if (isStudioMarker(recordOptions)) {
61
+ const seed = recordOptions.seed;
62
+ return {
63
+ base: seed
64
+ ? { ...DEFAULT_VIDEO_OPTIONS, ...seed }
65
+ : DEFAULT_VIDEO_OPTIONS,
66
+ studio: true,
67
+ };
68
+ }
69
+ return { base: recordOptions, studio: false };
70
+ }
71
+ /**
72
+ * Resolve the `renderOptions` option, which may be `studio()` / `studio({...})`
73
+ * deferring the render options to the web app. Returns the render options to use
74
+ * as the starting point (the seed when seeded, `undefined` when blank) and
75
+ * whether they are Studio-managed.
76
+ */
77
+ export function resolveStudioRenderOptions(renderOptions) {
78
+ assertNotLegacyStudioString(renderOptions, 'renderOptions');
79
+ if (isStudioMarker(renderOptions)) {
80
+ return {
81
+ obj: renderOptions.seed,
82
+ studio: true,
83
+ };
84
+ }
85
+ return { obj: renderOptions, studio: false };
86
+ }
40
87
  export async function finalizeDeferredRecordingStops(entries) {
41
88
  await Promise.all(entries.map(async ({ recorder }) => {
42
89
  const stopResult = await recorder.stop();
@@ -220,7 +267,7 @@ export function autoEndOpenOverlays(runtimeContext, recorder) {
220
267
  runtimeContext.asset.activeRuns.clear();
221
268
  }
222
269
  export async function withActiveRecordingContext(params) {
223
- const { runtimeContext, page, recorder, fn, unendedOverlays = 'throw', textDeclaration, } = params;
270
+ const { runtimeContext, page, recorder, fn, unendedOverlays = 'throw', valuesDeclaration, } = params;
224
271
  setActiveScreenCIRuntimeContext(runtimeContext);
225
272
  try {
226
273
  return await runWithScreenCIRuntimeContext(runtimeContext, async () => {
@@ -240,8 +287,16 @@ export async function withActiveRecordingContext(params) {
240
287
  setActiveClickRecorder(recorder);
241
288
  bindClickRecorderToPage(page, recorder);
242
289
  setRuntimePage(page);
243
- if (textDeclaration) {
244
- recorder.addTextDeclare(textDeclaration.fields, textDeclaration.studioFields, textDeclaration.seed);
290
+ // Fail fast on missing overlay/audio files before the body runs. Only
291
+ // when actually recording and when testFilePath is known (relative asset
292
+ // paths can only be resolved with an anchor file).
293
+ if (runtimeContext.recordingDir !== null &&
294
+ runtimeContext.testFilePath !== null) {
295
+ await validateRegisteredAssetPaths(runtimeContext.testFilePath);
296
+ await validateRegisteredAudioPaths(runtimeContext.testFilePath);
297
+ }
298
+ if (valuesDeclaration) {
299
+ recorder.addValuesDeclare(valuesDeclaration.fields, valuesDeclaration.studioFields, valuesDeclaration.seed);
245
300
  }
246
301
  const result = await fn();
247
302
  if (unendedOverlays === 'autoEnd') {
@@ -268,23 +323,32 @@ const _videoBase = base.extend({
268
323
  renderOptions: [undefined, { option: true }],
269
324
  _screenciLanguage: [undefined, { option: true }],
270
325
  _screenciVideoName: [undefined, { option: true }],
271
- _screenciLocalize: [undefined, { option: true }],
272
- _screenciStudio: [undefined, { option: true }],
326
+ _screenciNarration: [undefined, { option: true }],
327
+ _screenciValues: [undefined, { option: true }],
328
+ _screenciOverlays: [undefined, { option: true }],
329
+ _screenciAudio: [undefined, { option: true }],
330
+ _screenciRecordingLocalize: [undefined, { option: true }],
273
331
  _screenciSourceFile: [undefined, { option: true }],
274
332
  language: async ({ _screenciLanguage }, use) => {
275
333
  await use(_screenciLanguage);
276
334
  },
277
- narration: async ({ _screenciLocalize, _screenciStudio, renderOptions }, use) => {
278
- await use(buildNarrationMarkers(_screenciLocalize, narrationVoiceConfigFromRenderOptions(renderOptions, studioOptionFlags(_screenciStudio).renderOptions), _screenciStudio?.narration ?? []));
335
+ narration: async ({ _screenciNarration, _screenciRecordingLocalize, renderOptions, _screenciSourceFile, }, use, testInfo) => {
336
+ const { obj: renderOptionsObj, studio: studioRender } = resolveStudioRenderOptions(renderOptions);
337
+ await use(buildNarrationMarkers(_screenciNarration, _screenciRecordingLocalize?.languages ?? [], narrationVoiceConfigFromRenderOptions(renderOptionsObj, studioRender), undefined,
338
+ // Pre-warm media-cue hashes before recording so a video cue's start()
339
+ // does not pay the file read on the timeline.
340
+ _screenciSourceFile ?? testInfo.file));
279
341
  },
280
- text: async ({ _screenciLocalize, _screenciStudio, _screenciLanguage }, use) => {
281
- await use(buildTextValues(_screenciLocalize, _screenciLanguage, parseTextOverrides(), _screenciStudio?.text ?? []));
342
+ values: async ({ _screenciValues, _screenciLanguage }, use) => {
343
+ await use(buildValues(_screenciValues, _screenciLanguage, parseValuesOverrides()));
282
344
  },
283
- overlays: async ({ _screenciStudio }, use) => {
284
- await use(buildStudioOverlays(_screenciStudio?.overlays ?? []));
345
+ overlays: async ({ _screenciOverlays, _screenciLanguage }, use) => {
346
+ await use(buildOverlays(_screenciOverlays, _screenciLanguage));
285
347
  },
286
- audio: async ({ _screenciStudio }, use) => {
287
- await use(buildStudioAudioTracks(_screenciStudio?.audio ?? []));
348
+ audio: async ({ _screenciAudio, _screenciLanguage, _screenciSourceFile }, use, testInfo) => {
349
+ // Pre-warm audio-track hashes before recording so a track's start() does not
350
+ // pay the file read on the timeline.
351
+ await use(buildAudio(_screenciAudio, _screenciLanguage, _screenciSourceFile ?? testInfo.file));
288
352
  },
289
353
  recordingFinalizationQueue: [
290
354
  async ({}, use) => {
@@ -299,20 +363,59 @@ const _videoBase = base.extend({
299
363
  ],
300
364
  browser: async ({ playwright }, use) => {
301
365
  const shouldRecord = process.env.SCREENCI_RECORDING === 'true';
302
- const launchOptions = getChromiumLaunchOptions(shouldRecord);
303
- const browser = await playwright.chromium.launch(launchOptions);
366
+ // captureAudio requires isolated capture (a per-worker null sink). It must
367
+ // succeed or the run fails, so a recording never silently ships without the
368
+ // isolated audio it promises.
369
+ const captureAudioRequested = shouldRecord && isCaptureAudioEnabled();
370
+ // Isolated capture is Linux-only (macOS/Windows cannot isolate the browser's
371
+ // audio from the rest of the machine). Requested on an unsupported platform:
372
+ // fail fast rather than recording silently.
373
+ if (captureAudioRequested && !isScreenAudioSupported()) {
374
+ throw new Error(screenAudioUnsupportedMessage() ??
375
+ '[screenci] captureAudio is not supported on this platform.');
376
+ }
377
+ const audioActive = captureAudioRequested && isScreenAudioSupported();
378
+ // Give this worker a dedicated null sink so capture is silent on the host,
379
+ // isolated from other apps, and safe under parallel workers. The browser is
380
+ // routed into it via PULSE_SINK and the recorder captures its monitor.
381
+ let sink = null;
382
+ if (audioActive) {
383
+ // Requires `pactl` and a reachable pulse server (PulseAudio or PipeWire);
384
+ // the pulseaudio daemon binary itself is not needed. Throws if unavailable.
385
+ await assertScreenAudioCaptureReady();
386
+ sink = await createNullSink(workerSinkName());
387
+ if (!sink) {
388
+ throw new Error(`[screenci] captureAudio: could not create an isolated audio sink ` +
389
+ `(\`pactl load-module module-null-sink\` failed). Isolated ` +
390
+ `recording is required, so the run is stopped. ` +
391
+ `See ${SCREEN_AUDIO_DOCS_URL}`);
392
+ }
393
+ setActiveCaptureDevice(sink.monitorSource);
394
+ }
395
+ const launchOptions = getChromiumLaunchOptions(shouldRecord, audioActive);
396
+ const browser = await playwright.chromium.launch(sink
397
+ ? {
398
+ ...launchOptions,
399
+ env: { ...process.env, PULSE_SINK: sink.sinkName },
400
+ }
401
+ : launchOptions);
304
402
  instrumentBrowser(browser);
305
403
  await use(browser);
306
404
  if (browser.isConnected()) {
307
405
  await browser.close();
308
406
  }
407
+ if (sink) {
408
+ await unloadNullSink(sink);
409
+ setActiveCaptureDevice(null);
410
+ }
309
411
  },
310
- context: async ({ browser, recordOptions, _screenciStudio, _screenciVideoName, colorScheme, locale, timezoneId, userAgent, geolocation, permissions, extraHTTPHeaders, httpCredentials, ignoreHTTPSErrors, offline, storageState, baseURL, bypassCSP, acceptDownloads, javaScriptEnabled, hasTouch, isMobile, }, use, testInfo) => {
412
+ context: async ({ browser, recordOptions, _screenciVideoName, colorScheme, locale, timezoneId, userAgent, geolocation, permissions, extraHTTPHeaders, httpCredentials, ignoreHTTPSErrors, offline, storageState, baseURL, bypassCSP, acceptDownloads, javaScriptEnabled, hasTouch, isMobile, }, use, testInfo) => {
311
413
  // Configure browser context. The viewport is derived from recordOptions
312
414
  // (with Studio record-option overrides applied when deferred); other
313
415
  // Playwright `use` options (colorScheme, locale, storageState, ...) are
314
416
  // forwarded so they take effect on the context screenci creates.
315
- const effectiveRecordOptions = resolveEffectiveRecordOptions(recordOptions, _screenciStudio, _screenciVideoName ?? testInfo.title);
417
+ const { base: baseRecordOptions, studio: studioRecord } = resolveStudioRecordOptions(recordOptions);
418
+ const effectiveRecordOptions = resolveEffectiveRecordOptions(baseRecordOptions, studioRecord, _screenciVideoName ?? testInfo.title);
316
419
  const aspectRatio = effectiveRecordOptions.aspectRatio ?? DEFAULT_ASPECT_RATIO;
317
420
  const quality = effectiveRecordOptions.quality ?? DEFAULT_QUALITY;
318
421
  const dimensions = getDimensions(aspectRatio, quality);
@@ -350,16 +453,24 @@ const _videoBase = base.extend({
350
453
  await context.close();
351
454
  }
352
455
  },
353
- page: async ({ context, recordOptions: codeRecordOptions, renderOptions, recordingFinalizationQueue, _screenciLanguage, _screenciLocalize, _screenciStudio, _screenciVideoName, _screenciSourceFile, }, use, testInfo) => {
456
+ page: async ({ context, recordOptions: codeRecordOptions, renderOptions, recordingFinalizationQueue, _screenciLanguage, _screenciValues, _screenciVideoName, _screenciSourceFile, _screenciRecordingLocalize, }, use, testInfo) => {
354
457
  // Only record when explicitly enabled (record command)
355
458
  const shouldRecord = process.env.SCREENCI_RECORDING === 'true';
356
459
  // Apply Studio record-option overrides (when deferred) so the capture,
357
460
  // serialized recordOptions, and viewport all use the effective values.
358
- const recordOptions = resolveEffectiveRecordOptions(codeRecordOptions, _screenciStudio, _screenciVideoName ?? testInfo.title);
359
- const recorder = new EventRecorder(renderOptions, recordOptions, studioOptionFlags(_screenciStudio));
360
- // Declared `text` fields (and the active language's seeds) emitted once at
461
+ const { base: baseRecordOptions, studio: studioRecord } = resolveStudioRecordOptions(codeRecordOptions);
462
+ const { obj: renderOptionsObj, studio: studioRender } = resolveStudioRenderOptions(renderOptions);
463
+ const recordOptions = resolveEffectiveRecordOptions(baseRecordOptions, studioRecord, _screenciVideoName ?? testInfo.title);
464
+ const recorder = new EventRecorder(renderOptionsObj, recordOptions, {
465
+ renderOptions: studioRender,
466
+ recordOptions: studioRecord,
467
+ // Web-owned language set: stamped into metadata.studio.languages so the app
468
+ // knows this video may have languages added/rendered from Studio.
469
+ languages: _screenciRecordingLocalize?.studioOwned ?? false,
470
+ });
471
+ // Declared `values` fields (and the active language's seeds) emitted once at
361
472
  // recording start so the backend/Studio learn them.
362
- const textDeclaration = buildTextDeclaration(_screenciLocalize, _screenciLanguage, _screenciStudio?.text ?? []);
473
+ const valuesDeclaration = buildValuesDeclaration(_screenciValues, _screenciLanguage);
363
474
  // Asset paths are authored relative to the user's script. Playwright reports
364
475
  // `testInfo.file` as the builder module that registered the test, so prefer
365
476
  // the script path captured at the call site.
@@ -368,6 +479,15 @@ const _videoBase = base.extend({
368
479
  // translations and stamps metadata so the upload becomes a single language
369
480
  // version. `null` (shared / single-language) keeps every language.
370
481
  recorder.setActiveLanguage(_screenciLanguage ?? null);
482
+ // Stamp the full declared language set (regardless of the `--languages`
483
+ // render filter), but only when a set was explicitly declared. A plain video
484
+ // with the implicit `['en']` default records no availableLanguages, so the
485
+ // app does not treat it as a managed language set. The app unions this across
486
+ // a video's recordings to know every code-defined language even when only a
487
+ // subset was rendered this run.
488
+ if (_screenciRecordingLocalize?.explicit === true) {
489
+ recorder.setAvailableLanguages(_screenciRecordingLocalize.availableLanguages ?? []);
490
+ }
371
491
  // Per-language passes use a unique test title (so each gets its own
372
492
  // recording directory) but share one `videoName` so they group as language
373
493
  // versions of one video. Plain videos fall back to the test title.
@@ -379,16 +499,17 @@ const _videoBase = base.extend({
379
499
  page,
380
500
  testFilePath,
381
501
  recordOptions,
382
- renderOptions,
502
+ renderOptions: renderOptionsObj,
383
503
  });
384
504
  bindStillCaptureToPage(page);
385
505
  await setupMouseTracking(page, recorder);
506
+ await installRedactController(page, runtimeContext.redact, recordOptions.redact);
386
507
  recorder.start();
387
508
  await withActiveRecordingContext({
388
509
  runtimeContext,
389
510
  page,
390
511
  recorder,
391
- textDeclaration,
512
+ valuesDeclaration,
392
513
  fn: async () => {
393
514
  await use(page);
394
515
  },
@@ -424,9 +545,10 @@ const _videoBase = base.extend({
424
545
  testFilePath,
425
546
  recordingDir: videoDir,
426
547
  recordOptions,
427
- renderOptions,
548
+ renderOptions: renderOptionsObj,
428
549
  });
429
550
  await setupMouseTracking(page, recorder);
551
+ await installRedactController(page, runtimeContext.redact, recordOptions.redact);
430
552
  // Navigate to blank page to ensure window is ready and rendered
431
553
  await page.goto('about:blank');
432
554
  // Wait for browser window to be fully rendered before starting recording
@@ -437,6 +559,28 @@ const _videoBase = base.extend({
437
559
  await screenRecorder.start();
438
560
  // Mark the moment the video recording actually begins after the cursor is positioned.
439
561
  recorder.start();
562
+ const captureVolume = recordOptions.captureAudio ?? 0;
563
+ // captureAudio is Linux-only. On macOS/Windows skip capture entirely (a
564
+ // warning was already emitted at run start, and the worker fixture emits one
565
+ // at the end) rather than writing a silent or whole-machine track.
566
+ const audioSupported = isScreenAudioSupported();
567
+ // The recording browser is launched once per worker (audio mode is decided
568
+ // then from the root-level enableCaptureAudio switch), before this per-video
569
+ // recordOptions is known. If a video requests captureAudio without that
570
+ // switch on, the browser was launched muted on the legacy headless shell and
571
+ // the captured track would be silent. Fail loudly instead of writing silence.
572
+ if (audioSupported &&
573
+ captureRequestedButNotEnabled(captureVolume, isCaptureAudioEnabled())) {
574
+ throw new Error(`[screenci] "${videoName}" sets captureAudio but enableCaptureAudio is ` +
575
+ `not turned on. Add "enableCaptureAudio: true" at the top level of ` +
576
+ `your screenci config so the recording browser launches in audio mode ` +
577
+ `(it is decided once per worker, before a video's options are known). ` +
578
+ `See ${SCREEN_AUDIO_DOCS_URL}`);
579
+ }
580
+ const audioCapturePath = join(videoDir, 'screen-audio.wav');
581
+ const audioCapture = captureVolume > 0 && audioSupported && isCaptureAudioEnabled()
582
+ ? startScreenAudioCapture(audioCapturePath)
583
+ : null;
440
584
  // Wrap `page.screenshot()` only now, AFTER the screen recorder has started.
441
585
  // The recorder captures a baseline frame via `page.screenshot()` inside
442
586
  // `screenRecorder.start()`; wrapping earlier intercepted that internal call
@@ -448,7 +592,7 @@ const _videoBase = base.extend({
448
592
  runtimeContext,
449
593
  page,
450
594
  recorder,
451
- textDeclaration,
595
+ valuesDeclaration,
452
596
  fn: async () => {
453
597
  await use(page);
454
598
  // Do not end video abruptly.
@@ -460,6 +604,21 @@ const _videoBase = base.extend({
460
604
  restoreStillCapture();
461
605
  await screenRecorder.pause();
462
606
  recordingFinalizationQueue.push({ recorder: screenRecorder });
607
+ if (audioCapture !== null) {
608
+ try {
609
+ const captured = await audioCapture.stop();
610
+ recorder.addScreenAudioTrack({
611
+ path: captured.path,
612
+ fileHash: captured.fileHash,
613
+ volume: captureVolume,
614
+ repeat: false,
615
+ });
616
+ }
617
+ catch (err) {
618
+ logger.warn(`captureAudio: failed to capture audio track and it will be omitted. ` +
619
+ `${err instanceof Error ? err.message : String(err)}`);
620
+ }
621
+ }
463
622
  await page.close();
464
623
  if (testInfo.status === 'passed') {
465
624
  const configDir = process.env.SCREENCI_CONFIG_DIR ?? process.cwd();
@@ -502,7 +661,10 @@ export const video = _videoBase;
502
661
  // Attach the chainable fan-out builders. They register through the same test
503
662
  // instance, so per-language / per-variant passes inherit every video fixture.
504
663
  const _rootBuilder = createVideoBuilder(_videoBase);
505
- video.localize = _rootBuilder.localize;
506
- video.studio = _rootBuilder.studio;
664
+ video.narration = _rootBuilder.narration;
665
+ video.values = _rootBuilder.values;
666
+ video.overlays = _rootBuilder.overlays;
667
+ video.audio = _rootBuilder.audio;
668
+ video.languages = _rootBuilder.languages;
507
669
  video.each = _rootBuilder.each;
508
670
  //# sourceMappingURL=video.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"video.js","sourceRoot":"","sources":["../../src/video.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"video.js","sourceRoot":"","sources":["../../src/video.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Upper bound on the bytes we send as a voice-clone sample. ElevenLabs rejects
3
+ * larger uploads ("a maximum of 11MB"); we shrink or reject before upload so a
4
+ * failure surfaces here, at record time, rather than mid-render. Mirrors the
5
+ * backend's MAX_CUSTOM_VOICE_SIZE_BYTES.
6
+ */
7
+ export declare const MAX_VOICE_SAMPLE_BYTES = 11000000;
8
+ export type ExtractedVoiceSample = {
9
+ buffer: Buffer;
10
+ /** MIME type of the produced bytes. */
11
+ contentType: string;
12
+ /** Extension (with leading dot) describing the produced bytes. */
13
+ extension: string;
14
+ };
15
+ /** Injectable side effects, so the extraction flow can be unit tested without a
16
+ * real ffmpeg binary or filesystem. */
17
+ export type VoiceSampleAudioDeps = {
18
+ runFfmpeg: (args: string[]) => Promise<void>;
19
+ makeTempDir: (prefix: string) => Promise<string>;
20
+ readOutput: (path: string) => Promise<Buffer>;
21
+ removeDir: (path: string) => Promise<void>;
22
+ };
23
+ /**
24
+ * Returns an extracted/transcoded audio sample when the source is a video
25
+ * container or exceeds {@link MAX_VOICE_SAMPLE_BYTES}, or `null` when the source
26
+ * is already an audio file within the limit (upload it unchanged).
27
+ *
28
+ * Extraction strips any video track and transcodes to MP3 at 192 kbps, the
29
+ * format ElevenLabs recommends for cloning. A 20 MB screen recording becomes a
30
+ * few hundred KB of audio. If the result is still over the limit (e.g. a very
31
+ * long sample), this throws so the CLI can fail fast with a clear message.
32
+ */
33
+ export declare function maybeExtractVoiceSampleAudio(sourcePath: string, sourceByteLength: number, deps?: Partial<VoiceSampleAudioDeps>): Promise<ExtractedVoiceSample | null>;
34
+ //# sourceMappingURL=voiceSampleAudio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voiceSampleAudio.d.ts","sourceRoot":"","sources":["../../src/voiceSampleAudio.ts"],"names":[],"mappings":"AAQA;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,WAAa,CAAA;AAMhD,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAA;IACnB,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED;wCACwC;AACxC,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5C,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IAChD,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IAC7C,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3C,CAAA;AAyCD;;;;;;;;;GASG;AACH,wBAAsB,4BAA4B,CAChD,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,MAAM,EACxB,IAAI,GAAE,OAAO,CAAC,oBAAoB,CAAM,GACvC,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAkDtC"}
@@ -0,0 +1,105 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { mkdtemp, readFile, rm } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import { extname, join } from 'node:path';
5
+ import ffmpegStatic from 'ffmpeg-static';
6
+ const ffmpegPath = ffmpegStatic;
7
+ /**
8
+ * Upper bound on the bytes we send as a voice-clone sample. ElevenLabs rejects
9
+ * larger uploads ("a maximum of 11MB"); we shrink or reject before upload so a
10
+ * failure surfaces here, at record time, rather than mid-render. Mirrors the
11
+ * backend's MAX_CUSTOM_VOICE_SIZE_BYTES.
12
+ */
13
+ export const MAX_VOICE_SAMPLE_BYTES = 11_000_000;
14
+ // Containers that carry a video track. A voice clone only needs the audio, so
15
+ // for these we always strip to a small audio file before upload.
16
+ const VIDEO_EXTENSIONS = new Set(['.mp4', '.mov', '.webm', '.mkv', '.avi']);
17
+ function defaultRunFfmpeg(args) {
18
+ return new Promise((resolve, reject) => {
19
+ if (ffmpegPath === null) {
20
+ reject(new Error('[screenci] ffmpeg binary not found; cannot extract audio from the voice sample.'));
21
+ return;
22
+ }
23
+ const child = spawn(ffmpegPath, args, {
24
+ stdio: ['ignore', 'ignore', 'pipe'],
25
+ });
26
+ let stderr = '';
27
+ child.stderr?.on('data', (chunk) => {
28
+ stderr += chunk.toString();
29
+ });
30
+ child.on('error', reject);
31
+ child.on('close', (code) => {
32
+ if (code === 0) {
33
+ resolve();
34
+ return;
35
+ }
36
+ reject(new Error(`[screenci] ffmpeg exited with code ${String(code)} while extracting voice-sample audio.\n${stderr.slice(-2000)}`));
37
+ });
38
+ });
39
+ }
40
+ const defaultDeps = {
41
+ runFfmpeg: defaultRunFfmpeg,
42
+ makeTempDir: (prefix) => mkdtemp(prefix),
43
+ readOutput: (path) => readFile(path),
44
+ removeDir: (path) => rm(path, { recursive: true, force: true }),
45
+ };
46
+ /**
47
+ * Returns an extracted/transcoded audio sample when the source is a video
48
+ * container or exceeds {@link MAX_VOICE_SAMPLE_BYTES}, or `null` when the source
49
+ * is already an audio file within the limit (upload it unchanged).
50
+ *
51
+ * Extraction strips any video track and transcodes to MP3 at 192 kbps, the
52
+ * format ElevenLabs recommends for cloning. A 20 MB screen recording becomes a
53
+ * few hundred KB of audio. If the result is still over the limit (e.g. a very
54
+ * long sample), this throws so the CLI can fail fast with a clear message.
55
+ */
56
+ export async function maybeExtractVoiceSampleAudio(sourcePath, sourceByteLength, deps = {}) {
57
+ const ext = extname(sourcePath).toLowerCase();
58
+ const isVideo = VIDEO_EXTENSIONS.has(ext);
59
+ const tooLarge = sourceByteLength > MAX_VOICE_SAMPLE_BYTES;
60
+ if (!isVideo && !tooLarge)
61
+ return null;
62
+ const { runFfmpeg, makeTempDir, readOutput, removeDir } = {
63
+ ...defaultDeps,
64
+ ...deps,
65
+ };
66
+ const dir = await makeTempDir(join(tmpdir(), 'screenci-voice-'));
67
+ const outputPath = join(dir, 'voice-sample.mp3');
68
+ try {
69
+ // The clone cache is keyed by the SHA-256 of these uploaded bytes, so the
70
+ // output must be byte-reproducible: the same source must always yield the
71
+ // same MP3, otherwise the voice gets re-cloned on every run and the clone
72
+ // service accumulates duplicates. `-bitexact` stops ffmpeg embedding its
73
+ // version string, `-map_metadata -1` drops copied source tags (timestamps,
74
+ // device info), and `-map 0:a:0` at a fixed CBR bitrate makes the encode
75
+ // deterministic. The hash then only moves if the bundled encoder itself
76
+ // changes its output (e.g. an ffmpeg-static bump), which re-clones once.
77
+ await runFfmpeg([
78
+ '-y',
79
+ '-bitexact',
80
+ '-i',
81
+ sourcePath,
82
+ '-vn',
83
+ '-map',
84
+ '0:a:0',
85
+ '-map_metadata',
86
+ '-1',
87
+ '-acodec',
88
+ 'libmp3lame',
89
+ '-b:a',
90
+ '192k',
91
+ '-bitexact',
92
+ outputPath,
93
+ ]);
94
+ const buffer = await readOutput(outputPath);
95
+ if (buffer.byteLength > MAX_VOICE_SAMPLE_BYTES) {
96
+ const limitMb = Math.floor(MAX_VOICE_SAMPLE_BYTES / (1000 * 1000));
97
+ throw new Error(`[screenci] Voice sample audio is still too large after extraction (${buffer.byteLength} bytes; the limit is ${limitMb} MB). Use a shorter sample (about 1-2 minutes of clean speech is ideal).`);
98
+ }
99
+ return { buffer, contentType: 'audio/mpeg', extension: '.mp3' };
100
+ }
101
+ finally {
102
+ await removeDir(dir).catch(() => { });
103
+ }
104
+ }
105
+ //# sourceMappingURL=voiceSampleAudio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voiceSampleAudio.js","sourceRoot":"","sources":["../../src/voiceSampleAudio.ts"],"names":[],"mappings":"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"}
@@ -121,9 +121,9 @@ export type ModelVoiceKey = keyof Omit<typeof voices, 'elevenlabs'>;
121
121
  export type ElevenLabsVoiceKey = `elevenlabs:${string}`;
122
122
  /** Union of all valid voice keys, e.g. `'Aria' | 'elevenlabs:abc123'`. */
123
123
  export type VoiceKey = ModelVoiceKey | ElevenLabsVoiceKey;
124
- declare const supportedBaseLanguageCodes: readonly ["ar", "bn", "nl", "en", "fr", "de", "hi", "id", "it", "ja", "ko", "mr", "pl", "pt", "ro", "ru", "es", "ta", "te", "th", "tr", "uk", "vi", "af", "sq", "am", "hy", "az", "eu", "be", "bg", "my", "ca", "ceb", "cmn", "hr", "cs", "da", "et", "fil", "fi", "gl", "ka", "el", "gu", "ht", "he", "hu", "is", "jv", "kn", "kok", "lo", "la", "lv", "lt", "lb", "mk", "mai", "mg", "ms", "ml", "mn", "ne", "nb", "nn", "or", "ps", "fa", "pa", "sr", "sd", "si", "sk", "sl", "sw", "sv", "ur"];
124
+ declare const supportedBaseLanguageCodes: readonly ["ar", "bn", "nl", "en", "fr", "de", "hi", "id", "it", "ja", "ko", "mr", "pl", "pt", "ro", "ru", "es", "ta", "te", "th", "tr", "uk", "vi", "af", "sq", "am", "hy", "az", "eu", "be", "bg", "my", "ca", "ceb", "cmn", "yue", "hr", "cs", "da", "et", "fil", "fi", "gl", "ka", "el", "gu", "ht", "he", "hu", "is", "jv", "kn", "kok", "lo", "la", "lv", "lt", "lb", "mk", "mai", "mg", "ms", "ml", "mn", "ne", "nb", "nn", "or", "ps", "fa", "pa", "sr", "sd", "si", "sk", "sl", "sw", "sv", "ur"];
125
125
  type SupportedBaseLanguageCode = (typeof supportedBaseLanguageCodes)[number];
126
- export declare const supportedLanguages: readonly ["ar", "bn", "nl", "en", "fr", "de", "hi", "id", "it", "ja", "ko", "mr", "pl", "pt", "ro", "ru", "es", "ta", "te", "th", "tr", "uk", "vi", "af", "sq", "am", "hy", "az", "eu", "be", "bg", "my", "ca", "ceb", "cmn", "hr", "cs", "da", "et", "fil", "fi", "gl", "ka", "el", "gu", "ht", "he", "hu", "is", "jv", "kn", "kok", "lo", "la", "lv", "lt", "lb", "mk", "mai", "mg", "ms", "ml", "mn", "ne", "nb", "nn", "or", "ps", "fa", "pa", "sr", "sd", "si", "sk", "sl", "sw", "sv", "ur"];
126
+ export declare const supportedLanguages: readonly ["ar", "bn", "nl", "en", "fr", "de", "hi", "id", "it", "ja", "ko", "mr", "pl", "pt", "ro", "ru", "es", "ta", "te", "th", "tr", "uk", "vi", "af", "sq", "am", "hy", "az", "eu", "be", "bg", "my", "ca", "ceb", "cmn", "yue", "hr", "cs", "da", "et", "fil", "fi", "gl", "ka", "el", "gu", "ht", "he", "hu", "is", "jv", "kn", "kok", "lo", "la", "lv", "lt", "lb", "mk", "mai", "mg", "ms", "ml", "mn", "ne", "nb", "nn", "or", "ps", "fa", "pa", "sr", "sd", "si", "sk", "sl", "sw", "sv", "ur"];
127
127
  /** Union of supported language codes, e.g. `'en' | 'fi' | 'cmn'`. */
128
128
  export type Lang = SupportedBaseLanguageCode;
129
129
  /**