vidspotai-shared 1.0.91 → 1.0.93
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/schemas/demoSpec.schema.d.ts +689 -0
- package/lib/schemas/demoSpec.schema.d.ts.map +1 -0
- package/lib/schemas/demoSpec.schema.js +276 -0
- 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/schemas/project.schema.d.ts +78 -0
- package/lib/schemas/project.schema.d.ts.map +1 -1
- package/lib/schemas/project.schema.js +55 -1
- package/lib/schemas/videoPlan.schema.d.ts +69 -0
- package/lib/schemas/videoPlan.schema.d.ts.map +1 -1
- package/lib/schemas/videoPlan.schema.js +30 -1
- package/lib/services/agent/editClassifier.d.ts +16 -0
- package/lib/services/agent/editClassifier.d.ts.map +1 -1
- package/lib/services/agent/index.d.ts +1 -0
- package/lib/services/agent/index.d.ts.map +1 -1
- package/lib/services/agent/index.js +1 -0
- package/lib/services/agent/overlayRenderer.d.ts.map +1 -1
- package/lib/services/agent/overlayRenderer.js +8 -0
- package/lib/services/agent/planner/Planner.d.ts.map +1 -1
- package/lib/services/agent/planner/Planner.js +13 -2
- package/lib/services/agent/planner/structuralRules.d.ts.map +1 -1
- package/lib/services/agent/planner/structuralRules.js +6 -1
- package/lib/services/agent/textStylePacks.d.ts +35 -0
- package/lib/services/agent/textStylePacks.d.ts.map +1 -0
- package/lib/services/agent/textStylePacks.js +70 -0
- package/lib/services/agent/tools/composeScene.tool.d.ts +46 -0
- package/lib/services/agent/tools/composeScene.tool.d.ts.map +1 -1
- package/lib/services/agent/tools/estimateCost.tool.d.ts +16 -0
- package/lib/services/agent/tools/estimateCost.tool.d.ts.map +1 -1
- package/lib/services/agent/tools/planVideo.tool.d.ts +27 -0
- package/lib/services/agent/tools/planVideo.tool.d.ts.map +1 -1
- package/lib/services/agent/tools/render.tool.d.ts +16 -0
- package/lib/services/agent/tools/render.tool.d.ts.map +1 -1
- package/lib/services/aiGen/providers/bytedance/bytedance.service.d.ts.map +1 -1
- package/lib/services/aiGen/providers/bytedance/bytedance.service.js +8 -8
- package/lib/services/aiGen/providers/google/google.service.d.ts.map +1 -1
- package/lib/services/aiGen/providers/google/google.service.js +54 -18
- package/lib/services/aiGen/providers/google/googleApiKeys.d.ts +10 -6
- package/lib/services/aiGen/providers/google/googleApiKeys.d.ts.map +1 -1
- package/lib/services/aiGen/providers/google/googleApiKeys.js +10 -6
- package/lib/services/aiGen/providers/google/googleErrors.d.ts +17 -10
- package/lib/services/aiGen/providers/google/googleErrors.d.ts.map +1 -1
- package/lib/services/aiGen/providers/google/googleErrors.js +60 -21
- package/lib/services/aiGen/providers/google/googleKeyPool.d.ts.map +1 -1
- package/lib/services/aiGen/providers/google/googleKeyPool.js +40 -12
- package/lib/services/asr/index.d.ts +1 -0
- package/lib/services/asr/index.d.ts.map +1 -1
- package/lib/services/asr/index.js +1 -0
- package/lib/services/asr/transcribeWithFallback.d.ts +54 -0
- package/lib/services/asr/transcribeWithFallback.d.ts.map +1 -0
- package/lib/services/asr/transcribeWithFallback.js +87 -0
- package/lib/services/editor/designToProject.d.ts +2 -0
- package/lib/services/editor/designToProject.d.ts.map +1 -1
- package/lib/services/editor/designToProject.js +10 -0
- package/lib/services/editor/planToProject.d.ts.map +1 -1
- package/lib/services/editor/planToProject.helpers.d.ts +9 -3
- package/lib/services/editor/planToProject.helpers.d.ts.map +1 -1
- package/lib/services/editor/planToProject.helpers.js +17 -2
- package/lib/services/editor/planToProject.js +21 -3
- package/package.json +1 -1
|
@@ -190,6 +190,14 @@ export declare const TextOverlaySchema: z.ZodObject<{
|
|
|
190
190
|
"word-pop": "word-pop";
|
|
191
191
|
"highlight-current": "highlight-current";
|
|
192
192
|
}>>;
|
|
193
|
+
preset: z.ZodOptional<z.ZodEnum<{
|
|
194
|
+
none: "none";
|
|
195
|
+
"fade-soft": "fade-soft";
|
|
196
|
+
"kinetic-pop": "kinetic-pop";
|
|
197
|
+
"editorial-wipe": "editorial-wipe";
|
|
198
|
+
"bold-slam": "bold-slam";
|
|
199
|
+
"type-on": "type-on";
|
|
200
|
+
}>>;
|
|
193
201
|
startMs: z.ZodOptional<z.ZodNumber>;
|
|
194
202
|
endMs: z.ZodOptional<z.ZodNumber>;
|
|
195
203
|
persistAcrossScenes: z.ZodOptional<z.ZodBoolean>;
|
|
@@ -243,12 +251,32 @@ export type SceneLayout = z.infer<typeof SceneLayoutSchema>;
|
|
|
243
251
|
* free-form CSS strings (hex or named). CH-1 added `fontWeight` (100–900),
|
|
244
252
|
* which the renderer now honours (falling back to 800 when unset).
|
|
245
253
|
*/
|
|
254
|
+
/**
|
|
255
|
+
* Per-video animation "look". The planner picks ONE pack for the whole video
|
|
256
|
+
* so overlays/captions feel consistent; planToProject resolves the pack into
|
|
257
|
+
* concrete text/caption preset defaults (see resolveStylePack) that each
|
|
258
|
+
* overlay/caption can still override individually. Absent → "clean".
|
|
259
|
+
*/
|
|
260
|
+
export declare const TextStylePackSchema: z.ZodEnum<{
|
|
261
|
+
bold: "bold";
|
|
262
|
+
clean: "clean";
|
|
263
|
+
kinetic: "kinetic";
|
|
264
|
+
editorial: "editorial";
|
|
265
|
+
minimal: "minimal";
|
|
266
|
+
}>;
|
|
267
|
+
export type TextStylePack = z.infer<typeof TextStylePackSchema>;
|
|
246
268
|
export declare const CaptionStyleSchema: z.ZodObject<{
|
|
247
269
|
fontFamily: z.ZodOptional<z.ZodString>;
|
|
248
270
|
fontSize: z.ZodOptional<z.ZodNumber>;
|
|
249
271
|
fontWeight: z.ZodOptional<z.ZodNumber>;
|
|
250
272
|
color: z.ZodOptional<z.ZodString>;
|
|
251
273
|
highlightColor: z.ZodOptional<z.ZodString>;
|
|
274
|
+
preset: z.ZodOptional<z.ZodEnum<{
|
|
275
|
+
none: "none";
|
|
276
|
+
"tiktok-word": "tiktok-word";
|
|
277
|
+
"karaoke-fill": "karaoke-fill";
|
|
278
|
+
"block-cut": "block-cut";
|
|
279
|
+
}>>;
|
|
252
280
|
}, z.core.$strip>;
|
|
253
281
|
export type CaptionStyle = z.infer<typeof CaptionStyleSchema>;
|
|
254
282
|
export declare const PlannedSceneSchema: z.ZodObject<{
|
|
@@ -283,6 +311,12 @@ export declare const PlannedSceneSchema: z.ZodObject<{
|
|
|
283
311
|
fontWeight: z.ZodOptional<z.ZodNumber>;
|
|
284
312
|
color: z.ZodOptional<z.ZodString>;
|
|
285
313
|
highlightColor: z.ZodOptional<z.ZodString>;
|
|
314
|
+
preset: z.ZodOptional<z.ZodEnum<{
|
|
315
|
+
none: "none";
|
|
316
|
+
"tiktok-word": "tiktok-word";
|
|
317
|
+
"karaoke-fill": "karaoke-fill";
|
|
318
|
+
"block-cut": "block-cut";
|
|
319
|
+
}>>;
|
|
286
320
|
}, z.core.$strip>>;
|
|
287
321
|
onScreenText: z.ZodOptional<z.ZodString>;
|
|
288
322
|
overlays: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
@@ -340,6 +374,14 @@ export declare const PlannedSceneSchema: z.ZodObject<{
|
|
|
340
374
|
"word-pop": "word-pop";
|
|
341
375
|
"highlight-current": "highlight-current";
|
|
342
376
|
}>>;
|
|
377
|
+
preset: z.ZodOptional<z.ZodEnum<{
|
|
378
|
+
none: "none";
|
|
379
|
+
"fade-soft": "fade-soft";
|
|
380
|
+
"kinetic-pop": "kinetic-pop";
|
|
381
|
+
"editorial-wipe": "editorial-wipe";
|
|
382
|
+
"bold-slam": "bold-slam";
|
|
383
|
+
"type-on": "type-on";
|
|
384
|
+
}>>;
|
|
343
385
|
startMs: z.ZodOptional<z.ZodNumber>;
|
|
344
386
|
endMs: z.ZodOptional<z.ZodNumber>;
|
|
345
387
|
persistAcrossScenes: z.ZodOptional<z.ZodBoolean>;
|
|
@@ -504,6 +546,12 @@ export declare const VideoPlanSchema: z.ZodObject<{
|
|
|
504
546
|
fontWeight: z.ZodOptional<z.ZodNumber>;
|
|
505
547
|
color: z.ZodOptional<z.ZodString>;
|
|
506
548
|
highlightColor: z.ZodOptional<z.ZodString>;
|
|
549
|
+
preset: z.ZodOptional<z.ZodEnum<{
|
|
550
|
+
none: "none";
|
|
551
|
+
"tiktok-word": "tiktok-word";
|
|
552
|
+
"karaoke-fill": "karaoke-fill";
|
|
553
|
+
"block-cut": "block-cut";
|
|
554
|
+
}>>;
|
|
507
555
|
}, z.core.$strip>>;
|
|
508
556
|
onScreenText: z.ZodOptional<z.ZodString>;
|
|
509
557
|
overlays: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
@@ -561,6 +609,14 @@ export declare const VideoPlanSchema: z.ZodObject<{
|
|
|
561
609
|
"word-pop": "word-pop";
|
|
562
610
|
"highlight-current": "highlight-current";
|
|
563
611
|
}>>;
|
|
612
|
+
preset: z.ZodOptional<z.ZodEnum<{
|
|
613
|
+
none: "none";
|
|
614
|
+
"fade-soft": "fade-soft";
|
|
615
|
+
"kinetic-pop": "kinetic-pop";
|
|
616
|
+
"editorial-wipe": "editorial-wipe";
|
|
617
|
+
"bold-slam": "bold-slam";
|
|
618
|
+
"type-on": "type-on";
|
|
619
|
+
}>>;
|
|
564
620
|
startMs: z.ZodOptional<z.ZodNumber>;
|
|
565
621
|
endMs: z.ZodOptional<z.ZodNumber>;
|
|
566
622
|
persistAcrossScenes: z.ZodOptional<z.ZodBoolean>;
|
|
@@ -650,7 +706,20 @@ export declare const VideoPlanSchema: z.ZodObject<{
|
|
|
650
706
|
fontWeight: z.ZodOptional<z.ZodNumber>;
|
|
651
707
|
color: z.ZodOptional<z.ZodString>;
|
|
652
708
|
highlightColor: z.ZodOptional<z.ZodString>;
|
|
709
|
+
preset: z.ZodOptional<z.ZodEnum<{
|
|
710
|
+
none: "none";
|
|
711
|
+
"tiktok-word": "tiktok-word";
|
|
712
|
+
"karaoke-fill": "karaoke-fill";
|
|
713
|
+
"block-cut": "block-cut";
|
|
714
|
+
}>>;
|
|
653
715
|
}, z.core.$strip>>;
|
|
716
|
+
textStylePack: z.ZodOptional<z.ZodEnum<{
|
|
717
|
+
bold: "bold";
|
|
718
|
+
clean: "clean";
|
|
719
|
+
kinetic: "kinetic";
|
|
720
|
+
editorial: "editorial";
|
|
721
|
+
minimal: "minimal";
|
|
722
|
+
}>>;
|
|
654
723
|
bible: z.ZodOptional<z.ZodObject<{
|
|
655
724
|
characters: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
656
725
|
id: z.ZodString;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"videoPlan.schema.d.ts","sourceRoot":"","sources":["../../src/schemas/videoPlan.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"videoPlan.schema.d.ts","sourceRoot":"","sources":["../../src/schemas/videoPlan.schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.VideoPlanSchema = exports.ScriptSchema = exports.ChapterSchema = exports.PlannerWarningSchema = exports.PlannedSceneSchema = exports.CaptionStyleSchema = exports.SceneLayoutSchema = exports.TextOverlaySchema = exports.TextBgStyleSchema = exports.TextAnimationSchema = exports.TextPositionSchema = exports.TextRoleSchema = exports.TransitionKindSchema = exports.SceneAssetStrategySchema = exports.AgentVisualBibleSchema = exports.BibleEntitySchema = void 0;
|
|
3
|
+
exports.VideoPlanSchema = exports.ScriptSchema = exports.ChapterSchema = exports.PlannerWarningSchema = exports.PlannedSceneSchema = exports.CaptionStyleSchema = exports.TextStylePackSchema = exports.SceneLayoutSchema = exports.TextOverlaySchema = exports.TextBgStyleSchema = exports.TextAnimationSchema = exports.TextPositionSchema = exports.TextRoleSchema = exports.TransitionKindSchema = exports.SceneAssetStrategySchema = exports.AgentVisualBibleSchema = exports.BibleEntitySchema = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
5
|
const agentPersona_schema_1 = require("./agentPersona.schema");
|
|
6
6
|
const brief_schema_1 = require("./brief.schema");
|
|
@@ -158,6 +158,14 @@ exports.TextOverlaySchema = zod_1.z.object({
|
|
|
158
158
|
*/
|
|
159
159
|
bgStyle: exports.TextBgStyleSchema.optional(),
|
|
160
160
|
animation: exports.TextAnimationSchema.optional(),
|
|
161
|
+
/**
|
|
162
|
+
* Named animation preset (see TextPresetSchema). Preferred over `animation`
|
|
163
|
+
* for new plans — a preset bundles a richer, designed entrance. When both are
|
|
164
|
+
* set, `preset` wins at render time. The planner picks one per video for
|
|
165
|
+
* consistency (see the plan-level `textStylePack`); per-overlay overrides are
|
|
166
|
+
* rare. Absent → renderer uses `animation` (or its role default).
|
|
167
|
+
*/
|
|
168
|
+
preset: project_schema_1.TextPresetSchema.optional(),
|
|
161
169
|
/** Start/end times in ms within the scene; default = whole scene. */
|
|
162
170
|
startMs: zod_1.z.number().nonnegative().optional(),
|
|
163
171
|
endMs: zod_1.z.number().nonnegative().optional(),
|
|
@@ -221,12 +229,27 @@ exports.SceneLayoutSchema = zod_1.z.object({
|
|
|
221
229
|
* free-form CSS strings (hex or named). CH-1 added `fontWeight` (100–900),
|
|
222
230
|
* which the renderer now honours (falling back to 800 when unset).
|
|
223
231
|
*/
|
|
232
|
+
/**
|
|
233
|
+
* Per-video animation "look". The planner picks ONE pack for the whole video
|
|
234
|
+
* so overlays/captions feel consistent; planToProject resolves the pack into
|
|
235
|
+
* concrete text/caption preset defaults (see resolveStylePack) that each
|
|
236
|
+
* overlay/caption can still override individually. Absent → "clean".
|
|
237
|
+
*/
|
|
238
|
+
exports.TextStylePackSchema = zod_1.z.enum([
|
|
239
|
+
"clean", // fade-soft text, plain captions — neutral / corporate
|
|
240
|
+
"bold", // bold-slam headlines, tiktok-word captions — punchy ads
|
|
241
|
+
"kinetic", // kinetic-pop text, tiktok-word captions — energetic social
|
|
242
|
+
"editorial", // editorial-wipe text, karaoke-fill captions — premium brand
|
|
243
|
+
"minimal", // static text, plain captions — let the visuals breathe
|
|
244
|
+
]);
|
|
224
245
|
exports.CaptionStyleSchema = zod_1.z.object({
|
|
225
246
|
fontFamily: zod_1.z.string().min(1).max(80).optional(),
|
|
226
247
|
fontSize: zod_1.z.number().int().min(8).max(200).optional(),
|
|
227
248
|
fontWeight: zod_1.z.number().int().min(100).max(900).optional(),
|
|
228
249
|
color: zod_1.z.string().min(1).max(40).optional(),
|
|
229
250
|
highlightColor: zod_1.z.string().min(1).max(40).optional(),
|
|
251
|
+
/** Named caption animation preset (see CaptionPresetSchema). Absent → "none". */
|
|
252
|
+
preset: project_schema_1.CaptionPresetSchema.optional(),
|
|
230
253
|
});
|
|
231
254
|
exports.PlannedSceneSchema = zod_1.z.object({
|
|
232
255
|
sceneIndex: zod_1.z.number().int().nonnegative(),
|
|
@@ -527,6 +550,12 @@ exports.VideoPlanSchema = zod_1.z.object({
|
|
|
527
550
|
* this in the planner — it's a post-hoc user edit.
|
|
528
551
|
*/
|
|
529
552
|
captionStyle: exports.CaptionStyleSchema.optional(),
|
|
553
|
+
/**
|
|
554
|
+
* Per-video animation look (see TextStylePackSchema). The planner picks one
|
|
555
|
+
* for consistency; planToProject resolves it into default text/caption
|
|
556
|
+
* presets that individual overlays/captions can override. Absent → "clean".
|
|
557
|
+
*/
|
|
558
|
+
textStylePack: exports.TextStylePackSchema.optional(),
|
|
530
559
|
/**
|
|
531
560
|
* AG-12 — Visual Bible built by the BibleBuilder pre-pass and threaded
|
|
532
561
|
* into every scene that references entity ids. Optional because legacy
|
|
@@ -92,6 +92,14 @@ export declare const TextEditSchema: z.ZodObject<{
|
|
|
92
92
|
"word-pop": "word-pop";
|
|
93
93
|
"highlight-current": "highlight-current";
|
|
94
94
|
}>>;
|
|
95
|
+
preset: z.ZodOptional<z.ZodEnum<{
|
|
96
|
+
none: "none";
|
|
97
|
+
"fade-soft": "fade-soft";
|
|
98
|
+
"kinetic-pop": "kinetic-pop";
|
|
99
|
+
"editorial-wipe": "editorial-wipe";
|
|
100
|
+
"bold-slam": "bold-slam";
|
|
101
|
+
"type-on": "type-on";
|
|
102
|
+
}>>;
|
|
95
103
|
startMs: z.ZodOptional<z.ZodNumber>;
|
|
96
104
|
endMs: z.ZodOptional<z.ZodNumber>;
|
|
97
105
|
persistAcrossScenes: z.ZodOptional<z.ZodBoolean>;
|
|
@@ -187,6 +195,14 @@ export declare const EditRequestSchema: z.ZodObject<{
|
|
|
187
195
|
"word-pop": "word-pop";
|
|
188
196
|
"highlight-current": "highlight-current";
|
|
189
197
|
}>>;
|
|
198
|
+
preset: z.ZodOptional<z.ZodEnum<{
|
|
199
|
+
none: "none";
|
|
200
|
+
"fade-soft": "fade-soft";
|
|
201
|
+
"kinetic-pop": "kinetic-pop";
|
|
202
|
+
"editorial-wipe": "editorial-wipe";
|
|
203
|
+
"bold-slam": "bold-slam";
|
|
204
|
+
"type-on": "type-on";
|
|
205
|
+
}>>;
|
|
190
206
|
startMs: z.ZodOptional<z.ZodNumber>;
|
|
191
207
|
endMs: z.ZodOptional<z.ZodNumber>;
|
|
192
208
|
persistAcrossScenes: z.ZodOptional<z.ZodBoolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editClassifier.d.ts","sourceRoot":"","sources":["../../../src/services/agent/editClassifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,qBAAqB;;;;;;;;EAQhC,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,eAAe;;;iBAS1B,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,eAAO,MAAM,cAAc
|
|
1
|
+
{"version":3,"file":"editClassifier.d.ts","sourceRoot":"","sources":["../../../src/services/agent/editClassifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,qBAAqB;;;;;;;;EAQhC,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,eAAe;;;iBAS1B,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAGzB,CAAC;AAEH,eAAO,MAAM,YAAY;;;iBAKvB,CAAC;AAEH,eAAO,MAAM,eAAe;;;;iBAK1B,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;iBAKhC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;iBAGlC,CAAC;AAEH,eAAO,MAAM,iBAAiB;;iBAG5B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8B5B,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,gBAAgB,EAAE,KAAK,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,uFAAuF;IACvF,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B,GAAG,WAAW,GAAG,IAAI,CAwCrB;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE;IAC9C,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB,EAAE,MAAM,EAAE,CAAC;CACjC,GAAG,MAAM,CAuBT"}
|
|
@@ -40,6 +40,7 @@ export * from "./stitchedVideoCritic";
|
|
|
40
40
|
export * from "./stitchedVideoCritic.gemini";
|
|
41
41
|
export * from "./perSceneCritic";
|
|
42
42
|
export * from "./textOverlayStyles";
|
|
43
|
+
export * from "./textStylePacks";
|
|
43
44
|
export * from "./overlayRenderer";
|
|
44
45
|
export * from "./editClassifier";
|
|
45
46
|
export * from "./qualityGate";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/agent/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,2BAA2B,CAAC;AAC1C,cAAc,UAAU,CAAC;AACzB,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/agent/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,2BAA2B,CAAC;AAC1C,cAAc,UAAU,CAAC;AACzB,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC"}
|
|
@@ -56,6 +56,7 @@ __exportStar(require("./stitchedVideoCritic"), exports);
|
|
|
56
56
|
__exportStar(require("./stitchedVideoCritic.gemini"), exports);
|
|
57
57
|
__exportStar(require("./perSceneCritic"), exports);
|
|
58
58
|
__exportStar(require("./textOverlayStyles"), exports);
|
|
59
|
+
__exportStar(require("./textStylePacks"), exports);
|
|
59
60
|
__exportStar(require("./overlayRenderer"), exports);
|
|
60
61
|
__exportStar(require("./editClassifier"), exports);
|
|
61
62
|
__exportStar(require("./qualityGate"), exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlayRenderer.d.ts","sourceRoot":"","sources":["../../../src/services/agent/overlayRenderer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"overlayRenderer.d.ts","sourceRoot":"","sources":["../../../src/services/agent/overlayRenderer.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAuB,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAElF,MAAM,WAAW,aAAa;IAC5B,gEAAgE;IAChE,UAAU,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,gBAAgB,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,0EAA0E;IAC1E,YAAY,EAAE,MAAM,CAAC;IACrB,wCAAwC;IACxC,MAAM,EAAE,WAAW,CAAC;IACpB,8DAA8D;IAC9D,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,+CAA+C;IAC/C,eAAe,EAAE,MAAM,CAAC;IACxB,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;CACnB;AAsHD;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,aAAa,GACjB,eAAe,CA6EjB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,WAAW,EAAE,EACvB,GAAG,EAAE,aAAa,GACjB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,eAAe,EAAE,CAAA;CAAE,CAMlD;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,KAAK,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,GACzC,WAAW,EAAE,EAAE,CAyBjB"}
|
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
// REMOVED FOR v2 — kept for reference.
|
|
3
|
+
// Legacy text-overlay path (ffmpeg `drawtext` → later skia-canvas). The live v2
|
|
4
|
+
// agent render composites text via the Remotion render tree
|
|
5
|
+
// (vidspotai-remotion-components → TextClipView/CaptionClipView, driven by
|
|
6
|
+
// apps/node-express-server/src/services/render/remotionRenderer.ts), which gives
|
|
7
|
+
// the editor preview 1:1 parity with the export. Nothing in the production
|
|
8
|
+
// pipeline imports this any more — only dev/debug replay scripts do. Retained,
|
|
9
|
+
// not deleted, so those scripts keep working and the old approach is recoverable.
|
|
2
10
|
/**
|
|
3
11
|
* AG-40 — overlay renderer. Turns a `TextOverlay[]` into a list of ffmpeg
|
|
4
12
|
* `drawtext` filter expressions ready to chain in a `-filter_complex` graph.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Planner.d.ts","sourceRoot":"","sources":["../../../../src/services/agent/planner/Planner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAoB,MAAM,+BAA+B,CAAC;AAC7E,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,SAAS,EAEV,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAkB7C;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,SAAS,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,OAAO;IAIN,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAEP,IAAI,EAAE,cAAc;IAK3C,IAAI,CACR,KAAK,EAAE,UAAU,EACjB,IAAI,GAAE;QACJ,OAAO,CAAC,EAAE,YAAY,CAAC;QACvB,QAAQ,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;QACjC,WAAW,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;QACvC,KAAK,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;QAChC;;;;;;WAMG;QACH,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;KAC9B,GACL,OAAO,CAAC,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"Planner.d.ts","sourceRoot":"","sources":["../../../../src/services/agent/planner/Planner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAoB,MAAM,+BAA+B,CAAC;AAC7E,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,SAAS,EAEV,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAkB7C;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,SAAS,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,OAAO;IAIN,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAEP,IAAI,EAAE,cAAc;IAK3C,IAAI,CACR,KAAK,EAAE,UAAU,EACjB,IAAI,GAAE;QACJ,OAAO,CAAC,EAAE,YAAY,CAAC;QACvB,QAAQ,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;QACjC,WAAW,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;QACvC,KAAK,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;QAChC;;;;;;WAMG;QACH,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;KAC9B,GACL,OAAO,CAAC,SAAS,CAAC;IAoRrB;;;;;;;;;;;OAWG;IACH,UAAU,CACR,KAAK,EAAE,UAAU,EACjB,IAAI,GAAE;QACJ,OAAO,CAAC,EAAE,YAAY,CAAC;QACvB,QAAQ,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;QACjC,WAAW,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;QACvC,KAAK,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;KAC5B,GACL;QAAE,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;KAAE;IAqEhE;;;;;;;;;;;;;;;;OAgBG;IACG,0BAA0B,CAC9B,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,UAAU,EACjB,IAAI,GAAE;QACJ,OAAO,CAAC,EAAE,YAAY,CAAC;QACvB,QAAQ,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;QACjC,KAAK,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;QAChC,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,0EAA0E;QAC1E,WAAW,CAAC,EAAE,MAAM,CAAC;KACjB,GACL,OAAO,CAAC,WAAW,EAAE,CAAC;CAQ1B"}
|
|
@@ -129,9 +129,20 @@ class Planner {
|
|
|
129
129
|
const reparsed = videoPlan_schema_1.VideoPlanSchema.safeParse(result.data);
|
|
130
130
|
if (reparsed.success) {
|
|
131
131
|
// AG-9: duration contract. Brief.durationSec is the user's ask; if the
|
|
132
|
-
// plan under-delivers by >10%, re-prompt with an explicit correction.
|
|
132
|
+
// plan over/under-delivers by >10%, re-prompt with an explicit correction.
|
|
133
|
+
//
|
|
134
|
+
// Downgrade-on-last-attempt (like ttsGap/chapterGap below): for SHORT
|
|
135
|
+
// briefs the ±10% window can be narrower than the scene-duration quantum
|
|
136
|
+
// and have NO feasible integer-scene solution — e.g. an 8s brief allows
|
|
137
|
+
// 7.2–8.8s, but a 5s-min model gives 1 scene=5s (under) or 2 scenes=10s
|
|
138
|
+
// (over, ratio 1.25) with nothing in between, so every retry fails and
|
|
139
|
+
// the WHOLE project was being thrown away + paging on-call. A duration
|
|
140
|
+
// miss is a quality miss, not render-breaking (the user still gets a
|
|
141
|
+
// playable video and the storyboard shows the real total duration), so
|
|
142
|
+
// after we've burned every retry, ship the closest plan rather than
|
|
143
|
+
// fail the project. The LLM still gets all maxRetries to hit the target.
|
|
133
144
|
const durationGap = (0, validators_1.checkDurationContract)(reparsed.data, brief);
|
|
134
|
-
if (durationGap) {
|
|
145
|
+
if (durationGap && attempt < this.maxRetries) {
|
|
135
146
|
lastErrors = durationGap;
|
|
136
147
|
continue;
|
|
137
148
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structuralRules.d.ts","sourceRoot":"","sources":["../../../../src/services/agent/planner/structuralRules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAoB,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"structuralRules.d.ts","sourceRoot":"","sources":["../../../../src/services/agent/planner/structuralRules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAoB,MAAM,+BAA+B,CAAC;AAG7E;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CA0OrE"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.buildStructuralRulesSection = buildStructuralRulesSection;
|
|
4
4
|
const brief_schema_1 = require("../../../schemas/brief.schema");
|
|
5
|
+
const textStylePacks_1 = require("../textStylePacks");
|
|
5
6
|
/**
|
|
6
7
|
* Strict structural rules surfaced by Phase 1 dry-run (AG-8/9/10). These three
|
|
7
8
|
* gaps consistently capped UGC eval scores at 0.887 — pacing ignored, duration
|
|
@@ -147,7 +148,11 @@ function buildStructuralRulesSection(brief) {
|
|
|
147
148
|
// text-layout v1 — extended position vocabulary + animation/bgStyle/sizePct
|
|
148
149
|
// recommendations. Planner picks per-scene based on scene.intent / role.
|
|
149
150
|
lines.push(" - Overlay position vocabulary (set `position` explicitly to override role default): 'top', 'top-banner' (full-width strip across the top — good for category labels / counter chips), 'top-left' / 'top-right' (corner badges), 'center' (single-line emphasis), 'left-rail' (vertically-centered left 33% — product-shot copy beside the asset), 'lower-third' (default for subheadline/body), 'bottom', 'bottom-left' / 'bottom-right', 'caption-strip' (bottom-pinned word-by-word captions — TikTok-style on voiceover-driven scenes). Pick the position that matches the scene intent: hook → 'center' or 'top-banner'; product-reveal → 'left-rail' or 'lower-third'; voiceover-narration → 'caption-strip'; cta → 'lower-third' or bottom band.");
|
|
150
|
-
|
|
151
|
+
// Animation style pack — the ONE top-level animation decision. It sets how
|
|
152
|
+
// overlays and captions animate across the whole video; per-overlay
|
|
153
|
+
// `animation`/`preset` overrides below are rarely needed once a pack is set.
|
|
154
|
+
lines.push(` - ${textStylePacks_1.TEXT_STYLE_PACK_CHEAT_SHEET}`);
|
|
155
|
+
lines.push(" - Overlay animation (OPTIONAL per-overlay override — the `textStylePack` above already sets sensible motion, so only set this when ONE overlay must differ): 'fade', 'slide-up', 'pop', 'type', 'word-pop', 'highlight-current' (caption-strip only). Prefer leaving it unset and letting the pack drive the look.");
|
|
151
156
|
lines.push(" - Overlay bgStyle (background decoration for legibility — set `bgStyle` to override the auto-default): 'none' (text only, no chrome), 'shadow' (drop shadow — safe default on any background), 'pill' (rounded-rect fill hugging the text — great for cta / counter chips), 'bar' (full-width edge-to-edge band — pairs with 'top-banner' or 'caption-strip'), 'outline' (glyph stroke for high contrast on busy footage). The renderer applies a smart default when omitted, so only set this when you specifically want a different treatment.");
|
|
152
157
|
lines.push(" - Overlay sizePct (optional alternative to fontSize, expressed as % of frame height, range 2–20): use for resolution-independent sizing. Typical: hook headline ~10–14, subheadline ~6–8, body ~4–6, caption-strip ~5–7, watermark ~2–3. The role default is fine 90% of the time; only set sizePct when you want emphasis bigger or smaller than the role suggests.");
|
|
153
158
|
lines.push(" - Overlay font (optional, picks from the curated pack): one of 'Inter', 'Anton', 'Bebas Neue', 'Playfair Display', 'Caveat', 'Permanent Marker', 'IBM Plex Sans', 'Space Grotesk', 'Archivo Black', 'Outfit', 'Fraunces', 'DM Serif Display'. Persona-driven pick: friendly/casual → Caveat or Outfit; bold/urgent (sales hook) → Anton, Archivo Black, or Bebas Neue; editorial/premium → Playfair Display, Fraunces, or DM Serif Display; tech/modern → Inter, Space Grotesk, or IBM Plex Sans; handmade/artisanal → Permanent Marker or Caveat. Omit `font` to use the role default (Poppins) when no persona signal is strong.");
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Text/caption style packs — the per-video "animation look" the planner picks
|
|
3
|
+
* once, resolved into concrete TextPreset / CaptionPreset defaults per role.
|
|
4
|
+
*
|
|
5
|
+
* Why a pack (not per-overlay animation choices): a single coherent look reads
|
|
6
|
+
* far better than each overlay animating differently. The planner emits ONE
|
|
7
|
+
* `textStylePack` for the whole video; planToProject resolves it into a preset
|
|
8
|
+
* for every overlay/caption, and any per-overlay `preset` still wins. The
|
|
9
|
+
* preset ids here MUST stay in lock-step with the registry in
|
|
10
|
+
* `vidspotai-remotion-components/src/presets` and the enums in project.schema.
|
|
11
|
+
*/
|
|
12
|
+
import type { CaptionPreset, TextPreset } from "../../schemas/project.schema";
|
|
13
|
+
import type { TextRole, TextStylePack } from "../../schemas/videoPlan.schema";
|
|
14
|
+
export interface StylePackDef {
|
|
15
|
+
label: string;
|
|
16
|
+
description: string;
|
|
17
|
+
/** Default text preset for any role not in `textByRole`. */
|
|
18
|
+
text: TextPreset;
|
|
19
|
+
/** Role-specific overrides (e.g. headlines slam, body fades). */
|
|
20
|
+
textByRole?: Partial<Record<TextRole, TextPreset>>;
|
|
21
|
+
/** Caption animation for the whole video. */
|
|
22
|
+
caption: CaptionPreset;
|
|
23
|
+
}
|
|
24
|
+
export declare const DEFAULT_STYLE_PACK: TextStylePack;
|
|
25
|
+
export declare const TEXT_STYLE_PACKS: Record<TextStylePack, StylePackDef>;
|
|
26
|
+
/** Resolve the text preset for a given role under a pack (per-role override wins). */
|
|
27
|
+
export declare function resolveTextPreset(pack: TextStylePack | undefined, role: TextRole): TextPreset;
|
|
28
|
+
/** Resolve the caption preset for a pack. */
|
|
29
|
+
export declare function resolveCaptionPreset(pack: TextStylePack | undefined): CaptionPreset;
|
|
30
|
+
/**
|
|
31
|
+
* Cheat sheet handed to the planner so it picks a pack that fits the persona /
|
|
32
|
+
* brief instead of leaving it default. One line per pack.
|
|
33
|
+
*/
|
|
34
|
+
export declare const TEXT_STYLE_PACK_CHEAT_SHEET: string;
|
|
35
|
+
//# sourceMappingURL=textStylePacks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textStylePacks.d.ts","sourceRoot":"","sources":["../../../src/services/agent/textStylePacks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE9E,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,IAAI,EAAE,UAAU,CAAC;IACjB,iEAAiE;IACjE,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;IACnD,6CAA6C;IAC7C,OAAO,EAAE,aAAa,CAAC;CACxB;AAED,eAAO,MAAM,kBAAkB,EAAE,aAAuB,CAAC;AAEzD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,aAAa,EAAE,YAAY,CAqChE,CAAC;AAEF,sFAAsF;AACtF,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,aAAa,GAAG,SAAS,EAC/B,IAAI,EAAE,QAAQ,GACb,UAAU,CAGZ;AAED,6CAA6C;AAC7C,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,aAAa,GAAG,SAAS,GAC9B,aAAa,CAEf;AAED;;;GAGG;AACH,eAAO,MAAM,2BAA2B,QAMhC,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Text/caption style packs — the per-video "animation look" the planner picks
|
|
4
|
+
* once, resolved into concrete TextPreset / CaptionPreset defaults per role.
|
|
5
|
+
*
|
|
6
|
+
* Why a pack (not per-overlay animation choices): a single coherent look reads
|
|
7
|
+
* far better than each overlay animating differently. The planner emits ONE
|
|
8
|
+
* `textStylePack` for the whole video; planToProject resolves it into a preset
|
|
9
|
+
* for every overlay/caption, and any per-overlay `preset` still wins. The
|
|
10
|
+
* preset ids here MUST stay in lock-step with the registry in
|
|
11
|
+
* `vidspotai-remotion-components/src/presets` and the enums in project.schema.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.TEXT_STYLE_PACK_CHEAT_SHEET = exports.TEXT_STYLE_PACKS = exports.DEFAULT_STYLE_PACK = void 0;
|
|
15
|
+
exports.resolveTextPreset = resolveTextPreset;
|
|
16
|
+
exports.resolveCaptionPreset = resolveCaptionPreset;
|
|
17
|
+
exports.DEFAULT_STYLE_PACK = "clean";
|
|
18
|
+
exports.TEXT_STYLE_PACKS = {
|
|
19
|
+
clean: {
|
|
20
|
+
label: "Clean",
|
|
21
|
+
description: "Gentle fades, no flashy motion. Corporate, explainer, professional, real-estate.",
|
|
22
|
+
text: "fade-soft",
|
|
23
|
+
caption: "none",
|
|
24
|
+
},
|
|
25
|
+
bold: {
|
|
26
|
+
label: "Bold",
|
|
27
|
+
description: "Headlines slam in, captions pop word-by-word. Direct-response ads, promos, hooks.",
|
|
28
|
+
text: "kinetic-pop",
|
|
29
|
+
textByRole: { headline: "bold-slam", cta: "bold-slam" },
|
|
30
|
+
caption: "tiktok-word",
|
|
31
|
+
},
|
|
32
|
+
kinetic: {
|
|
33
|
+
label: "Kinetic",
|
|
34
|
+
description: "Energetic per-word motion throughout. Social / UGC / fast-cut, high-retention.",
|
|
35
|
+
text: "kinetic-pop",
|
|
36
|
+
caption: "tiktok-word",
|
|
37
|
+
},
|
|
38
|
+
editorial: {
|
|
39
|
+
label: "Editorial",
|
|
40
|
+
description: "Refined wipe reveals + karaoke caption fill. Premium brand films, fashion, lifestyle.",
|
|
41
|
+
text: "editorial-wipe",
|
|
42
|
+
caption: "karaoke-fill",
|
|
43
|
+
},
|
|
44
|
+
minimal: {
|
|
45
|
+
label: "Minimal",
|
|
46
|
+
description: "Static text, plain captions. Let the visuals lead — cinematic, documentary.",
|
|
47
|
+
text: "none",
|
|
48
|
+
caption: "none",
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
/** Resolve the text preset for a given role under a pack (per-role override wins). */
|
|
52
|
+
function resolveTextPreset(pack, role) {
|
|
53
|
+
const def = exports.TEXT_STYLE_PACKS[pack ?? exports.DEFAULT_STYLE_PACK];
|
|
54
|
+
return def.textByRole?.[role] ?? def.text;
|
|
55
|
+
}
|
|
56
|
+
/** Resolve the caption preset for a pack. */
|
|
57
|
+
function resolveCaptionPreset(pack) {
|
|
58
|
+
return exports.TEXT_STYLE_PACKS[pack ?? exports.DEFAULT_STYLE_PACK].caption;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Cheat sheet handed to the planner so it picks a pack that fits the persona /
|
|
62
|
+
* brief instead of leaving it default. One line per pack.
|
|
63
|
+
*/
|
|
64
|
+
exports.TEXT_STYLE_PACK_CHEAT_SHEET = `
|
|
65
|
+
Animation style packs (pick exactly one \`textStylePack\` for the whole video — match it to the persona/vibe):
|
|
66
|
+
${Object.entries(exports.TEXT_STYLE_PACKS)
|
|
67
|
+
.map(([id, def]) => ` - ${id}: ${def.description}`)
|
|
68
|
+
.join("\n")}
|
|
69
|
+
Default is "clean" when unsure. The pack drives how headlines/CTAs and captions animate; you don't need to set per-overlay \`animation\`/\`preset\` unless one overlay must differ.
|
|
70
|
+
`.trim();
|
|
@@ -36,6 +36,7 @@ declare const InputSchema: z.ZodObject<{
|
|
|
36
36
|
fx: "fx";
|
|
37
37
|
}>;
|
|
38
38
|
name: z.ZodOptional<z.ZodString>;
|
|
39
|
+
sourceTrackId: z.ZodOptional<z.ZodString>;
|
|
39
40
|
index: z.ZodNumber;
|
|
40
41
|
muted: z.ZodDefault<z.ZodBoolean>;
|
|
41
42
|
hidden: z.ZodDefault<z.ZodBoolean>;
|
|
@@ -230,6 +231,14 @@ declare const InputSchema: z.ZodObject<{
|
|
|
230
231
|
}>>;
|
|
231
232
|
backgroundColor: z.ZodOptional<z.ZodString>;
|
|
232
233
|
shadow: z.ZodOptional<z.ZodString>;
|
|
234
|
+
preset: z.ZodOptional<z.ZodEnum<{
|
|
235
|
+
none: "none";
|
|
236
|
+
"fade-soft": "fade-soft";
|
|
237
|
+
"kinetic-pop": "kinetic-pop";
|
|
238
|
+
"editorial-wipe": "editorial-wipe";
|
|
239
|
+
"bold-slam": "bold-slam";
|
|
240
|
+
"type-on": "type-on";
|
|
241
|
+
}>>;
|
|
233
242
|
id: z.ZodString;
|
|
234
243
|
trackId: z.ZodString;
|
|
235
244
|
display: z.ZodObject<{
|
|
@@ -285,6 +294,12 @@ declare const InputSchema: z.ZodObject<{
|
|
|
285
294
|
color: z.ZodDefault<z.ZodString>;
|
|
286
295
|
highlightColor: z.ZodOptional<z.ZodString>;
|
|
287
296
|
language: z.ZodDefault<z.ZodString>;
|
|
297
|
+
preset: z.ZodOptional<z.ZodEnum<{
|
|
298
|
+
none: "none";
|
|
299
|
+
"tiktok-word": "tiktok-word";
|
|
300
|
+
"karaoke-fill": "karaoke-fill";
|
|
301
|
+
"block-cut": "block-cut";
|
|
302
|
+
}>>;
|
|
288
303
|
id: z.ZodString;
|
|
289
304
|
trackId: z.ZodString;
|
|
290
305
|
display: z.ZodObject<{
|
|
@@ -353,6 +368,7 @@ declare const InputSchema: z.ZodObject<{
|
|
|
353
368
|
"from-bottom-left": "from-bottom-left";
|
|
354
369
|
}>>;
|
|
355
370
|
}, z.core.$strip>>>;
|
|
371
|
+
masterVolume: z.ZodDefault<z.ZodNumber>;
|
|
356
372
|
agentRunId: z.ZodOptional<z.ZodString>;
|
|
357
373
|
metadata: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
358
374
|
createdAt: z.ZodString;
|
|
@@ -549,6 +565,14 @@ declare const InputSchema: z.ZodObject<{
|
|
|
549
565
|
}>>;
|
|
550
566
|
backgroundColor: z.ZodOptional<z.ZodString>;
|
|
551
567
|
shadow: z.ZodOptional<z.ZodString>;
|
|
568
|
+
preset: z.ZodOptional<z.ZodEnum<{
|
|
569
|
+
none: "none";
|
|
570
|
+
"fade-soft": "fade-soft";
|
|
571
|
+
"kinetic-pop": "kinetic-pop";
|
|
572
|
+
"editorial-wipe": "editorial-wipe";
|
|
573
|
+
"bold-slam": "bold-slam";
|
|
574
|
+
"type-on": "type-on";
|
|
575
|
+
}>>;
|
|
552
576
|
id: z.ZodString;
|
|
553
577
|
trackId: z.ZodString;
|
|
554
578
|
display: z.ZodObject<{
|
|
@@ -604,6 +628,12 @@ declare const InputSchema: z.ZodObject<{
|
|
|
604
628
|
color: z.ZodDefault<z.ZodString>;
|
|
605
629
|
highlightColor: z.ZodOptional<z.ZodString>;
|
|
606
630
|
language: z.ZodDefault<z.ZodString>;
|
|
631
|
+
preset: z.ZodOptional<z.ZodEnum<{
|
|
632
|
+
none: "none";
|
|
633
|
+
"tiktok-word": "tiktok-word";
|
|
634
|
+
"karaoke-fill": "karaoke-fill";
|
|
635
|
+
"block-cut": "block-cut";
|
|
636
|
+
}>>;
|
|
607
637
|
id: z.ZodString;
|
|
608
638
|
trackId: z.ZodString;
|
|
609
639
|
display: z.ZodObject<{
|
|
@@ -711,6 +741,7 @@ declare const OutputSchema: z.ZodObject<{
|
|
|
711
741
|
fx: "fx";
|
|
712
742
|
}>;
|
|
713
743
|
name: z.ZodOptional<z.ZodString>;
|
|
744
|
+
sourceTrackId: z.ZodOptional<z.ZodString>;
|
|
714
745
|
index: z.ZodNumber;
|
|
715
746
|
muted: z.ZodDefault<z.ZodBoolean>;
|
|
716
747
|
hidden: z.ZodDefault<z.ZodBoolean>;
|
|
@@ -905,6 +936,14 @@ declare const OutputSchema: z.ZodObject<{
|
|
|
905
936
|
}>>;
|
|
906
937
|
backgroundColor: z.ZodOptional<z.ZodString>;
|
|
907
938
|
shadow: z.ZodOptional<z.ZodString>;
|
|
939
|
+
preset: z.ZodOptional<z.ZodEnum<{
|
|
940
|
+
none: "none";
|
|
941
|
+
"fade-soft": "fade-soft";
|
|
942
|
+
"kinetic-pop": "kinetic-pop";
|
|
943
|
+
"editorial-wipe": "editorial-wipe";
|
|
944
|
+
"bold-slam": "bold-slam";
|
|
945
|
+
"type-on": "type-on";
|
|
946
|
+
}>>;
|
|
908
947
|
id: z.ZodString;
|
|
909
948
|
trackId: z.ZodString;
|
|
910
949
|
display: z.ZodObject<{
|
|
@@ -960,6 +999,12 @@ declare const OutputSchema: z.ZodObject<{
|
|
|
960
999
|
color: z.ZodDefault<z.ZodString>;
|
|
961
1000
|
highlightColor: z.ZodOptional<z.ZodString>;
|
|
962
1001
|
language: z.ZodDefault<z.ZodString>;
|
|
1002
|
+
preset: z.ZodOptional<z.ZodEnum<{
|
|
1003
|
+
none: "none";
|
|
1004
|
+
"tiktok-word": "tiktok-word";
|
|
1005
|
+
"karaoke-fill": "karaoke-fill";
|
|
1006
|
+
"block-cut": "block-cut";
|
|
1007
|
+
}>>;
|
|
963
1008
|
id: z.ZodString;
|
|
964
1009
|
trackId: z.ZodString;
|
|
965
1010
|
display: z.ZodObject<{
|
|
@@ -1028,6 +1073,7 @@ declare const OutputSchema: z.ZodObject<{
|
|
|
1028
1073
|
"from-bottom-left": "from-bottom-left";
|
|
1029
1074
|
}>>;
|
|
1030
1075
|
}, z.core.$strip>>>;
|
|
1076
|
+
masterVolume: z.ZodDefault<z.ZodNumber>;
|
|
1031
1077
|
agentRunId: z.ZodOptional<z.ZodString>;
|
|
1032
1078
|
metadata: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
1033
1079
|
createdAt: z.ZodString;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composeScene.tool.d.ts","sourceRoot":"","sources":["../../../../src/services/agent/tools/composeScene.tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,OAAO,EAAgB,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAiC/D,QAAA,MAAM,WAAW
|
|
1
|
+
{"version":3,"file":"composeScene.tool.d.ts","sourceRoot":"","sources":["../../../../src/services/agent/tools/composeScene.tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,OAAO,EAAgB,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAiC/D,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAGf,CAAC;AAEH,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAIhB,CAAC;AAEH,eAAO,MAAM,gBAAgB,EAAE,cAAc,CAC3C,OAAO,WAAW,EAClB,OAAO,YAAY,CA4DpB,CAAC"}
|