vidspotai-shared 1.0.95 → 1.0.97
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.
- package/lib/globals/aiModels/enums.d.ts +3 -0
- package/lib/globals/aiModels/enums.d.ts.map +1 -1
- package/lib/globals/aiModels/enums.js +9 -0
- package/lib/globals/aiModels/index.d.ts.map +1 -1
- package/lib/globals/aiModels/index.js +2 -0
- package/lib/globals/aiModels/providers/hostedAvatars.d.ts +22 -0
- package/lib/globals/aiModels/providers/hostedAvatars.d.ts.map +1 -0
- package/lib/globals/aiModels/providers/hostedAvatars.js +129 -0
- package/lib/globals/aiModels/providers/kling.d.ts.map +1 -1
- package/lib/globals/aiModels/providers/kling.js +85 -1
- package/lib/globals/creditUnit.d.ts +29 -0
- package/lib/globals/creditUnit.d.ts.map +1 -1
- package/lib/globals/creditUnit.js +30 -1
- package/lib/globals/types.d.ts +58 -1
- package/lib/globals/types.d.ts.map +1 -1
- package/lib/globals/types.js +61 -1
- package/lib/models/demoVideoProject.model.d.ts +244 -0
- package/lib/models/demoVideoProject.model.d.ts.map +1 -0
- package/lib/models/demoVideoProject.model.js +2 -0
- package/lib/models/githubConnection.model.d.ts +35 -0
- package/lib/models/githubConnection.model.d.ts.map +1 -0
- package/lib/models/githubConnection.model.js +2 -0
- package/lib/models/index.d.ts +3 -0
- package/lib/models/index.d.ts.map +1 -1
- package/lib/models/index.js +3 -0
- package/lib/models/outreach.model.d.ts +175 -0
- package/lib/models/outreach.model.d.ts.map +1 -0
- package/lib/models/outreach.model.js +2 -0
- package/lib/models/video.model.d.ts +4 -0
- package/lib/models/video.model.d.ts.map +1 -1
- package/lib/schemas/brandKit.schema.d.ts +4 -0
- package/lib/schemas/brandKit.schema.d.ts.map +1 -1
- package/lib/schemas/brandKit.schema.js +10 -0
- package/lib/schemas/demoQuestion.schema.d.ts +286 -0
- package/lib/schemas/demoQuestion.schema.d.ts.map +1 -0
- package/lib/schemas/demoQuestion.schema.js +210 -0
- package/lib/schemas/demoSpec.schema.d.ts +109 -6
- package/lib/schemas/demoSpec.schema.d.ts.map +1 -1
- package/lib/schemas/demoSpec.schema.js +95 -7
- package/lib/schemas/index.d.ts +1 -0
- package/lib/schemas/index.d.ts.map +1 -1
- package/lib/schemas/index.js +1 -0
- package/lib/services/agent/providerFallback/chains.d.ts.map +1 -1
- package/lib/services/agent/providerFallback/chains.js +9 -1
- package/lib/services/agent/taskPoller.d.ts.map +1 -1
- package/lib/services/agent/taskPoller.js +17 -6
- package/lib/services/agent/tools/generateAvatarVideo.tool.d.ts +21 -9
- package/lib/services/agent/tools/generateAvatarVideo.tool.d.ts.map +1 -1
- package/lib/services/agent/tools/generateAvatarVideo.tool.js +135 -39
- package/lib/services/aiGen/aiGenFactory.service.d.ts +1 -1
- package/lib/services/aiGen/aiGenFactory.service.d.ts.map +1 -1
- package/lib/services/aiGen/aiGenFactory.service.js +11 -2
- package/lib/services/aiGen/providers/kling/kling.service.d.ts +36 -1
- package/lib/services/aiGen/providers/kling/kling.service.d.ts.map +1 -1
- package/lib/services/aiGen/providers/kling/kling.service.js +62 -5
- package/lib/services/aiGen/providers/kling/klingCredits.d.ts.map +1 -1
- package/lib/services/aiGen/providers/kling/klingCredits.js +12 -0
- package/lib/services/aiGen/providers/kling/klingRequests.d.ts +14 -1
- package/lib/services/aiGen/providers/kling/klingRequests.d.ts.map +1 -1
- package/lib/services/aiGen/providers/kling/klingRequests.js +44 -0
- package/lib/services/aiGen/providers/kling/klingStatus.d.ts +13 -1
- package/lib/services/aiGen/providers/kling/klingStatus.d.ts.map +1 -1
- package/lib/services/aiGen/providers/kling/klingStatus.js +111 -0
- package/lib/services/aiGen/providers/kling/types.d.ts +71 -0
- package/lib/services/aiGen/providers/kling/types.d.ts.map +1 -1
- package/lib/services/avatarGen/IAvatarVideoProvider.d.ts +136 -0
- package/lib/services/avatarGen/IAvatarVideoProvider.d.ts.map +1 -0
- package/lib/services/avatarGen/IAvatarVideoProvider.js +42 -0
- package/lib/services/avatarGen/avatarProviderFactory.d.ts +18 -0
- package/lib/services/avatarGen/avatarProviderFactory.d.ts.map +1 -0
- package/lib/services/avatarGen/avatarProviderFactory.js +54 -0
- package/lib/services/avatarGen/index.d.ts +6 -0
- package/lib/services/avatarGen/index.d.ts.map +1 -0
- package/lib/services/avatarGen/index.js +21 -0
- package/lib/services/avatarGen/providers/heygenAvatarProvider.d.ts +45 -0
- package/lib/services/avatarGen/providers/heygenAvatarProvider.d.ts.map +1 -0
- package/lib/services/avatarGen/providers/heygenAvatarProvider.js +190 -0
- package/lib/services/avatarGen/providers/klingAvatarProvider.d.ts +32 -0
- package/lib/services/avatarGen/providers/klingAvatarProvider.d.ts.map +1 -0
- package/lib/services/avatarGen/providers/klingAvatarProvider.js +69 -0
- package/lib/services/avatarGen/providers/tavusAvatarProvider.d.ts +56 -0
- package/lib/services/avatarGen/providers/tavusAvatarProvider.d.ts.map +1 -0
- package/lib/services/avatarGen/providers/tavusAvatarProvider.js +183 -0
- package/lib/services/demo/demoAuthor.d.ts +45 -0
- package/lib/services/demo/demoAuthor.d.ts.map +1 -0
- package/lib/services/demo/demoAuthor.js +75 -0
- package/lib/services/demo/demoAuthorNormalize.d.ts +49 -0
- package/lib/services/demo/demoAuthorNormalize.d.ts.map +1 -0
- package/lib/services/demo/demoAuthorNormalize.js +327 -0
- package/lib/services/demo/demoAuthorPrompt.d.ts +102 -0
- package/lib/services/demo/demoAuthorPrompt.d.ts.map +1 -0
- package/lib/services/demo/demoAuthorPrompt.js +243 -0
- package/lib/services/demo/demoCredits.d.ts +20 -0
- package/lib/services/demo/demoCredits.d.ts.map +1 -0
- package/lib/services/demo/demoCredits.js +51 -0
- package/lib/services/demo/demoMediaGuard.d.ts +43 -0
- package/lib/services/demo/demoMediaGuard.d.ts.map +1 -0
- package/lib/services/demo/demoMediaGuard.js +207 -0
- package/lib/services/demo/demoMusic.d.ts +13 -0
- package/lib/services/demo/demoMusic.d.ts.map +1 -0
- package/lib/services/demo/demoMusic.js +93 -0
- package/lib/services/demo/demoPrefill.d.ts +76 -0
- package/lib/services/demo/demoPrefill.d.ts.map +1 -0
- package/lib/services/demo/demoPrefill.js +435 -0
- package/lib/services/demo/demoRevisePrompt.d.ts +17 -0
- package/lib/services/demo/demoRevisePrompt.d.ts.map +1 -0
- package/lib/services/demo/demoRevisePrompt.js +85 -0
- package/lib/services/demo/demoReviser.d.ts +63 -0
- package/lib/services/demo/demoReviser.d.ts.map +1 -0
- package/lib/services/demo/demoReviser.js +81 -0
- package/lib/services/demo/demoScriptPrompt.d.ts +63 -0
- package/lib/services/demo/demoScriptPrompt.d.ts.map +1 -0
- package/lib/services/demo/demoScriptPrompt.js +234 -0
- package/lib/services/demo/demoScriptWriter.d.ts +65 -0
- package/lib/services/demo/demoScriptWriter.d.ts.map +1 -0
- package/lib/services/demo/demoScriptWriter.js +211 -0
- package/lib/services/demo/demoTriage.d.ts +65 -0
- package/lib/services/demo/demoTriage.d.ts.map +1 -0
- package/lib/services/demo/demoTriage.js +130 -0
- package/lib/services/demo/githubOAuth.d.ts +78 -0
- package/lib/services/demo/githubOAuth.d.ts.map +1 -0
- package/lib/services/demo/githubOAuth.js +209 -0
- package/lib/services/demo/githubOAuthState.d.ts +10 -0
- package/lib/services/demo/githubOAuthState.d.ts.map +1 -0
- package/lib/services/demo/githubOAuthState.js +63 -0
- package/lib/services/demo/index.d.ts +24 -0
- package/lib/services/demo/index.d.ts.map +1 -0
- package/lib/services/demo/index.js +39 -0
- package/lib/services/firestore.service.d.ts +11 -0
- package/lib/services/firestore.service.d.ts.map +1 -1
- package/lib/services/firestore.service.js +24 -0
- package/lib/services/index.d.ts +2 -0
- package/lib/services/index.d.ts.map +1 -1
- package/lib/services/index.js +2 -0
- package/lib/services/tts/providers/elevenlabs.service.d.ts.map +1 -1
- package/lib/services/tts/providers/elevenlabs.service.js +16 -8
- package/lib/utils/index.d.ts +1 -0
- package/lib/utils/index.d.ts.map +1 -1
- package/lib/utils/index.js +1 -0
- package/lib/utils/outreachTemplate.d.ts +46 -0
- package/lib/utils/outreachTemplate.d.ts.map +1 -0
- package/lib/utils/outreachTemplate.js +174 -0
- 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
|
+
}
|