@clipwright/core 0.33.0 → 0.35.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 (236) hide show
  1. package/CHANGELOG.md +251 -0
  2. package/README.md +3 -1
  3. package/dist/account-actors.d.ts +173 -14
  4. package/dist/account-actors.js +142 -10
  5. package/dist/account-actors.js.map +1 -1
  6. package/dist/actor-bounds.d.ts +4 -0
  7. package/dist/actor-bounds.js +4 -0
  8. package/dist/actor-bounds.js.map +1 -1
  9. package/dist/actors.d.ts +31 -0
  10. package/dist/actors.js +26 -0
  11. package/dist/actors.js.map +1 -1
  12. package/dist/api-failure.js +2 -1
  13. package/dist/api-failure.js.map +1 -1
  14. package/dist/asset-identity.d.ts +6 -0
  15. package/dist/asset-identity.js +7 -0
  16. package/dist/asset-identity.js.map +1 -0
  17. package/dist/assets.d.ts +403 -8
  18. package/dist/assets.js +132 -22
  19. package/dist/assets.js.map +1 -1
  20. package/dist/billing-terms.d.ts +69 -0
  21. package/dist/billing-terms.js +8 -0
  22. package/dist/billing-terms.js.map +1 -1
  23. package/dist/caption-language.d.ts +2 -0
  24. package/dist/caption-language.js +17 -0
  25. package/dist/caption-language.js.map +1 -0
  26. package/dist/contract-dispositions.d.ts +1617 -8
  27. package/dist/contract-dispositions.js +75 -11
  28. package/dist/contract-dispositions.js.map +1 -1
  29. package/dist/contracts/v1/workflow-brief.d.ts +3166 -78
  30. package/dist/contracts/v1/workflow-brief.js +4 -0
  31. package/dist/contracts/v1/workflow-brief.js.map +1 -1
  32. package/dist/contracts/v1/workflow-catalog.d.ts +3712 -8
  33. package/dist/contracts/v1/workflow-catalog.js +4 -2
  34. package/dist/contracts/v1/workflow-catalog.js.map +1 -1
  35. package/dist/contracts/v1/workflow-client.d.ts +2466 -4
  36. package/dist/contracts/v1/workflow-client.js +6 -3
  37. package/dist/contracts/v1/workflow-client.js.map +1 -1
  38. package/dist/contracts/v1/workflow-execution.d.ts +163 -9
  39. package/dist/contracts/v1/workflow-execution.js +15 -7
  40. package/dist/contracts/v1/workflow-execution.js.map +1 -1
  41. package/dist/contracts/v1/workflow-plan.d.ts +6014 -487
  42. package/dist/contracts/v1/workflow-primitives.d.ts +3 -1
  43. package/dist/contracts/v1/workflow-primitives.js +1 -1
  44. package/dist/contracts/v1/workflow-primitives.js.map +1 -1
  45. package/dist/contracts/v1/workflow-run-read.d.ts +114 -1
  46. package/dist/edit-billing.d.ts +12 -0
  47. package/dist/edit-billing.js +8 -0
  48. package/dist/edit-billing.js.map +1 -1
  49. package/dist/edit-long-form.d.ts +1 -1
  50. package/dist/edit-long-form.js +12 -2
  51. package/dist/edit-long-form.js.map +1 -1
  52. package/dist/endpoint-notes.d.ts +3 -0
  53. package/dist/endpoint-notes.js +66 -0
  54. package/dist/endpoint-notes.js.map +1 -0
  55. package/dist/endpoints.d.ts +4 -0
  56. package/dist/endpoints.js +15 -0
  57. package/dist/endpoints.js.map +1 -1
  58. package/dist/errors.d.ts +1 -1
  59. package/dist/errors.js +7 -0
  60. package/dist/errors.js.map +1 -1
  61. package/dist/face-billing.d.ts +55 -0
  62. package/dist/face-billing.js +22 -0
  63. package/dist/face-billing.js.map +1 -1
  64. package/dist/faceless-price.d.ts +26 -2
  65. package/dist/faceless-price.js +33 -6
  66. package/dist/faceless-price.js.map +1 -1
  67. package/dist/faceless-public.d.ts +6 -1
  68. package/dist/faceless-public.js +2 -2
  69. package/dist/faceless-public.js.map +1 -1
  70. package/dist/generations.d.ts +32 -6
  71. package/dist/generations.js +82 -27
  72. package/dist/generations.js.map +1 -1
  73. package/dist/idempotency.d.ts +2 -0
  74. package/dist/idempotency.js +7 -4
  75. package/dist/idempotency.js.map +1 -1
  76. package/dist/index.d.ts +15 -0
  77. package/dist/index.js +17 -0
  78. package/dist/index.js.map +1 -1
  79. package/dist/long-form-pricing.d.ts +7 -4
  80. package/dist/long-form-pricing.js +13 -10
  81. package/dist/long-form-pricing.js.map +1 -1
  82. package/dist/long-form-revision.js +1 -1
  83. package/dist/long-form-revision.js.map +1 -1
  84. package/dist/openapi.d.ts +154 -0
  85. package/dist/openapi.js +334 -0
  86. package/dist/openapi.js.map +1 -0
  87. package/dist/pacing.d.ts +15 -0
  88. package/dist/pacing.js +30 -0
  89. package/dist/pacing.js.map +1 -1
  90. package/dist/parts-pricing.d.ts +84 -0
  91. package/dist/parts-pricing.js +105 -0
  92. package/dist/parts-pricing.js.map +1 -0
  93. package/dist/presenter-beats.d.ts +45 -0
  94. package/dist/presenter-beats.js +144 -0
  95. package/dist/presenter-beats.js.map +1 -0
  96. package/dist/prices.d.ts +98 -0
  97. package/dist/prices.js +189 -0
  98. package/dist/prices.js.map +1 -0
  99. package/dist/public-endpoints.d.ts +2 -0
  100. package/dist/public-endpoints.js +2 -0
  101. package/dist/public-endpoints.js.map +1 -1
  102. package/dist/public-responses.d.ts +23 -0
  103. package/dist/public-responses.js +11 -0
  104. package/dist/public-responses.js.map +1 -0
  105. package/dist/reference-analysis.d.ts +683 -0
  106. package/dist/reference-analysis.js +91 -0
  107. package/dist/reference-analysis.js.map +1 -0
  108. package/dist/reference-kinds.d.ts +6 -0
  109. package/dist/reference-kinds.js +8 -0
  110. package/dist/reference-kinds.js.map +1 -0
  111. package/dist/reference-profile.d.ts +633 -0
  112. package/dist/reference-profile.js +151 -0
  113. package/dist/reference-profile.js.map +1 -0
  114. package/dist/reference-staging.d.ts +571 -0
  115. package/dist/reference-staging.js +151 -0
  116. package/dist/reference-staging.js.map +1 -0
  117. package/dist/reference-voice.d.ts +305 -0
  118. package/dist/reference-voice.js +108 -0
  119. package/dist/reference-voice.js.map +1 -0
  120. package/dist/resolved-timeline.d.ts +206 -1
  121. package/dist/resolved-timeline.js +96 -4
  122. package/dist/resolved-timeline.js.map +1 -1
  123. package/dist/run-static-warnings.js +19 -7
  124. package/dist/run-static-warnings.js.map +1 -1
  125. package/dist/runs.d.ts +75 -3
  126. package/dist/runs.js +6 -1
  127. package/dist/runs.js.map +1 -1
  128. package/dist/semantic-inserts.d.ts +7 -0
  129. package/dist/semantic-inserts.js +19 -9
  130. package/dist/semantic-inserts.js.map +1 -1
  131. package/dist/skills.d.ts +5838 -22
  132. package/dist/skills.js +380 -25
  133. package/dist/skills.js.map +1 -1
  134. package/dist/templates/callout.d.ts +34 -0
  135. package/dist/templates/callout.js +51 -0
  136. package/dist/templates/callout.js.map +1 -0
  137. package/dist/templates/checklist.d.ts +42 -0
  138. package/dist/templates/checklist.js +47 -0
  139. package/dist/templates/checklist.js.map +1 -0
  140. package/dist/templates/compare.d.ts +26 -0
  141. package/dist/templates/compare.js +35 -0
  142. package/dist/templates/compare.js.map +1 -0
  143. package/dist/templates/end-card.d.ts +16 -0
  144. package/dist/templates/end-card.js +25 -0
  145. package/dist/templates/end-card.js.map +1 -0
  146. package/dist/templates/index.d.ts +171 -0
  147. package/dist/templates/index.js +394 -0
  148. package/dist/templates/index.js.map +1 -0
  149. package/dist/templates/lower-third.d.ts +18 -0
  150. package/dist/templates/lower-third.js +26 -0
  151. package/dist/templates/lower-third.js.map +1 -0
  152. package/dist/templates/notification.d.ts +30 -0
  153. package/dist/templates/notification.js +32 -0
  154. package/dist/templates/notification.js.map +1 -0
  155. package/dist/templates/phone-call.d.ts +27 -0
  156. package/dist/templates/phone-call.js +43 -0
  157. package/dist/templates/phone-call.js.map +1 -0
  158. package/dist/templates/progress.d.ts +22 -0
  159. package/dist/templates/progress.js +42 -0
  160. package/dist/templates/progress.js.map +1 -0
  161. package/dist/templates/quote.d.ts +21 -0
  162. package/dist/templates/quote.js +29 -0
  163. package/dist/templates/quote.js.map +1 -0
  164. package/dist/templates/rating.d.ts +22 -0
  165. package/dist/templates/rating.js +29 -0
  166. package/dist/templates/rating.js.map +1 -0
  167. package/dist/templates/size.d.ts +13 -0
  168. package/dist/templates/size.js +10 -0
  169. package/dist/templates/size.js.map +1 -0
  170. package/dist/templates/slot.d.ts +10 -0
  171. package/dist/templates/slot.js +5 -0
  172. package/dist/templates/slot.js.map +1 -0
  173. package/dist/templates/sounds.d.ts +701 -0
  174. package/dist/templates/sounds.js +89 -0
  175. package/dist/templates/sounds.js.map +1 -0
  176. package/dist/templates/stat.d.ts +20 -0
  177. package/dist/templates/stat.js +33 -0
  178. package/dist/templates/stat.js.map +1 -0
  179. package/dist/templates/tag.d.ts +23 -0
  180. package/dist/templates/tag.js +31 -0
  181. package/dist/templates/tag.js.map +1 -0
  182. package/dist/templates/theme.d.ts +29 -0
  183. package/dist/templates/theme.js +47 -0
  184. package/dist/templates/theme.js.map +1 -0
  185. package/dist/templates/title-card.d.ts +21 -0
  186. package/dist/templates/title-card.js +30 -0
  187. package/dist/templates/title-card.js.map +1 -0
  188. package/dist/tts-backend.d.ts +9 -0
  189. package/dist/tts-backend.js +21 -0
  190. package/dist/tts-backend.js.map +1 -1
  191. package/dist/ugc-call.d.ts +89 -0
  192. package/dist/ugc-call.js +111 -0
  193. package/dist/ugc-call.js.map +1 -0
  194. package/dist/ugc-framing.d.ts +26 -0
  195. package/dist/ugc-framing.js +64 -0
  196. package/dist/ugc-framing.js.map +1 -0
  197. package/dist/ugc-layers.d.ts +88 -0
  198. package/dist/ugc-layers.js +142 -0
  199. package/dist/ugc-layers.js.map +1 -0
  200. package/dist/ugc-video-media.d.ts +12 -0
  201. package/dist/ugc-video-media.js +39 -0
  202. package/dist/ugc-video-media.js.map +1 -0
  203. package/dist/vendor-response.d.ts +4 -0
  204. package/dist/vendor-response.js +12 -0
  205. package/dist/vendor-response.js.map +1 -1
  206. package/dist/voice-admission.d.ts +1244 -1
  207. package/dist/voice-listing.js +7 -1
  208. package/dist/voice-listing.js.map +1 -1
  209. package/dist/voice-pace.d.ts +34 -0
  210. package/dist/voice-pace.generated.json +72 -0
  211. package/dist/voice-pace.js +34 -0
  212. package/dist/voice-pace.js.map +1 -0
  213. package/dist/voices.d.ts +21 -8
  214. package/dist/voices.js +44 -19
  215. package/dist/voices.js.map +1 -1
  216. package/dist/workflows/catalog.js +2 -1
  217. package/dist/workflows/catalog.js.map +1 -1
  218. package/dist/workflows/index.d.ts +2 -0
  219. package/dist/workflows/index.js +2 -0
  220. package/dist/workflows/index.js.map +1 -1
  221. package/dist/workflows/methods/faceless-explainer.d.ts +697 -3
  222. package/dist/workflows/methods/kinetic-launch.d.ts +697 -3
  223. package/dist/workflows/methods/product-image-story.d.ts +697 -3
  224. package/dist/workflows/methods/reference-remake.d.ts +870 -0
  225. package/dist/workflows/methods/reference-remake.js +26 -0
  226. package/dist/workflows/methods/reference-remake.js.map +1 -0
  227. package/dist/workflows/methods/shared.d.ts +697 -3
  228. package/dist/workflows/methods/ugc-faq-answer.d.ts +697 -3
  229. package/dist/workflows/methods/ugc-product-intro.d.ts +697 -3
  230. package/dist/workflows/methods/website-proof-demo.d.ts +697 -3
  231. package/dist/workflows/reference-remake.d.ts +663 -0
  232. package/dist/workflows/reference-remake.js +598 -0
  233. package/dist/workflows/reference-remake.js.map +1 -0
  234. package/dist/workflows/validate.js +19 -11
  235. package/dist/workflows/validate.js.map +1 -1
  236. package/package.json +9 -3
@@ -0,0 +1,154 @@
1
+ import { z } from "zod";
2
+ import { type ApiEndpoint } from "./endpoints.js";
3
+ /** `/openapi.json` (owner decision 2026-10-26): every registry route is marked public or excluded, and a */
4
+ /** public route names its request and response schemas; API tests parse their real responses with them. */
5
+ type SuccessStatus = 200 | 201 | 202 | 204;
6
+ export interface NamedSchema {
7
+ readonly name: string;
8
+ readonly schema: z.ZodType;
9
+ }
10
+ export interface PublicRoute {
11
+ readonly exposure: "public";
12
+ readonly operationId: string;
13
+ readonly tag: OpenApiTag;
14
+ /** Answers without a key, before the auth and rate-limit middleware. */
15
+ readonly anonymous?: true;
16
+ readonly body?: NamedSchema | {
17
+ readonly mediaTypes: readonly string[];
18
+ };
19
+ readonly query?: z.ZodObject;
20
+ /** One schema per path parameter, the core id schema the handlers check; API tests prove no accepted id falls outside it. */
21
+ readonly params?: Readonly<Record<string, z.ZodType>>;
22
+ /** The route takes `Idempotency-Key` without requiring it; a billed route requires it unless it names `billedWithoutKey`. */
23
+ readonly optionalIdempotencyKey?: true;
24
+ /** Why a billed route needs no key: what makes a resend answer the first call instead of charging again. */
25
+ readonly billedWithoutKey?: string;
26
+ /** `null`: no body. A public route without a success response does not compile. */
27
+ readonly responses: Readonly<Partial<Record<SuccessStatus, NamedSchema | null>>> & ({
28
+ 200: unknown;
29
+ } | {
30
+ 201: unknown;
31
+ } | {
32
+ 202: unknown;
33
+ } | {
34
+ 204: unknown;
35
+ });
36
+ }
37
+ export interface ExcludedRoute {
38
+ readonly exposure: "excluded";
39
+ readonly reason: string;
40
+ }
41
+ export type OpenApiRoute = PublicRoute | ExcludedRoute;
42
+ declare const TAGS: {
43
+ readonly Service: "The API host itself.";
44
+ readonly Skills: "Quote and start runs. A quote charges nothing; a run holds credits and answers at once.";
45
+ readonly Runs: "One namespace for every run: state, shots, drafts, revisions and shot candidates.";
46
+ readonly Workflows: "Workflow methods and account plans compiled into native runs.";
47
+ readonly Uploads: "Pictures you send for a run, kept for a limited time.";
48
+ readonly Assets: "Pictures and clips kept on the account until you delete them.";
49
+ readonly Actors: "Actors saved on the account and their defaults.";
50
+ readonly Catalogs: "Voices, template sounds, generation models, skills and prices.";
51
+ readonly "Reference analysis": "A reference video read into a profile a remake plan takes.";
52
+ readonly Account: "Balance, debt and holds.";
53
+ };
54
+ export type OpenApiTag = keyof typeof TAGS;
55
+ /** The shared refusal (`docs/03-api.md` §6): `code` is a registered one, typed refusals add their own fields. */
56
+ export declare const errorEnvelope: z.ZodObject<{
57
+ error: z.ZodObject<{
58
+ code: z.ZodEnum<{
59
+ [x: string]: string;
60
+ }>;
61
+ message: z.ZodString;
62
+ }, z.core.$loose>;
63
+ }, z.core.$strip>;
64
+ /** Keyed by `endpointLabel`; the test proves the keys are exactly the registry's. */
65
+ export declare const OPENAPI_ROUTES: Readonly<Record<string, OpenApiRoute>>;
66
+ /** Registry order, public rows only. */
67
+ export declare function publicOpenApiRoutes(): {
68
+ endpoint: ApiEndpoint;
69
+ route: PublicRoute;
70
+ }[];
71
+ /** `:id` in Hono notation is `{id}` in OpenAPI. */
72
+ export declare const openApiOperationPath: (path: string) => string;
73
+ /** The declared body of a success status: a schema, `null` for no body, `undefined` when undeclared. */
74
+ export declare function openApiResponse(endpoint: ApiEndpoint, status: number): NamedSchema | null | undefined;
75
+ type Json = Record<string, unknown>;
76
+ /** Pure: the same document from the same code, so the API builds it once and serves it from memory. */
77
+ export declare function buildOpenApiDocument(): {
78
+ openapi: string;
79
+ info: {
80
+ title: string;
81
+ version: string;
82
+ summary: string;
83
+ description: string;
84
+ contact: {
85
+ name: string;
86
+ url: string;
87
+ };
88
+ };
89
+ servers: {
90
+ url: string;
91
+ }[];
92
+ security: {
93
+ apiKey: never[];
94
+ }[];
95
+ tags: {
96
+ name: string;
97
+ description: "A reference video read into a profile a remake plan takes." | "Actors saved on the account and their defaults." | "Balance, debt and holds." | "One namespace for every run: state, shots, drafts, revisions and shot candidates." | "Pictures and clips kept on the account until you delete them." | "Pictures you send for a run, kept for a limited time." | "Quote and start runs. A quote charges nothing; a run holds credits and answers at once." | "The API host itself." | "Voices, template sounds, generation models, skills and prices." | "Workflow methods and account plans compiled into native runs.";
98
+ }[];
99
+ paths: Record<string, Record<string, Json>>;
100
+ components: {
101
+ securitySchemes: {
102
+ apiKey: {
103
+ type: string;
104
+ scheme: string;
105
+ bearerFormat: string;
106
+ description: string;
107
+ };
108
+ };
109
+ responses: {
110
+ Error: {
111
+ description: string;
112
+ content: {
113
+ "application/json": {
114
+ schema: {
115
+ $ref: string;
116
+ };
117
+ };
118
+ };
119
+ };
120
+ Unauthorized: {
121
+ description: string;
122
+ content: {
123
+ "application/json": {
124
+ schema: {
125
+ $ref: string;
126
+ };
127
+ };
128
+ };
129
+ };
130
+ RateLimited: {
131
+ description: string;
132
+ content: {
133
+ "application/json": {
134
+ schema: {
135
+ $ref: string;
136
+ };
137
+ };
138
+ };
139
+ headers: {
140
+ "Retry-After": {
141
+ schema: {
142
+ type: string;
143
+ minimum: number;
144
+ };
145
+ description: string;
146
+ };
147
+ };
148
+ };
149
+ };
150
+ schemas: Json;
151
+ };
152
+ };
153
+ export type OpenApiDocument = ReturnType<typeof buildOpenApiDocument>;
154
+ export {};
@@ -0,0 +1,334 @@
1
+ import { createRequire } from "node:module";
2
+ import { z } from "zod";
3
+ import { createActorInput, createActorQuote, personalActorId } from "./account-actors.js";
4
+ import { account } from "./account.js";
5
+ import { actorsResponse } from "./actors.js";
6
+ import { asset, assetId, ASSET_PUT_MEDIA_TYPES, assetBytesQuery, assetList, assetListQuery, createAssetRequest, pendingAsset, updateAssetRequest, } from "./assets.js";
7
+ import { actorDefaults, actorDefaultsInput } from "./broll-policy.js";
8
+ import { offeredUgcInput } from "./contract-dispositions.js";
9
+ import { workflowCatalogResponse, workflowMethodResponse } from "./contracts/v1/workflow-catalog.js";
10
+ import { launchWorkflow, workflowLaunchResponse, workflowQuoteBinding } from "./contracts/v1/workflow-execution.js";
11
+ import { approveWorkflowPlan, createWorkflowPlan, saveWorkflowPlan, workflowPlanRead } from "./contracts/v1/workflow-plan.js";
12
+ import { workflowId, workflowMethodId } from "./contracts/v1/workflow-primitives.js";
13
+ import { workflowRun } from "./contracts/v1/workflow-run-read.js";
14
+ import { candidateQuote, candidateRequest, runCandidates } from "./edit-candidate.js";
15
+ import { runEdit, saveRunEdit } from "./edit-document.js";
16
+ import { revisionQuote, revisionRequest } from "./edit-revision.js";
17
+ import { runShots } from "./edit-shots.js";
18
+ import { ENDPOINT_NOTES } from "./endpoint-notes.js";
19
+ import { API_ERROR_CODES } from "./errors.js";
20
+ import { API_ENDPOINTS, endpointLabel } from "./endpoints.js";
21
+ import { facelessQuoteResponse } from "./faceless-public.js";
22
+ import { generateImageRequest, generateVideoRequest, generationModels, generationQuote } from "./generations.js";
23
+ import { pricesResponse } from "./prices.js";
24
+ import { PUBLIC_API_BASE_URL, PUBLIC_APP_BASE_URL } from "./public-endpoints.js";
25
+ import { healthResponse, publicSkillsResponse } from "./public-responses.js";
26
+ import { analysisQuoteResponse, analyzeReferenceRequest, referenceAnalysis, referenceAnalysisId } from "./reference-analysis.js";
27
+ import { runId } from "./runs.js";
28
+ import { quoteResponse } from "./skills.js";
29
+ import { templateSoundsList } from "./templates/sounds.js";
30
+ import { UPLOAD_MEDIA_TYPES, uploadId, uploadImportRequest, uploadIntentRequest, uploadIntentResponse, uploadItemResponse, uploadList, uploadResponse, } from "./uploads.js";
31
+ import { serverFacelessInput } from "./voice-admission.js";
32
+ import { serverVoicesQuery } from "./voice-listing.js";
33
+ import { voicesResponse } from "./voices.js";
34
+ import { planReferenceRemake } from "./workflows/reference-remake.js";
35
+ const named = (name, schema) => ({ name, schema });
36
+ const TAGS = {
37
+ Service: "The API host itself.",
38
+ Skills: "Quote and start runs. A quote charges nothing; a run holds credits and answers at once.",
39
+ Runs: "One namespace for every run: state, shots, drafts, revisions and shot candidates.",
40
+ Workflows: "Workflow methods and account plans compiled into native runs.",
41
+ Uploads: "Pictures you send for a run, kept for a limited time.",
42
+ Assets: "Pictures and clips kept on the account until you delete them.",
43
+ Actors: "Actors saved on the account and their defaults.",
44
+ Catalogs: "Voices, template sounds, generation models, skills and prices.",
45
+ "Reference analysis": "A reference video read into a profile a remake plan takes.",
46
+ Account: "Balance, debt and holds.",
47
+ };
48
+ /** The shared refusal (`docs/03-api.md` §6): `code` is a registered one, typed refusals add their own fields. */
49
+ export const errorEnvelope = z.object({
50
+ error: z.looseObject({ code: z.enum(API_ERROR_CODES), message: z.string().min(1) }),
51
+ });
52
+ const Run = named("Run", workflowRun);
53
+ // Strict: the API refuses a key outside the offered fields (`unknown_field`) before the schema runs.
54
+ const MakeUgcInput = named("MakeUgcInput", offeredUgcInput.strict());
55
+ const RAW_UPLOAD = { mediaTypes: UPLOAD_MEDIA_TYPES };
56
+ const AssetItem = named("AssetItem", z.union([asset, pendingAsset]));
57
+ const RUN = { id: runId };
58
+ const ACTOR = { id: personalActorId };
59
+ const ASSET = { id: assetId };
60
+ const PLAN = { id: workflowId };
61
+ const openApiDocumentShape = z.looseObject({ openapi: z.string(), info: z.looseObject({}), paths: z.record(z.string(), z.unknown()) });
62
+ /** Keyed by `endpointLabel`; the test proves the keys are exactly the registry's. */
63
+ export const OPENAPI_ROUTES = {
64
+ "POST /v1/skills/make_faceless/quote": { exposure: "public", operationId: "quoteMakeFaceless", tag: "Skills",
65
+ body: named("MakeFacelessInput", serverFacelessInput), responses: { 200: named("FacelessQuote", facelessQuoteResponse) } },
66
+ "POST /v1/skills/make_faceless/run": { exposure: "public", operationId: "runMakeFaceless", tag: "Skills",
67
+ body: named("MakeFacelessInput", serverFacelessInput), responses: { 202: Run, 200: Run } },
68
+ "GET /health": { exposure: "public", operationId: "getHealth", tag: "Service", anonymous: true,
69
+ responses: { 200: named("Health", healthResponse) } },
70
+ "GET /": { exposure: "excluded", reason: "The host root names the human docs for crawlers; it is not an operation a client calls." },
71
+ "GET /robots.txt": { exposure: "excluded", reason: "A plain-text crawler directive for the API host, not part of the client contract." },
72
+ "GET /openapi.json": { exposure: "public", operationId: "getOpenApiDocument", tag: "Service", anonymous: true,
73
+ responses: { 200: named("OpenApiDocument", openApiDocumentShape) } },
74
+ "GET /v1/voices": { exposure: "public", operationId: "listVoices", tag: "Catalogs", query: serverVoicesQuery,
75
+ responses: { 200: named("Voices", voicesResponse) } },
76
+ "GET /v1/template-sounds": { exposure: "public", operationId: "listTemplateSounds", tag: "Catalogs",
77
+ responses: { 200: named("TemplateSounds", templateSoundsList) } },
78
+ "GET /v1/account": { exposure: "public", operationId: "getAccount", tag: "Account", responses: { 200: named("Account", account) } },
79
+ "POST /v1/skills/make_ugc/quote": { exposure: "public", operationId: "quoteMakeUgc", tag: "Skills",
80
+ body: MakeUgcInput, responses: { 200: named("UgcQuote", quoteResponse) } },
81
+ "GET /v1/runs/{id}": { exposure: "public", operationId: "getRun", tag: "Runs", params: RUN, responses: { 200: Run } },
82
+ "GET /v1/runs/{id}/shots": { exposure: "public", operationId: "getRunShots", tag: "Runs", params: RUN,
83
+ responses: { 200: named("RunShots", runShots) } },
84
+ "GET /v1/runs/{id}/edit": { exposure: "public", operationId: "getRunEdit", tag: "Runs", params: RUN, responses: { 200: named("RunEdit", runEdit) } },
85
+ "POST /v1/runs/{id}/edit": { exposure: "public", operationId: "saveRunEdit", tag: "Runs", params: RUN,
86
+ body: named("SaveRunEdit", saveRunEdit), responses: { 200: named("RunEdit", runEdit) } },
87
+ "POST /v1/runs/{id}/revisions/quote": { exposure: "public", operationId: "quoteRevision", tag: "Runs", params: RUN,
88
+ body: named("RevisionRequest", revisionRequest), responses: { 200: named("RevisionQuote", revisionQuote) } },
89
+ "POST /v1/runs/{id}/revisions": { exposure: "public", operationId: "startRevision", tag: "Runs", params: RUN,
90
+ body: named("RevisionRequest", revisionRequest), responses: { 202: Run, 200: Run } },
91
+ "POST /v1/runs/{id}/candidates/quote": { exposure: "public", operationId: "quoteCandidate", tag: "Runs", params: RUN,
92
+ body: named("CandidateRequest", candidateRequest), responses: { 200: named("CandidateQuote", candidateQuote) } },
93
+ "POST /v1/runs/{id}/candidates": { exposure: "public", operationId: "createCandidate", tag: "Runs", params: RUN,
94
+ body: named("CandidateRequest", candidateRequest), responses: { 202: Run, 200: Run } },
95
+ "GET /v1/runs/{id}/candidates": { exposure: "public", operationId: "listCandidates", tag: "Runs", params: RUN,
96
+ responses: { 200: named("RunCandidates", runCandidates) } },
97
+ "POST /v1/skills/make_ugc/run": { exposure: "public", operationId: "runMakeUgc", tag: "Skills",
98
+ body: MakeUgcInput, responses: { 202: Run, 200: Run } },
99
+ "GET /v1/public/skills": { exposure: "public", operationId: "listPublicSkills", tag: "Catalogs", anonymous: true,
100
+ responses: { 200: named("PublicSkills", publicSkillsResponse) } },
101
+ "GET /v1/public/prices": { exposure: "public", operationId: "listPrices", tag: "Catalogs", anonymous: true,
102
+ responses: { 200: named("Prices", pricesResponse) } },
103
+ "GET /v1/actors": { exposure: "public", operationId: "listActors", tag: "Actors", responses: { 200: named("Actors", actorsResponse) } },
104
+ "DELETE /v1/actors/{id}": { exposure: "public", operationId: "deleteActor", tag: "Actors", params: ACTOR, responses: { 204: null } },
105
+ "GET /v1/actors/{id}/defaults": { exposure: "public", operationId: "getActorDefaults", tag: "Actors", params: ACTOR,
106
+ responses: { 200: named("ActorDefaults", actorDefaults) } },
107
+ "POST /v1/actors/{id}/defaults": { exposure: "public", operationId: "setActorDefaults", tag: "Actors", params: ACTOR,
108
+ body: named("ActorDefaultsInput", actorDefaultsInput), responses: { 200: named("ActorDefaults", actorDefaults) } },
109
+ "POST /v1/skills/create_actor/quote": { exposure: "public", operationId: "quoteCreateActor", tag: "Skills",
110
+ body: named("CreateActorInput", createActorInput), responses: { 200: named("CreateActorQuote", createActorQuote) } },
111
+ "POST /v1/skills/create_actor/run": { exposure: "public", operationId: "runCreateActor", tag: "Skills",
112
+ body: named("CreateActorInput", createActorInput), responses: { 202: Run, 200: Run } },
113
+ "POST /v1/uploads": { exposure: "public", operationId: "uploadImage", tag: "Uploads", body: RAW_UPLOAD,
114
+ responses: { 201: named("Upload", uploadResponse) } },
115
+ "GET /v1/uploads": { exposure: "public", operationId: "listUploads", tag: "Uploads", responses: { 200: named("Uploads", uploadList) } },
116
+ "POST /v1/uploads/import": { exposure: "public", operationId: "importUpload", tag: "Uploads", optionalIdempotencyKey: true,
117
+ body: named("UploadImportRequest", uploadImportRequest), responses: { 201: named("Upload", uploadResponse), 200: named("Upload", uploadResponse) } },
118
+ "POST /v1/uploads/intents": { exposure: "public", operationId: "createUploadIntent", tag: "Uploads", optionalIdempotencyKey: true,
119
+ body: named("UploadIntentRequest", uploadIntentRequest),
120
+ responses: { 201: named("UploadIntent", uploadIntentResponse), 200: named("UploadIntent", uploadIntentResponse) } },
121
+ "GET /v1/uploads/{id}": { exposure: "public", operationId: "getUpload", tag: "Uploads", params: { id: uploadId },
122
+ responses: { 200: named("UploadItem", uploadItemResponse) } },
123
+ "POST /v1/assets": { exposure: "public", operationId: "createAsset", tag: "Assets", optionalIdempotencyKey: true,
124
+ body: named("CreateAssetRequest", createAssetRequest), responses: { 201: AssetItem, 202: AssetItem, 200: AssetItem } },
125
+ "POST /v1/assets/bytes": { exposure: "public", operationId: "createAssetFromBytes", tag: "Assets", optionalIdempotencyKey: true,
126
+ body: { mediaTypes: ASSET_PUT_MEDIA_TYPES }, query: assetBytesQuery, responses: { 201: AssetItem, 202: AssetItem, 200: AssetItem } },
127
+ "GET /v1/assets": { exposure: "public", operationId: "listAssets", tag: "Assets", query: assetListQuery,
128
+ responses: { 200: named("Assets", assetList) } },
129
+ "GET /v1/assets/{id}": { exposure: "public", operationId: "getAsset", tag: "Assets", params: ASSET, responses: { 200: AssetItem } },
130
+ "POST /v1/assets/{id}": { exposure: "public", operationId: "updateAsset", tag: "Assets", params: ASSET,
131
+ body: named("UpdateAssetRequest", updateAssetRequest), responses: { 200: named("Asset", asset) } },
132
+ "DELETE /v1/assets/{id}": { exposure: "public", operationId: "deleteAsset", tag: "Assets", params: ASSET, responses: { 204: null } },
133
+ "GET /internal/portfolio-metrics": { exposure: "excluded",
134
+ reason: "Internal funnel aggregates behind their own secret, outside the client contract (docs/03-api.md section 12)." },
135
+ "GET /v1/public/workflows": { exposure: "public", operationId: "listWorkflows", tag: "Workflows", anonymous: true,
136
+ responses: { 200: named("WorkflowCatalog", workflowCatalogResponse) } },
137
+ "GET /v1/public/workflows/{id}": { exposure: "public", operationId: "getWorkflow", tag: "Workflows", anonymous: true, params: { id: workflowMethodId },
138
+ responses: { 200: named("WorkflowMethod", workflowMethodResponse) } },
139
+ "POST /v1/workflow-plans": { exposure: "public", operationId: "createWorkflowPlan", tag: "Workflows",
140
+ body: named("CreateWorkflowPlan", createWorkflowPlan), responses: { 201: named("WorkflowPlan", workflowPlanRead) } },
141
+ "GET /v1/workflow-plans/{id}": { exposure: "public", operationId: "getWorkflowPlan", tag: "Workflows", params: PLAN,
142
+ responses: { 200: named("WorkflowPlan", workflowPlanRead) } },
143
+ "POST /v1/workflow-plans/reference-remake": { exposure: "public", operationId: "planReferenceRemake", tag: "Workflows",
144
+ body: named("PlanReferenceRemake", planReferenceRemake), responses: { 201: named("WorkflowPlan", workflowPlanRead) } },
145
+ "POST /v1/workflow-plans/{id}/revisions": { exposure: "public", operationId: "saveWorkflowPlan", tag: "Workflows", params: PLAN,
146
+ body: named("SaveWorkflowPlan", saveWorkflowPlan), responses: { 200: named("WorkflowPlan", workflowPlanRead) } },
147
+ "POST /v1/workflow-plans/{id}/approve": { exposure: "public", operationId: "approveWorkflowPlan", tag: "Workflows", params: PLAN,
148
+ body: named("ApproveWorkflowPlan", approveWorkflowPlan), responses: { 200: named("WorkflowPlan", workflowPlanRead) } },
149
+ "POST /v1/workflow-plans/{id}/quote": { exposure: "public", operationId: "quoteWorkflowPlan", tag: "Workflows", params: PLAN,
150
+ responses: { 200: named("WorkflowQuote", workflowQuoteBinding) } },
151
+ "POST /v1/workflow-plans/{id}/run": { exposure: "public", operationId: "runWorkflowPlan", tag: "Workflows", params: PLAN,
152
+ body: named("LaunchWorkflow", launchWorkflow),
153
+ responses: { 202: named("WorkflowLaunch", workflowLaunchResponse), 200: named("WorkflowLaunch", workflowLaunchResponse) } },
154
+ "GET /v1/generations/models": { exposure: "public", operationId: "listGenerationModels", tag: "Catalogs",
155
+ responses: { 200: named("GenerationModels", generationModels) } },
156
+ "POST /v1/skills/generate_image/quote": { exposure: "public", operationId: "quoteImage", tag: "Skills",
157
+ body: named("GenerateImageRequest", generateImageRequest), responses: { 200: named("GenerationQuote", generationQuote) } },
158
+ "POST /v1/skills/generate_image/run": { exposure: "public", operationId: "generateImage", tag: "Skills",
159
+ body: named("GenerateImageRequest", generateImageRequest), responses: { 202: Run, 200: Run } },
160
+ "POST /v1/skills/generate_video/quote": { exposure: "public", operationId: "quoteVideo", tag: "Skills",
161
+ body: named("GenerateVideoRequest", generateVideoRequest), responses: { 200: named("GenerationQuote", generationQuote) } },
162
+ "POST /v1/skills/generate_video/run": { exposure: "public", operationId: "generateVideo", tag: "Skills",
163
+ body: named("GenerateVideoRequest", generateVideoRequest), responses: { 202: Run, 200: Run } },
164
+ "POST /v1/reference-analyses/quote": { exposure: "public", operationId: "quoteAnalysis", tag: "Reference analysis",
165
+ body: named("AnalyzeReferenceRequest", analyzeReferenceRequest), responses: { 200: named("AnalysisQuote", analysisQuoteResponse) } },
166
+ "POST /v1/reference-analyses": { exposure: "public", operationId: "analyzeReference", tag: "Reference analysis",
167
+ billedWithoutKey: "one live analysis per asset: a resend answers the same analysis, and only a succeeded one is charged",
168
+ body: named("AnalyzeReferenceRequest", analyzeReferenceRequest),
169
+ responses: { 202: named("ReferenceAnalysis", referenceAnalysis), 200: named("ReferenceAnalysis", referenceAnalysis) } },
170
+ "GET /v1/reference-analyses/{id}": { exposure: "public", operationId: "getReferenceAnalysis", tag: "Reference analysis", params: { id: referenceAnalysisId },
171
+ responses: { 200: named("ReferenceAnalysis", referenceAnalysis) } },
172
+ };
173
+ function routeOf(endpoint) {
174
+ const route = OPENAPI_ROUTES[endpointLabel(endpoint)];
175
+ if (route === undefined)
176
+ throw new Error(`no OpenAPI marking for ${endpointLabel(endpoint)}`);
177
+ return route;
178
+ }
179
+ /** Registry order, public rows only. */
180
+ export function publicOpenApiRoutes() {
181
+ return API_ENDPOINTS.flatMap((endpoint) => {
182
+ const route = routeOf(endpoint);
183
+ return route.exposure === "public" ? [{ endpoint, route }] : [];
184
+ });
185
+ }
186
+ /** `:id` in Hono notation is `{id}` in OpenAPI. */
187
+ export const openApiOperationPath = (path) => path.replace(/:(\w+)/g, "{$1}");
188
+ /** The declared body of a success status: a schema, `null` for no body, `undefined` when undeclared. */
189
+ export function openApiResponse(endpoint, status) {
190
+ const route = routeOf(endpoint);
191
+ if (route.exposure !== "public")
192
+ return undefined;
193
+ return route.responses[status];
194
+ }
195
+ const SCHEMA_REF = "#/components/schemas/";
196
+ const WARNINGS = { type: "array", items: { type: "string" } };
197
+ /** zod's local `$defs` would resolve against the document root, so they become components of their own. */
198
+ function toComponent(entry, io, schemas) {
199
+ const json = z.toJSONSchema(entry.schema, { io, unrepresentable: "any" });
200
+ const defs = (json.$defs ?? {});
201
+ delete json.$schema;
202
+ delete json.$defs;
203
+ const rewrite = (node, key) => {
204
+ if (Array.isArray(node))
205
+ return node.map((item) => rewrite(item));
206
+ if (node === null || typeof node !== "object")
207
+ return node;
208
+ const object = node;
209
+ if (typeof object.$ref === "string" && object.$ref.startsWith("#/$defs/")) {
210
+ return { ...object, $ref: `${SCHEMA_REF}${entry.name}.${object.$ref.slice("#/$defs/".length)}` };
211
+ }
212
+ // Rule 3: an unmet parameter is a warning, never silence; the shared component says so once.
213
+ if (key === "warnings" && object.type === "array" && JSON.stringify(object.items) === JSON.stringify(WARNINGS.items)) {
214
+ const { type: _type, items: _items, ...rest } = object;
215
+ return { $ref: `${SCHEMA_REF}Warnings`, ...rest };
216
+ }
217
+ if (object.properties !== null && typeof object.properties === "object") {
218
+ const properties = Object.fromEntries(Object.entries(object.properties).map(([name, value]) => [name, rewrite(value, name)]));
219
+ return Object.fromEntries(Object.entries(object).map(([name, value]) => [name, name === "properties" ? properties : rewrite(value)]));
220
+ }
221
+ return Object.fromEntries(Object.entries(object).map(([name, value]) => [name, rewrite(value)]));
222
+ };
223
+ schemas[entry.name] = rewrite(json);
224
+ for (const [name, def] of Object.entries(defs))
225
+ schemas[`${entry.name}.${name}`] = rewrite(def);
226
+ }
227
+ const { version: PACKAGE_VERSION } = createRequire(import.meta.url)("../package.json");
228
+ /** Routes whose 200 replays an earlier answer and whose fresh answer has another status. */
229
+ const SUCCESS_REPLAY = new Set(Object.entries(OPENAPI_ROUTES).flatMap(([label, route]) => route.exposure === "public" && 200 in route.responses && (201 in route.responses || 202 in route.responses) ? [label] : []));
230
+ /** Pure: the same document from the same code, so the API builds it once and serves it from memory. */
231
+ export function buildOpenApiDocument() {
232
+ const schemas = {
233
+ Warnings: { ...WARNINGS, description: "What the request named and the API did not honour; it is never dropped silently." },
234
+ };
235
+ const seen = new Map();
236
+ const ref = (entry, io) => {
237
+ const known = seen.get(entry.name);
238
+ if (known !== undefined && known !== entry.schema)
239
+ throw new Error(`two schemas share the component name ${entry.name}`);
240
+ if (known === undefined) {
241
+ seen.set(entry.name, entry.schema);
242
+ toComponent(entry, io, schemas);
243
+ }
244
+ return { $ref: `${SCHEMA_REF}${entry.name}` };
245
+ };
246
+ ref(named("ErrorEnvelope", errorEnvelope), "output");
247
+ const paths = {};
248
+ for (const { endpoint, route } of publicOpenApiRoutes()) {
249
+ const label = endpointLabel(endpoint);
250
+ const note = ENDPOINT_NOTES[label];
251
+ if (note === undefined)
252
+ throw new Error(`no note for ${label}`);
253
+ const pathNames = [...endpoint.path.matchAll(/:(\w+)/g)].map(([, name]) => name);
254
+ if (JSON.stringify(pathNames) !== JSON.stringify(Object.keys(route.params ?? {}))) {
255
+ throw new Error(`${label} names path parameters [${pathNames.join(", ")}], its marking [${Object.keys(route.params ?? {}).join(", ")}]`);
256
+ }
257
+ const parameters = pathNames.map((name) => {
258
+ const { $schema: _schema, ...schema } = z.toJSONSchema(route.params[name], { io: "input", unrepresentable: "any" });
259
+ return { name, in: "path", required: true, schema };
260
+ });
261
+ if (route.query !== undefined) {
262
+ const query = z.toJSONSchema(route.query, { io: "input", unrepresentable: "any" });
263
+ for (const [name, schema] of Object.entries(query.properties ?? {})) {
264
+ const { description, ...rest } = schema;
265
+ parameters.push({ name, in: "query", required: query.required?.includes(name) ?? false, schema: rest,
266
+ ...(typeof description === "string" && { description }) });
267
+ }
268
+ }
269
+ if ((endpoint.billed && route.billedWithoutKey === undefined) || route.optionalIdempotencyKey) {
270
+ parameters.push({ name: "Idempotency-Key", in: "header", required: endpoint.billed, schema: { type: "string", minLength: 1 },
271
+ description: endpoint.billed
272
+ ? "Required: a resend with the same key and body returns the first run instead of charging again."
273
+ : "Optional: a resend with the same key and body returns the first answer." });
274
+ }
275
+ const responses = {};
276
+ for (const [status, entry] of Object.entries(route.responses)) {
277
+ responses[status] = entry === null
278
+ ? { description: "No content." }
279
+ : { description: status === "200" && SUCCESS_REPLAY.has(label) ? "The earlier answer to the same request." : "Success.",
280
+ content: { "application/json": { schema: ref(entry, "output") } } };
281
+ }
282
+ if (!route.anonymous) {
283
+ responses["401"] = { $ref: "#/components/responses/Unauthorized" };
284
+ responses["429"] = { $ref: "#/components/responses/RateLimited" };
285
+ }
286
+ responses.default = { $ref: "#/components/responses/Error" };
287
+ const body = route.body === undefined ? undefined : "mediaTypes" in route.body
288
+ ? { required: true, content: Object.fromEntries(route.body.mediaTypes.map((type) => [type, {}])) }
289
+ : { required: true, content: { "application/json": { schema: ref(route.body, "input") } } };
290
+ const item = paths[openApiOperationPath(endpoint.path)] ?? {};
291
+ paths[openApiOperationPath(endpoint.path)] = item;
292
+ item[endpoint.method.toLowerCase()] = {
293
+ operationId: route.operationId,
294
+ tags: [route.tag],
295
+ summary: note.split(/(?<=\.)\s/)[0],
296
+ description: note,
297
+ security: route.anonymous ? [] : [{ apiKey: [] }],
298
+ ...(parameters.length > 0 && { parameters }),
299
+ ...(body !== undefined && { requestBody: body }),
300
+ responses,
301
+ };
302
+ }
303
+ const envelope = { "application/json": { schema: { $ref: `${SCHEMA_REF}ErrorEnvelope` } } };
304
+ return {
305
+ openapi: "3.1.1",
306
+ info: {
307
+ title: "Clipwright API",
308
+ version: PACKAGE_VERSION,
309
+ summary: "Agent-native video generation: UGC, faceless and long-form presenter videos.",
310
+ description: "Quotes are free; a run holds credits and answers at once, and GET /v1/runs/{id} reports every run. "
311
+ + "Parameters the API does not honour come back in warnings[], never silently. "
312
+ + "Every refusal is one envelope, { error: { code, message } }, with typed fields for the codes that carry numbers.",
313
+ contact: { name: "Clipwright", url: "https://clipwright.io/docs" },
314
+ },
315
+ servers: [{ url: PUBLIC_API_BASE_URL }],
316
+ security: [{ apiKey: [] }],
317
+ tags: Object.entries(TAGS).map(([name, description]) => ({ name, description })),
318
+ paths,
319
+ components: {
320
+ securitySchemes: {
321
+ apiKey: { type: "http", scheme: "bearer", bearerFormat: "cw_*",
322
+ description: `A key starting with cw_, issued at ${PUBLIC_APP_BASE_URL}/api-keys and shown once.` },
323
+ },
324
+ responses: {
325
+ Error: { description: "A refusal in the shared error envelope.", content: envelope },
326
+ Unauthorized: { description: "The key is missing, malformed or revoked; nothing was charged.", content: envelope },
327
+ RateLimited: { description: "Too many requests for the account's bucket; retry after Retry-After seconds.", content: envelope,
328
+ headers: { "Retry-After": { schema: { type: "integer", minimum: 0 }, description: "Seconds until a retry can succeed." } } },
329
+ },
330
+ schemas,
331
+ },
332
+ };
333
+ }
334
+ //# sourceMappingURL=openapi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi.js","sourceRoot":"","sources":["../src/openapi.ts"],"names":[],"mappings":"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"}
package/dist/pacing.d.ts CHANGED
@@ -1,4 +1,19 @@
1
+ import { type TtsModelId } from "./voices.js";
1
2
  /** Speech pacing: 2–4 words per second. */
2
3
  export declare const WORDS_PER_SECOND_MIN = 2;
3
4
  export declare const WORDS_PER_SECOND_MAX = 4;
4
5
  export declare function countWords(script: string): number;
6
+ /** Average pace for duration ESTIMATES: two live ElevenLabs renders (Sarah), 74 words → 27.1 s and 32 words → 13.07 s. */
7
+ /** The earlier 3 words/s missed by −18.9% against the ±15% gate. */
8
+ export declare const ESTIMATE_WORDS_PER_SECOND = 2.6;
9
+ /** Russian on eleven_v3 reads slower: 153 words in 66.13 s, 2.31 words/s (#164). */
10
+ /** The speech-duration floor uses ESTIMATE_WORDS_PER_SECOND; only a measurement may raise it. */
11
+ export declare const ESTIMATE_WORDS_PER_SECOND_CYRILLIC = 2.3;
12
+ /** Cyrillic on eleven_v4: 153 words in 70.32 s, one take at Stability 0.5 (#452). */
13
+ export declare const ESTIMATE_WORDS_PER_SECOND_CYRILLIC_V4 = 2.18;
14
+ /** Cyrillic on gemini-3.8-flash-tts: 153 words in 71.04 s and 65.68 s, mean 2.24, rounded down (#453). */
15
+ export declare const ESTIMATE_WORDS_PER_SECOND_CYRILLIC_GOOGLE = 2.2;
16
+ /** Only make_ugc admission names the model; without it the script family alone sets the pace. */
17
+ export declare function estimateWordsPerSecond(script: string, model?: TtsModelId): number;
18
+ /** An ESTIMATE from the script's pace, not a fact: the charge follows the measured duration. */
19
+ export declare function estimateDurationSec(script: string, model?: TtsModelId): number;
package/dist/pacing.js CHANGED
@@ -1,7 +1,37 @@
1
+ import { detectScriptFamily, GOOGLE_TTS_MODEL } from "./voices.js";
1
2
  /** Speech pacing: 2–4 words per second. */
2
3
  export const WORDS_PER_SECOND_MIN = 2;
3
4
  export const WORDS_PER_SECOND_MAX = 4;
4
5
  export function countWords(script) {
5
6
  return script.trim().split(/\s+/).filter(Boolean).length;
6
7
  }
8
+ /** Average pace for duration ESTIMATES: two live ElevenLabs renders (Sarah), 74 words → 27.1 s and 32 words → 13.07 s. */
9
+ /** The earlier 3 words/s missed by −18.9% against the ±15% gate. */
10
+ export const ESTIMATE_WORDS_PER_SECOND = 2.6;
11
+ /** Russian on eleven_v3 reads slower: 153 words in 66.13 s, 2.31 words/s (#164). */
12
+ /** The speech-duration floor uses ESTIMATE_WORDS_PER_SECOND; only a measurement may raise it. */
13
+ export const ESTIMATE_WORDS_PER_SECOND_CYRILLIC = 2.3;
14
+ /** Cyrillic on eleven_v4: 153 words in 70.32 s, one take at Stability 0.5 (#452). */
15
+ export const ESTIMATE_WORDS_PER_SECOND_CYRILLIC_V4 = 2.18;
16
+ /** Cyrillic on gemini-3.8-flash-tts: 153 words in 71.04 s and 65.68 s, mean 2.24, rounded down (#453). */
17
+ export const ESTIMATE_WORDS_PER_SECOND_CYRILLIC_GOOGLE = 2.2;
18
+ /** Cyrillic pace for models with their own measurement; any other model reads at the script family's pace. */
19
+ const CYRILLIC_WORDS_PER_SECOND_BY_MODEL = {
20
+ eleven_v4: ESTIMATE_WORDS_PER_SECOND_CYRILLIC_V4,
21
+ [GOOGLE_TTS_MODEL]: ESTIMATE_WORDS_PER_SECOND_CYRILLIC_GOOGLE,
22
+ };
23
+ /** Only make_ugc admission names the model; without it the script family alone sets the pace. */
24
+ export function estimateWordsPerSecond(script, model) {
25
+ if (detectScriptFamily(script) !== "cyrillic")
26
+ return ESTIMATE_WORDS_PER_SECOND;
27
+ const measured = model !== undefined && Object.hasOwn(CYRILLIC_WORDS_PER_SECOND_BY_MODEL, model)
28
+ ? CYRILLIC_WORDS_PER_SECOND_BY_MODEL[model]
29
+ : undefined;
30
+ return measured ?? ESTIMATE_WORDS_PER_SECOND_CYRILLIC;
31
+ }
32
+ /** An ESTIMATE from the script's pace, not a fact: the charge follows the measured duration. */
33
+ export function estimateDurationSec(script, model) {
34
+ const words = countWords(script);
35
+ return Math.max(1, Math.round(words / estimateWordsPerSecond(script, model)));
36
+ }
7
37
  //# sourceMappingURL=pacing.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pacing.js","sourceRoot":"","sources":["../src/pacing.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAEtC,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;AAC3D,CAAC"}
1
+ {"version":3,"file":"pacing.js","sourceRoot":"","sources":["../src/pacing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAmB,MAAM,aAAa,CAAC;AAEpF,2CAA2C;AAC3C,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAEtC,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;AAC3D,CAAC;AAED,0HAA0H;AAC1H,oEAAoE;AACpE,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,CAAC;AAE7C,oFAAoF;AACpF,iGAAiG;AACjG,MAAM,CAAC,MAAM,kCAAkC,GAAG,GAAG,CAAC;AAEtD,qFAAqF;AACrF,MAAM,CAAC,MAAM,qCAAqC,GAAG,IAAI,CAAC;AAE1D,0GAA0G;AAC1G,MAAM,CAAC,MAAM,yCAAyC,GAAG,GAAG,CAAC;AAE7D,8GAA8G;AAC9G,MAAM,kCAAkC,GAAwC;IAC9E,SAAS,EAAE,qCAAqC;IAChD,CAAC,gBAAgB,CAAC,EAAE,yCAAyC;CAC9D,CAAC;AAEF,iGAAiG;AACjG,MAAM,UAAU,sBAAsB,CAAC,MAAc,EAAE,KAAkB;IACvE,IAAI,kBAAkB,CAAC,MAAM,CAAC,KAAK,UAAU;QAAE,OAAO,yBAAyB,CAAC;IAChF,MAAM,QAAQ,GACZ,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,kCAAkC,EAAE,KAAK,CAAC;QAC7E,CAAC,CAAC,kCAAkC,CAAC,KAAK,CAAC;QAC3C,CAAC,CAAC,SAAS,CAAC;IAChB,OAAO,QAAQ,IAAI,kCAAkC,CAAC;AACxD,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,mBAAmB,CAAC,MAAc,EAAE,KAAkB;IACpE,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IACjC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,sBAAsB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAChF,CAAC"}