vidspotai-shared 1.0.100 → 1.0.101-dev.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 (183) hide show
  1. package/lib/globals/aiModels/enums.d.ts +1 -0
  2. package/lib/globals/aiModels/enums.d.ts.map +1 -1
  3. package/lib/globals/aiModels/enums.js +3 -0
  4. package/lib/globals/aiModels/extendCapability.d.ts +26 -0
  5. package/lib/globals/aiModels/extendCapability.d.ts.map +1 -0
  6. package/lib/globals/aiModels/extendCapability.js +42 -0
  7. package/lib/globals/aiModels/index.d.ts +1 -0
  8. package/lib/globals/aiModels/index.d.ts.map +1 -1
  9. package/lib/globals/aiModels/index.js +1 -0
  10. package/lib/globals/aiModels/providers/google.d.ts.map +1 -1
  11. package/lib/globals/aiModels/providers/google.js +6 -9
  12. package/lib/globals/aiModels/providers/hostedAvatars.js +10 -10
  13. package/lib/globals/creditUnit.d.ts +20 -33
  14. package/lib/globals/creditUnit.d.ts.map +1 -1
  15. package/lib/globals/creditUnit.js +20 -33
  16. package/lib/globals/types.d.ts +34 -2
  17. package/lib/globals/types.d.ts.map +1 -1
  18. package/lib/globals/types.js +37 -0
  19. package/lib/models/demoVideoProject.model.d.ts +213 -0
  20. package/lib/models/demoVideoProject.model.d.ts.map +1 -1
  21. package/lib/models/index.d.ts +2 -0
  22. package/lib/models/index.d.ts.map +1 -1
  23. package/lib/models/index.js +2 -0
  24. package/lib/models/mediaUpload.model.d.ts +25 -0
  25. package/lib/models/mediaUpload.model.d.ts.map +1 -1
  26. package/lib/models/productConnection.model.d.ts +57 -0
  27. package/lib/models/productConnection.model.d.ts.map +1 -0
  28. package/lib/models/productConnection.model.js +7 -0
  29. package/lib/models/video.model.d.ts +11 -0
  30. package/lib/models/video.model.d.ts.map +1 -1
  31. package/lib/models/videoQaJob.model.d.ts +61 -0
  32. package/lib/models/videoQaJob.model.d.ts.map +1 -0
  33. package/lib/models/videoQaJob.model.js +16 -0
  34. package/lib/schemas/brandKit.schema.d.ts +3 -1
  35. package/lib/schemas/brandKit.schema.d.ts.map +1 -1
  36. package/lib/schemas/brandKit.schema.js +9 -0
  37. package/lib/schemas/brief.schema.d.ts +5 -4
  38. package/lib/schemas/brief.schema.d.ts.map +1 -1
  39. package/lib/schemas/brief.schema.js +23 -1
  40. package/lib/schemas/demoQuestion.schema.d.ts +24 -4
  41. package/lib/schemas/demoQuestion.schema.d.ts.map +1 -1
  42. package/lib/schemas/demoQuestion.schema.js +8 -2
  43. package/lib/schemas/demoSpec.schema.d.ts +40 -6
  44. package/lib/schemas/demoSpec.schema.d.ts.map +1 -1
  45. package/lib/schemas/demoSpec.schema.js +46 -1
  46. package/lib/schemas/project.schema.d.ts +33 -3
  47. package/lib/schemas/project.schema.d.ts.map +1 -1
  48. package/lib/schemas/project.schema.js +22 -0
  49. package/lib/schemas/social.schema.d.ts +1 -1
  50. package/lib/schemas/videoPlan.schema.d.ts +22 -20
  51. package/lib/schemas/videoPlan.schema.d.ts.map +1 -1
  52. package/lib/schemas/videoPlan.schema.js +19 -0
  53. package/lib/services/agent/editClassifier.d.ts +10 -10
  54. package/lib/services/agent/eval/types.d.ts +3 -2
  55. package/lib/services/agent/eval/types.d.ts.map +1 -1
  56. package/lib/services/agent/executor/core.d.ts.map +1 -1
  57. package/lib/services/agent/executor/core.js +11 -0
  58. package/lib/services/agent/planner/Planner.d.ts.map +1 -1
  59. package/lib/services/agent/planner/Planner.js +5 -0
  60. package/lib/services/agent/planner/overlayRegen.d.ts.map +1 -1
  61. package/lib/services/agent/planner/overlayRegen.js +5 -0
  62. package/lib/services/agent/planner/plannerMessages.d.ts.map +1 -1
  63. package/lib/services/agent/planner/plannerMessages.js +10 -1
  64. package/lib/services/agent/planner/scriptFirstPlanner.d.ts.map +1 -1
  65. package/lib/services/agent/planner/scriptFirstPlanner.js +2 -0
  66. package/lib/services/agent/regenCore.d.ts.map +1 -1
  67. package/lib/services/agent/regenCore.js +11 -1
  68. package/lib/services/agent/runHelpers.d.ts +8 -0
  69. package/lib/services/agent/runHelpers.d.ts.map +1 -1
  70. package/lib/services/agent/runHelpers.js +5 -1
  71. package/lib/services/agent/tools/chapterOutline.tool.d.ts +8 -0
  72. package/lib/services/agent/tools/chapterOutline.tool.d.ts.map +1 -1
  73. package/lib/services/agent/tools/chapterOutline.tool.js +21 -8
  74. package/lib/services/agent/tools/composeScene.tool.d.ts +32 -2
  75. package/lib/services/agent/tools/composeScene.tool.d.ts.map +1 -1
  76. package/lib/services/agent/tools/estimateCost.tool.d.ts +11 -1
  77. package/lib/services/agent/tools/estimateCost.tool.d.ts.map +1 -1
  78. package/lib/services/agent/tools/extendVideo.tool.d.ts +9 -3
  79. package/lib/services/agent/tools/extendVideo.tool.d.ts.map +1 -1
  80. package/lib/services/agent/tools/extendVideo.tool.js +12 -27
  81. package/lib/services/agent/tools/generateAvatarVideo.tool.d.ts +1 -1
  82. package/lib/services/agent/tools/generateScript.tool.d.ts +3 -2
  83. package/lib/services/agent/tools/generateScript.tool.d.ts.map +1 -1
  84. package/lib/services/agent/tools/generateScript.tool.js +16 -7
  85. package/lib/services/agent/tools/generateVoiceover.tool.d.ts +1 -1
  86. package/lib/services/agent/tools/planVideo.tool.d.ts +11 -8
  87. package/lib/services/agent/tools/planVideo.tool.d.ts.map +1 -1
  88. package/lib/services/agent/tools/render.tool.d.ts +11 -1
  89. package/lib/services/agent/tools/render.tool.d.ts.map +1 -1
  90. package/lib/services/agent/tools/searchStock.tool.d.ts +1 -1
  91. package/lib/services/agent/tools/searchUserLibrary.tool.d.ts +4 -4
  92. package/lib/services/aiGen/providers/alibaba/alibaba.d.ts +0 -6
  93. package/lib/services/aiGen/providers/alibaba/alibaba.d.ts.map +1 -1
  94. package/lib/services/aiGen/providers/alibaba/alibaba.js +5 -103
  95. package/lib/services/aiGen/providers/bytedance/bytedance.service.d.ts.map +1 -1
  96. package/lib/services/aiGen/providers/bytedance/bytedance.service.js +1 -9
  97. package/lib/services/aiGen/providers/google/google.service.d.ts.map +1 -1
  98. package/lib/services/aiGen/providers/google/google.service.js +26 -142
  99. package/lib/services/aiGen/providers/google/googleErrors.d.ts.map +1 -1
  100. package/lib/services/aiGen/providers/google/googleErrors.js +7 -17
  101. package/lib/services/aiGen/providers/kling/kling.service.d.ts.map +1 -1
  102. package/lib/services/aiGen/providers/kling/kling.service.js +22 -3
  103. package/lib/services/aiGen/providers/kling/klingStatus.d.ts +7 -0
  104. package/lib/services/aiGen/providers/kling/klingStatus.d.ts.map +1 -1
  105. package/lib/services/aiGen/providers/kling/klingStatus.js +41 -4
  106. package/lib/services/aiGen/providers/pixverse/pixverse.service.d.ts.map +1 -1
  107. package/lib/services/aiGen/providers/pixverse/pixverse.service.js +25 -0
  108. package/lib/services/aiGen/providers/types.d.ts +20 -0
  109. package/lib/services/aiGen/providers/types.d.ts.map +1 -1
  110. package/lib/services/avatarGen/avatarProviderFactory.d.ts.map +1 -1
  111. package/lib/services/avatarGen/avatarProviderFactory.js +3 -0
  112. package/lib/services/avatarGen/index.d.ts +1 -0
  113. package/lib/services/avatarGen/index.d.ts.map +1 -1
  114. package/lib/services/avatarGen/index.js +1 -0
  115. package/lib/services/avatarGen/providers/synthesiaAvatarProvider.d.ts +53 -0
  116. package/lib/services/avatarGen/providers/synthesiaAvatarProvider.d.ts.map +1 -0
  117. package/lib/services/avatarGen/providers/synthesiaAvatarProvider.js +176 -0
  118. package/lib/services/demo/demoAuthor.d.ts +7 -0
  119. package/lib/services/demo/demoAuthor.d.ts.map +1 -1
  120. package/lib/services/demo/demoAuthor.js +2 -0
  121. package/lib/services/demo/demoAuthorPrompt.d.ts +6 -0
  122. package/lib/services/demo/demoAuthorPrompt.d.ts.map +1 -1
  123. package/lib/services/demo/demoAuthorPrompt.js +24 -2
  124. package/lib/services/demo/demoCaptions.d.ts +69 -0
  125. package/lib/services/demo/demoCaptions.d.ts.map +1 -0
  126. package/lib/services/demo/demoCaptions.js +152 -0
  127. package/lib/services/demo/demoMusic.d.ts +8 -1
  128. package/lib/services/demo/demoMusic.d.ts.map +1 -1
  129. package/lib/services/demo/demoMusic.js +32 -16
  130. package/lib/services/demo/demoScriptPrompt.d.ts +2 -1
  131. package/lib/services/demo/demoScriptPrompt.d.ts.map +1 -1
  132. package/lib/services/demo/demoScriptPrompt.js +29 -2
  133. package/lib/services/demo/demoStockAssets.d.ts +29 -0
  134. package/lib/services/demo/demoStockAssets.d.ts.map +1 -0
  135. package/lib/services/demo/demoStockAssets.js +107 -0
  136. package/lib/services/demo/index.d.ts +3 -0
  137. package/lib/services/demo/index.d.ts.map +1 -1
  138. package/lib/services/demo/index.js +3 -0
  139. package/lib/services/demo/productConnection.service.d.ts +78 -0
  140. package/lib/services/demo/productConnection.service.d.ts.map +1 -0
  141. package/lib/services/demo/productConnection.service.js +125 -0
  142. package/lib/services/editor/planToProject.d.ts.map +1 -1
  143. package/lib/services/editor/planToProject.helpers.d.ts +1 -0
  144. package/lib/services/editor/planToProject.helpers.d.ts.map +1 -1
  145. package/lib/services/editor/planToProject.helpers.js +3 -0
  146. package/lib/services/editor/planToProject.js +39 -0
  147. package/lib/services/editor/projectToDesign.js +13 -1
  148. package/lib/services/firestore.service.d.ts +14 -0
  149. package/lib/services/firestore.service.d.ts.map +1 -1
  150. package/lib/services/firestore.service.js +16 -0
  151. package/lib/services/translation/index.d.ts +1 -0
  152. package/lib/services/translation/index.d.ts.map +1 -1
  153. package/lib/services/translation/index.js +8 -1
  154. package/lib/services/translation/outputLanguage.d.ts +75 -0
  155. package/lib/services/translation/outputLanguage.d.ts.map +1 -0
  156. package/lib/services/translation/outputLanguage.js +190 -0
  157. package/lib/services/translation/translation.service.d.ts +13 -2
  158. package/lib/services/translation/translation.service.d.ts.map +1 -1
  159. package/lib/services/translation/translation.service.js +73 -31
  160. package/lib/services/tts/index.d.ts +1 -0
  161. package/lib/services/tts/index.d.ts.map +1 -1
  162. package/lib/services/tts/index.js +1 -0
  163. package/lib/services/tts/providers/elevenlabs.service.d.ts +7 -0
  164. package/lib/services/tts/providers/elevenlabs.service.d.ts.map +1 -1
  165. package/lib/services/tts/providers/elevenlabs.service.js +69 -13
  166. package/lib/services/tts/types.d.ts +29 -0
  167. package/lib/services/tts/types.d.ts.map +1 -1
  168. package/lib/services/tts/wordTimings.d.ts +27 -0
  169. package/lib/services/tts/wordTimings.d.ts.map +1 -0
  170. package/lib/services/tts/wordTimings.js +57 -0
  171. package/lib/utils/billableDuration.d.ts +11 -0
  172. package/lib/utils/billableDuration.d.ts.map +1 -0
  173. package/lib/utils/billableDuration.js +91 -0
  174. package/lib/utils/index.d.ts +3 -0
  175. package/lib/utils/index.d.ts.map +1 -1
  176. package/lib/utils/index.js +3 -0
  177. package/lib/utils/mp4Duration.d.ts +38 -0
  178. package/lib/utils/mp4Duration.d.ts.map +1 -0
  179. package/lib/utils/mp4Duration.js +164 -0
  180. package/lib/utils/socialEntitlements.d.ts +51 -0
  181. package/lib/utils/socialEntitlements.d.ts.map +1 -0
  182. package/lib/utils/socialEntitlements.js +65 -0
  183. package/package.json +1 -1
@@ -11,6 +11,7 @@ const aiModels_1 = require("../../../../globals/aiModels");
11
11
  const types_1 = require("../../../../globals/types");
12
12
  const firebase_1 = require("../../../../libs/firebase");
13
13
  const helpers_2 = require("../../../../utils/helpers");
14
+ const mp4Duration_1 = require("../../../../utils/mp4Duration");
14
15
  const logger_1 = require("../../../../utils/logger");
15
16
  const errors_1 = require("../../../../utils/errors");
16
17
  const transientRetry_1 = require("../../transientRetry");
@@ -138,6 +139,13 @@ class PixVerseService extends baseAiGenProvider_service_1.BaseAiGenProviderServi
138
139
  // Extend a previously-generated PixVerse video. Takes the prior video_id;
139
140
  // returns a new task whose status is polled via the same /result/{id} endpoint.
140
141
  if (params.endpoint === "extend") {
142
+ // Backstop matching kling.service: reject rather than silently falling
143
+ // through to plain generation, which would return a brand-new clip while
144
+ // the caller believed their video had been continued.
145
+ if (!(0, aiModels_1.modelSupportsExtend)(params.modelKey)) {
146
+ throw new Error(`${params.modelKey} has no PixVerse video-extend endpoint. ` +
147
+ `Extend-capable: ${[...aiModels_1.EXTEND_CAPABLE_MODELS].join(", ")}.`);
148
+ }
141
149
  if (!params.sourceTaskId) {
142
150
  throw new Error("sourceTaskId (prior PixVerse video_id) is required for video extension");
143
151
  }
@@ -320,6 +328,12 @@ class PixVerseService extends baseAiGenProvider_service_1.BaseAiGenProviderServi
320
328
  errorMessage: `Unknown PixVerse status: ${status}`,
321
329
  };
322
330
  }
331
+ // NOTE: unlike Kling, PixVerse's /video/result payload carries NO clip
332
+ // length. Verified against the official docs 2026-07-24 — the whole Resp
333
+ // object is {create_time, id, modify_time, negative_prompt, outputHeight,
334
+ // outputWidth, prompt, resolution_ratio, seed, size, status, style, url},
335
+ // and `size` is bytes. So there is no field to read: the delivered length
336
+ // is measured from the downloaded file below (see readMp4DurationSec).
323
337
  const sourceVideoUrl = data?.Resp?.url;
324
338
  if (!sourceVideoUrl) {
325
339
  return {
@@ -333,6 +347,16 @@ class PixVerseService extends baseAiGenProvider_service_1.BaseAiGenProviderServi
333
347
  throw new Error(`Failed to download PixVerse video (${videoResp.status})`);
334
348
  }
335
349
  const buffer = Buffer.from(await videoResp.arrayBuffer());
350
+ // Measure the DELIVERED length off the bytes we already hold, since the
351
+ // API never reports it. Matters most for `endpoint:"extend"`, where the
352
+ // extend body deliberately sends no duration and PixVerse appends a fixed
353
+ // native increment — billing the requested duration there over-charges.
354
+ // Returns undefined for anything unreadable, in which case finalization
355
+ // keeps billing the requested duration exactly as before.
356
+ const durationSec = (0, mp4Duration_1.readMp4DurationSec)(buffer);
357
+ if (durationSec === undefined) {
358
+ logger_1.logger.warn("PixVerse: could not read delivered duration from the downloaded clip — billing will use the requested duration", { task, bytes: buffer.length });
359
+ }
336
360
  // ---- Upload to Firebase ----
337
361
  const filePath = `${outputFilePath}/${outputFilename}.mp4`;
338
362
  const bucket = (0, firebase_1.getBucket)();
@@ -353,6 +377,7 @@ class PixVerseService extends baseAiGenProvider_service_1.BaseAiGenProviderServi
353
377
  return {
354
378
  videoUrl: publicVideoUrl,
355
379
  status: types_1.EVideoSceneStatus.COMPLETED,
380
+ durationSec,
356
381
  };
357
382
  }
358
383
  // =========================================================
@@ -102,6 +102,26 @@ export interface VideoStatusResult {
102
102
  status: EVideoSceneStatus;
103
103
  videoUrl?: string;
104
104
  errorMessage?: string;
105
+ /**
106
+ * ACTUAL length of the delivered clip, in seconds, when the provider reports
107
+ * it. Billing must prefer this over the REQUESTED duration: the two diverge
108
+ * whenever a provider ignores or clamps the requested value.
109
+ *
110
+ * The motivating case is video-extend. `buildExtendBody()` (Kling) and the
111
+ * Pixverse `/extend/generate` body deliberately send no `duration` — both
112
+ * providers append a fixed native increment (~5s / ~5-8s) — yet every billing
113
+ * site priced from the requested duration, so `endpoint:"extend"` with
114
+ * `duration:10` charged for 10s of generation and delivered ~5s. On
115
+ * kling-v2-master that is 28 credits for a 14-credit clip.
116
+ *
117
+ * Kling already returns this (`task_result.videos[].duration`, seconds as a
118
+ * string); it was parsed for `.url` only and discarded. Providers that don't
119
+ * report a length leave this undefined and billing falls back to the
120
+ * requested duration, exactly as before.
121
+ *
122
+ * See notes/UTILITY_TOOLS_LAUNCH_PLAN.md §1.5.1.
123
+ */
124
+ durationSec?: number;
105
125
  }
106
126
  export interface VideoStatusParams {
107
127
  task: TVideoJobTask;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/services/aiGen/providers/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/services/aiGen/providers/types.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,cAAc,EACd,eAAe,EAChB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,iBAAiB,EACjB,aAAa,EACd,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AAC9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAEtE,MAAM,WAAW,qBAAqB;IAEpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,eAAe,CAAC;IAC1B,4FAA4F;IAC5F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,IAAI,CAAC,EAAE,eAAe,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;IAE7D;;;;;OAKG;IACH,QAAQ,CAAC,EACL,eAAe,GACf,gBAAgB,GAChB,gBAAgB,GAChB,oBAAoB,GACpB,QAAQ,GACR,YAAY,GACZ,QAAQ,GACR,MAAM,GACN,WAAW,GACX,gBAAgB,CAAC;IAGrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uGAAuG;IACvG,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,0FAA0F;IAC1F,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,2DAA2D;IAC3D,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,+DAA+D;IAC/D,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAG9B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,6FAA6F;IAC7F,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAG3B,UAAU,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,OAAO,CAAC,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1E,YAAY,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC;IAG/C,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oFAAoF;IACpF,YAAY,CAAC,EAAE,KAAK,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,KAAK,CAAC;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC/C,CAAC,CAAC;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IAGtB,oFAAoF;IACpF,gBAAgB,CAAC,EAAE,WAAW,GAAG,aAAa,GAAG,YAAY,CAAC;IAC9D,iCAAiC;IACjC,qBAAqB,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAGvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kGAAkG;IAClG,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,iBAAiB,CAAC,SAAS,CAAC;IACpC,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;;;;;;;;;;;OAkBG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CAEtB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,EAAE,eAAe,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IAEnC,KAAK,EAAE,GAAG,CAAC;IACX,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gDAAgD;IAChD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,iBAAiB,GAAG,MAAM,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,oFAAoF;IACpF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,OAAO,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;IAC7C,sEAAsE;IACtE,UAAU,CAAC,EAAE,QAAQ,GAAG,aAAa,GAAG,MAAM,CAAC;IAC/C,YAAY,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IACvC,6BAA6B;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc;IACd,gBAAgB,CAAC,EAAE,WAAW,GAAG,aAAa,GAAG,YAAY,CAAC;IAC9D,+CAA+C;IAC/C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,6CAA6C;IAC7C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kEAAkE;IAClE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,oFAAoF;IACpF,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,eAAe,CAAC;IAC1B,wEAAwE;IACxE,MAAM,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,cAAc,EAAE,MAAM,CAAC;IACvB,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,aAAa,CAAC;IACxB,iFAAiF;IACjF,MAAM,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,cAAc,EAAE,MAAM,CAAC;IACvB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8EAA8E;IAC9E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iEAAiE;IACjE,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EACJ,eAAe,GACf,cAAc,GACd,iBAAiB,GACjB,eAAe,GACf,aAAa,CAAC;IAClB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IACxC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,uFAAuF;IACvF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
@@ -1 +1 @@
1
- {"version":3,"file":"avatarProviderFactory.d.ts","sourceRoot":"","sources":["../../../src/services/avatarGen/avatarProviderFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AA4ClF,oFAAoF;AACpF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAEhE;AAED,kFAAkF;AAClF,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,eAAe,GACxB,kBAAkB,GAAG,SAAS,CAEhC;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAEtE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,eAAe,GACxB,oBAAoB,CAMtB"}
1
+ {"version":3,"file":"avatarProviderFactory.d.ts","sourceRoot":"","sources":["../../../src/services/avatarGen/avatarProviderFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAgDlF,oFAAoF;AACpF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAEhE;AAED,kFAAkF;AAClF,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,eAAe,GACxB,kBAAkB,GAAG,SAAS,CAEhC;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAEtE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,eAAe,GACxB,oBAAoB,CAMtB"}
@@ -7,11 +7,13 @@ exports.getAvatarVideoProvider = getAvatarVideoProvider;
7
7
  const aiModels_1 = require("../../globals/aiModels");
8
8
  const heygenAvatarProvider_1 = require("./providers/heygenAvatarProvider");
9
9
  const klingAvatarProvider_1 = require("./providers/klingAvatarProvider");
10
+ const synthesiaAvatarProvider_1 = require("./providers/synthesiaAvatarProvider");
10
11
  const tavusAvatarProvider_1 = require("./providers/tavusAvatarProvider");
11
12
  const avatarProviderMap = {
12
13
  [aiModels_1.EVideoGenModels.KLING_AVATAR]: (modelKey) => new klingAvatarProvider_1.KlingAvatarProvider(modelKey),
13
14
  [aiModels_1.EVideoGenModels.HEYGEN_AVATAR]: (modelKey) => new heygenAvatarProvider_1.HeyGenAvatarProvider(modelKey),
14
15
  [aiModels_1.EVideoGenModels.TAVUS_AVATAR]: (modelKey) => new tavusAvatarProvider_1.TavusAvatarProvider(modelKey),
16
+ [aiModels_1.EVideoGenModels.SYNTHESIA_AVATAR]: (modelKey) => new synthesiaAvatarProvider_1.SynthesiaAvatarProvider(modelKey),
15
17
  };
16
18
  /**
17
19
  * Static capability lookup, keyed off each provider's `CAPABILITIES` constant —
@@ -24,6 +26,7 @@ const avatarCapabilityMap = {
24
26
  [aiModels_1.EVideoGenModels.KLING_AVATAR]: klingAvatarProvider_1.KlingAvatarProvider.CAPABILITIES,
25
27
  [aiModels_1.EVideoGenModels.HEYGEN_AVATAR]: heygenAvatarProvider_1.HeyGenAvatarProvider.CAPABILITIES,
26
28
  [aiModels_1.EVideoGenModels.TAVUS_AVATAR]: tavusAvatarProvider_1.TavusAvatarProvider.CAPABILITIES,
29
+ [aiModels_1.EVideoGenModels.SYNTHESIA_AVATAR]: synthesiaAvatarProvider_1.SynthesiaAvatarProvider.CAPABILITIES,
27
30
  };
28
31
  /** True if `modelKey` is an avatar model handled by a dedicated avatar provider. */
29
32
  function isAvatarModel(modelKey) {
@@ -3,4 +3,5 @@ export * from "./avatarProviderFactory";
3
3
  export * from "./providers/klingAvatarProvider";
4
4
  export * from "./providers/heygenAvatarProvider";
5
5
  export * from "./providers/tavusAvatarProvider";
6
+ export * from "./providers/synthesiaAvatarProvider";
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/avatarGen/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iCAAiC,CAAC;AAChD,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/avatarGen/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iCAAiC,CAAC;AAChD,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC"}
@@ -19,3 +19,4 @@ __exportStar(require("./avatarProviderFactory"), exports);
19
19
  __exportStar(require("./providers/klingAvatarProvider"), exports);
20
20
  __exportStar(require("./providers/heygenAvatarProvider"), exports);
21
21
  __exportStar(require("./providers/tavusAvatarProvider"), exports);
22
+ __exportStar(require("./providers/synthesiaAvatarProvider"), exports);
@@ -0,0 +1,53 @@
1
+ import { EVideoGenModels } from "../../../globals/aiModels";
2
+ import { AvatarCapabilities, AvatarGenerateRequest, AvatarStatusQuery, AvatarStatusResult, AvatarSubmitResult, EAvatarEngine, IAvatarVideoProvider } from "../IAvatarVideoProvider";
3
+ /**
4
+ * Synthesia avatar engine — a HOSTED engine (the caller picks a Synthesia stock
5
+ * or personal avatar + voice and supplies a script; Synthesia does its own TTS +
6
+ * lipsync in one render). Positioned as the enterprise/compliance tier: studio
7
+ * presenters across 140+ languages for regulated buyers.
8
+ *
9
+ * Contract (Synthesia API v2, verified 2026-07-19 against docs.synthesia.io):
10
+ * • submit : POST /v2/videos
11
+ * { test, title, visibility, aspectRatio,
12
+ * input: [{ avatar, background, scriptText,
13
+ * avatarSettings: { voice? } }] } → { id, status }
14
+ * • status : GET /v2/videos/{id}
15
+ * → { status, download, duration, thumbnail, ... }
16
+ * status enum: in_progress | approved | complete | error |
17
+ * rejected | deleted (`download` set when complete)
18
+ * • auth : Authorization: Bearer <key> (header-based)
19
+ *
20
+ * NO ISupportsHostedCatalog: Synthesia exposes stock avatars/voices as static
21
+ * reference tables (IDs are copied from the web app), not a stable list REST
22
+ * endpoint — so the catalog capability is DEFERRED (per the Reach plan §2.4,
23
+ * "Catalog (defer to Phase 4+)"). Selection is by known avatar/voice id today.
24
+ *
25
+ * Standalone class — Synthesia has no place in the generic video factory; avatar
26
+ * gen is its own concern (see IAvatarVideoProvider). Transport (auth + timeout +
27
+ * retry) is owned here, mirroring HeyGen/Tavus.
28
+ *
29
+ * Runtime is gated on SYNTHESIA_API_KEY (enterprise plan). Until that key is in
30
+ * the env stores the constructor throws — the intended "wired but not enabled"
31
+ * state for the enterprise tier.
32
+ */
33
+ export declare class SynthesiaAvatarProvider implements IAvatarVideoProvider {
34
+ private readonly modelKey;
35
+ /** Static so callers can branch on capability without constructing (which
36
+ * would require SYNTHESIA_API_KEY just to read the input mode). */
37
+ static readonly CAPABILITIES: AvatarCapabilities;
38
+ readonly engine = EAvatarEngine.SYNTHESIA;
39
+ readonly capabilities: AvatarCapabilities;
40
+ private readonly baseUrl;
41
+ private readonly apiKey;
42
+ private readonly submitTimeout;
43
+ private readonly statusTimeout;
44
+ /** Synthesia requires a named background; "off_white" is a built-in studio bg. */
45
+ private readonly defaultBackground;
46
+ constructor(modelKey?: EVideoGenModels);
47
+ generate(req: AvatarGenerateRequest): Promise<AvatarSubmitResult>;
48
+ checkStatus(query: AvatarStatusQuery): Promise<AvatarStatusResult>;
49
+ private request;
50
+ /** Retries transient network/timeout/429 failures with a small backoff. */
51
+ private requestWithRetry;
52
+ }
53
+ //# sourceMappingURL=synthesiaAvatarProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synthesiaAvatarProvider.d.ts","sourceRoot":"","sources":["../../../../src/services/avatarGen/providers/synthesiaAvatarProvider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAG5D,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,oBAAoB,EACrB,MAAM,yBAAyB,CAAC;AAEjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,uBAAwB,YAAW,oBAAoB;IAqBhE,OAAO,CAAC,QAAQ,CAAC,QAAQ;IApB3B;wEACoE;IACpE,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,kBAAkB,CAI9C;IAEF,QAAQ,CAAC,MAAM,2BAA2B;IAC1C,QAAQ,CAAC,YAAY,qBAAwC;IAE7D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAW;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAU;IAExC,kFAAkF;IAClF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAe;gBAG9B,QAAQ,GAAE,eAAkD;IAQzE,QAAQ,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA6CjE,WAAW,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;YAoC1D,OAAO;IA0BrB,2EAA2E;YAC7D,gBAAgB;CAsD/B"}
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SynthesiaAvatarProvider = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const aiModels_1 = require("../../../globals/aiModels");
9
+ const types_1 = require("../../../globals/types");
10
+ const logger_1 = require("../../../utils/logger");
11
+ const IAvatarVideoProvider_1 = require("../IAvatarVideoProvider");
12
+ /**
13
+ * Synthesia avatar engine — a HOSTED engine (the caller picks a Synthesia stock
14
+ * or personal avatar + voice and supplies a script; Synthesia does its own TTS +
15
+ * lipsync in one render). Positioned as the enterprise/compliance tier: studio
16
+ * presenters across 140+ languages for regulated buyers.
17
+ *
18
+ * Contract (Synthesia API v2, verified 2026-07-19 against docs.synthesia.io):
19
+ * • submit : POST /v2/videos
20
+ * { test, title, visibility, aspectRatio,
21
+ * input: [{ avatar, background, scriptText,
22
+ * avatarSettings: { voice? } }] } → { id, status }
23
+ * • status : GET /v2/videos/{id}
24
+ * → { status, download, duration, thumbnail, ... }
25
+ * status enum: in_progress | approved | complete | error |
26
+ * rejected | deleted (`download` set when complete)
27
+ * • auth : Authorization: Bearer <key> (header-based)
28
+ *
29
+ * NO ISupportsHostedCatalog: Synthesia exposes stock avatars/voices as static
30
+ * reference tables (IDs are copied from the web app), not a stable list REST
31
+ * endpoint — so the catalog capability is DEFERRED (per the Reach plan §2.4,
32
+ * "Catalog (defer to Phase 4+)"). Selection is by known avatar/voice id today.
33
+ *
34
+ * Standalone class — Synthesia has no place in the generic video factory; avatar
35
+ * gen is its own concern (see IAvatarVideoProvider). Transport (auth + timeout +
36
+ * retry) is owned here, mirroring HeyGen/Tavus.
37
+ *
38
+ * Runtime is gated on SYNTHESIA_API_KEY (enterprise plan). Until that key is in
39
+ * the env stores the constructor throws — the intended "wired but not enabled"
40
+ * state for the enterprise tier.
41
+ */
42
+ class SynthesiaAvatarProvider {
43
+ constructor(modelKey = aiModels_1.EVideoGenModels.SYNTHESIA_AVATAR) {
44
+ this.modelKey = modelKey;
45
+ this.engine = IAvatarVideoProvider_1.EAvatarEngine.SYNTHESIA;
46
+ this.capabilities = SynthesiaAvatarProvider.CAPABILITIES;
47
+ this.baseUrl = "https://api.synthesia.io";
48
+ this.submitTimeout = 120000; // 2 min — submit can be slow under load
49
+ this.statusTimeout = 60000; // 1 min — status should be fast
50
+ /** Synthesia requires a named background; "off_white" is a built-in studio bg. */
51
+ this.defaultBackground = "off_white";
52
+ if (!process.env.SYNTHESIA_API_KEY) {
53
+ throw new Error("Missing SYNTHESIA_API_KEY in environment variables");
54
+ }
55
+ this.apiKey = process.env.SYNTHESIA_API_KEY;
56
+ }
57
+ async generate(req) {
58
+ if (req.mode !== "hosted") {
59
+ throw new Error(`SynthesiaAvatarProvider only supports hosted requests (got "${req.mode}")`);
60
+ }
61
+ // Synthesia's clip carries the avatar + script; the voice is set on
62
+ // avatarSettings.voice (optional — omit to use the avatar's default voice).
63
+ const avatarSettings = {
64
+ style: "rectangular",
65
+ };
66
+ if (req.hostedVoiceId) {
67
+ avatarSettings.voice = req.hostedVoiceId;
68
+ }
69
+ const body = {
70
+ test: false,
71
+ visibility: "private",
72
+ title: `vidspot-${req.hostedAvatarId}-${req.script.slice(0, 24)}`,
73
+ input: [
74
+ {
75
+ avatar: req.hostedAvatarId,
76
+ background: this.defaultBackground,
77
+ scriptText: req.script,
78
+ avatarSettings,
79
+ },
80
+ ],
81
+ };
82
+ const data = await this.request("/v2/videos", "POST", body, this.submitTimeout);
83
+ const videoId = data?.id;
84
+ if (!videoId) {
85
+ throw new Error(`Synthesia submit returned no id: ${JSON.stringify(data?.message ?? data)}`);
86
+ }
87
+ return { providerTaskId: videoId };
88
+ }
89
+ async checkStatus(query) {
90
+ const data = await this.requestWithRetry(`/v2/videos/${encodeURIComponent(query.providerTaskId)}`, "GET", undefined, this.statusTimeout);
91
+ // Synthesia status enum: in_progress | approved | complete | error |
92
+ // rejected | deleted. Only `complete` (with a download URL) is terminal-ok;
93
+ // `approved` is a moderation-passed intermediate that still renders.
94
+ if (data?.status === "complete" && data.download) {
95
+ return {
96
+ status: types_1.EVideoSceneStatus.COMPLETED,
97
+ videoUrl: data.download,
98
+ };
99
+ }
100
+ if (data?.status === "error" ||
101
+ data?.status === "rejected" ||
102
+ data?.status === "deleted") {
103
+ return {
104
+ status: types_1.EVideoSceneStatus.FAILED,
105
+ errorMessage: `Synthesia render ${data.status}`,
106
+ };
107
+ }
108
+ return { status: types_1.EVideoSceneStatus.PENDING };
109
+ }
110
+ // ─── Transport ────────────────────────────────────────────────────────────
111
+ async request(endpoint, method, body, timeout = this.submitTimeout) {
112
+ const config = {
113
+ method,
114
+ url: `${this.baseUrl}${endpoint}`,
115
+ headers: {
116
+ Authorization: `Bearer ${this.apiKey}`,
117
+ "Content-Type": "application/json",
118
+ },
119
+ timeout,
120
+ data: body,
121
+ };
122
+ const response = await axios_1.default.request(config);
123
+ if (response.status < 200 || response.status >= 300) {
124
+ throw new Error(`Synthesia API Error: ${response.status} ${response.statusText} — ${JSON.stringify(response.data)}`);
125
+ }
126
+ return response.data;
127
+ }
128
+ /** Retries transient network/timeout/429 failures with a small backoff. */
129
+ async requestWithRetry(endpoint, method, body, timeout = this.statusTimeout, maxAttempts = 4) {
130
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
131
+ try {
132
+ return await this.request(endpoint, method, body, timeout);
133
+ }
134
+ catch (err) {
135
+ const e = err;
136
+ const httpStatus = e.response?.status;
137
+ const isTimeout = e.code === "ECONNABORTED" || (e.message?.includes("timeout") ?? false);
138
+ const isNetworkError = e.code === "ECONNRESET" ||
139
+ e.code === "ECONNREFUSED" ||
140
+ e.code === "ENOTFOUND" ||
141
+ e.code === "ERR_NETWORK";
142
+ const isRateLimit = httpStatus === 429;
143
+ const isRetryable = isTimeout || isNetworkError || isRateLimit;
144
+ if (!isRetryable || attempt === maxAttempts) {
145
+ logger_1.logger.error("Synthesia request failed (non-retryable or max attempts)", {
146
+ endpoint,
147
+ attempt,
148
+ maxAttempts,
149
+ httpStatus,
150
+ errorCode: e.code,
151
+ errorMessage: e.message,
152
+ });
153
+ throw err;
154
+ }
155
+ const backoffMs = isRateLimit ? 10000 : 1000;
156
+ logger_1.logger.warn("Synthesia request failed — retrying", {
157
+ endpoint,
158
+ attempt,
159
+ maxAttempts,
160
+ httpStatus,
161
+ backoffMs,
162
+ });
163
+ await new Promise((r) => setTimeout(r, backoffMs));
164
+ }
165
+ }
166
+ throw new Error("Unreachable");
167
+ }
168
+ }
169
+ exports.SynthesiaAvatarProvider = SynthesiaAvatarProvider;
170
+ /** Static so callers can branch on capability without constructing (which
171
+ * would require SYNTHESIA_API_KEY just to read the input mode). */
172
+ SynthesiaAvatarProvider.CAPABILITIES = {
173
+ inputMode: "hosted",
174
+ nativeTts: true,
175
+ multiSceneSplit: false,
176
+ };
@@ -25,6 +25,13 @@ export interface DemoAuthorDeps {
25
25
  * DEMO_GEN_ASSETS_DISABLED kill-switch.
26
26
  */
27
27
  allowGeneratedAssets?: boolean;
28
+ /**
29
+ * Allow the planner to resolve real STOCK-library assets (`source:"stock"`).
30
+ * Defaults to whether a stock provider is configured (`stockAssetsAvailable()`),
31
+ * so stock lights up automatically once a PEXELS/PIXABAY/UNSPLASH key is set —
32
+ * no separate flag. Pass explicitly to override.
33
+ */
34
+ allowStockAssets?: boolean;
28
35
  }
29
36
  export interface DemoAuthorResult extends NormalizeResult {
30
37
  /** Model that produced the spec (primary or fallback). */
@@ -1 +1 @@
1
- {"version":3,"file":"demoAuthor.d.ts","sourceRoot":"","sources":["../../../src/services/demo/demoAuthor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EACL,eAAe,EAGhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAqB,MAAM,uBAAuB,CAAC;AAqB3E,MAAM,WAAW,cAAc;IAC7B,yDAAyD;IACzD,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,uDAAuD;IACvD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,kFAAkF;IAClF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,0DAA0D;IAC1D,SAAS,EAAE,WAAW,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9D;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,eAAe,EACtB,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,gBAAgB,CAAC,CAgD3B"}
1
+ {"version":3,"file":"demoAuthor.d.ts","sourceRoot":"","sources":["../../../src/services/demo/demoAuthor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EACL,eAAe,EAGhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAqB,MAAM,uBAAuB,CAAC;AAsB3E,MAAM,WAAW,cAAc;IAC7B,yDAAyD;IACzD,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,uDAAuD;IACvD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,kFAAkF;IAClF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,0DAA0D;IAC1D,SAAS,EAAE,WAAW,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9D;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,eAAe,EACtB,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,gBAAgB,CAAC,CAiD3B"}
@@ -6,6 +6,7 @@ const llmCallerRegistry_1 = require("../agent/llmCallerRegistry");
6
6
  const modelRouter_1 = require("../agent/modelRouter");
7
7
  const demoAuthorPrompt_1 = require("./demoAuthorPrompt");
8
8
  const demoAuthorNormalize_1 = require("./demoAuthorNormalize");
9
+ const demoStockAssets_1 = require("./demoStockAssets");
9
10
  /**
10
11
  * DemoSpec author — the "plan" stage of the SaaS Demo Video pipeline (plan
11
12
  * Phase 3 / §4 stage 2).
@@ -44,6 +45,7 @@ async function authorDemoSpec(input, deps = {}) {
44
45
  const system = (0, demoAuthorPrompt_1.buildDemoAuthorSystemPrompt)({
45
46
  allowCustomScenes: deps.allowCustomScenes,
46
47
  allowGeneratedAssets: deps.allowGeneratedAssets,
48
+ allowStockAssets: deps.allowStockAssets ?? (0, demoStockAssets_1.stockAssetsAvailable)(),
47
49
  });
48
50
  const userText = (0, demoAuthorPrompt_1.buildDemoAuthorUserText)(cappedInput);
49
51
  const result = await llm.structured({
@@ -95,6 +95,12 @@ export interface DemoAuthorPromptOpts {
95
95
  * worker passes false only under the DEMO_GEN_ASSETS_DISABLED kill-switch.
96
96
  */
97
97
  allowGeneratedAssets?: boolean;
98
+ /**
99
+ * Allow the planner to resolve real STOCK-library assets (`source:"stock"`).
100
+ * The worker passes true only when a stock provider is configured
101
+ * (`stockAssetsAvailable()`); ignored when generation is disabled entirely.
102
+ */
103
+ allowStockAssets?: boolean;
98
104
  }
99
105
  export declare function buildDemoAuthorSystemPrompt(opts?: DemoAuthorPromptOpts): string;
100
106
  /** Build the user-turn text (images are attached separately as imageUrls). */
@@ -1 +1 @@
1
- {"version":3,"file":"demoAuthorPrompt.d.ts","sourceRoot":"","sources":["../../../src/services/demo/demoAuthorPrompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EACL,uBAAuB,EACvB,eAAe,EACf,uBAAuB,EACxB,MAAM,qCAAqC,CAAC;AAE7C;;;;;;;;;;;;;;;GAeG;AAMH,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CACnC,WAAW,CAAC,uBAAuB,CAAC,cAAc,CAAC,CAAC,EACpD,cAAc,CAQf,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,uBAAuB,EAAE,cAA6C,CAAC;AAEpF,wBAAgB,eAAe,CAC7B,YAAY,EAAE,uBAAuB,CAAC,cAAc,CAAC,GAAG,SAAS,GAChE,cAAc,CAEhB;AAID;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,+EAA+E;IAC/E,WAAW,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,KAAK,EAAE,SAAS,CAAC;IACjB,qGAAqG;IACrG,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC,8FAA8F;IAC9F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+FAA+F;IAC/F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,OAAO,CAAC,EAAE,uBAAuB,CAAC;IAClC;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;CAC1D;AAwFD;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,wBAAgB,2BAA2B,CAAC,IAAI,GAAE,oBAAyB,GAAG,MAAM,CA0CnF;AAmED,8EAA8E;AAC9E,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CA+CtE"}
1
+ {"version":3,"file":"demoAuthorPrompt.d.ts","sourceRoot":"","sources":["../../../src/services/demo/demoAuthorPrompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EACL,uBAAuB,EACvB,eAAe,EACf,uBAAuB,EACxB,MAAM,qCAAqC,CAAC;AAE7C;;;;;;;;;;;;;;;GAeG;AAMH,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CACnC,WAAW,CAAC,uBAAuB,CAAC,cAAc,CAAC,CAAC,EACpD,cAAc,CAQf,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,uBAAuB,EAAE,cAA6C,CAAC;AAEpF,wBAAgB,eAAe,CAC7B,YAAY,EAAE,uBAAuB,CAAC,cAAc,CAAC,GAAG,SAAS,GAChE,cAAc,CAEhB;AAID;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,+EAA+E;IAC/E,WAAW,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,KAAK,EAAE,SAAS,CAAC;IACjB,qGAAqG;IACrG,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC,8FAA8F;IAC9F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+FAA+F;IAC/F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,OAAO,CAAC,EAAE,uBAAuB,CAAC;IAClC;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;CAC1D;AAqGD;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAgB,2BAA2B,CAAC,IAAI,GAAE,oBAAyB,GAAG,MAAM,CAmDnF;AAmED,8EAA8E;AAC9E,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CA+CtE"}
@@ -80,6 +80,18 @@ HOW to write the generation prompt (you are prompting a top image/video model):
80
80
  Caps: at most 4 images + 1 video per spec (requests beyond the cap are dropped in declaration order — declare the most important first).`;
81
81
  const GENERATED_MEDIA_DISALLOWED = `
82
82
  Do NOT declare generatedAssets and do NOT cite any "gen://" URL — asset generation is disabled; use only provided media.`;
83
+ /**
84
+ * Stock-library addendum — appended only when a stock provider is configured
85
+ * (see stockAssetsAvailable()). Lets the planner resolve a real photo/clip from a
86
+ * licensed library instead of paying a generative model, for generic real-world
87
+ * subjects where a stock shot is as good or better. Same declaration + gen://
88
+ * citation mechanism, distinguished by source:"stock" + a search query.
89
+ */
90
+ const STOCK_MEDIA_ALLOWED = `
91
+ STOCK MEDIA (a real, free, licensed library is available — prefer it over generation for GENERIC real-world subjects):
92
+ - To use a stock asset, declare it in generatedAssets[] with source:"stock", a kind ("image"|"video"), and query (2–5 plain search words — the subject only, NO brand names, NO UI text; e.g. "founder laptop cafe", "city street night"). Omit/ignore the generation prompt for stock (a short prompt is fine as a description but query drives the search). Cite it exactly like a generated asset: "gen://<id>".
93
+ - PREFER source:"stock" over source:"generated" when the subject is a common real-world thing (people working, places, objects, nature, devices) — it's instant, free, and photoreal. RESERVE source:"generated" for subjects a library won't have: your product's specific look, surreal/branded compositions, exact palette-matched abstract motion backdrops.
94
+ - A stock miss degrades exactly like a failed generation (ref stripped, beat falls back to its coded surface) — so still never author a beat that is EMPTY without the asset.`;
83
95
  const STYLE_TAXONOMY = `
84
96
  STYLE (top-level, cross-cutting — re-skins EVERY scene; this is the anti-overfit axis):
85
97
  - visual: clean-ui-walkthrough | split-headline | kinetic-typography | cinematic | minimal-calm | energetic-punchy
@@ -100,8 +112,9 @@ function buildDemoAuthorSystemPrompt(opts = {}) {
100
112
  const customGuidance = opts.allowCustomScenes
101
113
  ? CUSTOM_SCENE_ALLOWED
102
114
  : CUSTOM_SCENE_DISALLOWED;
103
- const generatedMediaGuidance = opts.allowGeneratedAssets !== false
104
- ? GENERATED_MEDIA_ALLOWED
115
+ const genAllowed = opts.allowGeneratedAssets !== false;
116
+ const generatedMediaGuidance = genAllowed
117
+ ? GENERATED_MEDIA_ALLOWED + (opts.allowStockAssets ? `\n${STOCK_MEDIA_ALLOWED}` : "")
105
118
  : GENERATED_MEDIA_DISALLOWED;
106
119
  return `You are the lead motion designer + creative director for VidSpotAI's autonomous SaaS product-demo generator. You author a single DemoSpec (returned via the provided tool) that a Remotion engine renders to a broadcast-quality MP4 with ZERO further human effort. Your bar is "better than a hand-made Product Hunt launch video."
107
120
 
@@ -128,6 +141,15 @@ QUALITY BAR (observed in the reference demos — hit all of these):
128
141
  - Write a caption{title,sub?} for beats that carry a narration point (skip captions on pure kinetic/music beats). Seed narrationHint on feature beats for the later voiceover stage.
129
142
  - Prefer deviceMockup / splitFeature.screenshotUrl for authenticated apps you cannot convincingly fake; prefer coded featureShowcase when you want a cursor walkthrough and can plausibly synthesize the surface.
130
143
 
144
+ CONTENTFUL SURFACES — every coded product UI must look POPULATED, never hollow (hard quality gate; empty UI reads as broken and sinks the whole video):
145
+ - Fill it or omit it. Every surface/region you invoke (featureShowcase surfaces, chat turns, dashboard tiles, editor rows, analysis findings, table rows, card grids) MUST be filled with real, specific, domain-accurate content. NEVER emit a featureShowcase/cardGrid/surface with an empty or near-empty cards array — an unpopulated surface renders as blank chrome. If you can't supply genuine content for a region, don't include that region (e.g. don't ask for a sidebar/panel/stat you can't fill).
146
+ - Right shape, at least 3 items where the surface is a list: search → 3–5 results, each title + subtitle + badge; dashboard → 3–4 stats, each a value (+ an icon, and a delta only if truthful); editor → labelled property rows (label + value, e.g. Caption / Trim / Music / Brand); analysis or scene-plan → findings each a label (+ optional sub + a timecode badge); chat → alternating user/assistant turns with real copy. Give search/editor/dashboard cards an \`icon\` so tiles/rows carry a glyph.
147
+ - NO EMPTY ASSET SLOTS. Never leave a blank avatar, poster, logo, or thumbnail hole. The engine auto-fills these — a person → initials from userName, a video/result tile → brand-gradient poster + play glyph, the product chrome → brand fills — but ONLY when you provide the underlying content (a userName, card titles, subtitles). Supply that content; do not describe an empty frame.
148
+
149
+ ASSETS (images / video / music / voiceover) — prefer REAL, ask FIRST, improvise LAST, never leave a hole:
150
+ - Order of preference for any asset that would materially raise quality (hero screenshot, presenter photo, B-roll, logo): (a) a user-attached asset (Featured media / screenshots), else (b) commission it via generatedAssets where GENERATED MEDIA rules allow, else (c) a stock/library asset if the pipeline exposes one, else (d) a synthetic coded surface. Only fall to a coded surface once real imagery is genuinely unavailable — never fabricate an empty placeholder to stand in for a missing asset.
151
+ - Don't FORCE an asset where it adds nothing. A clean coded surface beats a gratuitous stock photo; use imagery only where it earns its place.
152
+
131
153
  DISTINCTIVENESS (every video must feel authored for THIS product, not filled into a house template):
132
154
  - Derive the arc from the product's actual story. "logoReveal → problem → bigStatement → features → stats → cta" is ONE possible skeleton, not the format — reorder, drop, or swap beats whenever the product suggests it: open on the product surface for a visually striking tool, lead with the workflow for hero-workflow, open on a bold claim for value-prop, skip the problem beat for a product whose value is self-evident.
133
155
  - Before returning, check your scene-type sequence: if it matches the generic skeleton out of inertia rather than choice, rework the weakest beat into a different type — or a custom scene.
@@ -0,0 +1,69 @@
1
+ import { IDemoCaptionTrack, IDemoCaptionWord } from "../../models/demoVideoProject.model";
2
+ import { DemoSpec } from "../../schemas/demoSpec.schema";
3
+ /**
4
+ * Caption track construction for the SaaS Demo Video pipeline (audit finding G3).
5
+ *
6
+ * Social feeds autoplay MUTED, so a demo whose whole argument lives in the
7
+ * voiceover says nothing there. This module turns the synthesized narration into
8
+ * readable, word-timed cues that the render burns in, plus an `.srt` sidecar for
9
+ * platforms that accept an upload.
10
+ *
11
+ * The interesting problem is not timing, it's LINE LENGTH: a narration segment is
12
+ * per-scene and can be 30+ words. Drawn as one line that's an unreadable wall, so
13
+ * segments are split into cues sized to what a viewer takes in at a glance,
14
+ * breaking on sentence boundaries wherever the text offers one.
15
+ */
16
+ /**
17
+ * A segment of narration with its words already timed on the VIDEO timeline —
18
+ * i.e. the voicing stage has applied any `atempo` correction and added the
19
+ * segment's `startMs`. This module never sees provider-relative time.
20
+ */
21
+ export interface DemoNarrationTiming {
22
+ /** Scene this narration belongs to (matches DemoScene.id). */
23
+ sceneId: string;
24
+ /** The spoken copy, verbatim — this is what gets displayed. */
25
+ text: string;
26
+ /** Absolute start on the video timeline, ms. */
27
+ startMs: number;
28
+ /** Absolute end on the video timeline, ms (post-compression, slot-clamped). */
29
+ endMs: number;
30
+ /**
31
+ * Absolute-timed words from the provider's character alignment. Empty when the
32
+ * provider returned none — this module then falls back to proportional timing.
33
+ */
34
+ words: IDemoCaptionWord[];
35
+ }
36
+ /**
37
+ * Should this video burn captions into the picture?
38
+ *
39
+ * Portrait and square ALWAYS: those aspects exist for social feeds, which autoplay
40
+ * muted, so an un-captioned vertical cut ships with its argument inaudible. That is
41
+ * exactly the G2/G3 "social does not ship" verdict.
42
+ *
43
+ * Landscape only when the style asked for a captions-led read (`audioIntent`).
44
+ * A 16:9 landing-page or YC cut is watched with sound, and permanent burned-in
45
+ * text there competes with the on-screen lower-thirds the planner already wrote.
46
+ *
47
+ * Pure by design — the `DEMO_CAPTIONS_DISABLED` kill switch is applied by the
48
+ * worker, so this stays trivially testable.
49
+ */
50
+ export declare function shouldBurnCaptions(spec: Pick<DemoSpec, "aspect" | "style">): boolean;
51
+ /**
52
+ * Split timed narration into readable cues.
53
+ *
54
+ * `fromAlignment` records whether the times came from real provider alignment or
55
+ * from proportional estimation, so the QA/report layer can tell an honest
56
+ * karaoke-synced track from a best-effort one.
57
+ */
58
+ export declare function buildCaptionTrack(segments: DemoNarrationTiming[]): IDemoCaptionTrack;
59
+ /**
60
+ * Serialize a caption track as SubRip (`.srt`) — the format YouTube, LinkedIn and
61
+ * Vimeo all accept as an uploaded subtitle file. Shipping this alongside the
62
+ * burned-in captions also makes the narration searchable/indexable, which
63
+ * burned-in pixels never are.
64
+ *
65
+ * A zero-length cue is emitted with a minimum 1ms span rather than dropped: some
66
+ * parsers reject `start == end`, and losing a line is worse than a rounding nudge.
67
+ */
68
+ export declare function captionTrackToSrt(track: IDemoCaptionTrack): string;
69
+ //# sourceMappingURL=demoCaptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demoCaptions.d.ts","sourceRoot":"","sources":["../../../src/services/demo/demoCaptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAEzD;;;;;;;;;;;;GAYG;AAEH;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAsBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,GAAG,OAAO,CAGpF;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,mBAAmB,EAAE,GAAG,iBAAiB,CAuBpF;AAsED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAOlE"}