vidspotai-shared 1.0.94 → 1.0.96

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 (136) hide show
  1. package/lib/globals/aiModels/enums.d.ts +2 -0
  2. package/lib/globals/aiModels/enums.d.ts.map +1 -1
  3. package/lib/globals/aiModels/enums.js +5 -0
  4. package/lib/globals/aiModels/index.d.ts.map +1 -1
  5. package/lib/globals/aiModels/index.js +2 -0
  6. package/lib/globals/aiModels/providers/hostedAvatars.d.ts +22 -0
  7. package/lib/globals/aiModels/providers/hostedAvatars.d.ts.map +1 -0
  8. package/lib/globals/aiModels/providers/hostedAvatars.js +129 -0
  9. package/lib/globals/types.d.ts +58 -1
  10. package/lib/globals/types.d.ts.map +1 -1
  11. package/lib/globals/types.js +61 -1
  12. package/lib/models/demoVideoProject.model.d.ts +244 -0
  13. package/lib/models/demoVideoProject.model.d.ts.map +1 -0
  14. package/lib/models/demoVideoProject.model.js +2 -0
  15. package/lib/models/githubConnection.model.d.ts +35 -0
  16. package/lib/models/githubConnection.model.d.ts.map +1 -0
  17. package/lib/models/githubConnection.model.js +2 -0
  18. package/lib/models/index.d.ts +3 -0
  19. package/lib/models/index.d.ts.map +1 -1
  20. package/lib/models/index.js +3 -0
  21. package/lib/models/outreach.model.d.ts +175 -0
  22. package/lib/models/outreach.model.d.ts.map +1 -0
  23. package/lib/models/outreach.model.js +2 -0
  24. package/lib/models/video.model.d.ts +4 -0
  25. package/lib/models/video.model.d.ts.map +1 -1
  26. package/lib/schemas/brandKit.schema.d.ts +4 -0
  27. package/lib/schemas/brandKit.schema.d.ts.map +1 -1
  28. package/lib/schemas/brandKit.schema.js +10 -0
  29. package/lib/schemas/demoQuestion.schema.d.ts +286 -0
  30. package/lib/schemas/demoQuestion.schema.d.ts.map +1 -0
  31. package/lib/schemas/demoQuestion.schema.js +210 -0
  32. package/lib/schemas/demoSpec.schema.d.ts +109 -6
  33. package/lib/schemas/demoSpec.schema.d.ts.map +1 -1
  34. package/lib/schemas/demoSpec.schema.js +95 -7
  35. package/lib/schemas/index.d.ts +1 -0
  36. package/lib/schemas/index.d.ts.map +1 -1
  37. package/lib/schemas/index.js +1 -0
  38. package/lib/schemas/videoPlan.schema.d.ts +2 -2
  39. package/lib/schemas/videoPlan.schema.d.ts.map +1 -1
  40. package/lib/schemas/videoPlan.schema.js +11 -1
  41. package/lib/services/agent/providerFallback/chains.d.ts.map +1 -1
  42. package/lib/services/agent/providerFallback/chains.js +9 -1
  43. package/lib/services/agent/taskPoller.d.ts.map +1 -1
  44. package/lib/services/agent/taskPoller.js +17 -6
  45. package/lib/services/agent/tools/generateAvatarVideo.tool.d.ts +21 -9
  46. package/lib/services/agent/tools/generateAvatarVideo.tool.d.ts.map +1 -1
  47. package/lib/services/agent/tools/generateAvatarVideo.tool.js +135 -39
  48. package/lib/services/agent/tools/planVideo.tool.d.ts +2 -2
  49. package/lib/services/aiGen/aiGenFactory.service.d.ts +1 -1
  50. package/lib/services/aiGen/aiGenFactory.service.d.ts.map +1 -1
  51. package/lib/services/aiGen/aiGenFactory.service.js +10 -2
  52. package/lib/services/aiGen/helpers.d.ts.map +1 -1
  53. package/lib/services/aiGen/helpers.js +12 -2
  54. package/lib/services/aiGen/providers/kling/kling.service.d.ts.map +1 -1
  55. package/lib/services/aiGen/providers/kling/kling.service.js +47 -8
  56. package/lib/services/aiGen/providers/pixverse/pixverse.service.d.ts +8 -0
  57. package/lib/services/aiGen/providers/pixverse/pixverse.service.d.ts.map +1 -1
  58. package/lib/services/aiGen/providers/pixverse/pixverse.service.js +55 -2
  59. package/lib/services/avatarGen/IAvatarVideoProvider.d.ts +136 -0
  60. package/lib/services/avatarGen/IAvatarVideoProvider.d.ts.map +1 -0
  61. package/lib/services/avatarGen/IAvatarVideoProvider.js +42 -0
  62. package/lib/services/avatarGen/avatarProviderFactory.d.ts +18 -0
  63. package/lib/services/avatarGen/avatarProviderFactory.d.ts.map +1 -0
  64. package/lib/services/avatarGen/avatarProviderFactory.js +54 -0
  65. package/lib/services/avatarGen/index.d.ts +6 -0
  66. package/lib/services/avatarGen/index.d.ts.map +1 -0
  67. package/lib/services/avatarGen/index.js +21 -0
  68. package/lib/services/avatarGen/providers/heygenAvatarProvider.d.ts +45 -0
  69. package/lib/services/avatarGen/providers/heygenAvatarProvider.d.ts.map +1 -0
  70. package/lib/services/avatarGen/providers/heygenAvatarProvider.js +190 -0
  71. package/lib/services/avatarGen/providers/klingAvatarProvider.d.ts +32 -0
  72. package/lib/services/avatarGen/providers/klingAvatarProvider.d.ts.map +1 -0
  73. package/lib/services/avatarGen/providers/klingAvatarProvider.js +69 -0
  74. package/lib/services/avatarGen/providers/tavusAvatarProvider.d.ts +56 -0
  75. package/lib/services/avatarGen/providers/tavusAvatarProvider.d.ts.map +1 -0
  76. package/lib/services/avatarGen/providers/tavusAvatarProvider.js +183 -0
  77. package/lib/services/demo/demoAuthor.d.ts +45 -0
  78. package/lib/services/demo/demoAuthor.d.ts.map +1 -0
  79. package/lib/services/demo/demoAuthor.js +75 -0
  80. package/lib/services/demo/demoAuthorNormalize.d.ts +49 -0
  81. package/lib/services/demo/demoAuthorNormalize.d.ts.map +1 -0
  82. package/lib/services/demo/demoAuthorNormalize.js +327 -0
  83. package/lib/services/demo/demoAuthorPrompt.d.ts +102 -0
  84. package/lib/services/demo/demoAuthorPrompt.d.ts.map +1 -0
  85. package/lib/services/demo/demoAuthorPrompt.js +243 -0
  86. package/lib/services/demo/demoCredits.d.ts +20 -0
  87. package/lib/services/demo/demoCredits.d.ts.map +1 -0
  88. package/lib/services/demo/demoCredits.js +51 -0
  89. package/lib/services/demo/demoMediaGuard.d.ts +43 -0
  90. package/lib/services/demo/demoMediaGuard.d.ts.map +1 -0
  91. package/lib/services/demo/demoMediaGuard.js +207 -0
  92. package/lib/services/demo/demoMusic.d.ts +13 -0
  93. package/lib/services/demo/demoMusic.d.ts.map +1 -0
  94. package/lib/services/demo/demoMusic.js +93 -0
  95. package/lib/services/demo/demoPrefill.d.ts +76 -0
  96. package/lib/services/demo/demoPrefill.d.ts.map +1 -0
  97. package/lib/services/demo/demoPrefill.js +435 -0
  98. package/lib/services/demo/demoRevisePrompt.d.ts +17 -0
  99. package/lib/services/demo/demoRevisePrompt.d.ts.map +1 -0
  100. package/lib/services/demo/demoRevisePrompt.js +85 -0
  101. package/lib/services/demo/demoReviser.d.ts +63 -0
  102. package/lib/services/demo/demoReviser.d.ts.map +1 -0
  103. package/lib/services/demo/demoReviser.js +81 -0
  104. package/lib/services/demo/demoScriptPrompt.d.ts +63 -0
  105. package/lib/services/demo/demoScriptPrompt.d.ts.map +1 -0
  106. package/lib/services/demo/demoScriptPrompt.js +234 -0
  107. package/lib/services/demo/demoScriptWriter.d.ts +65 -0
  108. package/lib/services/demo/demoScriptWriter.d.ts.map +1 -0
  109. package/lib/services/demo/demoScriptWriter.js +211 -0
  110. package/lib/services/demo/demoTriage.d.ts +65 -0
  111. package/lib/services/demo/demoTriage.d.ts.map +1 -0
  112. package/lib/services/demo/demoTriage.js +130 -0
  113. package/lib/services/demo/githubOAuth.d.ts +78 -0
  114. package/lib/services/demo/githubOAuth.d.ts.map +1 -0
  115. package/lib/services/demo/githubOAuth.js +209 -0
  116. package/lib/services/demo/githubOAuthState.d.ts +10 -0
  117. package/lib/services/demo/githubOAuthState.d.ts.map +1 -0
  118. package/lib/services/demo/githubOAuthState.js +63 -0
  119. package/lib/services/demo/index.d.ts +24 -0
  120. package/lib/services/demo/index.d.ts.map +1 -0
  121. package/lib/services/demo/index.js +39 -0
  122. package/lib/services/firestore.service.d.ts +11 -0
  123. package/lib/services/firestore.service.d.ts.map +1 -1
  124. package/lib/services/firestore.service.js +24 -0
  125. package/lib/services/index.d.ts +2 -0
  126. package/lib/services/index.d.ts.map +1 -1
  127. package/lib/services/index.js +2 -0
  128. package/lib/services/tts/providers/elevenlabs.service.d.ts.map +1 -1
  129. package/lib/services/tts/providers/elevenlabs.service.js +16 -8
  130. package/lib/utils/index.d.ts +1 -0
  131. package/lib/utils/index.d.ts.map +1 -1
  132. package/lib/utils/index.js +1 -0
  133. package/lib/utils/outreachTemplate.d.ts +46 -0
  134. package/lib/utils/outreachTemplate.d.ts.map +1 -0
  135. package/lib/utils/outreachTemplate.js +174 -0
  136. package/package.json +1 -1
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ /**
3
+ * Outreach template utilities — shared between Firebase Functions (schema
4
+ * validation) and the node-express-server (fan-out processor).
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.extractTemplateVariables = extractTemplateVariables;
8
+ exports.resolveTemplate = resolveTemplate;
9
+ exports.resolvePlaceholdersDeep = resolvePlaceholdersDeep;
10
+ exports.localizePlanText = localizePlanText;
11
+ exports.generateLandingPageSlug = generateLandingPageSlug;
12
+ const translation_service_1 = require("../services/translation/translation.service");
13
+ const logger_1 = require("./logger");
14
+ /** Extract {{variable}} names from a script template string. */
15
+ function extractTemplateVariables(script) {
16
+ const matches = script.matchAll(/\{\{([a-zA-Z][a-zA-Z0-9_]*)\}\}/g);
17
+ const seen = new Set();
18
+ for (const m of matches) {
19
+ const name = m[1];
20
+ if (name)
21
+ seen.add(name);
22
+ }
23
+ return Array.from(seen);
24
+ }
25
+ /**
26
+ * Resolve a script template by substituting `{{varName}}` tokens with values
27
+ * from the `variables` map. Throws if a required variable is missing or empty.
28
+ */
29
+ function resolveTemplate(scriptTemplate, variables) {
30
+ return scriptTemplate.replace(/\{\{([a-zA-Z][a-zA-Z0-9_]*)\}\}/g, (_, name) => {
31
+ const val = variables[name];
32
+ if (val === undefined || val === "") {
33
+ throw new Error(`Missing required template variable: {{${name}}}`);
34
+ }
35
+ return val;
36
+ });
37
+ }
38
+ /**
39
+ * Lenient variant of {@link resolveTemplate}: substitutes known `{{var}}` tokens
40
+ * and leaves unknown ones intact (no throw). Used for deep plan resolution where
41
+ * required-variable validation has already happened against the scriptTemplate.
42
+ */
43
+ function resolveLenient(text, variables) {
44
+ return text.replace(/\{\{([a-zA-Z][a-zA-Z0-9_]*)\}\}/g, (whole, name) => {
45
+ const val = variables[name];
46
+ return val === undefined || val === "" ? whole : val;
47
+ });
48
+ }
49
+ /**
50
+ * Deep-clone `value` and substitute `{{variables}}` inside every string it
51
+ * contains (recursively through objects and arrays). Non-string leaves are
52
+ * copied as-is; unknown tokens are left intact.
53
+ *
54
+ * Reach uses this to personalize an authored produced-scene `VideoPlan` per
55
+ * recipient — resolving `{{name}}`/`{{company}}` in scene voiceover lines,
56
+ * overlay text, visual prompts and titles — without re-planning. The input must
57
+ * be JSON-serializable (VideoPlan is); functions/Dates are not supported.
58
+ */
59
+ function resolvePlaceholdersDeep(value, variables) {
60
+ if (typeof value === "string") {
61
+ return resolveLenient(value, variables);
62
+ }
63
+ if (Array.isArray(value)) {
64
+ return value.map((v) => resolvePlaceholdersDeep(v, variables));
65
+ }
66
+ if (value !== null && typeof value === "object") {
67
+ const out = {};
68
+ for (const [k, v] of Object.entries(value)) {
69
+ out[k] = resolvePlaceholdersDeep(v, variables);
70
+ }
71
+ return out;
72
+ }
73
+ return value;
74
+ }
75
+ /**
76
+ * Normalize a BCP-47 locale to its primary language subtag, lowercased
77
+ * (e.g. "es-419" → "es", "pt_BR" → "pt"). Returns undefined for empty input.
78
+ */
79
+ function primaryLang(locale) {
80
+ if (!locale)
81
+ return undefined;
82
+ const base = locale.trim().toLowerCase().split(/[-_]/)[0];
83
+ return base || undefined;
84
+ }
85
+ /**
86
+ * Translate the viewer-facing TEXT of a produced-scene {@link VideoPlan} into
87
+ * `toLocale` — the produced-scene half of Reach's multilingual wedge.
88
+ *
89
+ * Translates only what a viewer hears/reads: the plan `title`, each scene's
90
+ * `voiceoverLine`, `onScreenText`, and every `overlays[].text`. Visual `prompt`s
91
+ * and internal `intent`s are deliberately LEFT in the source language — those
92
+ * feed the video models, which expect (and were tuned on) English prompts.
93
+ *
94
+ * Behaviour:
95
+ * - No-ops (returns the input unchanged) when `toLocale` is absent or resolves
96
+ * to the same primary language as `fromLocale`.
97
+ * - Dedupes repeated strings (watermarks/CTAs recur across scenes) so each
98
+ * unique string is translated once, with bounded concurrency.
99
+ * - **Fails open per string:** a translation error keeps the original text
100
+ * rather than throwing — a translation outage must never block a render.
101
+ *
102
+ * Returns a deep clone; the input plan is never mutated.
103
+ */
104
+ async function localizePlanText(plan, toLocale, fromLocale = "en") {
105
+ const to = primaryLang(toLocale);
106
+ const from = primaryLang(fromLocale) ?? "en";
107
+ if (!to || to === from)
108
+ return plan;
109
+ // ── Collect unique translatable strings ──────────────────────────────────
110
+ const unique = new Set();
111
+ const collect = (s) => {
112
+ if (s && s.trim())
113
+ unique.add(s);
114
+ };
115
+ collect(plan.title);
116
+ for (const scene of plan.scenes) {
117
+ collect(scene.voiceoverLine);
118
+ collect(scene.onScreenText);
119
+ for (const ov of scene.overlays ?? [])
120
+ collect(ov.text);
121
+ }
122
+ if (unique.size === 0)
123
+ return plan;
124
+ // ── Translate each unique string once (bounded concurrency, fail-open) ────
125
+ const map = new Map();
126
+ const originals = Array.from(unique);
127
+ const CONCURRENCY = 5;
128
+ for (let i = 0; i < originals.length; i += CONCURRENCY) {
129
+ const batch = originals.slice(i, i + CONCURRENCY);
130
+ await Promise.all(batch.map(async (orig) => {
131
+ try {
132
+ const translated = await translation_service_1.translationService.translate(orig, from, to);
133
+ if (translated && translated.trim())
134
+ map.set(orig, translated);
135
+ }
136
+ catch (err) {
137
+ logger_1.logger.warn("localizePlanText: string translation failed, keeping original", {
138
+ toLocale: to,
139
+ err: err instanceof Error ? err.message : String(err),
140
+ });
141
+ }
142
+ }));
143
+ }
144
+ if (map.size === 0)
145
+ return plan;
146
+ // ── Apply onto a deep clone (prompt/intent stay in source language) ───────
147
+ const out = JSON.parse(JSON.stringify(plan));
148
+ const tr = (s) => s && map.has(s) ? map.get(s) : s;
149
+ out.title = tr(out.title);
150
+ for (const scene of out.scenes) {
151
+ scene.voiceoverLine = tr(scene.voiceoverLine);
152
+ scene.onScreenText = tr(scene.onScreenText);
153
+ if (scene.overlays) {
154
+ for (const ov of scene.overlays) {
155
+ const t = tr(ov.text);
156
+ if (t)
157
+ ov.text = t;
158
+ }
159
+ }
160
+ }
161
+ return out;
162
+ }
163
+ /** Generate a short URL-safe slug for a landing page (16 chars, alphanumeric). */
164
+ function generateLandingPageSlug() {
165
+ const chars = "abcdefghijklmnopqrstuvwxyz0123456789";
166
+ let slug = "";
167
+ const arr = new Uint8Array(16);
168
+ // Use Math.random-based fallback since crypto.getRandomValues may not exist in
169
+ // all Node envs; for uniqueness we rely on Firestore write-time collision checks.
170
+ for (let i = 0; i < 16; i++) {
171
+ slug += chars[Math.floor(Math.random() * chars.length)];
172
+ }
173
+ return slug;
174
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vidspotai-shared",
3
- "version": "1.0.94",
3
+ "version": "1.0.96",
4
4
  "main": "lib/index.js",
5
5
  "types": "lib/index.d.ts",
6
6
  "exports": {