@clipwright/core 0.19.0 → 0.20.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 (124) hide show
  1. package/CHANGELOG.md +14 -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 +3 -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-short-61.d.ts +83 -0
  42. package/dist/faceless-short-61.js +152 -0
  43. package/dist/faceless-short-61.js.map +1 -0
  44. package/dist/faceless-storyboard-timing.d.ts +40 -0
  45. package/dist/faceless-storyboard-timing.js +97 -0
  46. package/dist/faceless-storyboard-timing.js.map +1 -0
  47. package/dist/faceless-storyboard-v2-plan.d.ts +3 -0
  48. package/dist/faceless-storyboard-v2-plan.js +112 -0
  49. package/dist/faceless-storyboard-v2-plan.js.map +1 -0
  50. package/dist/faceless-storyboard-v2-timing.d.ts +52 -0
  51. package/dist/faceless-storyboard-v2-timing.js +136 -0
  52. package/dist/faceless-storyboard-v2-timing.js.map +1 -0
  53. package/dist/faceless-storyboard-v2.d.ts +44 -0
  54. package/dist/faceless-storyboard-v2.js +43 -0
  55. package/dist/faceless-storyboard-v2.js.map +1 -0
  56. package/dist/faceless-storyboard.d.ts +55 -0
  57. package/dist/faceless-storyboard.js +105 -0
  58. package/dist/faceless-storyboard.js.map +1 -0
  59. package/dist/idempotency.d.ts +8 -44
  60. package/dist/idempotency.js +10 -44
  61. package/dist/idempotency.js.map +1 -1
  62. package/dist/index.js +21 -25
  63. package/dist/index.js.map +1 -1
  64. package/dist/long-form-pricing.d.ts +4 -4
  65. package/dist/long-form-pricing.js +4 -4
  66. package/dist/long-form-pricing.js.map +1 -1
  67. package/dist/long-form-profile.d.ts +2 -2
  68. package/dist/long-form-profile.js +2 -2
  69. package/dist/long-form-profile.js.map +1 -1
  70. package/dist/pacing.d.ts +1 -1
  71. package/dist/pacing.js +1 -1
  72. package/dist/pacing.js.map +1 -1
  73. package/dist/public-endpoints.d.ts +9 -11
  74. package/dist/public-endpoints.js +11 -13
  75. package/dist/public-endpoints.js.map +1 -1
  76. package/dist/rate-limit.d.ts +23 -130
  77. package/dist/rate-limit.js +27 -132
  78. package/dist/rate-limit.js.map +1 -1
  79. package/dist/render-backend.d.ts +30 -145
  80. package/dist/render-backend.js +4 -27
  81. package/dist/render-backend.js.map +1 -1
  82. package/dist/run-preflight.d.ts +4 -4
  83. package/dist/run-preflight.js +10 -10
  84. package/dist/run-preflight.js.map +1 -1
  85. package/dist/run-static-warnings.d.ts +8 -8
  86. package/dist/run-static-warnings.js +24 -24
  87. package/dist/run-static-warnings.js.map +1 -1
  88. package/dist/runs.d.ts +18 -55
  89. package/dist/runs.js +26 -94
  90. package/dist/runs.js.map +1 -1
  91. package/dist/script-integrity.d.ts +6 -7
  92. package/dist/script-integrity.js +7 -8
  93. package/dist/script-integrity.js.map +1 -1
  94. package/dist/semantic-inserts.d.ts +4 -4
  95. package/dist/semantic-inserts.js +6 -6
  96. package/dist/semantic-inserts.js.map +1 -1
  97. package/dist/skills.d.ts +33 -107
  98. package/dist/skills.js +69 -160
  99. package/dist/skills.js.map +1 -1
  100. package/dist/tts-backend.d.ts +13 -42
  101. package/dist/tts-backend.js +2 -10
  102. package/dist/tts-backend.js.map +1 -1
  103. package/dist/uploads.d.ts +4 -4
  104. package/dist/uploads.js +4 -4
  105. package/dist/uploads.js.map +1 -1
  106. package/dist/vendor-response.d.ts +17 -80
  107. package/dist/vendor-response.js +19 -67
  108. package/dist/vendor-response.js.map +1 -1
  109. package/dist/voice-admission.d.ts +5 -5
  110. package/dist/voice-admission.js +6 -6
  111. package/dist/voice-admission.js.map +1 -1
  112. package/dist/voice-catalog-data.d.ts +2 -2
  113. package/dist/voice-catalog-data.js +2 -2
  114. package/dist/voice-catalog-data.js.map +1 -1
  115. package/dist/voice-catalog.d.ts +5 -5
  116. package/dist/voice-catalog.js +6 -6
  117. package/dist/voice-catalog.js.map +1 -1
  118. package/dist/voice-listing.d.ts +4 -4
  119. package/dist/voice-listing.js +6 -6
  120. package/dist/voice-listing.js.map +1 -1
  121. package/dist/voices.d.ts +40 -82
  122. package/dist/voices.js +56 -99
  123. package/dist/voices.js.map +1 -1
  124. package/package.json +1 -1
@@ -1,18 +1,6 @@
1
1
  import type { AspectRatio, Resolution } from "./skills.js";
2
2
  import type { VendorRefusalClass } from "./vendor-response.js";
3
- /**
4
- * Вендор-нейтральный контракт рендера аватара.
5
- *
6
- * ЗАЧЕМ: HeyGen — не единственный и не обязательно постоянный провайдер.
7
- * В docs/05 уже записан Argil как запасной бэкенд (дешевле по минуте), а
8
- * legacy-API самого HeyGen выключается 31.10.2026 — вендорская поверхность
9
- * меняется быстрее, чем наш продукт. Всё, что знает про `x-api-key`,
10
- * `/v3/videos` и словарь `"1080p"`, живёт ИСКЛЮЧИТЕЛЬНО в адаптере.
11
- *
12
- * ПРАВИЛО: ни один тип в этом файле не должен быть заимствован из вендорского
13
- * ответа. Если поле нельзя объяснить в терминах продукта — ему здесь не место.
14
- */
15
- /** Источник аудио. Загруженный ассет — вендорская деталь, наружу не торчит. */
3
+ /** Audio source. An uploaded asset is a vendor detail and does not leak out. */
16
4
  export type AudioSource = {
17
5
  kind: "url";
18
6
  url: string;
@@ -21,175 +9,72 @@ export type AudioSource = {
21
9
  data: Uint8Array;
22
10
  mimeType: string;
23
11
  };
24
- /**
25
- * Источник внешности актёра — ПУБЛИЧНЫЙ URL пользователя, и только он.
26
- *
27
- * Дискриминируемый союз из одного варианта не избыточен: он фиксирует, что
28
- * вторым вариантом никогда не станет вендорский идентификатор. Расширяться он
29
- * может кадром или байтами, но не «id аватара из каталога».
30
- */
12
+ /** Actor appearance source: the user's PUBLIC URL and nothing else. A one-variant union */
13
+ /** pins that a vendor identifier never becomes a second variant. */
31
14
  export type ImageSource = {
32
15
  kind: "url";
33
16
  url: string;
34
17
  };
35
- /**
36
- * Запрос на рендер одного клипа.
37
- *
38
- * ПРО ВНЕШНОСТЬ (инвариант переписан в US-524, а не удалён). Раньше внешности
39
- * здесь не было вовсе: её целиком разрешал адаптер, и поле `image` публичного
40
- * контракта молча игнорировалось. Теперь внешность приходит СЮДА, но ровно в
41
- * одной форме — пользовательский публичный URL. Вендорские идентификаторы
42
- * (talking_photo, asset_id) наружу по-прежнему не торчат и остаются заперты в
43
- * адаптере; `image` не задан — адаптер резолвит дефолтного актёра сам, как и
44
- * прежде. То есть ослаблено ровно одно ограничение, и оно названо.
45
- */
18
+ /** Request to render one clip. Appearance arrives only as a user's public URL; vendor */
19
+ /** identifiers stay in the adapter, which resolves the default actor when `image` is unset. */
46
20
  export interface AvatarClipRequest {
47
- /**
48
- * Наш run_id. Адаптер обязан пробросить в идемпотентность вендора
49
- * (`Idempotency-Key`, если она есть) ОБЛАСТЬ — `idempotencyScope ?? runId`,
50
- * а не сам `runId` безусловно: разбор — у поля `idempotencyScope` ниже.
51
- */
21
+ /** Our run_id. The adapter passes the SCOPE (`idempotencyScope ?? runId`) to vendor */
22
+ /** idempotency, not `runId` unconditionally. */
52
23
  runId: string;
53
- /**
54
- * Область вендорской идемпотентности. Не задана — берётся `runId`, то есть
55
- * поведение односегментного рана буквально прежнее.
56
- *
57
- * ЗАЧЕМ ОТДЕЛЬНО ОТ `runId` (US-526): у сегментного ролика на один ран
58
- * приходится несколько платных create. Общий на всех ключ означал бы, что
59
- * вендор дедуплицирует ВТОРОЙ сегмент в первый и вернёт чужой ролик —
60
- * молча и с кодом 200. Разделять обязан вызывающий, потому что только он
61
- * знает, чем сегменты различаются.
62
- */
24
+ /** Vendor idempotency scope, `runId` when unset. A segmented clip makes several paid */
25
+ /** creates per run; a shared key would make the vendor return the first clip for all. */
63
26
  idempotencyScope?: string;
64
27
  audio: AudioSource;
65
28
  resolution: Resolution;
66
29
  aspectRatio: AspectRatio;
67
- /** Не задан — адаптер резолвит дефолтного актёра. */
30
+ /** Unset: the adapter resolves the default actor. */
68
31
  image?: ImageSource;
69
32
  }
70
33
  export interface AvatarClipResult {
71
- /**
72
- * URL у вендора. Считается ВРЕМЕННЫМ и непригодным для отдачи клиенту:
73
- * у HeyGen это подписанная ссылка с истечением. Пайплайн обязан перелить
74
- * файл в наше хранилище и вернуть пользователю уже наш URL.
75
- */
34
+ /** The vendor URL. TEMPORARY and unfit for clients (a signed, expiring link): the pipeline */
35
+ /** copies the file to our storage and returns our URL. */
76
36
  videoUrl: string;
77
37
  durationSec: number;
78
- /** Идентификатор задачи у вендора — без него разбор инцидента на их стороне невозможен. */
38
+ /** The vendor's job id: without it the vendor cannot investigate an incident. */
79
39
  providerJobId: string;
80
40
  provider: string;
81
41
  }
82
- /**
83
- * Хэндл созданной у вендора задачи рендера — мост между ПЛАТНЫМ `createAvatarJob`
84
- * и бесплатным `pollAvatarJob`.
85
- *
86
- * СЕРИАЛИЗУЕМ ПО КОНТРАКТУ (инвариант): таск сохраняет его в R2 как
87
- * `runs/{runId}/avatar.job.json` и после падения восстанавливает через
88
- * `JSON.parse(JSON.stringify(handle))`. Отсюда: только примитивы — никаких
89
- * `Date`, `Uint8Array`, функций; если когда-либо понадобится момент времени,
90
- * он кладётся ISO-строкой. Round-trip обязан давать эквивалентный объект,
91
- * иначе возобновление поллинга по чекпоинту сломается.
92
- */
42
+ /** Handle of a vendor render job, bridging the PAID `createAvatarJob` and the free */
43
+ /** `pollAvatarJob`. Must survive a JSON round-trip: primitives only, times as ISO strings. */
93
44
  export interface AvatarJobHandle {
94
- /** Идентификатор задачи у вендора (у HeyGen — `video_id`). */
45
+ /** The vendor's job id. */
95
46
  providerJobId: string;
96
- /** Имя бэкенда, создавшего задачу, — чтобы поллить её тем же адаптером. */
47
+ /** The backend that created the job, so the same adapter polls it. */
97
48
  provider: string;
98
49
  }
99
- /**
100
- * Возможности бэкенда. Существует, потому что вендоры отличаются в мелочах,
101
- * которые ломают гейт: HeyGen отклоняет `480p` и ниже (проверено 18.07.2026,
102
- * принимает только 720p/1080p/4k), у другого провайдера набор будет иным.
103
- *
104
- * Несовпадение НЕ должно приводить к молчаливой подмене — правило проекта №3
105
- * требует объявлять несоблюдённые параметры в `warnings[]`.
106
- */
50
+ /** Backend capabilities: vendors differ in details that break the gate. A mismatch must */
51
+ /** never be silently substituted; unhonored parameters go to `warnings[]`. */
107
52
  export interface BackendCapabilities {
108
53
  resolutions: readonly Resolution[];
109
54
  aspectRatios: readonly AspectRatio[];
110
- /** Максимальная длина одного аудио, сек. null — вендор не документирует. */
55
+ /** Maximum length of one audio, seconds. null: the vendor does not document it. */
111
56
  maxAudioSec: number | null;
112
57
  }
113
58
  export interface RenderBackend {
114
59
  readonly name: string;
115
60
  readonly capabilities: BackendCapabilities;
116
- /**
117
- * Создать задачу рендера у вендора. РАЗДЕЛЁН с поллингом намеренно: создание —
118
- * ПЛАТНОЕ и однократное, поллинг — бесплатный и возобновляемый. Возврат —
119
- * сериализуемый `AvatarJobHandle`, который таск пишет в R2 (`avatar.job.json`)
120
- * ДО начала поллинга: падение между «вендор списал деньги» и «ролик перелит в
121
- * наше хранилище» возобновляется поллингом сохранённого handle, а не вторым
122
- * платным вызовом (ADR-006).
123
- *
124
- * Реализация обязана:
125
- * - разрешать внешность персонажа ВНУТРИ (вендорский каталог), не принимая её
126
- * из запроса — идентификаторы аватара и каталог наружу не торчат;
127
- * - слать вендорский `Idempotency-Key`, детерминированный от ОБЛАСТИ
128
- * идемпотентности (`req.idempotencyScope ?? req.runId`, US-526), — вторая
129
- * независимая линия против двойного списания (подтверждено, docs/13).
130
- * Именно от области, а не от `runId`: у сегментного ролика на один ран
131
- * приходится несколько платных create, и общий ключ заставил бы вендора
132
- * вернуть первый ролик в ответ на каждый следующий — молча и с кодом 200;
133
- * - помечать ошибку признаком `retryable`: 4xx кроме 429 — `false`, 5xx и
134
- * 429 — `true`.
135
- *
136
- * ПРИЗНАК ОПИСЫВАЕТ ПРИРОДУ ОШИБКИ, А НЕ РАЗРЕШЕНИЕ ПОВТОРИТЬ ЭТОТ ВЫЗОВ
137
- * (уточнение US-606b, круг 11 внешнего ревью; прежняя редакция говорила «их
138
- * ретрай починит» и читалась как позволение). «Транзиентная» и «можно
139
- * повторить» — разные утверждения, и для ПЛАТНОГО создания второе всегда
140
- * ложно: 429 означает, что вендор отбил, а 5xx — что неизвестно, начал ли он
141
- * работу, и повтор превратил бы одно возможное списание в два достоверных.
142
- * Признак читается ТОЛЬКО на бесплатном поллинге (`utils/poll-retry.ts`);
143
- * `createAvatarJob` не повторяется ни при каком статусе.
144
- */
61
+ /** Creates the vendor job: PAID and once, apart from the free, resumable poll. Keys vendor */
62
+ /** idempotency on the scope; `retryable` describes the error, and a paid create is never retried. */
145
63
  createAvatarJob(req: AvatarClipRequest): Promise<AvatarJobHandle>;
146
- /**
147
- * Дождаться терминального состояния задачи и вернуть результат. БЕСПЛАТНЫЙ и
148
- * идемпотентный: безопасен для повтора и для возобновления по сохранённому
149
- * handle.
150
- *
151
- * Дискриминация терминальности — SUCCESS-WHITELIST (fail-closed): успех — это
152
- * ТОЛЬКО явно успешный статус вендора ВМЕСТЕ с непустым URL видео. Любой иной
153
- * терминальный ИЛИ неизвестный статус, равно как «успех» без URL, обязан
154
- * бросать: молчаливый провал внутри HTTP 200 (у HeyGen — `status: "failed"`)
155
- * обычным error-handling не ловится. Реализация обязана иметь верхний предел
156
- * ожидания и бросать по его превышению, а не висеть на зависшей очереди.
157
- */
64
+ /** Waits for a terminal state; free and idempotent. Fail-closed: only an explicit success */
65
+ /** with a non-empty video URL succeeds, and a deadline bounds the wait. */
158
66
  pollAvatarJob(handle: AvatarJobHandle, options?: {
159
67
  deadlineMs: number;
160
68
  }): Promise<AvatarClipResult>;
161
- /** Чья причина за отказом: наш счёт у вендора или его беда. ОБЯЗАТЕЛЕН — */
162
- /** новый вендор без него не скомпилируется. Разбор — `docs/18` §11.6. */
69
+ /** Whose fault a refusal is: our account at the vendor or the vendor's trouble. REQUIRED, */
70
+ /** so a new vendor does not compile without it. */
163
71
  classifyRefusal(error: unknown): VendorRefusalClass;
164
72
  }
165
- /**
166
- * ЧИТАТЕЛЬ ПРИЗНАКА, КОТОРЫЙ ТРЕБУЕТ КОНТРАКТ ВЫШЕ (US-606b).
167
- *
168
- * ЧТО ОН ЧИТАЕТ: природу ошибки, а не разрешение повторить операцию. Кто и что
169
- * повторяет — решает вызывающий, и на ПЛАТНОМ создании ответ всегда «ничего»
170
- * (см. `createAvatarJob` выше). Сегодня единственный потребитель — ретрай
171
- * бесплатного поллинга.
172
- *
173
- * ЗАЧЕМ ЗДЕСЬ, А НЕ У ВЫЗЫВАЮЩЕГО. Обязанность помечать ошибку записана строкой
174
- * выше, и до этой стори её никто не читал: адаптер считал признак, а
175
- * потребителя у него не было — то есть контракт держался тестами адаптера на
176
- * самого себя. Читатель обязан жить там же, где написана обязанность, иначе он
177
- * станет разбором формы КОНКРЕТНОГО адаптера по месту, и второй бэкенд (Argil в
178
- * docs/05) выполнит контракт, а вызывающий его не заметит.
179
- *
180
- * СТРОГОЕ РАВЕНСТВО `true`, А НЕ ПРИВЕДЕНИЕ К ИСТИНЕ: решение о повторе рядом с
181
- * деньгами — последнее место, где уместна догадка «похоже на да». Чего в
182
- * признаке нет (ошибка без поля, чужой объект, строка) — то не повторяется.
183
- */
73
+ /** Reads the `retryable` flag the contract above requires, next to where it is required. */
74
+ /** Strictly `=== true`: near money, anything short of an explicit yes is not retried. */
184
75
  export declare function isRetryableVendorError(error: unknown): boolean;
185
- /**
186
- * Приведение запроса к возможностям бэкенда.
187
- *
188
- * Возвращает то, что бэкенд реально может, и список предупреждений о каждом
189
- * расхождении. Молча понижать разрешение нельзя: пользователь, заказавший
190
- * 1080p и получивший 720p без предупреждения, — это ровно тот дефект
191
- * конкурента, который зафиксирован в docs/08 как антипаттерн.
192
- */
76
+ /** Fits a request to the backend's capabilities; every mismatch is a warning, and the */
77
+ /** resolution is never lowered silently. */
193
78
  export declare function negotiateCapabilities(req: Pick<AvatarClipRequest, "resolution" | "aspectRatio">, caps: BackendCapabilities, backendName: string): {
194
79
  resolution: Resolution;
195
80
  aspectRatio: AspectRatio;
@@ -1,35 +1,12 @@
1
- /**
2
- * ЧИТАТЕЛЬ ПРИЗНАКА, КОТОРЫЙ ТРЕБУЕТ КОНТРАКТ ВЫШЕ (US-606b).
3
- *
4
- * ЧТО ОН ЧИТАЕТ: природу ошибки, а не разрешение повторить операцию. Кто и что
5
- * повторяет — решает вызывающий, и на ПЛАТНОМ создании ответ всегда «ничего»
6
- * (см. `createAvatarJob` выше). Сегодня единственный потребитель — ретрай
7
- * бесплатного поллинга.
8
- *
9
- * ЗАЧЕМ ЗДЕСЬ, А НЕ У ВЫЗЫВАЮЩЕГО. Обязанность помечать ошибку записана строкой
10
- * выше, и до этой стори её никто не читал: адаптер считал признак, а
11
- * потребителя у него не было — то есть контракт держался тестами адаптера на
12
- * самого себя. Читатель обязан жить там же, где написана обязанность, иначе он
13
- * станет разбором формы КОНКРЕТНОГО адаптера по месту, и второй бэкенд (Argil в
14
- * docs/05) выполнит контракт, а вызывающий его не заметит.
15
- *
16
- * СТРОГОЕ РАВЕНСТВО `true`, А НЕ ПРИВЕДЕНИЕ К ИСТИНЕ: решение о повторе рядом с
17
- * деньгами — последнее место, где уместна догадка «похоже на да». Чего в
18
- * признаке нет (ошибка без поля, чужой объект, строка) — то не повторяется.
19
- */
1
+ /** Reads the `retryable` flag the contract above requires, next to where it is required. */
2
+ /** Strictly `=== true`: near money, anything short of an explicit yes is not retried. */
20
3
  export function isRetryableVendorError(error) {
21
4
  return (typeof error === "object" &&
22
5
  error !== null &&
23
6
  error.retryable === true);
24
7
  }
25
- /**
26
- * Приведение запроса к возможностям бэкенда.
27
- *
28
- * Возвращает то, что бэкенд реально может, и список предупреждений о каждом
29
- * расхождении. Молча понижать разрешение нельзя: пользователь, заказавший
30
- * 1080p и получивший 720p без предупреждения, — это ровно тот дефект
31
- * конкурента, который зафиксирован в docs/08 как антипаттерн.
32
- */
8
+ /** Fits a request to the backend's capabilities; every mismatch is a warning, and the */
9
+ /** resolution is never lowered silently. */
33
10
  export function negotiateCapabilities(req, caps, backendName) {
34
11
  const warnings = [];
35
12
  let resolution = req.resolution;
@@ -1 +1 @@
1
- {"version":3,"file":"render-backend.js","sourceRoot":"","sources":["../src/render-backend.ts"],"names":[],"mappings":"AAsKA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACb,KAAiC,CAAC,SAAS,KAAK,IAAI,CACtD,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,GAA0D,EAC1D,IAAyB,EACzB,WAAmB;IAEnB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;IAChC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,WAAW,WAAW,oCAAoC,CAAC,CAAC;QAC9E,CAAC;QACD,QAAQ,CAAC,IAAI,CACX,cAAc,UAAU,wBAAwB,WAAW,iBAAiB,QAAQ,EAAE,CACvF,CAAC;QACF,UAAU,GAAG,QAAQ,CAAC;IACxB,CAAC;IAED,IAAI,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC;IAClC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,WAAW,WAAW,sCAAsC,CAAC,CAAC;QAChF,CAAC;QACD,QAAQ,CAAC,IAAI,CACX,gBAAgB,WAAW,wBAAwB,WAAW,iBAAiB,QAAQ,EAAE,CAC1F,CAAC;QACF,WAAW,GAAG,QAAQ,CAAC;IACzB,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"render-backend.js","sourceRoot":"","sources":["../src/render-backend.ts"],"names":[],"mappings":"AA4EA,4FAA4F;AAC5F,yFAAyF;AACzF,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACb,KAAiC,CAAC,SAAS,KAAK,IAAI,CACtD,CAAC;AACJ,CAAC;AAED,yFAAyF;AACzF,4CAA4C;AAC5C,MAAM,UAAU,qBAAqB,CACnC,GAA0D,EAC1D,IAAyB,EACzB,WAAmB;IAEnB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;IAChC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,WAAW,WAAW,oCAAoC,CAAC,CAAC;QAC9E,CAAC;QACD,QAAQ,CAAC,IAAI,CACX,cAAc,UAAU,wBAAwB,WAAW,iBAAiB,QAAQ,EAAE,CACvF,CAAC;QACF,UAAU,GAAG,QAAQ,CAAC;IACxB,CAAC;IAED,IAAI,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC;IAClC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,WAAW,WAAW,sCAAsC,CAAC,CAAC;QAChF,CAAC;QACD,QAAQ,CAAC,IAAI,CACX,gBAAgB,WAAW,wBAAwB,WAAW,iBAAiB,QAAQ,EAAE,CAC1F,CAAC;QACF,WAAW,GAAG,QAAQ,CAAC;IACzB,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;AAC/C,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- /** Проба источника кадра; `not_probed` — сети не было (нет `image`). */
2
+ /** Frame source probe; `not_probed` means no network call happened (no `image`). */
3
3
  export declare const aspectProbeFact: z.ZodDiscriminatedUnion<[z.ZodObject<{
4
4
  kind: z.ZodLiteral<"not_probed">;
5
5
  }, z.core.$strip>, z.ZodObject<{
@@ -11,7 +11,7 @@ export declare const aspectProbeFact: z.ZodDiscriminatedUnion<[z.ZodObject<{
11
11
  height: z.ZodNumber;
12
12
  }, z.core.$strip>], "kind">;
13
13
  export type AspectProbeFact = z.infer<typeof aspectProbeFact>;
14
- /** Префлайт СЫРОГО `voice_id`; пресет каталог не запрашивает (US-515). */
14
+ /** Preflight of a RAW `voice_id`; a preset does not query the catalog. */
15
15
  export declare const voicePreflightFact: z.ZodDiscriminatedUnion<[z.ZodObject<{
16
16
  kind: z.ZodLiteral<"not_probed">;
17
17
  }, z.core.$strip>, z.ZodObject<{
@@ -40,9 +40,9 @@ export declare const runPreflight: z.ZodObject<{
40
40
  }, z.core.$strip>], "kind">>;
41
41
  }, z.core.$strip>;
42
42
  export type RunPreflight = z.infer<typeof runPreflight>;
43
- /** Имена семей — они же ключи слияния в `jsonb`. */
43
+ /** Family names, also the merge keys in `jsonb`. */
44
44
  export type RunPreflightFamily = keyof RunPreflight;
45
45
  export declare function sourceNotProbedWarning(errorClass: string): string;
46
- /** Каталог голосов усечён — сырой `voice_id` подтвердить нечем. FAIL-OPEN. */
46
+ /** The voice catalog is truncated, so a raw `voice_id` cannot be confirmed. FAIL-OPEN. */
47
47
  export declare const VOICE_CATALOG_INCOMPLETE_WARNING = "voice catalog incomplete \u2014 voice_id could not be verified";
48
48
  export declare function parseRunPreflight(stored: unknown): RunPreflight;
@@ -1,7 +1,7 @@
1
1
  import { z } from "zod";
2
- // ФАКТ ПРЕФЛАЙТА РАНА: невыводимое на чтении, потому что требует сети.
3
- // Почему факт, а не готовая строка, — docs/18, Д41 и Д42.
4
- /** Проба источника кадра; `not_probed` — сети не было (нет `image`). */
2
+ // Run preflight facts: what cannot be derived on read because it needs the network.
3
+ // A fact is stored rather than a ready-made line, so the reader derives the text.
4
+ /** Frame source probe; `not_probed` means no network call happened (no `image`). */
5
5
  export const aspectProbeFact = z.discriminatedUnion("kind", [
6
6
  z.object({ kind: z.literal("not_probed") }),
7
7
  z.object({ kind: z.literal("failed"), error_class: z.string().min(1) }),
@@ -11,26 +11,26 @@ export const aspectProbeFact = z.discriminatedUnion("kind", [
11
11
  height: z.number().int().positive(),
12
12
  }),
13
13
  ]);
14
- /** Префлайт СЫРОГО `voice_id`; пресет каталог не запрашивает (US-515). */
14
+ /** Preflight of a RAW `voice_id`; a preset does not query the catalog. */
15
15
  export const voicePreflightFact = z.discriminatedUnion("kind", [
16
16
  z.object({ kind: z.literal("not_probed") }),
17
17
  z.object({ kind: z.literal("catalog_incomplete") }),
18
18
  z.object({ kind: z.literal("verified") }),
19
19
  ]);
20
- // СЕМЬЯ БЕЗ КЛЮЧА ≠ `not_probed`: первое означает «не записано» — так выглядят
21
- // раны до 0030; второе — записанное знание «пробы не было». Разбор — docs/18, Д42.
20
+ // A missing family key ≠ `not_probed`: the first means "not recorded" (older runs look
21
+ // like that); the second is recorded knowledge that no probe happened.
22
22
  export const runPreflight = z.object({
23
23
  aspect: aspectProbeFact.optional(),
24
24
  voice: voicePreflightFact.optional(),
25
25
  });
26
- // Текст живёт рядом с фактом: его печатают оба конца — `quote` и читатель колонки.
26
+ // The text lives next to the fact: both ends print it, `quote` and the column reader.
27
27
  export function sourceNotProbedWarning(errorClass) {
28
28
  return `source could not be probed (${errorClass})`;
29
29
  }
30
- /** Каталог голосов усечён — сырой `voice_id` подтвердить нечем. FAIL-OPEN. */
30
+ /** The voice catalog is truncated, so a raw `voice_id` cannot be confirmed. FAIL-OPEN. */
31
31
  export const VOICE_CATALOG_INCOMPLETE_WARNING = "voice catalog incomplete — voice_id could not be verified";
32
- // СЕМЬИ РАЗБИРАЮТСЯ НЕЗАВИСИМО (довод `parseSettlementBasis`): порча одной не
33
- // забирает исправную вторую. Нечитаемое значение даёт пустой набор фактов.
32
+ // Families parse independently: a corrupt one does not take down a sound one.
33
+ // An unreadable value gives an empty set of facts.
34
34
  export function parseRunPreflight(stored) {
35
35
  if (typeof stored !== "object" || stored === null)
36
36
  return {};
@@ -1 +1 @@
1
- {"version":3,"file":"run-preflight.js","sourceRoot":"","sources":["../src/run-preflight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,uEAAuE;AACvE,0DAA0D;AAE1D,wEAAwE;AACxE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IAC1D,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;IAC3C,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;QACrB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QAClC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;KACpC,CAAC;CACH,CAAC,CAAC;AAGH,0EAA0E;AAC1E,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IAC7D,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;IAC3C,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC;IACnD,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;CAC1C,CAAC,CAAC;AAGH,+EAA+E;AAC/E,mFAAmF;AACnF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,eAAe,CAAC,QAAQ,EAAE;IAClC,KAAK,EAAE,kBAAkB,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC;AAMH,mFAAmF;AACnF,MAAM,UAAU,sBAAsB,CAAC,UAAkB;IACvD,OAAO,+BAA+B,UAAU,GAAG,CAAC;AACtD,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,MAAM,gCAAgC,GAC3C,2DAA2D,CAAC;AAE9D,8EAA8E;AAC9E,2EAA2E;AAC3E,MAAM,UAAU,iBAAiB,CAAC,MAAe;IAC/C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAC7D,MAAM,GAAG,GAAG,MAAiC,CAAC;IAC9C,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,kBAAkB,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACtD,OAAO;QACL,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"run-preflight.js","sourceRoot":"","sources":["../src/run-preflight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,oFAAoF;AACpF,kFAAkF;AAElF,oFAAoF;AACpF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IAC1D,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;IAC3C,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;QACrB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QAClC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;KACpC,CAAC;CACH,CAAC,CAAC;AAGH,0EAA0E;AAC1E,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IAC7D,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;IAC3C,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC;IACnD,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;CAC1C,CAAC,CAAC;AAGH,uFAAuF;AACvF,uEAAuE;AACvE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,eAAe,CAAC,QAAQ,EAAE;IAClC,KAAK,EAAE,kBAAkB,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC;AAMH,sFAAsF;AACtF,MAAM,UAAU,sBAAsB,CAAC,UAAkB;IACvD,OAAO,+BAA+B,UAAU,GAAG,CAAC;AACtD,CAAC;AAED,0FAA0F;AAC1F,MAAM,CAAC,MAAM,gCAAgC,GAC3C,2DAA2D,CAAC;AAE9D,8EAA8E;AAC9E,mDAAmD;AACnD,MAAM,UAAU,iBAAiB,CAAC,MAAe;IAC/C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAC7D,MAAM,GAAG,GAAG,MAAiC,CAAC;IAC9C,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,kBAAkB,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACtD,OAAO;QACL,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChD,CAAC;AACJ,CAAC"}
@@ -1,15 +1,15 @@
1
1
  import { type Gender } from "./actors.js";
2
2
  import { type RunPreflight } from "./run-preflight.js";
3
- /** Пол голоса приходит ОТ ВЫЗЫВАТЕЛЯ и обязателен: каталог голосов в баррел не */
4
- /** входит, а умолчание «только пресеты» теряло бы голос каталога молча (#210). */
3
+ /** Voice gender comes FROM THE CALLER and is required: the voice catalog is not in the */
4
+ /** barrel, and a presets-only default would silently lose catalog voices. */
5
5
  export type VoiceGenderResolver = (voice: string) => Gender | undefined;
6
- /** Сохранённый вход нечитаем: перечислить несоблюдённые поля нечем. */
6
+ /** The stored input is unreadable: there is nothing to list unhonored fields from. */
7
7
  export declare const UNREADABLE_RUN_INPUT_WARNING = "run input could not be read: parameters that are accepted but not honored cannot be listed for this run";
8
- /** То же для `create_actor`: неисполненных параметров у него не бывает, а нечитаемый вход — отказ без списания. */
8
+ /** The same for `create_actor`: it has no unhonored parameters, and an unreadable input fails uncharged. */
9
9
  export declare const UNREADABLE_CREATE_ACTOR_INPUT_WARNING = "create_actor run input could not be read: a run that fails for this reason creates no actor and is not charged";
10
- /** Выводимое по скиллу рана. У `create_actor` выводить нечего: его предупреждения */
11
- /** записаны при допуске, и чтение их не пересчитывает (ADR-0003). */
10
+ /** Derived warnings by run skill. `create_actor` has nothing to derive: its warnings are */
11
+ /** written at admission and not recomputed on read. */
12
12
  export declare function derivedRunWarnings(storedInput: unknown, preflight: RunPreflight, skill: string, voiceGenderOf: VoiceGenderResolver): string[];
13
- /** Полный `warnings[]` рана; порядок выводимого — как у `quote`. Префлайт и скилл */
14
- /** ОБЯЗАТЕЛЬНЫ И ЭТИМ СТОРОЖАТ: опциональный терял бы факт у нового читателя молча. */
13
+ /** A run's full `warnings[]`; derived lines in `quote` order. Preflight and skill are */
14
+ /** REQUIRED on purpose: an optional one would silently lose the fact for a new reader. */
15
15
  export declare function composeRunWarnings(stored: unknown, storedInput: unknown, storedPreflight: unknown, skill: string, voiceGenderOf: VoiceGenderResolver): string[];
@@ -6,12 +6,12 @@ import { buildActorGenderWarnings, buildVoiceActorMatchWarnings } from "./actors
6
6
  import { resolveAspectRatio, upscaleWarning } from "./aspect.js";
7
7
  import { DEFAULT_RESOLUTION } from "./skills.js";
8
8
  import { parseRunPreflight, sourceNotProbedWarning, VOICE_CATALOG_INCOMPLETE_WARNING, } from "./run-preflight.js";
9
- /** Сохранённый вход нечитаем: перечислить несоблюдённые поля нечем. */
9
+ /** The stored input is unreadable: there is nothing to list unhonored fields from. */
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
- /** То же для `create_actor`: неисполненных параметров у него не бывает, а нечитаемый вход — отказ без списания. */
11
+ /** The same for `create_actor`: it has no unhonored parameters, and an unreadable input fails uncharged. */
12
12
  export const UNREADABLE_CREATE_ACTOR_INPUT_WARNING = "create_actor run input could not be read: a run that fails for this reason creates no actor and is not charged";
13
- /** Что факт пробы даёт БЕЗ входа. `undefined` ниже — не дефолт формата: берём */
14
- /** только `warnings`, а они у `source === null` от `requested` не зависят (кейс). */
13
+ /** What a probe fact gives WITHOUT the input. `undefined` below is not a format default: only */
14
+ /** `warnings` are taken, and with `source === null` they do not depend on `requested`. */
15
15
  function aspectWarningsWithoutInput(fact) {
16
16
  if (fact?.kind !== "failed")
17
17
  return [];
@@ -21,29 +21,29 @@ function aspectWarningsWithoutInput(fact) {
21
21
  ...(resolution.kind === "resolved" ? resolution.warnings : []),
22
22
  ];
23
23
  }
24
- // ФОРМАТ ВЫВОДИТСЯ ИЗ ФАКТА ПРОБЫ ТЕМ ЖЕ РЕЗОЛВЕРОМ, ЧТО У `quote`
25
- // (`decideAspect` → `resolveAspectRatio`), поэтому две поверхности не разойдутся.
24
+ // The format is derived from the probe fact by the same resolver as `quote`
25
+ // (`decideAspect` → `resolveAspectRatio`), so the two surfaces cannot diverge.
26
26
  function aspectFactWarnings(fact, input) {
27
27
  if (fact === undefined || fact.kind === "not_probed")
28
28
  return [];
29
- // Провал зовёт ТУ ЖЕ функцию, что и путь без входа: равенство двух путей на этой
30
- // ветке структурное, а не совпадение, которое разъедется при первой правке.
29
+ // A failure calls THE SAME function as the input-free path, so the two paths are
30
+ // equal by structure, not by a coincidence that the next edit breaks.
31
31
  if (fact.kind === "failed")
32
32
  return aspectWarningsWithoutInput(fact);
33
33
  const source = { width: fact.width, height: fact.height, origin: "probed" };
34
34
  const resolution = resolveAspectRatio({ requested: input.aspect_ratio, source });
35
- // Отказ здесь недостижим: ран с конфликтом формата отбивается до вставки (400).
35
+ // A refusal is unreachable here: a run with a format conflict is refused before insert (400).
36
36
  if (resolution.kind !== "resolved")
37
37
  return [];
38
38
  const upscale = upscaleWarning(source, input.resolution ?? DEFAULT_RESOLUTION, resolution.aspectRatio);
39
39
  return [...resolution.warnings, ...(upscale === null ? [] : [upscale])];
40
40
  }
41
- /** Префлайт голоса: строку восстанавливает читатель, каталог вендора ему недоступен. */
41
+ /** Voice preflight: the reader rebuilds the line, since it has no access to the vendor catalog. */
42
42
  function voiceFactWarnings(fact) {
43
43
  return fact?.kind === "catalog_incomplete" ? [VOICE_CATALOG_INCOMPLETE_WARNING] : [];
44
44
  }
45
- /** Выводимое по скиллу рана. У `create_actor` выводить нечего: его предупреждения */
46
- /** записаны при допуске, и чтение их не пересчитывает (ADR-0003). */
45
+ /** Derived warnings by run skill. `create_actor` has nothing to derive: its warnings are */
46
+ /** written at admission and not recomputed on read. */
47
47
  export function derivedRunWarnings(storedInput, preflight, skill, voiceGenderOf) {
48
48
  const parsed = parseSkill(skill);
49
49
  switch (parsed) {
@@ -57,13 +57,13 @@ export function derivedRunWarnings(storedInput, preflight, skill, voiceGenderOf)
57
57
  return parsed;
58
58
  }
59
59
  }
60
- // Реестр диспозиций и языковой warning пресета. Почему без `voice_id` —
61
- // docs/18, Д41.
60
+ // The disposition registry and the preset language warning; the raw `voice_id` warning
61
+ // is quote-only, since the run verifies the id itself.
62
62
  function ugcRunWarnings(storedInput, preflight, voiceGenderOf) {
63
63
  const parsed = storedUgcInput.safeParse(storedInput);
64
64
  if (!parsed.success) {
65
- // НЕЧИТАЕМЫЙ ВХОД НЕ ОТМЕНЯЕТ ФАКТОВ. Мерка одна: выводится всё, что выводимо
66
- // БЕЗ входа. У `ok` снап от запрошенного формата зависит — его здесь и нет.
65
+ // An unreadable input does not cancel the facts: everything derivable WITHOUT the
66
+ // input is derived. An `ok` snap depends on the requested format, so it is absent.
67
67
  return [
68
68
  UNREADABLE_RUN_INPUT_WARNING,
69
69
  ...aspectWarningsWithoutInput(preflight.aspect),
@@ -72,30 +72,30 @@ function ugcRunWarnings(storedInput, preflight, voiceGenderOf) {
72
72
  }
73
73
  const { tts_model: storedModel, actor_snapshot: pin, ...rest } = parsed.data;
74
74
  const ttsModel = TTS_MODELS.find((model) => model === storedModel);
75
- // Снятая модель (`eleven_multilingual_v2`) читается как умолчание: на нём о модели молчим.
75
+ // A removed model (`eleven_multilingual_v2`) reads as the default, which stays silent about models.
76
76
  const input = { ...rest, tts_model: ttsModel };
77
- // ПОРЯДОК — ТОТ ЖЕ, ЧТО У `quote`: диспозиции, формат, голос. Иначе паритет
78
- // двух поверхностей держался бы только составом списка, но не равенством.
77
+ // The same ORDER as `quote`: dispositions, format, voice, so the two surfaces are
78
+ // equal, not merely the same set.
79
79
  return [
80
80
  ...dispositionWarnings(input),
81
81
  ...aspectFactWarnings(preflight.aspect, input),
82
82
  ...buildVoiceWarnings({ voice: input.voice, script: resolvedScript(input) }),
83
83
  ...buildActorGenderWarnings(input),
84
84
  ...buildVoiceActorMatchWarnings(input, voiceGenderOf, pin?.gender),
85
- // Пол пина в ВЫБОР МОДЕЛИ не идёт: у голосов по умолчанию обоих полов она одна,
86
- // поэтому вывод от пола не зависит; разойдутся модели — покраснеет тест в run-static-warnings.test.ts.
85
+ // The pinned gender does not feed MODEL choice: both genders' default voices share a
86
+ // model. If they diverge, a test in run-static-warnings.test.ts turns red.
87
87
  ...buildSpeechModelWarnings({ ...input, script: resolvedScript(input) }, input.actor_gender),
88
88
  ...voiceFactWarnings(preflight.voice),
89
89
  ];
90
90
  }
91
- /** Строки колонки `warnings`; нечитаемое значение даёт пустой список. */
91
+ /** Strings of the `warnings` column; an unreadable value gives an empty list. */
92
92
  function storedStrings(stored) {
93
93
  if (!Array.isArray(stored))
94
94
  return [];
95
95
  return stored.filter((item) => typeof item === "string");
96
96
  }
97
- /** Полный `warnings[]` рана; порядок выводимого — как у `quote`. Префлайт и скилл */
98
- /** ОБЯЗАТЕЛЬНЫ И ЭТИМ СТОРОЖАТ: опциональный терял бы факт у нового читателя молча. */
97
+ /** A run's full `warnings[]`; derived lines in `quote` order. Preflight and skill are */
98
+ /** REQUIRED on purpose: an optional one would silently lose the fact for a new reader. */
99
99
  export function composeRunWarnings(stored, storedInput, storedPreflight, skill, voiceGenderOf) {
100
100
  return [
101
101
  ...new Set([
@@ -1 +1 @@
1
- {"version":3,"file":"run-static-warnings.js","sourceRoot":"","sources":["../src/run-static-warnings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAqB,MAAM,aAAa,CAAC;AAC5F,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,wBAAwB,EAAE,4BAA4B,EAAe,MAAM,aAAa,CAAC;AAClG,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,gCAAgC,GAIjC,MAAM,oBAAoB,CAAC;AAQ5B,uEAAuE;AACvE,MAAM,CAAC,MAAM,4BAA4B,GACvC,yGAAyG,CAAC;AAE5G,mHAAmH;AACnH,MAAM,CAAC,MAAM,qCAAqC,GAChD,gHAAgH,CAAC;AAEnH,iFAAiF;AACjF,qFAAqF;AACrF,SAAS,0BAA0B,CAAC,IAAiC;IACnE,IAAI,IAAI,EAAE,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG,kBAAkB,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9E,OAAO;QACL,sBAAsB,CAAC,IAAI,CAAC,WAAW,CAAC;QACxC,GAAG,CAAC,UAAU,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/D,CAAC;AACJ,CAAC;AAED,mEAAmE;AACnE,kFAAkF;AAClF,SAAS,kBAAkB,CACzB,IAAiC,EACjC,KAAmB;IAEnB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY;QAAE,OAAO,EAAE,CAAC;IAChE,iFAAiF;IACjF,4EAA4E;IAC5E,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,0BAA0B,CAAC,IAAI,CAAC,CAAC;IAEpE,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,QAAiB,EAAE,CAAC;IACrF,MAAM,UAAU,GAAG,kBAAkB,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;IACjF,gFAAgF;IAChF,IAAI,UAAU,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,EAAE,CAAC;IAC9C,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,IAAI,kBAAkB,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;IACvG,OAAO,CAAC,GAAG,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,wFAAwF;AACxF,SAAS,iBAAiB,CAAC,IAAoC;IAC7D,OAAO,IAAI,EAAE,IAAI,KAAK,oBAAoB,CAAC,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACvF,CAAC;AAED,qFAAqF;AACrF,qEAAqE;AACrE,MAAM,UAAU,kBAAkB,CAChC,WAAoB,EACpB,SAAuB,EACvB,KAAa,EACb,aAAkC;IAElC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IACjC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,UAAU;YACb,OAAO,cAAc,CAAC,WAAW,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;QAC/D,KAAK,cAAc;YACjB,OAAO,sBAAsB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC;QAC9G,KAAK,IAAI;YACP,OAAO,CAAC,4BAA4B,CAAC,CAAC;QACxC;YACE,OAAO,MAAsB,CAAC;IAClC,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,gBAAgB;AAChB,SAAS,cAAc,CACrB,WAAoB,EACpB,SAAuB,EACvB,aAAkC;IAElC,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACrD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,8EAA8E;QAC9E,4EAA4E;QAC5E,OAAO;YACL,4BAA4B;YAC5B,GAAG,0BAA0B,CAAC,SAAS,CAAC,MAAM,CAAC;YAC/C,GAAG,iBAAiB,CAAC,SAAS,CAAC,KAAK,CAAC;SACtC,CAAC;IACJ,CAAC;IACD,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IAC7E,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC;IACnE,2FAA2F;IAC3F,MAAM,KAAK,GAAiB,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IAC7D,4EAA4E;IAC5E,0EAA0E;IAC1E,OAAO;QACL,GAAG,mBAAmB,CAAC,KAAK,CAAC;QAC7B,GAAG,kBAAkB,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC;QAC9C,GAAG,kBAAkB,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5E,GAAG,wBAAwB,CAAC,KAAK,CAAC;QAClC,GAAG,4BAA4B,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,CAAC;QAClE,gFAAgF;QAChF,uGAAuG;QACvG,GAAG,wBAAwB,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,YAAY,CAAC;QAC5F,GAAG,iBAAiB,CAAC,SAAS,CAAC,KAAK,CAAC;KACtC,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,SAAS,aAAa,CAAC,MAAe;IACpC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC;AAC3E,CAAC;AAED,qFAAqF;AACrF,uFAAuF;AACvF,MAAM,UAAU,kBAAkB,CAChC,MAAe,EACf,WAAoB,EACpB,eAAwB,EACxB,KAAa,EACb,aAAkC;IAElC,OAAO;QACL,GAAG,IAAI,GAAG,CAAC;YACT,GAAG,kBAAkB,CAAC,WAAW,EAAE,iBAAiB,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC;YAC5F,GAAG,aAAa,CAAC,MAAM,CAAC;SACzB,CAAC;KACH,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"run-static-warnings.js","sourceRoot":"","sources":["../src/run-static-warnings.ts"],"names":[],"mappings":"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"}