@clipwright/core 0.19.0 → 0.21.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 (135) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/dist/__fixtures__/queue-promises.d.ts +5 -84
  3. package/dist/__fixtures__/queue-promises.js +7 -84
  4. package/dist/__fixtures__/queue-promises.js.map +1 -1
  5. package/dist/account-actors.d.ts +25 -25
  6. package/dist/account-actors.js +25 -25
  7. package/dist/account-actors.js.map +1 -1
  8. package/dist/account.d.ts +4 -10
  9. package/dist/account.js +6 -12
  10. package/dist/account.js.map +1 -1
  11. package/dist/actor-bounds.d.ts +4 -4
  12. package/dist/actor-bounds.js +4 -4
  13. package/dist/actor-bounds.js.map +1 -1
  14. package/dist/actor-qualities.d.ts +3 -3
  15. package/dist/actor-qualities.js +3 -3
  16. package/dist/actor-qualities.js.map +1 -1
  17. package/dist/actors.d.ts +8 -8
  18. package/dist/actors.js +9 -9
  19. package/dist/actors.js.map +1 -1
  20. package/dist/api-failure.d.ts +28 -129
  21. package/dist/api-failure.js +52 -225
  22. package/dist/api-failure.js.map +1 -1
  23. package/dist/aspect.d.ts +26 -96
  24. package/dist/aspect.js +32 -108
  25. package/dist/aspect.js.map +1 -1
  26. package/dist/contract-dispositions.d.ts +42 -167
  27. package/dist/contract-dispositions.js +54 -184
  28. package/dist/contract-dispositions.js.map +1 -1
  29. package/dist/endpoints.d.ts +5 -5
  30. package/dist/endpoints.js +5 -3
  31. package/dist/endpoints.js.map +1 -1
  32. package/dist/errors.d.ts +33 -101
  33. package/dist/errors.js +42 -108
  34. package/dist/errors.js.map +1 -1
  35. package/dist/faceless-cut-style.d.ts +115 -0
  36. package/dist/faceless-cut-style.js +109 -0
  37. package/dist/faceless-cut-style.js.map +1 -0
  38. package/dist/faceless-image-qualification.d.ts +97 -0
  39. package/dist/faceless-image-qualification.js +145 -0
  40. package/dist/faceless-image-qualification.js.map +1 -0
  41. package/dist/faceless-price.d.ts +21 -0
  42. package/dist/faceless-price.js +25 -0
  43. package/dist/faceless-price.js.map +1 -0
  44. package/dist/faceless-public-plan.d.ts +71 -0
  45. package/dist/faceless-public-plan.js +166 -0
  46. package/dist/faceless-public-plan.js.map +1 -0
  47. package/dist/faceless-public.d.ts +107 -0
  48. package/dist/faceless-public.js +74 -0
  49. package/dist/faceless-public.js.map +1 -0
  50. package/dist/faceless-short-61.d.ts +83 -0
  51. package/dist/faceless-short-61.js +152 -0
  52. package/dist/faceless-short-61.js.map +1 -0
  53. package/dist/faceless-storyboard-timing.d.ts +40 -0
  54. package/dist/faceless-storyboard-timing.js +97 -0
  55. package/dist/faceless-storyboard-timing.js.map +1 -0
  56. package/dist/faceless-storyboard-v2-plan.d.ts +3 -0
  57. package/dist/faceless-storyboard-v2-plan.js +112 -0
  58. package/dist/faceless-storyboard-v2-plan.js.map +1 -0
  59. package/dist/faceless-storyboard-v2-timing.d.ts +63 -0
  60. package/dist/faceless-storyboard-v2-timing.js +143 -0
  61. package/dist/faceless-storyboard-v2-timing.js.map +1 -0
  62. package/dist/faceless-storyboard-v2.d.ts +44 -0
  63. package/dist/faceless-storyboard-v2.js +43 -0
  64. package/dist/faceless-storyboard-v2.js.map +1 -0
  65. package/dist/faceless-storyboard.d.ts +55 -0
  66. package/dist/faceless-storyboard.js +105 -0
  67. package/dist/faceless-storyboard.js.map +1 -0
  68. package/dist/idempotency.d.ts +10 -44
  69. package/dist/idempotency.js +18 -44
  70. package/dist/idempotency.js.map +1 -1
  71. package/dist/index.d.ts +3 -0
  72. package/dist/index.js +24 -25
  73. package/dist/index.js.map +1 -1
  74. package/dist/long-form-pricing.d.ts +4 -4
  75. package/dist/long-form-pricing.js +4 -4
  76. package/dist/long-form-pricing.js.map +1 -1
  77. package/dist/long-form-profile.d.ts +2 -2
  78. package/dist/long-form-profile.js +2 -2
  79. package/dist/long-form-profile.js.map +1 -1
  80. package/dist/pacing.d.ts +1 -1
  81. package/dist/pacing.js +1 -1
  82. package/dist/pacing.js.map +1 -1
  83. package/dist/public-endpoints.d.ts +9 -11
  84. package/dist/public-endpoints.js +11 -13
  85. package/dist/public-endpoints.js.map +1 -1
  86. package/dist/rate-limit.d.ts +23 -130
  87. package/dist/rate-limit.js +27 -132
  88. package/dist/rate-limit.js.map +1 -1
  89. package/dist/render-backend.d.ts +30 -145
  90. package/dist/render-backend.js +4 -27
  91. package/dist/render-backend.js.map +1 -1
  92. package/dist/run-preflight.d.ts +4 -4
  93. package/dist/run-preflight.js +10 -10
  94. package/dist/run-preflight.js.map +1 -1
  95. package/dist/run-static-warnings.d.ts +8 -8
  96. package/dist/run-static-warnings.js +26 -24
  97. package/dist/run-static-warnings.js.map +1 -1
  98. package/dist/runs.d.ts +34 -55
  99. package/dist/runs.js +28 -94
  100. package/dist/runs.js.map +1 -1
  101. package/dist/script-integrity.d.ts +6 -7
  102. package/dist/script-integrity.js +7 -8
  103. package/dist/script-integrity.js.map +1 -1
  104. package/dist/semantic-inserts.d.ts +4 -4
  105. package/dist/semantic-inserts.js +6 -6
  106. package/dist/semantic-inserts.js.map +1 -1
  107. package/dist/skills.d.ts +37 -108
  108. package/dist/skills.js +77 -161
  109. package/dist/skills.js.map +1 -1
  110. package/dist/tts-backend.d.ts +13 -42
  111. package/dist/tts-backend.js +2 -10
  112. package/dist/tts-backend.js.map +1 -1
  113. package/dist/uploads.d.ts +4 -4
  114. package/dist/uploads.js +4 -4
  115. package/dist/uploads.js.map +1 -1
  116. package/dist/vendor-response.d.ts +17 -80
  117. package/dist/vendor-response.js +19 -67
  118. package/dist/vendor-response.js.map +1 -1
  119. package/dist/voice-admission.d.ts +5 -5
  120. package/dist/voice-admission.js +6 -6
  121. package/dist/voice-admission.js.map +1 -1
  122. package/dist/voice-catalog-data.d.ts +2 -2
  123. package/dist/voice-catalog-data.js +2 -2
  124. package/dist/voice-catalog-data.js.map +1 -1
  125. package/dist/voice-catalog.d.ts +5 -5
  126. package/dist/voice-catalog.generated.json +56 -54
  127. package/dist/voice-catalog.js +6 -6
  128. package/dist/voice-catalog.js.map +1 -1
  129. package/dist/voice-listing.d.ts +4 -4
  130. package/dist/voice-listing.js +6 -6
  131. package/dist/voice-listing.js.map +1 -1
  132. package/dist/voices.d.ts +40 -82
  133. package/dist/voices.js +56 -99
  134. package/dist/voices.js.map +1 -1
  135. package/package.json +1 -1
@@ -0,0 +1,115 @@
1
+ import { z } from "zod";
2
+ declare const profile: z.ZodObject<{
3
+ schema: z.ZodLiteral<"cut_style_profile_v1">;
4
+ fps: z.ZodLiteral<25>;
5
+ style_id: z.ZodString;
6
+ sources: z.ZodArray<z.ZodObject<{
7
+ sha256: z.ZodString;
8
+ reviewed_shots: z.ZodNumber;
9
+ image_shots: z.ZodNumber;
10
+ aligned_cuts: z.ZodNumber;
11
+ }, z.core.$strict>>;
12
+ speech_rules_available: z.ZodBoolean;
13
+ pacing: z.ZodObject<{
14
+ global_image_frames: z.ZodObject<{
15
+ p25: z.ZodNullable<z.ZodNumber>;
16
+ p50: z.ZodNullable<z.ZodNumber>;
17
+ p75: z.ZodNullable<z.ZodNumber>;
18
+ n: z.ZodNumber;
19
+ }, z.core.$strict>;
20
+ by_phase: z.ZodRecord<z.ZodEnum<{
21
+ climax: "climax";
22
+ development: "development";
23
+ resolution: "resolution";
24
+ setup: "setup";
25
+ }> & z.core.$partial, z.ZodObject<{
26
+ p25: z.ZodNullable<z.ZodNumber>;
27
+ p50: z.ZodNullable<z.ZodNumber>;
28
+ p75: z.ZodNullable<z.ZodNumber>;
29
+ n: z.ZodNumber;
30
+ }, z.core.$strict>>;
31
+ short_bursts: z.ZodObject<{
32
+ shot_count: z.ZodNumber;
33
+ n: z.ZodNumber;
34
+ }, z.core.$strict>;
35
+ }, z.core.$strict>;
36
+ motion: z.ZodObject<{
37
+ pan_flip_probability: z.ZodNullable<z.ZodNumber>;
38
+ pan_transition_n: z.ZodNumber;
39
+ pan_travel_fraction: z.ZodNullable<z.ZodNumber>;
40
+ pan_travel_n: z.ZodNumber;
41
+ }, z.core.$strict>;
42
+ opening_video: z.ZodObject<{
43
+ share: z.ZodNumber;
44
+ n: z.ZodNumber;
45
+ duration_frames: z.ZodObject<{
46
+ p25: z.ZodNullable<z.ZodNumber>;
47
+ p50: z.ZodNullable<z.ZodNumber>;
48
+ p75: z.ZodNullable<z.ZodNumber>;
49
+ n: z.ZodNumber;
50
+ }, z.core.$strict>;
51
+ }, z.core.$strict>;
52
+ captions: z.ZodObject<{
53
+ n: z.ZodNumber;
54
+ style: z.ZodNullable<z.ZodString>;
55
+ style_n: z.ZodNumber;
56
+ position_fraction: z.ZodNullable<z.ZodNumber>;
57
+ position_fraction_n: z.ZodNumber;
58
+ color: z.ZodNullable<z.ZodString>;
59
+ color_n: z.ZodNumber;
60
+ accent: z.ZodNullable<z.ZodString>;
61
+ accent_n: z.ZodNumber;
62
+ changes_per_sec: z.ZodObject<{
63
+ p25: z.ZodNullable<z.ZodNumber>;
64
+ p50: z.ZodNullable<z.ZodNumber>;
65
+ p75: z.ZodNullable<z.ZodNumber>;
66
+ n: z.ZodNumber;
67
+ }, z.core.$strict>;
68
+ }, z.core.$strict>;
69
+ speech: z.ZodNullable<z.ZodObject<{
70
+ n: z.ZodNumber;
71
+ unknown: z.ZodNumber;
72
+ class_counts: z.ZodRecord<z.ZodEnum<{
73
+ mid_word: "mid_word";
74
+ pause: "pause";
75
+ phrase: "phrase";
76
+ sentence: "sentence";
77
+ word: "word";
78
+ }> & z.core.$partial, z.ZodNumber>;
79
+ offset_frames: z.ZodObject<{
80
+ sentence: z.ZodObject<{
81
+ p25: z.ZodNullable<z.ZodNumber>;
82
+ p50: z.ZodNullable<z.ZodNumber>;
83
+ p75: z.ZodNullable<z.ZodNumber>;
84
+ n: z.ZodNumber;
85
+ }, z.core.$strict>;
86
+ phrase: z.ZodObject<{
87
+ p25: z.ZodNullable<z.ZodNumber>;
88
+ p50: z.ZodNullable<z.ZodNumber>;
89
+ p75: z.ZodNullable<z.ZodNumber>;
90
+ n: z.ZodNumber;
91
+ }, z.core.$strict>;
92
+ pause: z.ZodObject<{
93
+ p25: z.ZodNullable<z.ZodNumber>;
94
+ p50: z.ZodNullable<z.ZodNumber>;
95
+ p75: z.ZodNullable<z.ZodNumber>;
96
+ n: z.ZodNumber;
97
+ }, z.core.$strict>;
98
+ word: z.ZodObject<{
99
+ p25: z.ZodNullable<z.ZodNumber>;
100
+ p50: z.ZodNullable<z.ZodNumber>;
101
+ p75: z.ZodNullable<z.ZodNumber>;
102
+ n: z.ZodNumber;
103
+ }, z.core.$strict>;
104
+ mid_word: z.ZodObject<{
105
+ p25: z.ZodNullable<z.ZodNumber>;
106
+ p50: z.ZodNullable<z.ZodNumber>;
107
+ p75: z.ZodNullable<z.ZodNumber>;
108
+ n: z.ZodNumber;
109
+ }, z.core.$strict>;
110
+ }, z.core.$strict>;
111
+ }, z.core.$strict>>;
112
+ }, z.core.$strict>;
113
+ export type CutStyleProfile = z.infer<typeof profile>;
114
+ export declare function parseCutStyle(input: unknown): CutStyleProfile;
115
+ export {};
@@ -0,0 +1,109 @@
1
+ import { z } from "zod";
2
+ const count = z.number().int().nonnegative().safe();
3
+ const positiveCount = count.positive();
4
+ const finite = z.number().finite();
5
+ const nonnegative = finite.nonnegative();
6
+ const fraction = nonnegative.max(1);
7
+ const nonblank = z.string().trim().min(1);
8
+ const phase = z.enum(["setup", "development", "climax", "resolution"]);
9
+ const customIssue = "custom";
10
+ function quantiles(value) {
11
+ return z.strictObject({
12
+ p25: value.nullable(), p50: value.nullable(), p75: value.nullable(), n: count,
13
+ }).superRefine((q, ctx) => {
14
+ if (q.n === 0) {
15
+ if (q.p25 !== null || q.p50 !== null || q.p75 !== null) {
16
+ ctx.addIssue({ code: customIssue, message: "empty quantiles require null values" });
17
+ }
18
+ }
19
+ else if (q.p25 === null || q.p50 === null || q.p75 === null || q.p25 > q.p50 || q.p50 > q.p75) {
20
+ ctx.addIssue({ code: customIssue, message: "quantiles must be finite and ordered" });
21
+ }
22
+ });
23
+ }
24
+ const frameQuantiles = quantiles(count);
25
+ const signedQuantiles = quantiles(z.number().int().safe());
26
+ const speechClasses = ["sentence", "phrase", "pause", "word", "mid_word"];
27
+ const speechCounts = z.partialRecord(z.enum(speechClasses), count);
28
+ const speechOffsets = z.strictObject({
29
+ sentence: signedQuantiles,
30
+ phrase: signedQuantiles,
31
+ pause: signedQuantiles,
32
+ word: signedQuantiles,
33
+ mid_word: signedQuantiles,
34
+ });
35
+ const speech = z.strictObject({
36
+ n: positiveCount,
37
+ unknown: count,
38
+ class_counts: speechCounts,
39
+ offset_frames: speechOffsets,
40
+ }).superRefine((s, ctx) => {
41
+ if (Object.values(s.class_counts).reduce((sum, n) => sum + n, 0) !== s.n) {
42
+ ctx.addIssue({ code: customIssue, message: "speech class counts must equal n" });
43
+ }
44
+ for (const name of speechClasses) {
45
+ if (s.offset_frames[name].n !== (s.class_counts[name] ?? 0)) {
46
+ ctx.addIssue({ code: customIssue, message: `speech offset count differs for ${name}` });
47
+ }
48
+ }
49
+ });
50
+ const profile = z.strictObject({
51
+ schema: z.literal("cut_style_profile_v1"),
52
+ fps: z.literal(25),
53
+ style_id: nonblank,
54
+ sources: z.array(z.strictObject({
55
+ sha256: z.string().regex(/^[a-fA-F0-9]{64}$/),
56
+ reviewed_shots: positiveCount,
57
+ image_shots: count,
58
+ aligned_cuts: count,
59
+ })).min(1),
60
+ speech_rules_available: z.boolean(),
61
+ pacing: z.strictObject({
62
+ global_image_frames: frameQuantiles,
63
+ by_phase: z.partialRecord(phase, frameQuantiles),
64
+ short_bursts: z.strictObject({ shot_count: count, n: count }),
65
+ }),
66
+ motion: z.strictObject({
67
+ pan_flip_probability: fraction.nullable(),
68
+ pan_transition_n: count,
69
+ pan_travel_fraction: fraction.nullable(),
70
+ pan_travel_n: count,
71
+ }),
72
+ opening_video: z.strictObject({
73
+ share: fraction,
74
+ n: count,
75
+ duration_frames: frameQuantiles,
76
+ }),
77
+ captions: z.strictObject({
78
+ n: count,
79
+ style: nonblank.nullable(), style_n: count,
80
+ position_fraction: fraction.nullable(), position_fraction_n: count,
81
+ color: nonblank.nullable(), color_n: count,
82
+ accent: nonblank.nullable(), accent_n: count,
83
+ changes_per_sec: quantiles(nonnegative),
84
+ }),
85
+ speech: speech.nullable(),
86
+ }).superRefine((p, ctx) => {
87
+ if (p.pacing.global_image_frames.n === 0) {
88
+ ctx.addIssue({ code: customIssue, message: "global image pace needs observations" });
89
+ }
90
+ if (p.speech_rules_available !== (p.speech !== null)) {
91
+ ctx.addIssue({ code: customIssue, message: "speech availability requires measured speech" });
92
+ }
93
+ if (p.speech !== null && p.speech.n + p.speech.unknown !==
94
+ p.sources.reduce((sum, source) => sum + source.aligned_cuts, 0)) {
95
+ ctx.addIssue({ code: customIssue, message: "speech samples must match aligned source cuts" });
96
+ }
97
+ for (const source of p.sources) {
98
+ if (source.aligned_cuts > Math.max(0, source.reviewed_shots - 1)) {
99
+ ctx.addIssue({ code: customIssue, message: "aligned cuts exceed reviewed shot boundaries" });
100
+ }
101
+ if (source.image_shots > source.reviewed_shots) {
102
+ ctx.addIssue({ code: customIssue, message: "image shots exceed reviewed shots" });
103
+ }
104
+ }
105
+ });
106
+ export function parseCutStyle(input) {
107
+ return profile.parse(input);
108
+ }
109
+ //# sourceMappingURL=faceless-cut-style.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faceless-cut-style.js","sourceRoot":"","sources":["../src/faceless-cut-style.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ import { z } from "zod";
2
+ declare const plan: z.ZodObject<{
3
+ version: z.ZodLiteral<"faceless_image_v1">;
4
+ script: z.ZodString;
5
+ aspectRatio: z.ZodLiteral<"9:16">;
6
+ resolution: z.ZodLiteral<"1080p">;
7
+ brollPolicy: z.ZodEnum<{
8
+ anyone: "anyone";
9
+ no_actor: "no_actor";
10
+ no_people: "no_people";
11
+ }>;
12
+ assets: z.ZodArray<z.ZodObject<{
13
+ id: z.ZodString;
14
+ role: z.ZodEnum<{
15
+ character: "character";
16
+ scene: "scene";
17
+ style: "style";
18
+ }>;
19
+ source: z.ZodDiscriminatedUnion<[z.ZodObject<{
20
+ kind: z.ZodLiteral<"supplied">;
21
+ url: z.ZodURL;
22
+ }, z.core.$strict>, z.ZodObject<{
23
+ kind: z.ZodLiteral<"generated">;
24
+ prompt: z.ZodString;
25
+ styleId: z.ZodOptional<z.ZodString>;
26
+ characterIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
27
+ }, z.core.$strict>], "kind">;
28
+ }, z.core.$strict>>;
29
+ scenes: z.ZodArray<z.ZodObject<{
30
+ id: z.ZodString;
31
+ assetId: z.ZodString;
32
+ durationFrames: z.ZodNumber;
33
+ motion: z.ZodOptional<z.ZodObject<{
34
+ direction: z.ZodEnum<{
35
+ in: "in";
36
+ out: "out";
37
+ }>;
38
+ amount: z.ZodNumber;
39
+ }, z.core.$strict>>;
40
+ }, z.core.$strict>>;
41
+ }, z.core.$strict>;
42
+ export type FacelessImagePlan = z.infer<typeof plan>;
43
+ export declare function parseFacelessImagePlan(input: unknown): FacelessImagePlan;
44
+ export declare function quoteFacelessImage(input: unknown): {
45
+ pricingVersion: "faceless-image-v1-shadow";
46
+ aspectRatio: "9:16";
47
+ resolution: "1080p";
48
+ outputFrames: number;
49
+ outputSeconds: number;
50
+ credits: number;
51
+ customerCreditCeiling: number;
52
+ baseGeneratedImages: number;
53
+ maxGeneratedImages: number;
54
+ retryHeadroom: number;
55
+ costBreakdown: {
56
+ generatedImages: {
57
+ status: "unmeasured";
58
+ usd: null;
59
+ exposureBasis: "hypothetical_two_attempts_per_generated_asset_within_shared_allowance";
60
+ maxPaidAttemptsPerAsset: number;
61
+ maxPaidImageCalls: number;
62
+ };
63
+ tts: {
64
+ status: "unmeasured";
65
+ usd: null;
66
+ };
67
+ rendering: {
68
+ status: "unmeasured";
69
+ usd: null;
70
+ };
71
+ storage: {
72
+ status: "unmeasured";
73
+ usd: null;
74
+ };
75
+ paymentFees: {
76
+ status: "unmeasured";
77
+ usd: null;
78
+ };
79
+ paidFailures: {
80
+ status: "unmeasured";
81
+ usd: null;
82
+ };
83
+ };
84
+ totalCostUsd: null;
85
+ contributionMargin: null;
86
+ costQualified: boolean;
87
+ marginQualified: boolean;
88
+ sceneCount: number;
89
+ sceneSources: {
90
+ sceneId: string;
91
+ assetId: string;
92
+ sourceKind: "generated" | "supplied";
93
+ }[];
94
+ maxPaidAttempts: 0;
95
+ maxUsdSpend: 0;
96
+ };
97
+ export {};
@@ -0,0 +1,145 @@
1
+ import { z } from "zod";
2
+ import { brollPolicy } from "./broll-policy.js";
3
+ import { CANVAS_FPS } from "./media-timebase.js";
4
+ import { MAX_URL_LENGTH } from "./skills.js";
5
+ import { DEFAULT_TTS_MODEL, speechTextFor, TTS_MODEL_CHAR_CAP } from "./voices.js";
6
+ const id = z.string().min(1);
7
+ const suppliedSource = z.strictObject({
8
+ kind: z.literal("supplied"),
9
+ // Offline source eligibility only: remote bytes and geometry remain unqualified.
10
+ url: z.url().max(MAX_URL_LENGTH).refine(url => {
11
+ const source = new URL(url);
12
+ return source.protocol === "https:" && /\.(png|jpe?g)$/i.test(source.pathname);
13
+ }, "supplied image URL must use HTTPS with a PNG or JPEG path suffix"),
14
+ });
15
+ const generatedSource = z.strictObject({
16
+ kind: z.literal("generated"),
17
+ prompt: z.string().trim().min(1),
18
+ styleId: id.optional(),
19
+ characterIds: z.array(id).optional(),
20
+ });
21
+ const asset = z.strictObject({
22
+ id,
23
+ role: z.enum(["scene", "style", "character"]),
24
+ source: z.discriminatedUnion("kind", [suppliedSource, generatedSource]),
25
+ });
26
+ const scene = z.strictObject({
27
+ id,
28
+ assetId: id,
29
+ durationFrames: z.number().int().positive().refine(Number.isSafeInteger, "durationFrames must be a safe integer"),
30
+ motion: z.strictObject({ direction: z.enum(["in", "out"]), amount: z.number().min(0).lt(1) }).optional(),
31
+ });
32
+ const plan = z.strictObject({
33
+ version: z.literal("faceless_image_v1"),
34
+ script: z.string().trim().min(1).refine(text => speechTextFor(text, DEFAULT_TTS_MODEL).length <= TTS_MODEL_CHAR_CAP[DEFAULT_TTS_MODEL], `script exceeds ${DEFAULT_TTS_MODEL} limit of ${TTS_MODEL_CHAR_CAP[DEFAULT_TTS_MODEL]} characters after stress normalization`),
35
+ aspectRatio: z.literal("9:16"),
36
+ resolution: z.literal("1080p"),
37
+ brollPolicy,
38
+ assets: z.array(asset).min(1),
39
+ scenes: z.array(scene).min(1).max(100),
40
+ });
41
+ export function parseFacelessImagePlan(input) {
42
+ const parsed = plan.parse(input);
43
+ const assets = new Map();
44
+ for (const entry of parsed.assets) {
45
+ if (assets.has(entry.id))
46
+ throw new Error(`duplicate faceless IMAGE asset ID: ${entry.id}`);
47
+ if (entry.role !== "scene" && entry.source.kind === "generated" &&
48
+ (entry.source.styleId !== undefined || entry.source.characterIds !== undefined)) {
49
+ throw new Error(`faceless IMAGE references belong on scene assets: ${entry.id}`);
50
+ }
51
+ assets.set(entry.id, entry);
52
+ }
53
+ const used = new Set();
54
+ const sceneIds = new Set();
55
+ let sharedStyleId;
56
+ for (const entry of parsed.scenes) {
57
+ if (sceneIds.has(entry.id))
58
+ throw new Error(`duplicate faceless IMAGE scene ID: ${entry.id}`);
59
+ sceneIds.add(entry.id);
60
+ const image = assets.get(entry.assetId);
61
+ if (image?.role !== "scene")
62
+ throw new Error(`faceless IMAGE scene asset missing or wrong role: ${entry.assetId}`);
63
+ used.add(image.id);
64
+ if (image.source.kind === "generated") {
65
+ const style = image.source.styleId === undefined ? undefined : assets.get(image.source.styleId);
66
+ if (style?.role !== "style")
67
+ throw new Error(`faceless IMAGE style asset missing or wrong role: ${image.id}`);
68
+ if (sharedStyleId !== undefined && sharedStyleId !== style.id)
69
+ throw new Error("faceless IMAGE scenes require one shared style anchor");
70
+ sharedStyleId = style.id;
71
+ used.add(style.id);
72
+ const characters = image.source.characterIds ?? [];
73
+ if (parsed.brollPolicy !== "anyone" && characters.length > 0)
74
+ throw new Error("character references require the anyone policy");
75
+ if (new Set(characters).size !== characters.length)
76
+ throw new Error(`duplicate character reference: ${image.id}`);
77
+ for (const characterId of characters) {
78
+ const character = assets.get(characterId);
79
+ if (character?.role !== "character")
80
+ throw new Error(`faceless IMAGE character asset missing or wrong role: ${characterId}`);
81
+ used.add(characterId);
82
+ }
83
+ }
84
+ }
85
+ for (const entry of parsed.assets) {
86
+ if (!used.has(entry.id))
87
+ throw new Error(`unreferenced faceless IMAGE asset: ${entry.id}`);
88
+ }
89
+ const outputFrames = parsed.scenes.reduce((sum, entry) => sum + entry.durationFrames, 0);
90
+ if (!Number.isSafeInteger(outputFrames) || outputFrames > 300 * CANVAS_FPS)
91
+ throw new Error("faceless IMAGE exceeds 300 seconds");
92
+ const maxGeneratedImages = Math.floor((24 * outputFrames) / (60 * CANVAS_FPS));
93
+ const baseGeneratedImages = parsed.assets.filter(entry => entry.source.kind === "generated").length;
94
+ if (baseGeneratedImages > maxGeneratedImages)
95
+ throw new Error("faceless IMAGE exceeds generated image allowance");
96
+ return parsed;
97
+ }
98
+ export function quoteFacelessImage(input) {
99
+ const parsed = parseFacelessImagePlan(input);
100
+ const outputFrames = parsed.scenes.reduce((sum, entry) => sum + entry.durationFrames, 0);
101
+ const maxGeneratedImages = Math.floor((24 * outputFrames) / (60 * CANVAS_FPS));
102
+ const baseGeneratedImages = parsed.assets.filter(entry => entry.source.kind === "generated").length;
103
+ const raw = (180n * BigInt(outputFrames) + BigInt(60 * CANVAS_FPS - 1)) / BigInt(60 * CANVAS_FPS);
104
+ const credits = Number(raw > 200n ? raw : 200n);
105
+ const assetById = new Map(parsed.assets.map(entry => [entry.id, entry]));
106
+ return {
107
+ pricingVersion: "faceless-image-v1-shadow",
108
+ aspectRatio: parsed.aspectRatio,
109
+ resolution: parsed.resolution,
110
+ outputFrames,
111
+ outputSeconds: outputFrames / CANVAS_FPS,
112
+ credits,
113
+ customerCreditCeiling: credits,
114
+ baseGeneratedImages,
115
+ maxGeneratedImages,
116
+ retryHeadroom: maxGeneratedImages - baseGeneratedImages,
117
+ costBreakdown: {
118
+ generatedImages: {
119
+ status: "unmeasured",
120
+ usd: null,
121
+ exposureBasis: "hypothetical_two_attempts_per_generated_asset_within_shared_allowance",
122
+ maxPaidAttemptsPerAsset: 2,
123
+ maxPaidImageCalls: Math.min(maxGeneratedImages, 2 * baseGeneratedImages),
124
+ },
125
+ tts: { status: "unmeasured", usd: null },
126
+ rendering: { status: "unmeasured", usd: null },
127
+ storage: { status: "unmeasured", usd: null },
128
+ paymentFees: { status: "unmeasured", usd: null },
129
+ paidFailures: { status: "unmeasured", usd: null },
130
+ },
131
+ totalCostUsd: null,
132
+ contributionMargin: null,
133
+ costQualified: false,
134
+ marginQualified: false,
135
+ sceneCount: parsed.scenes.length,
136
+ sceneSources: parsed.scenes.map(entry => ({
137
+ sceneId: entry.id,
138
+ assetId: entry.assetId,
139
+ sourceKind: assetById.get(entry.assetId).source.kind,
140
+ })),
141
+ maxPaidAttempts: 0,
142
+ maxUsdSpend: 0,
143
+ };
144
+ }
145
+ //# sourceMappingURL=faceless-image-qualification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faceless-image-qualification.js","sourceRoot":"","sources":["../src/faceless-image-qualification.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEnF,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC7B,MAAM,cAAc,GAAG,CAAC,CAAC,YAAY,CAAC;IACpC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;IAC3B,iFAAiF;IACjF,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;QAC5C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACjF,CAAC,EAAE,kEAAkE,CAAC;CACvE,CAAC,CAAC;AACH,MAAM,eAAe,GAAG,CAAC,CAAC,YAAY,CAAC;IACrC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAChC,OAAO,EAAE,EAAE,CAAC,QAAQ,EAAE;IACtB,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC;AACH,MAAM,KAAK,GAAG,CAAC,CAAC,YAAY,CAAC;IAC3B,EAAE;IACF,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IAC7C,MAAM,EAAE,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;CACxE,CAAC,CAAC;AACH,MAAM,KAAK,GAAG,CAAC,CAAC,YAAY,CAAC;IAC3B,EAAE;IACF,OAAO,EAAE,EAAE;IACX,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,uCAAuC,CAAC;IACjH,MAAM,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;CACzG,CAAC,CAAC;AACH,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,CAAC;IAC1B,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC;IACvC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CACrC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,MAAM,IAAI,kBAAkB,CAAC,iBAAiB,CAAC,EAC9F,kBAAkB,iBAAiB,aAAa,kBAAkB,CAAC,iBAAiB,CAAC,wCAAwC,CAC9H;IACD,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IAC9B,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IAC9B,WAAW;IACX,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;CACvC,CAAC,CAAC;AAIH,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,GAAG,EAA+C,CAAC;IACtE,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5F,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW;YAC3D,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC,YAAY,KAAK,SAAS,CAAC,EAAE,CAAC;YACpF,MAAM,IAAI,KAAK,CAAC,qDAAqD,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,IAAI,aAAiC,CAAC;IACtC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9F,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,KAAK,EAAE,IAAI,KAAK,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACnH,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACnB,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAChG,IAAI,KAAK,EAAE,IAAI,KAAK,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9G,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,KAAK,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;YACxI,aAAa,GAAG,KAAK,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACnB,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;YACnD,IAAI,MAAM,CAAC,WAAW,KAAK,QAAQ,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;YAChI,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAClH,KAAK,MAAM,WAAW,IAAI,UAAU,EAAE,CAAC;gBACrC,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBAC1C,IAAI,SAAS,EAAE,IAAI,KAAK,WAAW;oBAAE,MAAM,IAAI,KAAK,CAAC,yDAAyD,WAAW,EAAE,CAAC,CAAC;gBAC7H,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7F,CAAC;IACD,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IACzF,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,YAAY,GAAG,GAAG,GAAG,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAClI,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC;IAC/E,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC;IACpG,IAAI,mBAAmB,GAAG,kBAAkB;QAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IAClH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IACzF,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC;IAC/E,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC;IACpG,MAAM,GAAG,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC,EAAE,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,EAAE,GAAG,UAAU,CAAC,CAAC;IAClG,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACzE,OAAO;QACL,cAAc,EAAE,0BAAmC;QACnD,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,YAAY;QACZ,aAAa,EAAE,YAAY,GAAG,UAAU;QACxC,OAAO;QACP,qBAAqB,EAAE,OAAO;QAC9B,mBAAmB;QACnB,kBAAkB;QAClB,aAAa,EAAE,kBAAkB,GAAG,mBAAmB;QACvD,aAAa,EAAE;YACb,eAAe,EAAE;gBACf,MAAM,EAAE,YAAqB;gBAC7B,GAAG,EAAE,IAAI;gBACT,aAAa,EAAE,uEAAgF;gBAC/F,uBAAuB,EAAE,CAAC;gBAC1B,iBAAiB,EAAE,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,GAAG,mBAAmB,CAAC;aACzE;YACD,GAAG,EAAE,EAAE,MAAM,EAAE,YAAqB,EAAE,GAAG,EAAE,IAAI,EAAE;YACjD,SAAS,EAAE,EAAE,MAAM,EAAE,YAAqB,EAAE,GAAG,EAAE,IAAI,EAAE;YACvD,OAAO,EAAE,EAAE,MAAM,EAAE,YAAqB,EAAE,GAAG,EAAE,IAAI,EAAE;YACrD,WAAW,EAAE,EAAE,MAAM,EAAE,YAAqB,EAAE,GAAG,EAAE,IAAI,EAAE;YACzD,YAAY,EAAE,EAAE,MAAM,EAAE,YAAqB,EAAE,GAAG,EAAE,IAAI,EAAE;SAC3D;QACD,YAAY,EAAE,IAAI;QAClB,kBAAkB,EAAE,IAAI;QACxB,aAAa,EAAE,KAAK;QACpB,eAAe,EAAE,KAAK;QACtB,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;QAChC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACxC,OAAO,EAAE,KAAK,CAAC,EAAE;YACjB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,UAAU,EAAE,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAE,CAAC,MAAM,CAAC,IAAI;SACtD,CAAC,CAAC;QACH,eAAe,EAAE,CAAU;QAC3B,WAAW,EAAE,CAAU;KACxB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { z } from "zod";
2
+ export declare const FACELESS_TARIFF_ID: "faceless-image-i2v-v1";
3
+ /** A faceless video ends with its speech and runs at least 25 s (owner, 2026-09-27). */
4
+ export declare const FACELESS_MIN_OUTPUT_FRAMES = 625;
5
+ /** The pre-speech estimate floor keeps the 4 s offset the 26 s floor had from the former 30 s minimum. */
6
+ export declare const FACELESS_MIN_ESTIMATE_SEC = 21;
7
+ /** A video may run up to 5 s past its selection, never past 90 s; the charge stays within the selection's quote (owner, 2026-09-27). */
8
+ export declare const facelessMaxOutputFrames: (selectedFrames: number) => number;
9
+ export declare const facelessQuote: z.ZodObject<{
10
+ outputFrames: z.ZodNumber;
11
+ baseCredits: z.ZodNumber;
12
+ openerCredits: z.ZodNumber;
13
+ totalCredits: z.ZodNumber;
14
+ tariffId: z.ZodLiteral<"faceless-image-i2v-v1">;
15
+ captions: z.ZodBoolean;
16
+ }, z.core.$strict>;
17
+ export type FacelessQuote = z.infer<typeof facelessQuote>;
18
+ export declare function quoteFaceless(input: {
19
+ outputFrames: number;
20
+ captions: boolean;
21
+ }): FacelessQuote;
@@ -0,0 +1,25 @@
1
+ import { z } from "zod";
2
+ export const FACELESS_TARIFF_ID = "faceless-image-i2v-v1";
3
+ /** A faceless video ends with its speech and runs at least 25 s (owner, 2026-09-27). */
4
+ export const FACELESS_MIN_OUTPUT_FRAMES = 625;
5
+ /** The pre-speech estimate floor keeps the 4 s offset the 26 s floor had from the former 30 s minimum. */
6
+ export const FACELESS_MIN_ESTIMATE_SEC = 21;
7
+ /** A video may run up to 5 s past its selection, never past 90 s; the charge stays within the selection's quote (owner, 2026-09-27). */
8
+ export const facelessMaxOutputFrames = (selectedFrames) => Math.min(selectedFrames + 125, 2250);
9
+ export const facelessQuote = z.object({
10
+ outputFrames: z.number().int().min(FACELESS_MIN_OUTPUT_FRAMES).max(2250),
11
+ baseCredits: z.number().int().nonnegative(),
12
+ openerCredits: z.number().int().nonnegative(),
13
+ totalCredits: z.number().int().nonnegative(),
14
+ tariffId: z.literal(FACELESS_TARIFF_ID),
15
+ captions: z.boolean(),
16
+ }).strict();
17
+ export function quoteFaceless(input) {
18
+ const outputFrames = z.number().int().min(FACELESS_MIN_OUTPUT_FRAMES).max(2250).parse(input.outputFrames);
19
+ const captions = z.boolean().parse(input.captions);
20
+ const baseCredits = Math.max(200, Math.ceil(180 * outputFrames / 1500));
21
+ const openerCredits = 150;
22
+ return { outputFrames, baseCredits, openerCredits,
23
+ totalCredits: baseCredits + openerCredits, tariffId: FACELESS_TARIFF_ID, captions };
24
+ }
25
+ //# sourceMappingURL=faceless-price.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faceless-price.js","sourceRoot":"","sources":["../src/faceless-price.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,kBAAkB,GAAG,uBAAgC,CAAC;AACnE,wFAAwF;AACxF,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAC9C,0GAA0G;AAC1G,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAC5C,wIAAwI;AACxI,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,cAAsB,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC;AAExG,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;IACxE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAC3C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAC7C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAC5C,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC;IACvC,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;CACtB,CAAC,CAAC,MAAM,EAAE,CAAC;AAGZ,MAAM,UAAU,aAAa,CAAC,KAAkD;IAC9E,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC1G,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC;IACxE,MAAM,aAAa,GAAG,GAAG,CAAC;IAC1B,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa;QAC/C,YAAY,EAAE,WAAW,GAAG,aAAa,EAAE,QAAQ,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC;AACxF,CAAC"}
@@ -0,0 +1,71 @@
1
+ import { z } from "zod";
2
+ import { type CutStyleProfile } from "./faceless-cut-style.js";
3
+ import { facelessCutScore } from "./faceless-storyboard-v2-timing.js";
4
+ import type { WordTiming } from "./tts-backend.js";
5
+ declare const phrase: z.ZodObject<{
6
+ wordStart: z.ZodNumber;
7
+ wordEnd: z.ZodNumber;
8
+ accentWord: z.ZodNumber;
9
+ }, z.core.$strict>;
10
+ declare const storySchema: z.ZodObject<{
11
+ script: z.ZodString;
12
+ narrationStartFrame: z.ZodNumber;
13
+ beats: z.ZodArray<z.ZodObject<{
14
+ id: z.ZodString;
15
+ wordStart: z.ZodNumber;
16
+ wordEnd: z.ZodNumber;
17
+ mediaType: z.ZodEnum<{
18
+ image: "image";
19
+ video: "video";
20
+ }>;
21
+ reason: z.ZodEnum<{
22
+ action: "action";
23
+ emphasis: "emphasis";
24
+ place: "place";
25
+ reveal: "reveal";
26
+ }>;
27
+ phase: z.ZodEnum<{
28
+ climax: "climax";
29
+ development: "development";
30
+ resolution: "resolution";
31
+ setup: "setup";
32
+ }>;
33
+ visualPrompt: z.ZodString;
34
+ }, z.core.$strict>>;
35
+ captionPhrases: z.ZodOptional<z.ZodArray<z.ZodObject<{
36
+ wordStart: z.ZodNumber;
37
+ wordEnd: z.ZodNumber;
38
+ accentWord: z.ZodNumber;
39
+ }, z.core.$strict>>>;
40
+ }, z.core.$strict>;
41
+ export type FacelessPublicStory = z.infer<typeof storySchema>;
42
+ export declare function facelessSpeechWordSpans(script: string): Array<{
43
+ word: string;
44
+ start: number;
45
+ end: number;
46
+ }>;
47
+ export declare function facelessSpeechLexicalWords(script: string): string[];
48
+ export declare function parseFacelessPublicStory(input: unknown, expectedScript?: string): FacelessPublicStory;
49
+ type Score = ReturnType<typeof facelessCutScore>;
50
+ export type FacelessPublicPlan = {
51
+ version: "faceless_public_v1";
52
+ outputFrames: number;
53
+ script: string;
54
+ words: WordTiming[];
55
+ narrationStartFrame: number;
56
+ captionPhrases: z.infer<typeof phrase>[];
57
+ shots: Array<{
58
+ id: string;
59
+ mediaType: "video" | "image";
60
+ startFrame: number;
61
+ endFrame: number;
62
+ beatIds: string[];
63
+ visualPrompts: string[];
64
+ phase: FacelessPublicStory["beats"][number]["phase"];
65
+ motion?: "PAN_UP" | "PAN_DOWN";
66
+ cutAfterWord?: number;
67
+ score: Score;
68
+ }>;
69
+ };
70
+ export declare function planPublicFacelessStory(input: FacelessPublicStory, words: readonly WordTiming[], inputStyle: CutStyleProfile, outputFrames: number): FacelessPublicPlan;
71
+ export {};