@clipwright/core 0.1.0 → 0.3.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 (47) hide show
  1. package/LICENSE +1 -1
  2. package/dist/__fixtures__/queue-promises.d.ts +87 -0
  3. package/dist/__fixtures__/queue-promises.js +99 -0
  4. package/dist/__fixtures__/queue-promises.js.map +1 -0
  5. package/dist/account.d.ts +49 -0
  6. package/dist/account.js +45 -0
  7. package/dist/account.js.map +1 -0
  8. package/dist/api-failure.d.ts +192 -0
  9. package/dist/api-failure.js +491 -0
  10. package/dist/api-failure.js.map +1 -0
  11. package/dist/contract-dispositions.d.ts +2 -19
  12. package/dist/contract-dispositions.js +2 -19
  13. package/dist/contract-dispositions.js.map +1 -1
  14. package/dist/errors.d.ts +148 -0
  15. package/dist/errors.js +192 -0
  16. package/dist/errors.js.map +1 -0
  17. package/dist/index.d.ts +7 -0
  18. package/dist/index.js +21 -0
  19. package/dist/index.js.map +1 -1
  20. package/dist/public-endpoints.d.ts +29 -0
  21. package/dist/public-endpoints.js +49 -0
  22. package/dist/public-endpoints.js.map +1 -0
  23. package/dist/rate-limit.d.ts +160 -0
  24. package/dist/rate-limit.js +182 -0
  25. package/dist/rate-limit.js.map +1 -0
  26. package/dist/render-backend.d.ts +44 -6
  27. package/dist/render-backend.js +24 -0
  28. package/dist/render-backend.js.map +1 -1
  29. package/dist/run-static-warnings.d.ts +5 -0
  30. package/dist/run-static-warnings.js +30 -0
  31. package/dist/run-static-warnings.js.map +1 -0
  32. package/dist/runs.d.ts +3 -0
  33. package/dist/runs.js +18 -1
  34. package/dist/runs.js.map +1 -1
  35. package/dist/skills.d.ts +27 -2
  36. package/dist/skills.js +48 -8
  37. package/dist/skills.js.map +1 -1
  38. package/dist/tts-backend.d.ts +4 -0
  39. package/dist/tts-backend.js +0 -13
  40. package/dist/tts-backend.js.map +1 -1
  41. package/dist/vendor-response.d.ts +98 -0
  42. package/dist/vendor-response.js +152 -0
  43. package/dist/vendor-response.js.map +1 -0
  44. package/dist/voices.d.ts +42 -26
  45. package/dist/voices.js +11 -8
  46. package/dist/voices.js.map +1 -1
  47. package/package.json +2 -2
package/dist/skills.js CHANGED
@@ -49,7 +49,23 @@ export function resolveResolution(requested, isDev) {
49
49
  return isDev ? DEV_RESOLUTION : DEFAULT_RESOLUTION;
50
50
  }
51
51
  /**
52
- * Потолок длины скрипта (docs/12 §11, ~45с озвучки) — временная замена
52
+ * ⚠️ ЭТО БАЗИС ВЫВОДА ПОТОЛКА СЛОВ, А НЕ ПОТОЛОК СЕКУНД, и имя переименовано
53
+ * ровно поэтому (находка внешней приёмки, круг 23). Прежнее — `MAX_SCRIPT_SECONDS`
54
+ * — читалось как «максимум секунд» и дважды подряд стало источником ДЕНЕЖНОГО
55
+ * дефекта на публичной странице цены: ею зажимали длительность, обещая клиенту
56
+ * меньше возможного счёта. Схема ограничивает только СЛОВА; сколько из них выйдет
57
+ * секунд, не ограничено ничем, потому что гейт пейсинга удалён.
58
+ *
59
+ * Число осталось прежним, роль названа честно: это множимое, из которого вместе
60
+ * с быстрым краем пейсинга получается `MAX_SCRIPT_WORDS`.
61
+ *
62
+ * ⚠️ ИСХОДНЫЙ ДОВОД НИЖЕ ОПИСЫВАЕТ ПОЛОЖЕНИЕ ДО УДАЛЕНИЯ ГЕЙТА ПЕЙСИНГА и
63
+ * оставлен как история, а не как действующее объяснение (находка внешней
64
+ * приёмки, круг 24): он объясняет число через «~45с озвучки» и пейсинг-гейт,
65
+ * которого с 2026-07-22 не существует. Действующее объяснение — абзац выше:
66
+ * это множимое, и ограничивает контракт только слова.
67
+ *
68
+ * Исходный довод (docs/12 §11) — временная замена
53
69
  * мульти-тейка (docs/12 §3: длинные скрипты раньше резались на несколько
54
70
  * тейков, эта логика вырезана на время прототипа). Пока мульти-тейк не
55
71
  * вернули, скрипт длиннее одного тейка нужно отклонять на входе, а не
@@ -60,8 +76,24 @@ export function resolveResolution(requested, isDev) {
60
76
  * потолок секунд без нарушения пейсинг-гейта. Числа пейсинга не дублируем,
61
77
  * берём готовые константы из pacing.ts.
62
78
  */
63
- export const MAX_SCRIPT_SECONDS = 45;
64
- export const MAX_SCRIPT_WORDS = MAX_SCRIPT_SECONDS * WORDS_PER_SECOND_MAX;
79
+ export const SCRIPT_SECONDS_BASIS = 45;
80
+ export const MAX_SCRIPT_WORDS = SCRIPT_SECONDS_BASIS * WORDS_PER_SECOND_MAX;
81
+ /** Потолок длины ЛЮБОГО адреса из чужого тела: без него поле берёт весь потолок */
82
+ /** тела запроса. Число — верхний предел, который переваривает любой браузер и CDN. */
83
+ export const MAX_URL_LENGTH = 2048;
84
+ /** ЧТО ДЕЛАЕТ `make_ugc` — один текст на обе контрактные поверхности: публичный */
85
+ /** REST-каталог и MCP `tools/list`. Разойдясь, они описали бы РАЗНЫЙ скилл. */
86
+ export const MAKE_UGC_DESCRIPTION = "Start generation of a lip-synced UGC video. Give a script (any length); the actor comes " +
87
+ "from person (described in words) or image. Format and resolution follow the request and " +
88
+ "the source, defaulting to 1080x1920. Captions are OPT-IN: ask the user first. Fields the " +
89
+ "renderer does not honor yet carry a NOT HONORED YET note in their own description — read " +
90
+ "it instead of guessing.";
91
+ /** Как ЗВАТЬ скилл по MCP. Отдельно от описания выше: имена соседних тулов и */
92
+ /** поллинг — свойства протокола, и REST-каталогу они не адресованы. */
93
+ export const MAKE_UGC_AGENT_PROTOCOL = "Call quote_ugc before generating and show the cost. This does NOT wait for the video: it " +
94
+ "starts the run and returns a run_id IMMEDIATELY. You MUST then poll get_run with that " +
95
+ "run_id until the state is 'succeeded' (video_url) or 'failed'. Pass attempt=2,3,… to " +
96
+ "deliberately start a NEW run for the same input (retry after a failure).";
65
97
  /**
66
98
  * Сырой zod-shape входа make_ugc — БЕЗ `.refine()`.
67
99
  *
@@ -85,7 +117,7 @@ export const ugcSegment = z.object({
85
117
  /** Реплика актёра. У `media`-сегмента отсутствует — там говорит соседний актёр. */
86
118
  script: z.string().min(1).max(10_000).optional(),
87
119
  /** Полнокадровый врез. Обязателен у `media`, запрещён у `actor`. */
88
- media_url: z.string().url().optional(),
120
+ media_url: z.string().url().max(MAX_URL_LENGTH).optional(),
89
121
  });
90
122
  /** Потолок актёрских сегментов — ограничение ОДНОГО рана, не суточных трат. */
91
123
  export const MAX_ACTOR_SEGMENTS = 3;
@@ -107,10 +139,10 @@ export const makeUgcInputShape = {
107
139
  // исключительно `{type:"url"}`, а заливка data-URI в R2 с presigned-выдачей
108
140
  // вскрыла бы инвариант Этапа 4 «R2-URL вендору не передаются». Отказ на входе
109
141
  // честнее, чем приём поля, которое некуда деть.
110
- image: z.string().url().startsWith("https://").optional(),
142
+ image: z.string().url().startsWith("https://").max(MAX_URL_LENGTH).optional(),
111
143
  character: z.string().regex(/^char_[a-zA-Z0-9]+$/).optional(),
112
144
  name: z.string().max(100).optional(),
113
- broll_url: z.string().url().optional(),
145
+ broll_url: z.string().url().max(MAX_URL_LENGTH).optional(),
114
146
  captions: z.boolean().default(false),
115
147
  caption_style: z.enum(CAPTION_STYLES).default("hormozi"),
116
148
  look: z.enum(LOOKS).default("natural"),
@@ -132,7 +164,7 @@ export const makeUgcInputShape = {
132
164
  // (enum порождает tools/list), voice_id — сырой вендорский id как escape hatch.
133
165
  voice: z.enum(VOICE_PRESET_NAMES).optional(),
134
166
  voice_id: z.string().regex(VOICE_ID_PATTERN).optional(),
135
- webhook_url: z.string().url().optional(),
167
+ webhook_url: z.string().url().max(MAX_URL_LENGTH).optional(),
136
168
  /**
137
169
  * Видимая плашка «сделано ИИ» поверх кадра — OPT-IN, а не обязательная.
138
170
  *
@@ -228,7 +260,15 @@ export const makeUgcInput = z
228
260
  .refine((v) => countWords(spokenTextOf(v)) <= MAX_SCRIPT_WORDS, {
229
261
  error: (issue) => {
230
262
  const wordCount = countWords(spokenTextOf(issue.input));
231
- return `script is ~${wordCount} words; ceiling is ${MAX_SCRIPT_WORDS} words (≈${MAX_SCRIPT_SECONDS}s of speech at the pacing gate)`;
263
+ /*
264
+ * ⚠️ ССЫЛКА НА «≈45s of speech at the pacing gate» СНЯТА (находка
265
+ * внешней приёмки, круг 23), и снята как ЛОЖЬ, а не как многословие.
266
+ * Гейта пейсинга не существует с 2026-07-22 — `validatePacing` не
267
+ * вызывается ниоткуда, — а число секунд агент читал как границу, хотя
268
+ * ограничены только слова. Текст ошибки на платной поверхности чинят
269
+ * перебором, и перебор по несуществующей границе стоит денег.
270
+ */
271
+ return `script is ~${wordCount} words; ceiling is ${MAX_SCRIPT_WORDS} words`;
232
272
  },
233
273
  });
234
274
  /** Склейка произносимого текста без проверок — общая база для гейтов и хелпера. */
@@ -1 +1 @@
1
- {"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { VendorRefusalClass } from "./vendor-response.js";
1
2
  /**
2
3
  * Вендор-нейтральный контракт синтеза речи.
3
4
  *
@@ -53,6 +54,9 @@ export interface TtsBackend {
53
54
  readonly name: string;
54
55
  readonly capabilities: TtsCapabilities;
55
56
  synthesize(req: SpeechRequest): Promise<SpeechResult>;
57
+ /** Тот же обязательный член, что у `RenderBackend`: контрактов два, и */
58
+ /** ElevenLabs реализует ЭТОТ. Разбор — `docs/18` §11.6. */
59
+ classifyRefusal(error: unknown): VendorRefusalClass;
56
60
  }
57
61
  /**
58
62
  * Склейка посимвольных таймингов в пословные.
@@ -1,16 +1,3 @@
1
- /**
2
- * Вендор-нейтральный контракт синтеза речи.
3
- *
4
- * ЗАЧЕМ отдельно от рендера: провайдеры TTS меняются независимо от провайдеров
5
- * аватара, и «ElevenLabs + HeyGen» — лишь одна из комбинаций.
6
- *
7
- * Ключевая причина существования этого файла — ТАЙМИНГИ. ElevenLabs отдаёт их
8
- * ПОСИМВОЛЬНО (проверено 18.07.2026: 134 символа → 134 тайминга), а этап B
9
- * ждёт пословные для `createTikTokStyleCaptions()`. Другой провайдер отдаст
10
- * пословные сразу или не отдаст вовсе. Нормализация обязана происходить в
11
- * адаптере, иначе посимвольный формат ElevenLabs протечёт в пайплайн субтитров
12
- * и намертво привяжет нас к вендору.
13
- */
14
1
  /**
15
2
  * Склейка посимвольных таймингов в пословные.
16
3
  *
@@ -1 +1 @@
1
- {"version":3,"file":"tts-backend.js","sourceRoot":"","sources":["../src/tts-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAkDH;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAChC,UAA6B,EAC7B,UAA6B,EAC7B,QAA2B;IAE3B,IAAI,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrF,MAAM,IAAI,KAAK,CACb,qCAAqC,UAAU,CAAC,MAAM,UAAU;YAC9D,GAAG,UAAU,CAAC,MAAM,YAAY,QAAQ,CAAC,MAAM,OAAO,CACzD,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,MAAM,KAAK,GAAG,GAAS,EAAE;QACvB,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YACxD,GAAG,GAAG,EAAE,CAAC;QACX,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAW,CAAC;QACnC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAClB,KAAK,EAAE,CAAC;YACR,SAAS;QACX,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,KAAK,GAAG,UAAU,CAAC,CAAC,CAAW,CAAC;QAClC,CAAC;QACD,GAAG,IAAI,EAAE,CAAC;QACV,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAW,CAAC;IAC9B,CAAC;IACD,KAAK,EAAE,CAAC;IAER,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"tts-backend.js","sourceRoot":"","sources":["../src/tts-backend.ts"],"names":[],"mappings":"AAoEA;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAChC,UAA6B,EAC7B,UAA6B,EAC7B,QAA2B;IAE3B,IAAI,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrF,MAAM,IAAI,KAAK,CACb,qCAAqC,UAAU,CAAC,MAAM,UAAU;YAC9D,GAAG,UAAU,CAAC,MAAM,YAAY,QAAQ,CAAC,MAAM,OAAO,CACzD,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,MAAM,KAAK,GAAG,GAAS,EAAE;QACvB,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YACxD,GAAG,GAAG,EAAE,CAAC;QACX,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAW,CAAC;QACnC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAClB,KAAK,EAAE,CAAC;YACR,SAAS;QACX,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,KAAK,GAAG,UAAU,CAAC,CAAC,CAAW,CAAC;QAClC,CAAC;QACD,GAAG,IAAI,EAAE,CAAC;QACV,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAW,CAAC;IAC9B,CAAC;IACD,KAAK,EAAE,CAAC;IAER,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * ЧТО УСПЕЛО СЛУЧИТЬСЯ С ПЛАТНЫМ ЗАПРОСОМ — ПРИЗНАК НА ОШИБКЕ, А НЕ ДОГАДКА ПО
3
+ * ЕЁ ТЕКСТУ (US-606a).
4
+ *
5
+ * ЗАЧЕМ ЭТО СУЩЕСТВУЕТ. Провалившийся платный вызов кончается одним из трёх, и
6
+ * различать их обязан код, а не человек, читающий лог:
7
+ *
8
+ * - платный запрос ещё НЕ УХОДИЛ (упал наш префлайт, бесплатный шаг, гард
9
+ * длины) — денег не взяли точно;
10
+ * - вендор ОТВЕТИЛ — дальше всё решает код: 4xx означает отказ без денег, а
11
+ * 2xx, которым мы не смогли воспользоваться, означает, что работу приняли и
12
+ * посчитали;
13
+ * - ОТВЕТА НЕ БЫЛО ВОВСЕ (обрыв, тайм-аут) — взяли или нет, неизвестно.
14
+ *
15
+ * Третий случай — единственная причина, по которой US-606a вообще написана.
16
+ * Свалив его в «не получилось», мы объявили бы неизвестность отсутствием траты,
17
+ * то есть соврали бы в свою пользу ровно там, где ошибка дороже всего.
18
+ *
19
+ * ПОЧЕМУ ОТСУТСТВИЕ ПРИЗНАКА ЗНАЧИТ «НЕИЗВЕСТНО», А НЕ «НЕ УХОДИЛ». Это
20
+ * fail-closed: непомеченная ошибка поднимает лишний алерт, непомеченная в
21
+ * другую сторону — прячет возможную трату. Цена первой ошибки — внимание
22
+ * владельца, цена второй — необнаруженное списание. Поэтому умолчание такое.
23
+ *
24
+ * ПОЧЕМУ РАЗБОР ТЕКСТА ОШИБКИ НЕ ГОДИТСЯ. Он завёл бы второй источник правды:
25
+ * формат сообщений адаптера и его копию в парсере. Они расходятся на первой же
26
+ * правке текста — молча, потому что парсер просто перестаёт узнавать строку.
27
+ * Тот же довод уже стоил нам одного дефекта в `SpendRefusedError`.
28
+ *
29
+ * ПОЧЕМУ В `core`, А НЕ В СЕРВИСНОМ ПАКЕТЕ. Это обязанность реализаций
30
+ * `RenderBackend` и `TtsBackend`, а оба контракта живут здесь — вместе с
31
+ * требованием различать райтраебл и нерайтраебл ошибки, которое той же природы.
32
+ * Модуль не тянет ничего: три функции над свойством объекта.
33
+ */
34
+ /**
35
+ * Что известно о судьбе платного запроса к моменту броска.
36
+ *
37
+ * `unsent` — платный запрос не уходил. `responded` — вендор ответил, и код
38
+ * ответа известен числом: флага «ответил» не хватило бы, потому что 200 и 402
39
+ * — разные события с разной ценой.
40
+ */
41
+ export type VendorDispatchFact = {
42
+ readonly kind: "unsent";
43
+ } | {
44
+ readonly kind: "responded";
45
+ readonly status: number;
46
+ };
47
+ /** Платный запрос ещё не уходил: упал префлайт, гард или бесплатный шаг. */
48
+ export declare function markVendorUnsent<E>(error: E): E;
49
+ /** Вендор ответил, и вот с каким кодом. */
50
+ export declare function markVendorResponse<E>(error: E, status: number): E;
51
+ /**
52
+ * Что известно о судьбе запроса. `undefined` — не известно НИЧЕГО, и это
53
+ * утверждение о незнании, а не об отказе.
54
+ *
55
+ * Читает и не-Error значения: в `catch` приходит `unknown`, и бросить могли что
56
+ * угодно.
57
+ */
58
+ export declare function vendorDispatchFact(error: unknown): VendorDispatchFact | undefined;
59
+ /**
60
+ * ВЕРДИКТ ВЕНДОРА О САМОЙ ЗАДАЧЕ — вторая ось, отдельная от судьбы запроса.
61
+ *
62
+ * ЗАЧЕМ ОТДЕЛЬНО ОТ `VendorDispatchFact`. Тот отвечает на вопрос «дошёл ли
63
+ * платный запрос»; этот — на вопрос «что вендор СКАЗАЛ о работе, которую уже
64
+ * принял». Оси независимы: запрос дошёл и получил 200 (первая ось довольна), а
65
+ * задача через десять минут поллинга объявлена проваленной (вторая ось — нет).
66
+ *
67
+ * ЗАЧЕМ ЭТО ВООБЩЕ ЕСТЬ. Без вердикта учёт не может отличить «мы не узнали, чем
68
+ * кончилось» от «вендор сам сказал, что провалил». Первое обязано оставаться
69
+ * незакрытым, второе — записаться: молчать о том, что знаешь, в аудиторском
70
+ * следе так же плохо, как утверждать то, чего не знаешь. Круг 2 внешней приёмки
71
+ * поймал первую ошибку, круг 3 — вторую.
72
+ *
73
+ * `succeeded` здесь означает «вендор довёл работу до конца», даже если
74
+ * воспользоваться результатом мы не смогли (пришёл `completed` без
75
+ * положительной длительности). Наша неспособность прочитать ответ — не провал
76
+ * вендора и не повод записывать его в отчёт как провал.
77
+ */
78
+ export type VendorJobVerdict = "succeeded" | "failed";
79
+ /** Помечает ошибку тем, что вендор сказал о САМОЙ задаче. */
80
+ export declare function markVendorJobVerdict<E>(error: E, verdict: VendorJobVerdict): E;
81
+ /**
82
+ * Вердикт вендора о задаче. `undefined` — вендор ничего терминального не
83
+ * сказал: оборвался поллинг, вышел срок, ответил не тот код. Это незнание, и
84
+ * закрывать по нему операцию нельзя.
85
+ */
86
+ export declare function vendorJobVerdict(error: unknown): VendorJobVerdict | undefined;
87
+ /** Чья причина за отказом вендора. `unknown` — честный ответ и ПРЕЖНЕЕ */
88
+ /** поведение (не ноль): разбор и цена обратного — `docs/18` §11.5. */
89
+ export type VendorRefusalClass = "account_standing" | "vendor" | "unknown";
90
+ /** Помечает ошибку тем, что о причине отказа сказал сам вендор. */
91
+ export declare function markVendorRefusal<E>(error: E, refusal: VendorRefusalClass): E;
92
+ /** Непомеченная ошибка — `unknown`: fail-closed здесь смотрит в прежнее поведение. */
93
+ export declare function vendorRefusalClass(error: unknown): VendorRefusalClass;
94
+ /** Пометить класс отказа ответом САМОГО адаптера. Без неё обязательный член */
95
+ /** задавал бы вендору вопрос, ответ на который никуда не едет (§11.6). */
96
+ export declare function withRefusalClass<T>(backend: {
97
+ classifyRefusal(error: unknown): VendorRefusalClass;
98
+ }, call: () => Promise<T>): Promise<T>;
@@ -0,0 +1,152 @@
1
+ /**
2
+ * ЧТО УСПЕЛО СЛУЧИТЬСЯ С ПЛАТНЫМ ЗАПРОСОМ — ПРИЗНАК НА ОШИБКЕ, А НЕ ДОГАДКА ПО
3
+ * ЕЁ ТЕКСТУ (US-606a).
4
+ *
5
+ * ЗАЧЕМ ЭТО СУЩЕСТВУЕТ. Провалившийся платный вызов кончается одним из трёх, и
6
+ * различать их обязан код, а не человек, читающий лог:
7
+ *
8
+ * - платный запрос ещё НЕ УХОДИЛ (упал наш префлайт, бесплатный шаг, гард
9
+ * длины) — денег не взяли точно;
10
+ * - вендор ОТВЕТИЛ — дальше всё решает код: 4xx означает отказ без денег, а
11
+ * 2xx, которым мы не смогли воспользоваться, означает, что работу приняли и
12
+ * посчитали;
13
+ * - ОТВЕТА НЕ БЫЛО ВОВСЕ (обрыв, тайм-аут) — взяли или нет, неизвестно.
14
+ *
15
+ * Третий случай — единственная причина, по которой US-606a вообще написана.
16
+ * Свалив его в «не получилось», мы объявили бы неизвестность отсутствием траты,
17
+ * то есть соврали бы в свою пользу ровно там, где ошибка дороже всего.
18
+ *
19
+ * ПОЧЕМУ ОТСУТСТВИЕ ПРИЗНАКА ЗНАЧИТ «НЕИЗВЕСТНО», А НЕ «НЕ УХОДИЛ». Это
20
+ * fail-closed: непомеченная ошибка поднимает лишний алерт, непомеченная в
21
+ * другую сторону — прячет возможную трату. Цена первой ошибки — внимание
22
+ * владельца, цена второй — необнаруженное списание. Поэтому умолчание такое.
23
+ *
24
+ * ПОЧЕМУ РАЗБОР ТЕКСТА ОШИБКИ НЕ ГОДИТСЯ. Он завёл бы второй источник правды:
25
+ * формат сообщений адаптера и его копию в парсере. Они расходятся на первой же
26
+ * правке текста — молча, потому что парсер просто перестаёт узнавать строку.
27
+ * Тот же довод уже стоил нам одного дефекта в `SpendRefusedError`.
28
+ *
29
+ * ПОЧЕМУ В `core`, А НЕ В СЕРВИСНОМ ПАКЕТЕ. Это обязанность реализаций
30
+ * `RenderBackend` и `TtsBackend`, а оба контракта живут здесь — вместе с
31
+ * требованием различать райтраебл и нерайтраебл ошибки, которое той же природы.
32
+ * Модуль не тянет ничего: три функции над свойством объекта.
33
+ */
34
+ /**
35
+ * Имя свойства. Намеренно длинное и с префиксом проекта: свойство садится на
36
+ * чужие объекты ошибок, и короткое имя вроде `status` затёрло бы поле, которое
37
+ * туда положил кто-то другой.
38
+ */
39
+ const VENDOR_DISPATCH_FACT = "clipwrightVendorDispatchFact";
40
+ /**
41
+ * Общая запись признака. Неперечислимо: ошибки уезжают в логи и в `runs.error`,
42
+ * и лишний ключ в их сериализации — шум, за который никто не просил.
43
+ *
44
+ * НА ПРИМИТИВЕ — НИЧЕГО НЕ ДЕЛАЕТ, И ЭТО НАЗВАННОЕ СВОЙСТВО, А НЕ НЕДОСМОТР:
45
+ * `throw "строка"` пометить нечем, и такая ошибка попадёт в `unknown`. Это
46
+ * сторона fail-closed (лишний алерт, а не потерянная трата), поэтому терпимо.
47
+ */
48
+ function mark(error, fact) {
49
+ if (typeof error !== "object" || error === null) {
50
+ return error;
51
+ }
52
+ Object.defineProperty(error, VENDOR_DISPATCH_FACT, {
53
+ value: fact,
54
+ enumerable: false,
55
+ writable: false,
56
+ // `configurable`, чтобы повторная пометка не бросала TypeError: ошибка
57
+ // проходит несколько уровней адаптера, и внешний слой вправе уточнить факт.
58
+ configurable: true,
59
+ });
60
+ return error;
61
+ }
62
+ /** Платный запрос ещё не уходил: упал префлайт, гард или бесплатный шаг. */
63
+ export function markVendorUnsent(error) {
64
+ return mark(error, { kind: "unsent" });
65
+ }
66
+ /** Вендор ответил, и вот с каким кодом. */
67
+ export function markVendorResponse(error, status) {
68
+ return mark(error, { kind: "responded", status });
69
+ }
70
+ /**
71
+ * Что известно о судьбе запроса. `undefined` — не известно НИЧЕГО, и это
72
+ * утверждение о незнании, а не об отказе.
73
+ *
74
+ * Читает и не-Error значения: в `catch` приходит `unknown`, и бросить могли что
75
+ * угодно.
76
+ */
77
+ export function vendorDispatchFact(error) {
78
+ if (typeof error !== "object" || error === null) {
79
+ return undefined;
80
+ }
81
+ const value = error[VENDOR_DISPATCH_FACT];
82
+ if (typeof value !== "object" || value === null) {
83
+ return undefined;
84
+ }
85
+ const fact = value;
86
+ if (fact.kind === "unsent") {
87
+ return { kind: "unsent" };
88
+ }
89
+ if (fact.kind === "responded" && typeof fact.status === "number") {
90
+ return { kind: "responded", status: fact.status };
91
+ }
92
+ return undefined;
93
+ }
94
+ const VENDOR_JOB_VERDICT = "clipwrightVendorJobVerdict";
95
+ /** Помечает ошибку тем, что вендор сказал о САМОЙ задаче. */
96
+ export function markVendorJobVerdict(error, verdict) {
97
+ if (typeof error !== "object" || error === null) {
98
+ return error;
99
+ }
100
+ Object.defineProperty(error, VENDOR_JOB_VERDICT, {
101
+ value: verdict,
102
+ enumerable: false,
103
+ writable: false,
104
+ configurable: true,
105
+ });
106
+ return error;
107
+ }
108
+ /**
109
+ * Вердикт вендора о задаче. `undefined` — вендор ничего терминального не
110
+ * сказал: оборвался поллинг, вышел срок, ответил не тот код. Это незнание, и
111
+ * закрывать по нему операцию нельзя.
112
+ */
113
+ export function vendorJobVerdict(error) {
114
+ if (typeof error !== "object" || error === null) {
115
+ return undefined;
116
+ }
117
+ const value = error[VENDOR_JOB_VERDICT];
118
+ return value === "succeeded" || value === "failed" ? value : undefined;
119
+ }
120
+ const VENDOR_REFUSAL_CLASS = "clipwrightVendorRefusalClass";
121
+ /** Помечает ошибку тем, что о причине отказа сказал сам вендор. */
122
+ export function markVendorRefusal(error, refusal) {
123
+ if (typeof error !== "object" || error === null) {
124
+ return error;
125
+ }
126
+ Object.defineProperty(error, VENDOR_REFUSAL_CLASS, {
127
+ value: refusal,
128
+ enumerable: false,
129
+ writable: false,
130
+ configurable: true,
131
+ });
132
+ return error;
133
+ }
134
+ /** Непомеченная ошибка — `unknown`: fail-closed здесь смотрит в прежнее поведение. */
135
+ export function vendorRefusalClass(error) {
136
+ if (typeof error !== "object" || error === null) {
137
+ return "unknown";
138
+ }
139
+ const value = error[VENDOR_REFUSAL_CLASS];
140
+ return value === "account_standing" || value === "vendor" ? value : "unknown";
141
+ }
142
+ /** Пометить класс отказа ответом САМОГО адаптера. Без неё обязательный член */
143
+ /** задавал бы вендору вопрос, ответ на который никуда не едет (§11.6). */
144
+ export async function withRefusalClass(backend, call) {
145
+ try {
146
+ return await call();
147
+ }
148
+ catch (error) {
149
+ throw markVendorRefusal(error, backend.classifyRefusal(error));
150
+ }
151
+ }
152
+ //# sourceMappingURL=vendor-response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vendor-response.js","sourceRoot":"","sources":["../src/vendor-response.ts"],"names":[],"mappings":"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"}
package/dist/voices.d.ts CHANGED
@@ -1,19 +1,6 @@
1
- /**
2
- * Каталог голосовых пресетов — НАШИ имена + метадата, БЕЗ вендорских id.
3
- *
4
- * ЗАЧЕМ имена здесь, а id в адаптере (условие плана R4-b, принцип 5):
5
- * `VOICE_PRESET_NAMES` порождает `z.enum` во входе `make_ugc` (`makeUgcInputShape`),
6
- * а он, в свою очередь, — `tools/list`/OpenAPI/типы SDK. Значит имена ОБЯЗАНЫ жить
7
- * в core. Вендорские ElevenLabs-id — платный секрет вендора и живут ровно в одном
8
- * месте — адаптере воркера (`PRESET_TO_VOICE_ID`, US-514); в core их нет ни одного,
9
- * иначе поверхность ключа расширилась бы (был инцидент 6fbe5b6). Расщепление
10
- * «имя в core / id в адаптере» вынуждено этими двумя инвариантами.
11
- *
12
- * ПОЧЕМУ у `owner_ru_clone` нет `gender`: это клон голоса владельца, и у вендора
13
- * для него нет лейбла гендера. Выдумывать метадату за вендора нельзя (принцип
14
- * «мы не должны выдумывать», условие §6) — отсутствие поля само по себе значимо
15
- * и участвует в precedence-логике verify-voices (US-520) и warnings (US-517).
16
- */
1
+ import { z } from "zod";
2
+ /** Каталог голосовых пресетов — НАШИ имена и метадата, БЕЗ вендорских id: имена */
3
+ /** порождают `tools/list` и типы SDK, id живут только в адаптере воркера. */
17
4
  export interface VoicePreset {
18
5
  /** Язык голоса в терминах BCP-47-подобного короткого кода (ru/en). */
19
6
  language: string;
@@ -61,6 +48,42 @@ export declare const VOICE_PRESETS: {
61
48
  */
62
49
  export declare const VOICE_PRESET_NAMES: [keyof typeof VOICE_PRESETS, ...(keyof typeof VOICE_PRESETS)[]];
63
50
  export type VoicePresetName = keyof typeof VOICE_PRESETS;
51
+ /** Ответ `/v1/voices` — схема, а не догадка обеих сторон. Сервер отдаёт разобранное */
52
+ /** ею тело, SDK разбирает им же: `Array.isArray` пропускал массив чего угодно. */
53
+ export declare const voiceCatalogEntry: z.ZodObject<{
54
+ name: z.ZodEnum<{
55
+ daria_ru_female: "daria_ru_female";
56
+ eric: "eric";
57
+ george: "george";
58
+ owner_ru_clone: "owner_ru_clone";
59
+ sarah: "sarah";
60
+ }>;
61
+ language: z.ZodString;
62
+ gender: z.ZodOptional<z.ZodEnum<{
63
+ female: "female";
64
+ male: "male";
65
+ }>>;
66
+ description: z.ZodString;
67
+ }, z.core.$strip>;
68
+ export type VoiceCatalogEntry = z.infer<typeof voiceCatalogEntry>;
69
+ export declare const voicesResponse: z.ZodObject<{
70
+ voices: z.ZodArray<z.ZodObject<{
71
+ name: z.ZodEnum<{
72
+ daria_ru_female: "daria_ru_female";
73
+ eric: "eric";
74
+ george: "george";
75
+ owner_ru_clone: "owner_ru_clone";
76
+ sarah: "sarah";
77
+ }>;
78
+ language: z.ZodString;
79
+ gender: z.ZodOptional<z.ZodEnum<{
80
+ female: "female";
81
+ male: "male";
82
+ }>>;
83
+ description: z.ZodString;
84
+ }, z.core.$strip>>;
85
+ }, z.core.$strip>;
86
+ export type VoicesResponse = z.infer<typeof voicesResponse>;
64
87
  /**
65
88
  * Дефолт под текущий аватар (look-01 «warm storyteller»): `george` —
66
89
  * британский повествовательный голос, семантически совпадает с образом.
@@ -104,8 +127,8 @@ export type VoiceSelection = {
104
127
  * отличать явный выбор от умолчания (warnings US-517).
105
128
  */
106
129
  export declare function resolveVoiceSelection(input: {
107
- voice?: VoicePresetName;
108
- voice_id?: string;
130
+ voice?: VoicePresetName | undefined;
131
+ voice_id?: string | undefined;
109
132
  }): VoiceSelection;
110
133
  /**
111
134
  * Семейство письменности скрипта — грубый детектор для языкового warning'а
@@ -122,14 +145,7 @@ export declare function resolveVoiceSelection(input: {
122
145
  */
123
146
  export declare const SCRIPT_DOMINANCE_THRESHOLD = 0.6;
124
147
  export declare function detectScriptFamily(script: string): "cyrillic" | "latin" | "neutral";
125
- /**
126
- * Warning отложенной проверки сырого voice_id на ПУТИ QUOTE (US-517). На quote
127
- * префлайта ещё нет (он бесплатный, но живёт в воркере, US-515), поэтому честно
128
- * сообщаем: существование id сверяется со счётом на СТАРТЕ рана, не сейчас. На
129
- * пути рана этот warning НЕ выдаётся — там префлайт уже отработал и, если каталог
130
- * неполон, добавит собственный `VOICE_CATALOG_INCOMPLETE_WARNING` (воркер зовёт
131
- * buildVoiceWarnings без voice_id, чтобы эти два не дублировали друг друга).
132
- */
148
+ /** Только путь QUOTE (US-517); почему не на пути рана — docs/18, Д41. */
133
149
  export declare const RAW_VOICE_ID_VALIDATION_WARNING = "raw voice_id is verified against your account at run start, not at quote time";
134
150
  /**
135
151
  * Голосовые warnings по ТЕСТУ ДОПУСТИМОСТИ (план §Р3). Warning допустим, только
package/dist/voices.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { z } from "zod";
1
2
  /**
2
3
  * Стартовый набор из 5 пресетов (условие плана §4). Порядок значим только для
3
4
  * презентации; дефолт задаётся отдельно через `DEFAULT_VOICE_PRESET`.
@@ -33,6 +34,15 @@ export const VOICE_PRESETS = {
33
34
  * список имён и метадата не разъехались (правило проекта №2 — не дублировать).
34
35
  */
35
36
  export const VOICE_PRESET_NAMES = Object.keys(VOICE_PRESETS);
37
+ /** Ответ `/v1/voices` — схема, а не догадка обеих сторон. Сервер отдаёт разобранное */
38
+ /** ею тело, SDK разбирает им же: `Array.isArray` пропускал массив чего угодно. */
39
+ export const voiceCatalogEntry = z.object({
40
+ name: z.enum(VOICE_PRESET_NAMES),
41
+ language: z.string().min(1),
42
+ gender: z.enum(["female", "male"]).optional(),
43
+ description: z.string().min(1),
44
+ });
45
+ export const voicesResponse = z.object({ voices: z.array(voiceCatalogEntry) });
36
46
  /**
37
47
  * Дефолт под текущий аватар (look-01 «warm storyteller»): `george` —
38
48
  * британский повествовательный голос, семантически совпадает с образом.
@@ -119,14 +129,7 @@ const LANGUAGE_TO_SCRIPT_FAMILY = {
119
129
  ru: "cyrillic",
120
130
  en: "latin",
121
131
  };
122
- /**
123
- * Warning отложенной проверки сырого voice_id на ПУТИ QUOTE (US-517). На quote
124
- * префлайта ещё нет (он бесплатный, но живёт в воркере, US-515), поэтому честно
125
- * сообщаем: существование id сверяется со счётом на СТАРТЕ рана, не сейчас. На
126
- * пути рана этот warning НЕ выдаётся — там префлайт уже отработал и, если каталог
127
- * неполон, добавит собственный `VOICE_CATALOG_INCOMPLETE_WARNING` (воркер зовёт
128
- * buildVoiceWarnings без voice_id, чтобы эти два не дублировали друг друга).
129
- */
132
+ /** Только путь QUOTE (US-517); почему не на пути рана — docs/18, Д41. */
130
133
  export const RAW_VOICE_ID_VALIDATION_WARNING = "raw voice_id is verified against your account at run start, not at quote time";
131
134
  /**
132
135
  * Голосовые warnings по ТЕСТУ ДОПУСТИМОСТИ (план §Р3). Warning допустим, только
@@ -1 +1 @@
1
- {"version":3,"file":"voices.js","sourceRoot":"","sources":["../src/voices.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"voices.js","sourceRoot":"","sources":["../src/voices.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@clipwright/core",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "Zod schemas and the shared request/response contract of the Clipwright UGC video API",
5
5
  "license": "MIT",
6
- "author": "Dimantika LLC",
6
+ "author": "Dimantika Sp. z o.o.",
7
7
  "homepage": "https://clipwright.io",
8
8
  "type": "module",
9
9
  "publishConfig": {