@clipwright/core 0.16.0 → 0.18.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 (77) hide show
  1. package/CHANGELOG.md +79 -0
  2. package/dist/actors.d.ts +4 -0
  3. package/dist/actors.js +22 -0
  4. package/dist/actors.js.map +1 -1
  5. package/dist/aspect.d.ts +3 -0
  6. package/dist/aspect.js +14 -0
  7. package/dist/aspect.js.map +1 -1
  8. package/dist/billing-terms.d.ts +19 -0
  9. package/dist/billing-terms.js +8 -0
  10. package/dist/billing-terms.js.map +1 -0
  11. package/dist/broll-policy.d.ts +31 -0
  12. package/dist/broll-policy.js +24 -0
  13. package/dist/broll-policy.js.map +1 -0
  14. package/dist/contract-dispositions.d.ts +65 -3
  15. package/dist/contract-dispositions.js +25 -21
  16. package/dist/contract-dispositions.js.map +1 -1
  17. package/dist/endpoints.d.ts +2 -2
  18. package/dist/endpoints.js +18 -13
  19. package/dist/endpoints.js.map +1 -1
  20. package/dist/errors.d.ts +7 -1
  21. package/dist/errors.js +13 -0
  22. package/dist/errors.js.map +1 -1
  23. package/dist/face-billing.d.ts +116 -0
  24. package/dist/face-billing.js +83 -0
  25. package/dist/face-billing.js.map +1 -0
  26. package/dist/face-delivery.d.ts +17 -0
  27. package/dist/face-delivery.js +12 -0
  28. package/dist/face-delivery.js.map +1 -0
  29. package/dist/index.d.ts +9 -0
  30. package/dist/index.js +9 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/long-form-pricing.d.ts +48 -0
  33. package/dist/long-form-pricing.js +73 -0
  34. package/dist/long-form-pricing.js.map +1 -0
  35. package/dist/long-form-profile.d.ts +5 -0
  36. package/dist/long-form-profile.js +6 -0
  37. package/dist/long-form-profile.js.map +1 -0
  38. package/dist/media-timebase.d.ts +2 -0
  39. package/dist/media-timebase.js +3 -0
  40. package/dist/media-timebase.js.map +1 -0
  41. package/dist/public-endpoints.d.ts +2 -0
  42. package/dist/public-endpoints.js +2 -0
  43. package/dist/public-endpoints.js.map +1 -1
  44. package/dist/render-backend.d.ts +3 -1
  45. package/dist/run-static-warnings.d.ts +6 -2
  46. package/dist/run-static-warnings.js +15 -11
  47. package/dist/run-static-warnings.js.map +1 -1
  48. package/dist/runs.d.ts +115 -0
  49. package/dist/runs.js +21 -0
  50. package/dist/runs.js.map +1 -1
  51. package/dist/semantic-inserts.d.ts +63 -0
  52. package/dist/semantic-inserts.js +160 -0
  53. package/dist/semantic-inserts.js.map +1 -0
  54. package/dist/skills.d.ts +217 -1
  55. package/dist/skills.js +87 -26
  56. package/dist/skills.js.map +1 -1
  57. package/dist/speech-rhythm-contract.d.ts +20 -0
  58. package/dist/speech-rhythm-contract.js +22 -0
  59. package/dist/speech-rhythm-contract.js.map +1 -0
  60. package/dist/speech-rhythm.d.ts +21 -0
  61. package/dist/speech-rhythm.js +47 -0
  62. package/dist/speech-rhythm.js.map +1 -0
  63. package/dist/tts-backend.d.ts +1 -0
  64. package/dist/tts-backend.js.map +1 -1
  65. package/dist/voice-admission.d.ts +53 -1
  66. package/dist/voice-admission.js +32 -1
  67. package/dist/voice-admission.js.map +1 -1
  68. package/dist/voice-listing.d.ts +5 -1
  69. package/dist/voice-listing.js +11 -1
  70. package/dist/voice-listing.js.map +1 -1
  71. package/dist/voice-preview-approval.d.ts +27 -0
  72. package/dist/voice-preview-approval.js +29 -0
  73. package/dist/voice-preview-approval.js.map +1 -0
  74. package/dist/voices.d.ts +2 -0
  75. package/dist/voices.js +3 -0
  76. package/dist/voices.js.map +1 -1
  77. package/package.json +13 -1
@@ -2,10 +2,10 @@ import { parseSkill, resolvedScript, storedUgcInput } from "./skills.js";
2
2
  import { storedCreateActorInput } from "./account-actors.js";
3
3
  import { dispositionWarnings } from "./contract-dispositions.js";
4
4
  import { buildSpeechModelWarnings, buildVoiceWarnings, TTS_MODELS } from "./voices.js";
5
- import { buildActorGenderWarnings } from "./actors.js";
6
- import { resolveAspectRatio } from "./aspect.js";
5
+ import { buildActorGenderWarnings, buildVoiceActorMatchWarnings } from "./actors.js";
6
+ import { resolveAspectRatio, upscaleWarning } from "./aspect.js";
7
+ import { DEFAULT_RESOLUTION } from "./skills.js";
7
8
  import { parseRunPreflight, sourceNotProbedWarning, VOICE_CATALOG_INCOMPLETE_WARNING, } from "./run-preflight.js";
8
- // Писатели хранят невыводимое, читатель выводит статику. Рационал — docs/18, Д41.
9
9
  /** Сохранённый вход нечитаем: перечислить несоблюдённые поля нечем. */
10
10
  export const UNREADABLE_RUN_INPUT_WARNING = "run input could not be read: parameters that are accepted but not honored cannot be listed for this run";
11
11
  /** То же для `create_actor`: неисполненных параметров у него не бывает, а нечитаемый вход — отказ без списания. */
@@ -33,7 +33,10 @@ function aspectFactWarnings(fact, input) {
33
33
  const source = { width: fact.width, height: fact.height, origin: "probed" };
34
34
  const resolution = resolveAspectRatio({ requested: input.aspect_ratio, source });
35
35
  // Отказ здесь недостижим: ран с конфликтом формата отбивается до вставки (400).
36
- return resolution.kind === "resolved" ? resolution.warnings : [];
36
+ if (resolution.kind !== "resolved")
37
+ return [];
38
+ const upscale = upscaleWarning(source, input.resolution ?? DEFAULT_RESOLUTION, resolution.aspectRatio);
39
+ return [...resolution.warnings, ...(upscale === null ? [] : [upscale])];
37
40
  }
38
41
  /** Префлайт голоса: строку восстанавливает читатель, каталог вендора ему недоступен. */
39
42
  function voiceFactWarnings(fact) {
@@ -41,11 +44,11 @@ function voiceFactWarnings(fact) {
41
44
  }
42
45
  /** Выводимое по скиллу рана. У `create_actor` выводить нечего: его предупреждения */
43
46
  /** записаны при допуске, и чтение их не пересчитывает (ADR-0003). */
44
- export function derivedRunWarnings(storedInput, preflight, skill) {
47
+ export function derivedRunWarnings(storedInput, preflight, skill, voiceGenderOf) {
45
48
  const parsed = parseSkill(skill);
46
49
  switch (parsed) {
47
50
  case "make_ugc":
48
- return ugcRunWarnings(storedInput, preflight);
51
+ return ugcRunWarnings(storedInput, preflight, voiceGenderOf);
49
52
  case "create_actor":
50
53
  return storedCreateActorInput.safeParse(storedInput).success ? [] : [UNREADABLE_CREATE_ACTOR_INPUT_WARNING];
51
54
  case null:
@@ -56,7 +59,7 @@ export function derivedRunWarnings(storedInput, preflight, skill) {
56
59
  }
57
60
  // Реестр диспозиций и языковой warning пресета. Почему без `voice_id` —
58
61
  // docs/18, Д41.
59
- function ugcRunWarnings(storedInput, preflight) {
62
+ function ugcRunWarnings(storedInput, preflight, voiceGenderOf) {
60
63
  const parsed = storedUgcInput.safeParse(storedInput);
61
64
  if (!parsed.success) {
62
65
  // НЕЧИТАЕМЫЙ ВХОД НЕ ОТМЕНЯЕТ ФАКТОВ. Мерка одна: выводится всё, что выводимо
@@ -67,7 +70,7 @@ function ugcRunWarnings(storedInput, preflight) {
67
70
  ...voiceFactWarnings(preflight.voice),
68
71
  ];
69
72
  }
70
- const { tts_model: storedModel, ...rest } = parsed.data;
73
+ const { tts_model: storedModel, actor_snapshot: pin, ...rest } = parsed.data;
71
74
  const ttsModel = TTS_MODELS.find((model) => model === storedModel);
72
75
  // Снятая модель (`eleven_multilingual_v2`) читается как умолчание: на нём о модели молчим.
73
76
  const input = { ...rest, tts_model: ttsModel };
@@ -78,7 +81,8 @@ function ugcRunWarnings(storedInput, preflight) {
78
81
  ...aspectFactWarnings(preflight.aspect, input),
79
82
  ...buildVoiceWarnings({ voice: input.voice, script: resolvedScript(input) }),
80
83
  ...buildActorGenderWarnings(input),
81
- // Пол пина (`actor_snapshot.gender`) не читается: у голосов по умолчанию обоих полов одна модель,
84
+ ...buildVoiceActorMatchWarnings(input, voiceGenderOf, pin?.gender),
85
+ // Пол пина в ВЫБОР МОДЕЛИ не идёт: у голосов по умолчанию обоих полов она одна,
82
86
  // поэтому вывод от пола не зависит; разойдутся модели — покраснеет тест в run-static-warnings.test.ts.
83
87
  ...buildSpeechModelWarnings({ ...input, script: resolvedScript(input) }, input.actor_gender),
84
88
  ...voiceFactWarnings(preflight.voice),
@@ -92,10 +96,10 @@ function storedStrings(stored) {
92
96
  }
93
97
  /** Полный `warnings[]` рана; порядок выводимого — как у `quote`. Префлайт и скилл */
94
98
  /** ОБЯЗАТЕЛЬНЫ И ЭТИМ СТОРОЖАТ: опциональный терял бы факт у нового читателя молча. */
95
- export function composeRunWarnings(stored, storedInput, storedPreflight, skill) {
99
+ export function composeRunWarnings(stored, storedInput, storedPreflight, skill, voiceGenderOf) {
96
100
  return [
97
101
  ...new Set([
98
- ...derivedRunWarnings(storedInput, parseRunPreflight(storedPreflight), skill),
102
+ ...derivedRunWarnings(storedInput, parseRunPreflight(storedPreflight), skill, voiceGenderOf),
99
103
  ...storedStrings(stored),
100
104
  ]),
101
105
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"run-static-warnings.js","sourceRoot":"","sources":["../src/run-static-warnings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-static-warnings.js","sourceRoot":"","sources":["../src/run-static-warnings.ts"],"names":[],"mappings":"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"}
package/dist/runs.d.ts CHANGED
@@ -13,6 +13,9 @@ export declare const runState: z.ZodEnum<{
13
13
  uploading: "uploading";
14
14
  }>;
15
15
  export type RunState = z.infer<typeof runState>;
16
+ /** Подпись выдана под GET, поэтому `curl -I` отвечает 403 и читается как */
17
+ /** «ссылка мертва». Сказано там, где ссылку выдают, — разбор в `docs/41` §7. */
18
+ export declare const VIDEO_URL_CHECK: string;
16
19
  export declare const runStep: z.ZodObject<{
17
20
  step: z.ZodString;
18
21
  state: z.ZodEnum<{
@@ -83,6 +86,27 @@ export declare const run: z.ZodObject<{
83
86
  }>;
84
87
  credits_reserved: z.ZodNumber;
85
88
  credits_charged: z.ZodNullable<z.ZodNumber>;
89
+ billing_terms: z.ZodOptional<z.ZodReadonly<z.ZodObject<{
90
+ mode: z.ZodLiteral<"face_seconds">;
91
+ tariffSnapshot: z.ZodUnion<readonly [z.ZodReadonly<z.ZodObject<{
92
+ version: z.ZodLiteral<1>;
93
+ id: z.ZodString;
94
+ creditsPerSecond: z.ZodNumber;
95
+ rounding: z.ZodLiteral<"ceil_aggregate_seconds">;
96
+ }, z.core.$strict>>, z.ZodReadonly<z.ZodObject<{
97
+ version: z.ZodLiteral<2>;
98
+ pricingVersion: z.ZodString;
99
+ rateCreditsPerFaceSecond: z.ZodNumber;
100
+ minimumCredits: z.ZodNumber;
101
+ rounding: z.ZodLiteral<"ceil_aggregate_seconds">;
102
+ failurePolicy: z.ZodLiteral<"verified_delivery_only">;
103
+ }, z.core.$strict>>]>;
104
+ }, z.core.$strict>>>;
105
+ resolved_broll_policy: z.ZodOptional<z.ZodEnum<{
106
+ anyone: "anyone";
107
+ no_actor: "no_actor";
108
+ no_people: "no_people";
109
+ }>>;
86
110
  warnings: z.ZodDefault<z.ZodArray<z.ZodString>>;
87
111
  error: z.ZodNullable<z.ZodString>;
88
112
  created_actor: z.ZodOptional<z.ZodObject<{
@@ -111,6 +135,38 @@ export declare const run: z.ZodObject<{
111
135
  character_sheet_url: z.ZodOptional<z.ZodString>;
112
136
  character_id: z.ZodOptional<z.ZodString>;
113
137
  duration_seconds: z.ZodNumber;
138
+ long_form_billing: z.ZodOptional<z.ZodReadonly<z.ZodObject<{
139
+ pricingVersion: z.ZodString;
140
+ rateCreditsPerFaceSecond: z.ZodNumber;
141
+ minimumCredits: z.ZodNumber;
142
+ actualDurationSec: z.ZodNumber;
143
+ actualBillableFaceSeconds: z.ZodNumber;
144
+ finalCreditsCharged: z.ZodNumber;
145
+ minimumApplied: z.ZodBoolean;
146
+ }, z.core.$strict>>>;
147
+ face_duration_seconds: z.ZodOptional<z.ZodNumber>;
148
+ full_speech_duration_seconds: z.ZodOptional<z.ZodNumber>;
149
+ face_credits_per_second: z.ZodOptional<z.ZodNumber>;
150
+ face_tariff_id: z.ZodOptional<z.ZodString>;
151
+ speech_timing_gaps: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
152
+ status: z.ZodLiteral<"available">;
153
+ durationSec: z.ZodNumber;
154
+ wordGapDurationSec: z.ZodNumber;
155
+ wordGapFraction: z.ZodNumber;
156
+ leadingGapSec: z.ZodNumber;
157
+ trailingGapSec: z.ZodNumber;
158
+ interWordGapsSec: z.ZodArray<z.ZodNumber>;
159
+ measuredSentenceGapCount: z.ZodNumber;
160
+ sentenceGapMedianSec: z.ZodNullable<z.ZodNumber>;
161
+ }, z.core.$strip>, z.ZodObject<{
162
+ status: z.ZodLiteral<"unavailable">;
163
+ reason: z.ZodEnum<{
164
+ invalid_duration: "invalid_duration";
165
+ invalid_timings: "invalid_timings";
166
+ missing_timings: "missing_timings";
167
+ unsupported_mode: "unsupported_mode";
168
+ }>;
169
+ }, z.core.$strip>], "status">>;
114
170
  ai_generated: z.ZodLiteral<true>;
115
171
  ai_disclosure: z.ZodString;
116
172
  requested_aspect_ratio: z.ZodOptional<z.ZodString>;
@@ -176,6 +232,27 @@ export declare const runRead: z.ZodObject<{
176
232
  skill: z.ZodString;
177
233
  credits_reserved: z.ZodNumber;
178
234
  credits_charged: z.ZodNullable<z.ZodNumber>;
235
+ billing_terms: z.ZodOptional<z.ZodReadonly<z.ZodObject<{
236
+ mode: z.ZodLiteral<"face_seconds">;
237
+ tariffSnapshot: z.ZodUnion<readonly [z.ZodReadonly<z.ZodObject<{
238
+ version: z.ZodLiteral<1>;
239
+ id: z.ZodString;
240
+ creditsPerSecond: z.ZodNumber;
241
+ rounding: z.ZodLiteral<"ceil_aggregate_seconds">;
242
+ }, z.core.$strict>>, z.ZodReadonly<z.ZodObject<{
243
+ version: z.ZodLiteral<2>;
244
+ pricingVersion: z.ZodString;
245
+ rateCreditsPerFaceSecond: z.ZodNumber;
246
+ minimumCredits: z.ZodNumber;
247
+ rounding: z.ZodLiteral<"ceil_aggregate_seconds">;
248
+ failurePolicy: z.ZodLiteral<"verified_delivery_only">;
249
+ }, z.core.$strict>>]>;
250
+ }, z.core.$strict>>>;
251
+ resolved_broll_policy: z.ZodOptional<z.ZodEnum<{
252
+ anyone: "anyone";
253
+ no_actor: "no_actor";
254
+ no_people: "no_people";
255
+ }>>;
179
256
  warnings: z.ZodDefault<z.ZodArray<z.ZodString>>;
180
257
  error: z.ZodNullable<z.ZodString>;
181
258
  created_actor: z.ZodOptional<z.ZodObject<{
@@ -204,6 +281,38 @@ export declare const runRead: z.ZodObject<{
204
281
  character_sheet_url: z.ZodOptional<z.ZodString>;
205
282
  character_id: z.ZodOptional<z.ZodString>;
206
283
  duration_seconds: z.ZodNumber;
284
+ long_form_billing: z.ZodOptional<z.ZodReadonly<z.ZodObject<{
285
+ pricingVersion: z.ZodString;
286
+ rateCreditsPerFaceSecond: z.ZodNumber;
287
+ minimumCredits: z.ZodNumber;
288
+ actualDurationSec: z.ZodNumber;
289
+ actualBillableFaceSeconds: z.ZodNumber;
290
+ finalCreditsCharged: z.ZodNumber;
291
+ minimumApplied: z.ZodBoolean;
292
+ }, z.core.$strict>>>;
293
+ face_duration_seconds: z.ZodOptional<z.ZodNumber>;
294
+ full_speech_duration_seconds: z.ZodOptional<z.ZodNumber>;
295
+ face_credits_per_second: z.ZodOptional<z.ZodNumber>;
296
+ face_tariff_id: z.ZodOptional<z.ZodString>;
297
+ speech_timing_gaps: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
298
+ status: z.ZodLiteral<"available">;
299
+ durationSec: z.ZodNumber;
300
+ wordGapDurationSec: z.ZodNumber;
301
+ wordGapFraction: z.ZodNumber;
302
+ leadingGapSec: z.ZodNumber;
303
+ trailingGapSec: z.ZodNumber;
304
+ interWordGapsSec: z.ZodArray<z.ZodNumber>;
305
+ measuredSentenceGapCount: z.ZodNumber;
306
+ sentenceGapMedianSec: z.ZodNullable<z.ZodNumber>;
307
+ }, z.core.$strip>, z.ZodObject<{
308
+ status: z.ZodLiteral<"unavailable">;
309
+ reason: z.ZodEnum<{
310
+ invalid_duration: "invalid_duration";
311
+ invalid_timings: "invalid_timings";
312
+ missing_timings: "missing_timings";
313
+ unsupported_mode: "unsupported_mode";
314
+ }>;
315
+ }, z.core.$strip>], "status">>;
207
316
  ai_generated: z.ZodLiteral<true>;
208
317
  ai_disclosure: z.ZodString;
209
318
  requested_aspect_ratio: z.ZodOptional<z.ZodString>;
@@ -232,6 +341,12 @@ export declare const runRead: z.ZodObject<{
232
341
  state: z.ZodString;
233
342
  }, z.core.$strip>;
234
343
  export type RunRead = z.infer<typeof runRead>;
344
+ /** Денежное поле рана. Имена выводятся ИЗ СХЕМЫ: перечень рядом с форматтером */
345
+ /** MCP и терял их — агент узнавал счёт вычитанием (clipwright#209). */
346
+ export type RunMoneyField = Extract<keyof RunRead, `credits_${string}`>;
347
+ export declare const RUN_MONEY_FIELDS: readonly RunMoneyField[];
348
+ /** Денежные поля рана одним объектом — для поверхностей, собирающих свой ответ. */
349
+ export declare function runMoney(read: RunRead): Pick<RunRead, RunMoneyField>;
235
350
  /**
236
351
  * Терминален ли ран. Принимает `string` (read-проекция), а не `RunState`,
237
352
  * поэтому неизвестный статус (расширение enum) корректно даёт `false`.
package/dist/runs.js CHANGED
@@ -1,6 +1,10 @@
1
1
  import { z } from "zod";
2
+ import { longFormBillingSummarySchema } from "./long-form-pricing.js";
3
+ import { speechRhythmResult } from "./speech-rhythm-contract.js";
2
4
  import { actorSelection } from "./actors.js";
3
5
  import { createdActor } from "./account-actors.js";
6
+ import { faceBillingAdmissionTermsSchema } from "./billing-terms.js";
7
+ import { brollPolicy } from "./broll-policy.js";
4
8
  /** Стадии ранов обоих скиллов: make_ugc (docs/02 §2) и create_actor (`generating`, ADR-0003). */
5
9
  export const RUN_STATES = [
6
10
  "queued",
@@ -14,6 +18,10 @@ export const RUN_STATES = [
14
18
  "failed",
15
19
  ];
16
20
  export const runState = z.enum(RUN_STATES);
21
+ /** Подпись выдана под GET, поэтому `curl -I` отвечает 403 и читается как */
22
+ /** «ссылка мертва». Сказано там, где ссылку выдают, — разбор в `docs/41` §7. */
23
+ export const VIDEO_URL_CHECK = "signed for GET only: HEAD returns 403. To check it without downloading, " +
24
+ 'use a ranged GET (curl -r 0-0), not curl -I.';
17
25
  export const runStep = z.object({
18
26
  step: z.string(),
19
27
  state: z.enum(["pending", "running", "succeeded", "failed"]),
@@ -62,6 +70,8 @@ export const run = z.object({
62
70
  state: runState,
63
71
  credits_reserved: z.number().int().nonnegative(),
64
72
  credits_charged: z.number().int().nonnegative().nullable(),
73
+ billing_terms: faceBillingAdmissionTermsSchema.optional(),
74
+ resolved_broll_policy: brollPolicy.optional(),
65
75
  warnings: z.array(z.string()).default([]),
66
76
  /**
67
77
  * Причина. НЕПУСТОЙ `error` НЕ ЗНАЧИТ `state: "failed"` — и это стало правдой
@@ -88,6 +98,12 @@ export const run = z.object({
88
98
  character_sheet_url: z.string().url().optional(),
89
99
  character_id: z.string().optional(),
90
100
  duration_seconds: z.number().positive(),
101
+ long_form_billing: longFormBillingSummarySchema.optional(),
102
+ face_duration_seconds: z.number().nonnegative().optional(),
103
+ full_speech_duration_seconds: z.number().positive().optional(),
104
+ face_credits_per_second: z.number().int().positive().optional(),
105
+ face_tariff_id: z.string().min(1).optional(),
106
+ speech_timing_gaps: speechRhythmResult.optional(),
91
107
  /**
92
108
  * ОБЯЗАТЕЛЬНЫЕ поля маркировки, а не опциональные.
93
109
  *
@@ -150,6 +166,11 @@ export const TERMINAL_STATES = [SUCCEEDED_STATE, FAILED_STATE];
150
166
  * сохраняется — сервер не должен принимать мусорное тело.
151
167
  */
152
168
  export const runRead = run.extend({ state: z.string() });
169
+ export const RUN_MONEY_FIELDS = Object.keys(run.shape).filter((field) => field.startsWith("credits_"));
170
+ /** Денежные поля рана одним объектом — для поверхностей, собирающих свой ответ. */
171
+ export function runMoney(read) {
172
+ return Object.fromEntries(RUN_MONEY_FIELDS.map((field) => [field, read[field]]));
173
+ }
153
174
  /**
154
175
  * Терминален ли ран. Принимает `string` (read-проекция), а не `RunState`,
155
176
  * поэтому неизвестный статус (расширение enum) корректно даёт `false`.
package/dist/runs.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"runs.js","sourceRoot":"","sources":["../src/runs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runs.js","sourceRoot":"","sources":["../src/runs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import type { WordTiming } from "./tts-backend.js";
2
+ export type SemanticInsertInstruction = {
3
+ insertId: string;
4
+ mediaId: string;
5
+ anchor: {
6
+ startWord: number;
7
+ endWord: number;
8
+ } | {
9
+ quote: string;
10
+ occurrence?: number;
11
+ };
12
+ coverWords?: number;
13
+ };
14
+ export interface SemanticInsertAnchor {
15
+ insertId: string;
16
+ mediaId: string;
17
+ startWord: number;
18
+ endWord: number;
19
+ coverWord?: number;
20
+ }
21
+ /** Первое НЕЗАКРЫТОЕ вставкой слово. Умолчание читается здесь и только здесь, */
22
+ /** иначе «покрытие равно якорю» разъедется между читателями (#265). */
23
+ export declare function coverWordOf(anchor: {
24
+ endWord: number;
25
+ coverWord?: number | undefined;
26
+ }): number;
27
+ export interface SemanticInsertPlan {
28
+ sourceTokens: readonly string[];
29
+ inserts: readonly SemanticInsertAnchor[];
30
+ }
31
+ export type SemanticInsertShot = {
32
+ kind: "actor";
33
+ fromFrame: number;
34
+ durationInFrames: number;
35
+ } | {
36
+ kind: "media";
37
+ fromFrame: number;
38
+ durationInFrames: number;
39
+ insertId: string;
40
+ mediaId: string;
41
+ };
42
+ export interface SemanticInsertResolution {
43
+ totalFrames: number;
44
+ shots: SemanticInsertShot[];
45
+ warnings: string[];
46
+ }
47
+ export declare function planSemanticInserts(script: string, instructions: readonly SemanticInsertInstruction[]): SemanticInsertPlan;
48
+ /** Число ПЛАТНЫХ актёрских шотов — чистая функция индексов слов, поэтому вход */
49
+ /** отвергается до синтеза речи, а не в воркере после оплаты (#265). */
50
+ export declare function countActorShots(plan: SemanticInsertPlan): number;
51
+ export declare function resolveSemanticInserts(input: {
52
+ plan: SemanticInsertPlan;
53
+ words: readonly WordTiming[];
54
+ durationSec: number;
55
+ fps: number;
56
+ }): SemanticInsertResolution;
57
+ export declare function selectTimelineInput<T>(segments: readonly T[] | undefined, planner: () => SemanticInsertPlan): {
58
+ kind: "explicit";
59
+ segments: readonly T[];
60
+ } | {
61
+ kind: "semantic";
62
+ plan: SemanticInsertPlan;
63
+ };
@@ -0,0 +1,160 @@
1
+ /** Первое НЕЗАКРЫТОЕ вставкой слово. Умолчание читается здесь и только здесь, */
2
+ /** иначе «покрытие равно якорю» разъедется между читателями (#265). */
3
+ export function coverWordOf(anchor) {
4
+ return anchor.coverWord ?? anchor.endWord;
5
+ }
6
+ function tokenize(text) {
7
+ const normalized = text.normalize("NFD").toLowerCase()
8
+ .replace(/([аеиоуыэюя]\u0308?)\u0301/gu, "$1").normalize("NFC")
9
+ .replace(/[’ʼ]/gu, "'");
10
+ return normalized.match(/[\p{L}\p{N}][\p{L}\p{N}\p{M}]*(?:['-][\p{L}\p{N}][\p{L}\p{N}\p{M}]*|[.,](?<=\p{N}[.,])\p{N}+)*/gu) ?? [];
11
+ }
12
+ function orderedAnchors(plan) {
13
+ if (plan.sourceTokens.length === 0 || plan.sourceTokens.some(token => typeof token !== "string" || tokenize(token).length !== 1 || tokenize(token)[0] !== token)) {
14
+ throw new Error("Semantic plan requires normalized source tokens");
15
+ }
16
+ const ids = new Set();
17
+ for (const anchor of plan.inserts) {
18
+ if (typeof anchor.insertId !== "string" || !anchor.insertId.trim() ||
19
+ typeof anchor.mediaId !== "string" || !anchor.mediaId.trim() || ids.has(anchor.insertId)) {
20
+ throw new Error("Semantic inserts require unique nonempty insert IDs and media IDs");
21
+ }
22
+ ids.add(anchor.insertId);
23
+ if (!Number.isSafeInteger(anchor.startWord) || !Number.isSafeInteger(anchor.endWord) ||
24
+ anchor.startWord < 0 || anchor.endWord <= anchor.startWord || anchor.endWord > plan.sourceTokens.length) {
25
+ throw new Error("Semantic insert word range is invalid");
26
+ }
27
+ if (anchor.coverWord !== undefined && (!Number.isSafeInteger(anchor.coverWord) ||
28
+ anchor.coverWord < anchor.endWord || anchor.coverWord > plan.sourceTokens.length)) {
29
+ throw new Error("Semantic insert coverage word is invalid");
30
+ }
31
+ }
32
+ const ordered = plan.inserts.map(anchor => ({ ...anchor })).sort((a, b) => a.startWord - b.startWord);
33
+ for (let i = 1; i < ordered.length; i++) {
34
+ if (ordered[i].startWord < coverWordOf(ordered[i - 1]))
35
+ throw new Error("Semantic insert word ranges overlap");
36
+ }
37
+ return ordered;
38
+ }
39
+ export function planSemanticInserts(script, instructions) {
40
+ for (const chunk of script.match(/\S+/gu) ?? []) {
41
+ const tokens = tokenize(chunk);
42
+ if (tokens.length > 1 || (tokens.length === 0 && !/^\p{P}+$/u.test(chunk))) {
43
+ throw new Error("Unsupported script tokenization: each whitespace chunk must contain at most one lexical word");
44
+ }
45
+ }
46
+ const sourceTokens = tokenize(script);
47
+ function quoteRange(anchor) {
48
+ const quoteTokens = tokenize(anchor.quote);
49
+ if (quoteTokens.length === 0)
50
+ throw new Error("Semantic insert quote is empty");
51
+ const matches = [];
52
+ for (let i = 0; i <= sourceTokens.length - quoteTokens.length; i++) {
53
+ if (quoteTokens.every((token, offset) => token === sourceTokens[i + offset]))
54
+ matches.push(i);
55
+ }
56
+ if (anchor.occurrence === undefined && matches.length > 1)
57
+ throw new Error("Semantic insert quote is ambiguous");
58
+ const occurrence = anchor.occurrence ?? 0;
59
+ if (!Number.isSafeInteger(occurrence) || occurrence < 0 || occurrence >= matches.length) {
60
+ throw new Error("Semantic insert quote occurrence does not match source text");
61
+ }
62
+ const startWord = matches[occurrence];
63
+ return { startWord, endWord: startWord + quoteTokens.length };
64
+ }
65
+ const inserts = instructions.map(({ insertId, mediaId, anchor, coverWords }) => {
66
+ const range = "startWord" in anchor
67
+ ? { startWord: anchor.startWord, endWord: anchor.endWord }
68
+ : quoteRange(anchor);
69
+ if (coverWords === undefined)
70
+ return { insertId, mediaId, ...range };
71
+ const anchored = range.endWord - range.startWord;
72
+ if (!Number.isSafeInteger(coverWords) || coverWords < anchored) {
73
+ throw new Error(`Semantic insert covers ${coverWords} words, fewer than the ${anchored} words it anchors`);
74
+ }
75
+ const coverWord = range.startWord + coverWords;
76
+ return { insertId, mediaId, ...range, ...(coverWord === range.endWord ? {} : { coverWord }) };
77
+ });
78
+ const plan = { sourceTokens, inserts };
79
+ return { sourceTokens, inserts: orderedAnchors(plan) };
80
+ }
81
+ /** Число ПЛАТНЫХ актёрских шотов — чистая функция индексов слов, поэтому вход */
82
+ /** отвергается до синтеза речи, а не в воркере после оплаты (#265). */
83
+ export function countActorShots(plan) {
84
+ const anchors = orderedAnchors(plan);
85
+ if (anchors.length === 0)
86
+ return 1;
87
+ let shots = anchors[0].startWord > 0 ? 1 : 0;
88
+ for (let i = 1; i < anchors.length; i++) {
89
+ if (coverWordOf(anchors[i - 1]) < anchors[i].startWord)
90
+ shots++;
91
+ }
92
+ return shots + (coverWordOf(anchors[anchors.length - 1]) < plan.sourceTokens.length ? 1 : 0);
93
+ }
94
+ export function resolveSemanticInserts(input) {
95
+ const { plan, words, durationSec, fps } = input;
96
+ const anchors = orderedAnchors(plan);
97
+ if (!Number.isFinite(durationSec) || durationSec <= 0 || !Number.isSafeInteger(fps) || fps <= 0) {
98
+ throw new Error("Semantic resolution requires a measured duration and positive integer fps");
99
+ }
100
+ const totalFrames = Math.round(durationSec * fps);
101
+ if (!Number.isSafeInteger(totalFrames) || totalFrames <= 0)
102
+ throw new Error("Measured duration has no representable frames");
103
+ const lexicalWords = [];
104
+ let previousEnd = 0;
105
+ for (let i = 0; i < words.length; i++) {
106
+ const word = words[i];
107
+ const tokens = tokenize(word.word);
108
+ const punctuationOnly = /^\p{P}+$/u.test(word.word);
109
+ if (!Number.isFinite(word.startSec) || !Number.isFinite(word.endSec) || word.startSec < previousEnd ||
110
+ word.endSec < word.startSec || (!punctuationOnly && word.endSec === word.startSec) || word.endSec > durationSec) {
111
+ throw new Error("Alignment timings are invalid, overlap, or exceed measured duration");
112
+ }
113
+ previousEnd = word.endSec;
114
+ if (punctuationOnly)
115
+ continue;
116
+ if (tokens.length !== 1 || tokens[0] !== plan.sourceTokens[lexicalWords.length]) {
117
+ throw new Error("Alignment text does not match source tokens");
118
+ }
119
+ lexicalWords.push(word);
120
+ }
121
+ if (lexicalWords.length !== plan.sourceTokens.length)
122
+ throw new Error("Alignment does not cover the source tokens exactly");
123
+ const shots = [];
124
+ let cursor = 0;
125
+ let rounded = Math.abs(totalFrames - durationSec * fps) > 1e-8;
126
+ for (const anchor of anchors) {
127
+ // Пауза принадлежит владельцу предыдущего слова: окно кончается на НАЧАЛЕ
128
+ // первого незакрытого слова, иначе щель станет платным огрызком (#265).
129
+ const cover = coverWordOf(anchor);
130
+ const head = anchor.startWord === 0;
131
+ const tail = cover >= lexicalWords.length;
132
+ const start = lexicalWords[anchor.startWord].startSec * fps;
133
+ const end = tail ? totalFrames : lexicalWords[cover].startSec * fps;
134
+ const fromFrame = head ? 0 : Math.round(start);
135
+ const endFrame = tail ? totalFrames : Math.round(end);
136
+ if (fromFrame < cursor || endFrame <= fromFrame || endFrame > totalFrames) {
137
+ throw new Error("Semantic insert frame range collides or has no positive duration");
138
+ }
139
+ if (!head)
140
+ rounded ||= Math.abs(fromFrame - start) > 1e-8;
141
+ if (!tail)
142
+ rounded ||= Math.abs(endFrame - end) > 1e-8;
143
+ if (fromFrame > cursor)
144
+ shots.push({ kind: "actor", fromFrame: cursor, durationInFrames: fromFrame - cursor });
145
+ shots.push({ kind: "media", fromFrame, durationInFrames: endFrame - fromFrame, insertId: anchor.insertId, mediaId: anchor.mediaId });
146
+ cursor = endFrame;
147
+ }
148
+ if (cursor < totalFrames)
149
+ shots.push({ kind: "actor", fromFrame: cursor, durationInFrames: totalFrames - cursor });
150
+ const warnings = [];
151
+ if (rounded)
152
+ warnings.push("Semantic insert boundaries or measured duration were rounded to the nearest frame.");
153
+ if (lexicalWords.length !== words.length)
154
+ warnings.push("Punctuation-only alignment entries were excluded from semantic word anchors.");
155
+ return { totalFrames, shots, warnings };
156
+ }
157
+ export function selectTimelineInput(segments, planner) {
158
+ return segments !== undefined ? { kind: "explicit", segments } : { kind: "semantic", plan: planner() };
159
+ }
160
+ //# sourceMappingURL=semantic-inserts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-inserts.js","sourceRoot":"","sources":["../src/semantic-inserts.ts"],"names":[],"mappings":"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"}