@clipwright/sdk 0.18.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.
package/CHANGELOG.md CHANGED
@@ -16,6 +16,50 @@ a customer reading it should not miss what appeared in the product. Like *Server
16
16
  they are live from the day the web app was deployed, not from the package release they are
17
17
  listed under.
18
18
 
19
+ ## [0.20.0] - 2026-09-25
20
+
21
+ The MCP server is ready for directories: it has a name in the official MCP
22
+ Registry, and every tool tells the host whether it only reads or writes.
23
+
24
+ ### Added
25
+
26
+ - Every MCP tool now carries a `title` and the `readOnlyHint`/`destructiveHint`
27
+ annotations: quotes, lists and reads are read-only, `delete_actor` is
28
+ destructive, and `make_ugc`, `create_actor`, `upload_image` and
29
+ `set_actor_defaults` write.
30
+ - `@clipwright/mcp-server` declares `mcpName: io.clipwright/mcp` for the official
31
+ MCP Registry.
32
+
33
+ ## [0.19.0] - 2026-09-22
34
+
35
+ A paid video that arrived after we stopped waiting can now be collected: the run
36
+ goes back to `queued` and drives the pipeline again. The server side was live
37
+ from the day it was deployed; this release carries the contract change to the
38
+ MCP tool description, which is where an agent reads the promise.
39
+
40
+ ### Changed
41
+
42
+ - **Breaking:** `failed` is no longer always final. A run whose paid vendor job
43
+ we still hold can be reopened: it goes back to `queued` and may reach
44
+ `succeeded`. Every reopening is named in `warnings[]`, and one run is reopened
45
+ at most three times. An agent that stops polling the moment it reads `failed`
46
+ will miss a video that was paid for and delivered.
47
+ - *Server-side* A run that lost the video while the vendor was still working on
48
+ it no longer says its paid job "was retained for recovery" when this run's
49
+ terms cannot support recovery. Reading the terms fails soft: when they cannot
50
+ be read at all, the run promises nothing either way.
51
+ - *Server-side* A recovered delivery is written to the ledger under its own
52
+ reason, `run_recovered_delivery`, because the vendor spend was already counted
53
+ on the day the run first failed.
54
+
55
+ ### Operations
56
+
57
+ - Migration 0036 adds `recovery_attempt` and `recovery_reopened_at` to `runs`,
58
+ and both are read on the main render path. **Apply the migration before
59
+ deploying any service**: an early deploy fails every `make_ugc` run, not one
60
+ feature. Order forward is migration, api, worker, web; backwards it is worker
61
+ and api first, then drop the columns.
62
+
19
63
  ## [0.18.0] - 2026-09-21
20
64
 
21
65
  Long-form clips can now show a face for a fifth of their length instead of nearly
package/dist/client-id.js CHANGED
@@ -2,22 +2,9 @@ import { randomUUID } from "node:crypto";
2
2
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
3
3
  import { homedir } from "node:os";
4
4
  import { join } from "node:path";
5
- /**
6
- * Устойчивая идентичность УСТАНОВКИ клиента — префикс ключа идемпотентности.
7
- *
8
- * ЗАЧЕМ ЭТО ВООБЩЕ СУЩЕСТВУЕТ (C1): ключ идемпотентности склеивается из хеша
9
- * входа И идентичности клиента. Хеш входа один и тот же на любой машине, поэтому
10
- * без стабильного per-установка `clientId` дедупликация повторного `POST /run`
11
- * либо не работает между перезапусками процесса, либо, наоборот, схлопывает
12
- * раны разных пользователей. Одна установка = одна идентичность = один денежный
13
- * контур дедупа.
14
- *
15
- * ПОЧЕМУ ПАДЕНИЕ, А НЕ ЭФЕМЕРНЫЙ id ПРИ ОШИБКЕ ФС: тихий фолбэк на случайный
16
- * id при каждом запуске ВЫКЛЮЧАЕТ C1 целиком (каждый старт — новый клиент →
17
- * дедуп мёртв → повторный рендер за деньги). Лучше громко потребовать выставить
18
- * `CLIPWRIGHT_CLIENT_ID`, чем молча жечь кредиты.
19
- */
20
- /** Приоритетный источник — явный env: не читает и не пишет файл вовсе. */
5
+ /** Stable per-install identity that prefixes the idempotency key, so retries */
6
+ /** deduplicate across restarts without merging different users' runs. */
7
+ /** An explicit env value wins and skips the file entirely. */
21
8
  const ENV_VAR = "CLIPWRIGHT_CLIENT_ID";
22
9
  export function resolveClientId() {
23
10
  const fromEnv = process.env[ENV_VAR];
@@ -33,16 +20,16 @@ export function resolveClientId() {
33
20
  return existing;
34
21
  }
35
22
  }
36
- // Первый запуск на этой установке: рождаем стабильный id и закрепляем его
37
- // на диске. UUID без дефисов — компактнее в заголовке Idempotency-Key.
23
+ // First run on this install: persist a stable id. Dashless UUID keeps the
24
+ // Idempotency-Key header short.
38
25
  const id = randomUUID().replace(/-/g, "");
39
26
  mkdirSync(dir, { recursive: true });
40
27
  writeFileSync(file, id, "utf8");
41
28
  return id;
42
29
  }
43
30
  catch (cause) {
44
- // ЛЮБАЯ невозможность прочитать/создать файл (read-only HOME в чужом хосте,
45
- // нет прав) — это НЕ повод на тихий эфемерный id (см. заголовок модуля).
31
+ // No silent ephemeral id: a fresh id per start disables dedup and turns
32
+ // every retry into a second paid render.
46
33
  throw new Error(`Cannot read or create ~/.clipwright/client-id. Set the ${ENV_VAR} ` +
47
34
  `environment variable to a stable per-install identifier so idempotent ` +
48
35
  `retries deduplicate instead of billing twice.`, { cause });
@@ -1 +1 @@
1
- {"version":3,"file":"client-id.js","sourceRoot":"","sources":["../src/client-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;;;;;;;;;;;;GAcG;AAEH,0EAA0E;AAC1E,MAAM,OAAO,GAAG,sBAAsB,CAAC;AAEvC,MAAM,UAAU,eAAe;IAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvD,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAEpC,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YACnD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAED,0EAA0E;QAC1E,uEAAuE;QACvE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1C,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,aAAa,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QAChC,OAAO,EAAE,CAAC;IACZ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,4EAA4E;QAC5E,yEAAyE;QACzE,MAAM,IAAI,KAAK,CACb,0DAA0D,OAAO,GAAG;YAClE,wEAAwE;YACxE,+CAA+C,EACjD,EAAE,KAAK,EAAE,CACV,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"client-id.js","sourceRoot":"","sources":["../src/client-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,gFAAgF;AAChF,yEAAyE;AAEzE,8DAA8D;AAC9D,MAAM,OAAO,GAAG,sBAAsB,CAAC;AAEvC,MAAM,UAAU,eAAe;IAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvD,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAEpC,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YACnD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAED,0EAA0E;QAC1E,gCAAgC;QAChC,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1C,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,aAAa,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QAChC,OAAO,EAAE,CAAC;IACZ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,wEAAwE;QACxE,yCAAyC;QACzC,MAAM,IAAI,KAAK,CACb,0DAA0D,OAAO,GAAG;YAClE,wEAAwE;YACxE,+CAA+C,EACjD,EAAE,KAAK,EAAE,CACV,CAAC;IACJ,CAAC;AACH,CAAC"}
package/dist/index.d.ts CHANGED
@@ -2,131 +2,86 @@ import { type Account, type ActorDefaults, type ActorDefaultsInput, type ActorCa
2
2
  export interface ClipwrightClientOptions {
3
3
  apiKey: string;
4
4
  baseUrl?: string | undefined;
5
- /** Интервал поллинга статуса рана, мс. */
5
+ /** Run status polling interval, ms. */
6
6
  pollIntervalMs?: number | undefined;
7
- /** Срок ОДНОГО запроса, мс (дефолт 30_000). Не путать с `maxWaitMs`: тот */
8
- /** ограничивает весь `makeUgc`, этот — каждое обращение по отдельности. */
7
+ /** Timeout of ONE request, ms (default 30_000). `maxWaitMs` bounds the */
8
+ /** whole `makeUgc`; this bounds each call separately. */
9
9
  requestTimeoutMs?: number | undefined;
10
10
  }
11
- /** Опции старта рана. `attempt` даёт суффикс `:N`; явный ключ его перекрывает. */
11
+ /** Run start options. `attempt` sets the `:N` suffix; an explicit key overrides it. */
12
12
  export interface StartUgcOptions {
13
- /** Номер попытки (дефолт 1) → суффикс `:N` у ключа идемпотентности. */
13
+ /** Attempt number (default 1) → `:N` suffix of the idempotency key. */
14
14
  attempt?: number | undefined;
15
- /** Явный ключ «намеренно новый ран» — перекрывает вычисленный. */
15
+ /** Explicit key for an intentionally new run; overrides the computed one. */
16
16
  idempotencyKey?: string | undefined;
17
17
  }
18
- /** Опции синхронного `makeUgc`: проброс `attempt` + дедлайн поллинга. */
18
+ /** Options of the blocking `makeUgc`: `attempt` plus a polling deadline. */
19
19
  export interface MakeUgcOptions {
20
20
  attempt?: number | undefined;
21
- /** Дедлайн ожидания терминального состояния, мс (дефолт 10 мин). */
21
+ /** Deadline for reaching a terminal state, ms (default 10 min). */
22
22
  maxWaitMs?: number | undefined;
23
23
  }
24
- /**
25
- * ОТВЕТ СЕРВЕРА НЕ РАЗОБРАЛСЯ — ЭТО НЕ ТО ЖЕ, ЧТО ОТКАЗ ВВОДА (US-622).
26
- *
27
- * Обе беды приходят из zod и до этого класса были неотличимы снаружи: и
28
- * `makeUgcInput.parse` на входе, и `run.parse` на ответе бросали `ZodError`.
29
- * Внешнее ревью (круг 9) показало цену этой неразличимости. CLI печатал любую
30
- * такую ошибку как «запрос отвергнут ДО отправки» — а на битом ответе `POST
31
- * /run` это ложь в самую дорогую сторону: запрос ушёл, ран создан и, возможно,
32
- * уже оплачен, но человеку сказано, что ничего не произошло, и `run_id` он не
33
- * получил.
34
- *
35
- * Поэтому провал разбора ОТВЕТА получает собственный класс и собственный текст,
36
- * который прямо называет, мог ли вызов иметь последствия.
37
- */
24
+ /** An unparseable server response, distinct from rejected input: after */
25
+ /** `POST /run` the run may already exist and be charged. */
38
26
  export declare class ClipwrightResponseError extends Error {
39
27
  #private;
40
- /** Путь, ответ которого не разобрался. */
28
+ /** Path whose response failed to parse. */
41
29
  readonly path: string;
42
- /** Мог ли запрос уже что-то изменить (создать ран, потратить деньги). */
30
+ /** Whether the request may already have changed state (created a run, spent credits). */
43
31
  readonly mayHaveTakenEffect: boolean;
44
- /**
45
- * ПОДТВЕРЖДЕНА ли доставка запроса. Имя выбрано точно (внешнее ревью, круг 12):
46
- * прежнее `delivered` читалось как «не доставлено», хотя `false` означает лишь
47
- * ОТСУТСТВИЕ ПОДТВЕРЖДЕНИЯ. Отличить «не дошло» от «дошло, а ответ потерян»
48
- * у HTTP способа нет, и потребитель, прочитавший поле как отрицание, запустил
49
- * бы `attempt: 2` и оплатил второй рендер.
50
- */
32
+ /** `false` means delivery is unconfirmed, not that it failed: HTTP cannot */
33
+ /** tell a lost request from a lost response. */
51
34
  readonly deliveryConfirmed: boolean;
52
35
  constructor(path: string, mayHaveTakenEffect: boolean, cause: unknown, deliveryConfirmed?: boolean);
53
36
  }
54
- /** Один пресет каталога `/v1/voices` — ВЫВЕДЕН из схемы ответа, а не написан */
55
- /** рядом с ней: две формы одного тела расходились бы молча (правило №2). */
37
+ /** One `/v1/voices` preset, derived from the response schema so the two */
38
+ /** shapes cannot drift apart. */
56
39
  export type VoiceCatalogEntry = CoreVoiceCatalogEntry;
57
- /**
58
- * ОТКАЗ API, ДОЕХАВШИЙ ДО ВЫЗЫВАТЕЛЯ ЦЕЛИКОМ (US-622).
59
- *
60
- * ЧТО БЫЛО ДО. `#request` сводил любой не-2xx к `new Error(message)`: статус,
61
- * код и назначенная сервером пауза терялись на границе SDK. Вызыватель мог
62
- * только напечатать текст — отличить «подожди две секунды» от «пополни счёт»
63
- * было нечем, и поллинг умирал на первом же 429.
64
- *
65
- * ЧЕГО ЗДЕСЬ НАМЕРЕННО НЕТ — СВОЕЙ ФОРМЫ ОТКАЗА. Класс не объявляет ни кодов,
66
- * ни полей с числами: всё это лежит в `ApiFailure` из `@clipwright/core`, и
67
- * `code`/`report()` выводятся оттуда же (правило проекта №2). Объяви SDK свою
68
- * копию — и MCP с CLI получили бы вторую, а «повторять или нет» стало бы
69
- * вопросом, на который три поверхности отвечают порознь.
70
- */
40
+ /** An API refusal with status, code and server-set pause intact. The shape */
41
+ /** comes from core, so SDK, CLI and MCP answer "retry or not" identically. */
71
42
  export declare class ClipwrightApiError extends Error {
72
- /** Разобранный отказ: вид, числа, пауза. Форма — из core. */
43
+ /** Parsed refusal: kind, numbers, pause. Shape comes from core. */
73
44
  readonly failure: ApiFailure;
74
45
  readonly status: number;
75
- /** Код отказа. Для чужих тел без кода — `http_<status>`. */
46
+ /** Refusal code; `http_<status>` for foreign bodies without one. */
76
47
  readonly code: string;
77
- /** Пауза в секундах, назначенная сервером. `undefined` — он её не назвал. */
48
+ /** Server-set pause in seconds; `undefined` if the server named none. */
78
49
  readonly retryAfterSeconds: number | undefined;
79
50
  constructor(failure: ApiFailure);
80
- /** Имеет ли смысл повторить тот же вызов. Решает core, а не эта поверхность. */
51
+ /** Whether repeating the same call makes sense. Core decides, not this surface. */
81
52
  get retryable(): boolean;
82
- /** Отказ, развёрнутый для агента: числа, императив, признак повтора. */
53
+ /** The refusal expanded for an agent: numbers, instruction, retry flag. */
83
54
  report(): AgentFailureReport;
84
55
  }
85
56
  export declare class ClipwrightClient {
86
57
  #private;
87
58
  constructor(opts: ClipwrightClientOptions);
88
- /** Оценка стоимости без списания кредитов. */
59
+ /** Cost estimate; spends no credits. */
89
60
  quoteUgc(input: MakeUgcInputArgs): Promise<QuoteResponse>;
90
- /**
91
- * Запуск генерации; возвращает ран сразу (state=queued).
92
- *
93
- * Ключ идемпотентности формируется ЗДЕСЬ, а не на вызывающей поверхности:
94
- * суффикс `:N` (по `attempt`, дефолт 1) пишется ВСЕГДА, иначе MCP дал бы
95
- * `<hash>`, а CLI `<hash>:1` — межповерхностный шов, в котором дедуп ломается.
96
- */
61
+ /** Starts a render and returns the run at once (state=queued). The key is built */
62
+ /** here with an always-present `:N` suffix, so MCP and CLI dedupe alike. */
97
63
  startUgc(input: MakeUgcInputArgs, opts?: StartUgcOptions): Promise<Run>;
98
- /**
99
- * Курируемый каталог голосов для `voice`/`voice_id` (US-516). Отдаёт то же,
100
- * что и `/v1/voices` — статический список из @clipwright/core, БЕЗ вендорских
101
- * id (они не покидают адаптер воркера). Каталог курируемый по дизайну: это
102
- * не полный список голосов вендора — остальные достижимы сырым `voice_id`.
103
- */
64
+ /** Uploads an image; returns its reference for later runs. */
104
65
  uploadImage(bytes: Uint8Array<ArrayBuffer>, mediaType: UploadMediaType): Promise<UploadResponse>;
66
+ /** Curated voice catalog for `voice`/`voice_id`; other voices stay reachable by raw `voice_id`. */
105
67
  listVoices(filters?: VoicesQuery): Promise<VoiceCatalogEntry[]>;
106
- /** Состояние счёта — `GET /v1/account` (clipwright#135). Бесплатно. */
68
+ /** Account state via `GET /v1/account`. Free. */
107
69
  getAccount(): Promise<Account>;
108
70
  listActors(): Promise<ActorCatalogEntry[]>;
109
71
  getActorDefaults(id: string): Promise<ActorDefaults>;
110
72
  setActorDefaults(id: string, input: ActorDefaultsInput): Promise<ActorDefaults>;
111
- /** Оценка `create_actor` без списания кредитов (clipwright#120). */
73
+ /** `create_actor` estimate; spends no credits. */
112
74
  quoteActor(input: CreateActorInputArgs): Promise<CreateActorQuote>;
113
- /** Запуск `create_actor`: ран возвращается сразу (state=queued), как у `startUgc`. */
114
- /** Ключ строится СВОЕЙ схемой — разбор `make_ugc` срезал бы поля актёра. */
75
+ /** Starts `create_actor`; returns the run at once (state=queued), like `startUgc`. */
76
+ /** The key uses its own schema: the `make_ugc` one would strip actor fields. */
115
77
  createActor(input: CreateActorInputArgs, opts?: StartUgcOptions): Promise<Run>;
116
- /** Удаление личного актёра. Ответ 204 без тела, поэтому разбирать нечего. */
78
+ /** Deletes a personal actor. The answer is 204 with no body. */
117
79
  deleteActor(id: string): Promise<void>;
118
- /**
119
- * Чтение рана в ТОЛЕРАНТНОЙ проекции (`runRead`, `state: string`): сервер мог
120
- * добавить стадию, которой не знает установленный SDK (docs/12:198). Поэтому
121
- * `safeParse` с деградацией к сырому телу вместо строгого `run.parse` — иначе
122
- * неизвестная стадия уронила бы `getRun` у каждого уже установленного MCP.
123
- * Тип возврата — `RunRead` (`state: string`), а НЕ узкий `Run` (условие
124
- * Architect №3): иначе `isTerminal(state)` не типчекнулся бы и потребители
125
- * приняли бы `state` за закрытый enum.
126
- */
80
+ /** Reads a run tolerantly (`state: string`): a newer server stage must not */
81
+ /** break installed clients, so parsing falls back to the raw body. */
127
82
  getRun(runId: string): Promise<RunRead>;
128
- /** Запуск + поллинг до терминального состояния. `attempt` пробрасывается внутрь, */
129
- /** `maxWaitMs` — дедлайн, обрывающий и паузу, и сам запрос. */
83
+ /** Start plus polling to a terminal state. `maxWaitMs` is one deadline that */
84
+ /** aborts both the pause and the request itself. */
130
85
  makeUgc(input: MakeUgcInputArgs, opts?: MakeUgcOptions, onProgress?: (run: RunRead) => void): Promise<RunRead>;
131
86
  }
132
87
  export { resolveClientId } from "./client-id.js";
package/dist/index.js CHANGED
@@ -1,43 +1,18 @@
1
1
  import { account as accountSchema, ACTORS_PATH, actorDefaults, actorDefaultsPath, actorItemPath, actorsResponse, CREATE_ACTOR_QUOTE_PATH, CREATE_ACTOR_RUN_PATH, createActorQuote, agentFailureReport, isRetryableFailure, parseApiFailure, PUBLIC_API_BASE_URL, retryDelayMs, run as runSchema, runRead as runReadSchema, isTerminal, FAILED_STATE, quoteResponse, RETRY_AFTER_HEADER, UPLOADS_PATH, uploadResponse, voicesResponse, } from "@clipwright/core";
2
2
  import { actorIdempotencyKeyFor, idempotencyKeyFor } from "@clipwright/core/idempotency";
3
3
  import { resolveClientId } from "./client-id.js";
4
- /**
5
- * Прод-API по умолчанию: SDK «просто работает» без явного baseUrl.
6
- *
7
- * Значение приезжает из `@clipwright/core` (US-614): тот же адрес печатает
8
- * лендинг в копируемой команде `curl`, и два литерала разошлись бы так, что
9
- * заметил бы это посетитель. Разбор — у самой константы.
10
- */
4
+ /** Production API by default; shared with core so every surface names one address. */
11
5
  const DEFAULT_BASE_URL = PUBLIC_API_BASE_URL;
12
- /** Дефолтный дедлайн поллинга: ≥5× над проекцией рендера (~113 с, docs/13). */
6
+ /** Default polling deadline: several times the expected render time. */
13
7
  const DEFAULT_MAX_WAIT_MS = 600_000;
14
- /** Срок одного запроса по умолчанию. У `fetch` в Node таймаута НЕТ: принятое, но */
15
- /** молчащее соединение висит вечно, и дедлайн вызова его не снимает. */
8
+ /** Default per-request timeout. Node's `fetch` has none, so a silent */
9
+ /** accepted connection would hang forever. */
16
10
  const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;
17
- /**
18
- * Потолок ОДНОГО `setTimeout` — 2^31−1 мс (примерно 24.8 суток).
19
- *
20
- * ЧТО БЫВАЕТ БЕЗ УЧЁТА ЭТОГО ПРЕДЕЛА, проверено запуском:
21
- * `setTimeout(fn, 2_592_000_000)` (тридцать суток) печатает
22
- * `TimeoutOverflowWarning` и стреляет ЧЕРЕЗ 0 мс. То есть самая длинная пауза
23
- * превращается в её полное отсутствие, и клиент, которому сервер велел
24
- * подождать тридцать суток, начинает долбить его без пауз.
25
- *
26
- * Живёт этот предел в SDK, а не в `@clipwright/core`, потому что он — свойство
27
- * платформы, а не контракта: `retryDelayMs` обязан честно возвращать то, что
28
- * назначил сервер.
29
- */
11
+ /** Max delay of ONE `setTimeout` (2^31−1 ms); a larger value fires after 0 ms. */
12
+ /** A platform limit, so it lives here and not in core. */
30
13
  const MAX_TIMER_DELAY_MS = 2_147_483_647;
31
- /**
32
- * Длительность в миллисекундах — или внятный отказ на входе.
33
- *
34
- * ОТКАЗ ГРОМКИЙ, А НЕ ТИХАЯ ПОДСТАНОВКА ДЕФОЛТА. `Number(process.env.POLL_MS)`
35
- * на незаданной переменной даёт `NaN`, и молчаливая замена его пятью секундами
36
- * скрыла бы от вызывателя, что его настройка не применилась. Здесь он узнаёт об
37
- * этом на первой же строке, а не по странному поведению поллинга.
38
- *
39
- * `undefined` — законный вход: это «не задавал», и тогда берётся дефолт.
40
- */
14
+ /** Milliseconds, or a loud rejection: silently defaulting a `NaN` would hide */
15
+ /** a misconfiguration. `undefined` means "not set" and takes the fallback. */
41
16
  function positiveMs(value, fallback, name) {
42
17
  if (value === undefined)
43
18
  return fallback;
@@ -46,32 +21,15 @@ function positiveMs(value, fallback, name) {
46
21
  }
47
22
  return value;
48
23
  }
49
- /**
50
- * ОТВЕТ СЕРВЕРА НЕ РАЗОБРАЛСЯ — ЭТО НЕ ТО ЖЕ, ЧТО ОТКАЗ ВВОДА (US-622).
51
- *
52
- * Обе беды приходят из zod и до этого класса были неотличимы снаружи: и
53
- * `makeUgcInput.parse` на входе, и `run.parse` на ответе бросали `ZodError`.
54
- * Внешнее ревью (круг 9) показало цену этой неразличимости. CLI печатал любую
55
- * такую ошибку как «запрос отвергнут ДО отправки» — а на битом ответе `POST
56
- * /run` это ложь в самую дорогую сторону: запрос ушёл, ран создан и, возможно,
57
- * уже оплачен, но человеку сказано, что ничего не произошло, и `run_id` он не
58
- * получил.
59
- *
60
- * Поэтому провал разбора ОТВЕТА получает собственный класс и собственный текст,
61
- * который прямо называет, мог ли вызов иметь последствия.
62
- */
24
+ /** An unparseable server response, distinct from rejected input: after */
25
+ /** `POST /run` the run may already exist and be charged. */
63
26
  export class ClipwrightResponseError extends Error {
64
- /** Путь, ответ которого не разобрался. */
27
+ /** Path whose response failed to parse. */
65
28
  path;
66
- /** Мог ли запрос уже что-то изменить (создать ран, потратить деньги). */
29
+ /** Whether the request may already have changed state (created a run, spent credits). */
67
30
  mayHaveTakenEffect;
68
- /**
69
- * ПОДТВЕРЖДЕНА ли доставка запроса. Имя выбрано точно (внешнее ревью, круг 12):
70
- * прежнее `delivered` читалось как «не доставлено», хотя `false` означает лишь
71
- * ОТСУТСТВИЕ ПОДТВЕРЖДЕНИЯ. Отличить «не дошло» от «дошло, а ответ потерян»
72
- * у HTTP способа нет, и потребитель, прочитавший поле как отрицание, запустил
73
- * бы `attempt: 2` и оплатил второй рендер.
74
- */
31
+ /** `false` means delivery is unconfirmed, not that it failed: HTTP cannot */
32
+ /** tell a lost request from a lost response. */
75
33
  deliveryConfirmed;
76
34
  constructor(path, mayHaveTakenEffect, cause, deliveryConfirmed = true) {
77
35
  super(ClipwrightResponseError.#describe(path, mayHaveTakenEffect, deliveryConfirmed), { cause });
@@ -80,19 +38,8 @@ export class ClipwrightResponseError extends Error {
80
38
  this.mayHaveTakenEffect = mayHaveTakenEffect;
81
39
  this.deliveryConfirmed = deliveryConfirmed;
82
40
  }
83
- /**
84
- * Три разных новости, а не одна (внешнее ревью, круги 9-11).
85
- *
86
- * Разница между ними — деньги. Сказать «ничего не произошло» там, где ран уже
87
- * создан, значит подтолкнуть человека к `--retry 2`, то есть ко второму
88
- * платному рендеру. Сказать «возможно, вы заплатили» на неудачном `quote`
89
- * значит пугать без причины и обесценить предупреждение там, где оно нужно.
90
- *
91
- * НИ ОДИН ИЗ ТРЁХ ТЕКСТОВ НЕ НАЗЫВАЕТ ВИНОВНИКА. Ответ не по контракту с тем
92
- * же успехом мог прислать шлюз или CDN, а не наш сервер; ровно за эту
93
- * бездоказательную атрибуцию внешнее ревью сняло две прежние формулировки
94
- * (круги 13 и 14), и здесь она повторена не будет.
95
- */
41
+ /** Three messages because the money differs; none blames the server, since a */
42
+ /** gateway or CDN may have sent the off-contract response. */
96
43
  static #describe(path, mayHaveTakenEffect, deliveryConfirmed) {
97
44
  if (!mayHaveTakenEffect) {
98
45
  return deliveryConfirmed
@@ -116,58 +63,25 @@ function parseResponse(schema, body, path, mayHaveTakenEffect) {
116
63
  throw new ClipwrightResponseError(path, mayHaveTakenEffect, cause);
117
64
  }
118
65
  }
119
- /**
120
- * Номер попытки → суффикс ключа идемпотентности. С отказом на мусоре.
121
- *
122
- * ЗДЕСЬ ПРОХОДИТ ДЕНЕЖНАЯ ГРАНИЦА, и молчаливого прохода на ней быть не должно.
123
- * Суффикс участвует в ключе, а РАЗНЫЙ ключ — это РАЗНЫЙ платный рендер. Пока
124
- * проверки не было, `?? 1` ловил только `null`/`undefined`, и `NaN` доезжал
125
- * до ключа как строка `:NaN`: ключ отличался от `:1`, сервер видел новый
126
- * запрос и запускал вторую платную генерацию. Внешнее ревью (круг 5) нашло
127
- * живой путь до этого входа — `clipwright make --retry banana`, где
128
- * `parseInt("banana")` даёт `NaN`.
129
- *
130
- * Отказ громкий, потому что тихий здесь стоит денег: пользователь, опечатавшийся
131
- * в номере попытки, получит сообщение, а не счёт.
132
- */
66
+ /** Attempt number → idempotency key suffix. A different key is a different paid */
67
+ /** render, so garbage such as `NaN` is rejected instead of passed through. */
133
68
  function attemptSuffix(attempt) {
134
69
  if (attempt === undefined)
135
70
  return 1;
136
- // `isSafeInteger`, а НЕ `isInteger` (внешнее ревью, круг 7). За пределом
137
- // безопасного диапазона разные числа сливаются в одно: `9007199254740993`
138
- // становится `…992` (проверено запуском). Два РАЗНЫХ номера попытки дали бы
139
- // один суффикс, то есть один ключ, — и запрошенный новый платный рендер молча
140
- // вернул бы прежний ран.
71
+ // `isSafeInteger`: beyond the safe range distinct numbers collapse into one,
72
+ // and a requested new render would silently return the old run.
141
73
  if (!Number.isSafeInteger(attempt) || attempt < 1) {
142
74
  throw new TypeError(`attempt must be a positive integer (1, 2, 3, …), got ${String(attempt)}. ` +
143
75
  "It selects which paid run to deduplicate against, so a wrong value can start a second render.");
144
76
  }
145
77
  return attempt;
146
78
  }
147
- /**
148
- * Сон произвольной длины — ЦЕПОЧКОЙ таймеров, а не одним обрезанным.
149
- *
150
- * ПОЧЕМУ НЕ ПРОСТО ОБРЕЗАТЬ. Первая редакция ограничивала сон потолком выше и
151
- * объясняла это тем, что цикл всё равно перепроверит условия. Внешнее ревью
152
- * (круг 2) показало, что объяснение неверно: сразу после сна цикл делает
153
- * `getRun()`, поэтому обрезка — это не «более ранняя перепроверка», а более
154
- * ранний ЗАПРОС. На паузе в тридцать суток второй запрос уходил бы через 24.86
155
- * суток — на пять суток раньше разрешённого сервером времени, то есть ровно то
156
- * нарушение, ради недопущения которого пауза и соблюдается.
157
- *
158
- * Цепочка сохраняет и предел платформы, и назначенную длительность.
159
- */
79
+ /** Sleep of any length as a CHAIN of timers: clamping would send the next */
80
+ /** request earlier than the server allowed. */
160
81
  function sleep(ms) {
161
82
  return new Promise((resolve) => {
162
- // НЕ-ЧИСЛО ОБЯЗАНО ЗАВЕРШИТЬ СОН, А НЕ ПРОДЛИТЬ ЕГО НАВСЕГДА (внешнее ревью,
163
- // круг 3). С `NaN` условие `left <= 0` ложно ВСЕГДА, `setTimeout(tick, NaN)`
164
- // Node трактует как одну миллисекунду, и цикл планирует таймеры до
165
- // скончания века: промис не завершается, дедлайн больше не проверяется, а
166
- // таймер держит процесс Node живым — `clipwright make` не вернул бы
167
- // управление вовсе. Сюда `NaN` попадает из `pollIntervalMs`, вычисленного
168
- // вызывателем (`Number(process.env.…)`); конструктор такой ввод теперь
169
- // отвергает, но защита стоит и здесь: у цикла с таймерами цена ошибки —
170
- // зависший процесс, а не неверное число.
83
+ // A non-number must end the sleep: with `NaN` the loop would schedule
84
+ // timers forever and keep the process alive.
171
85
  let left = Number.isFinite(ms) ? Math.max(ms, 0) : 0;
172
86
  const tick = () => {
173
87
  if (left <= 0) {
@@ -181,48 +95,32 @@ function sleep(ms) {
181
95
  tick();
182
96
  });
183
97
  }
184
- /**
185
- * ОТКАЗ API, ДОЕХАВШИЙ ДО ВЫЗЫВАТЕЛЯ ЦЕЛИКОМ (US-622).
186
- *
187
- * ЧТО БЫЛО ДО. `#request` сводил любой не-2xx к `new Error(message)`: статус,
188
- * код и назначенная сервером пауза терялись на границе SDK. Вызыватель мог
189
- * только напечатать текст — отличить «подожди две секунды» от «пополни счёт»
190
- * было нечем, и поллинг умирал на первом же 429.
191
- *
192
- * ЧЕГО ЗДЕСЬ НАМЕРЕННО НЕТ — СВОЕЙ ФОРМЫ ОТКАЗА. Класс не объявляет ни кодов,
193
- * ни полей с числами: всё это лежит в `ApiFailure` из `@clipwright/core`, и
194
- * `code`/`report()` выводятся оттуда же (правило проекта №2). Объяви SDK свою
195
- * копию — и MCP с CLI получили бы вторую, а «повторять или нет» стало бы
196
- * вопросом, на который три поверхности отвечают порознь.
197
- */
98
+ /** An API refusal with status, code and server-set pause intact. The shape */
99
+ /** comes from core, so SDK, CLI and MCP answer "retry or not" identically. */
198
100
  export class ClipwrightApiError extends Error {
199
- /** Разобранный отказ: вид, числа, пауза. Форма — из core. */
101
+ /** Parsed refusal: kind, numbers, pause. Shape comes from core. */
200
102
  failure;
201
103
  status;
202
- /** Код отказа. Для чужих тел без кода — `http_<status>`. */
104
+ /** Refusal code; `http_<status>` for foreign bodies without one. */
203
105
  code;
204
- /** Пауза в секундах, назначенная сервером. `undefined` — он её не назвал. */
106
+ /** Server-set pause in seconds; `undefined` if the server named none. */
205
107
  retryAfterSeconds;
206
108
  constructor(failure) {
207
109
  super(failure.message);
208
110
  this.name = "ClipwrightApiError";
209
111
  this.failure = failure;
210
112
  this.status = failure.status;
211
- // И КОД, И ПАУЗА БЕРУТСЯ ИЗ ОБЩЕГО РАЗВЁРТЫВАНИЯ, а не выводятся здесь по
212
- // второму разу. Разъехавшись, `error.code` в CLI и `code` в ответе MCP
213
- // говорили бы об одном отказе разными словами. Плюс следствие, которое
214
- // поймал сканер источников: перечисляя виды отказа тут (`failure.kind ===
215
- // …`), эта поверхность заводила бы у себя копию их названий — то есть
216
- // ровно тот второй источник, который правило проекта №2 запрещает.
113
+ // Code and pause come from the shared report, so CLI and MCP name one
114
+ // refusal with the same words.
217
115
  const report = agentFailureReport(failure);
218
116
  this.code = report.code;
219
117
  this.retryAfterSeconds = report.retry_after_seconds;
220
118
  }
221
- /** Имеет ли смысл повторить тот же вызов. Решает core, а не эта поверхность. */
119
+ /** Whether repeating the same call makes sense. Core decides, not this surface. */
222
120
  get retryable() {
223
121
  return isRetryableFailure(this.failure);
224
122
  }
225
- /** Отказ, развёрнутый для агента: числа, императив, признак повтора. */
123
+ /** The refusal expanded for an agent: numbers, instruction, retry flag. */
226
124
  report() {
227
125
  return agentFailureReport(this.failure);
228
126
  }
@@ -232,13 +130,8 @@ export class ClipwrightClient {
232
130
  #baseUrl;
233
131
  #pollIntervalMs;
234
132
  #requestTimeoutMs;
235
- /**
236
- * [A5] Идентичность установки резолвится ЛЕНИВО (при первом старте рана) и
237
- * кэшируется здесь. Конструктор её НЕ трогает: MCP-сервер строит клиент НА
238
- * ИМПОРТЕ модуля, ДО `server.connect`; если бы резолвер (пишущий в ~/.clipwright)
239
- * падал в конструкторе на read-only HOME, он убил бы ВЕСЬ MCP, включая
240
- * `quote_ugc`, которому clientId вообще не нужен.
241
- */
133
+ /** Resolved lazily on first run start: the MCP server builds the client at */
134
+ /** import, and a read-only HOME must not break tools that never need it. */
242
135
  #clientId;
243
136
  constructor(opts) {
244
137
  this.#apiKey = opts.apiKey;
@@ -246,40 +139,23 @@ export class ClipwrightClient {
246
139
  this.#pollIntervalMs = positiveMs(opts.pollIntervalMs, 5_000, "pollIntervalMs");
247
140
  this.#requestTimeoutMs = positiveMs(opts.requestTimeoutMs, DEFAULT_REQUEST_TIMEOUT_MS, "requestTimeoutMs");
248
141
  }
249
- /** Ленивый резолв + кэш идентичности установки (см. `#clientId`). */
142
+ /** Lazy resolve and cache of the install identity (see `#clientId`). */
250
143
  #getClientId() {
251
144
  if (this.#clientId === undefined) {
252
145
  this.#clientId = resolveClientId();
253
146
  }
254
147
  return this.#clientId;
255
148
  }
256
- /**
257
- * Один запрос к API.
258
- *
259
- * ТЕЛО ЧИТАЕТСЯ ТЕКСТОМ, А НЕ `res.json()`, и это не стилистика (US-622).
260
- * `res.json()` на не-JSON бросает `SyntaxError` ДО того, как мы посмотрели на
261
- * статус, — и вызыватель видит «Unexpected token <» вместо «слишком часто».
262
- * Отдать HTML-страницу вместо нашего тела может любой прокси между клиентом и
263
- * API: edge тарифа, корпоративный шлюз, страница обслуживания. Разбор текста
264
- * в `parseApiFailure` эту ветку закрывает, потому что решение принимается по
265
- * статусу, а тело лишь уточняет причину.
266
- */
149
+ /** One API request. The body is read as text, not `res.json()`: a proxy may */
150
+ /** return HTML, and the status must decide before the body is parsed. */
267
151
  async #request(path,
268
- /**
269
- * Мог ли ЭТОТ вызов что-то изменить на сервере. Знает это только вызыватель,
270
- * и знание обязано дойти сюда: провал разбора успешного ответа на `POST
271
- * /run` и на `GET /voices` — разные новости, и молчать о разнице дороже
272
- * всего именно там, где ран уже мог быть создан и оплачен.
273
- */
152
+ /** Whether THIS call could change server state; only the caller knows. */
274
153
  mayHaveTakenEffect, init) {
275
- // ВСЁ, ЧТО МОЖЕТ УПАСТЬ ПОСЛЕ ОТПРАВКИ, ЛОВИТСЯ ОДИНАКОВО (внешнее ревью,
276
- // круг 11). Обрыв на чтении тела бросал голый `TypeError` мимо
277
- // предупреждения про деньги — то есть ровно там, где ран уже создан, клиент
278
- // молчал о последствиях. Сюда же отнесён и провал самого `fetch`: доставку
279
- // он не опровергает, и на платном пути честнее сказать «неизвестно».
154
+ // Anything failing after send is reported alike: a failed `fetch` does not
155
+ // disprove delivery, so a paid path says "unknown".
280
156
  let res;
281
- // ОТМЕНА ДОХОДИТ ДО СЕТИ: свой срок у каждого запроса плюс сигнал вызывателя.
282
- // Сигнал ВЫНУТ из `init` — иначе срок запроса обходился бы мимо этой строки.
157
+ // Cancellation reaches the network: a per-request timeout plus the caller's
158
+ // signal, pulled out of `init` so it cannot bypass the timeout.
283
159
  const { signal: callerSignal, ...rest } = init ?? {};
284
160
  const timeout = AbortSignal.timeout(this.#requestTimeoutMs);
285
161
  const signal = callerSignal ? AbortSignal.any([callerSignal, timeout]) : timeout;
@@ -295,27 +171,24 @@ export class ClipwrightClient {
295
171
  });
296
172
  }
297
173
  catch (cause) {
298
- // На бесплатных путях сетевой сбой остаётся собой: своё сообщение (DNS,
299
- // отказ соединения) полезнее нашей обёртки, а денег там нет.
174
+ // On free paths the network error stays itself: its own message (DNS,
175
+ // refused connection) is more useful than our wrapper.
300
176
  if (!mayHaveTakenEffect)
301
177
  throw cause;
302
178
  throw new ClipwrightResponseError(path, true, cause, false);
303
179
  }
304
- // ЗАГОЛОВКИ ЧИТАЮТСЯ ДО ТЕЛА, потому что тело может и не дочитаться.
180
+ // Headers are read before the body, which may never finish arriving.
305
181
  const retryAfterHeader = res.headers.get(RETRY_AFTER_HEADER);
306
182
  let bodyText;
307
183
  try {
308
184
  bodyText = await res.text();
309
185
  }
310
186
  catch (cause) {
311
- // ОБРЫВ ЧТЕНИЯ НЕ СМЕЕТ СТИРАТЬ УЖЕ ИЗВЕСТНЫЙ СТАТУС (внешнее ревью,
312
- // круг 12). Первая редакция объявляла любой такой обрыв нарушением
313
- // контракта — и 429 на поллинге переставал быть ретрайным: `makeUgc`
314
- // бросал уже оплаченный ран вместо того, чтобы выждать паузу. Статус и
315
- // заголовки к этому моменту получены целиком, их и достаточно.
187
+ // A broken body read must not erase a known status: a 429 while polling
188
+ // stays retryable instead of abandoning a paid run.
316
189
  if (!res.ok) {
317
190
  throw new ClipwrightApiError(
318
- // `undefined`, а не пустая строка: тело не пустое, оно НЕДОСТУПНО.
191
+ // `undefined`, not an empty string: the body is unavailable, not empty.
319
192
  parseApiFailure({ status: res.status, bodyText: undefined, retryAfterHeader }));
320
193
  }
321
194
  throw new ClipwrightResponseError(path, mayHaveTakenEffect, cause);
@@ -327,25 +200,20 @@ export class ClipwrightClient {
327
200
  retryAfterHeader,
328
201
  }));
329
202
  }
330
- // 204 — «тела нет» по HTTP, и так отвечает удаление актёра. Разбор пустой
331
- // строки объявил бы это нарушением контракта, которого не было.
203
+ // 204 means "no body" (actor deletion answers so); parsing the empty string
204
+ // would report a contract violation that never happened.
332
205
  if (res.status === 204)
333
206
  return undefined;
334
207
  try {
335
208
  return JSON.parse(bodyText);
336
209
  }
337
210
  catch (cause) {
338
- // ТОТ ЖЕ КЛАСС, ЧТО И У ПРОВАЛА СХЕМЫ (внешнее ревью, круг 10). Первая
339
- // редакция бросала здесь обычный `Error`, и он проскакивал МИМО
340
- // предупреждения «ран мог быть создан и оплачен»: сервер, ответивший на
341
- // `POST /run` пустым телом или HTML, оставлял человека в уверенности, что
342
- // ничего не произошло, — и следующий шаг `--retry 2` оплачивал второй
343
- // рендер. Тело не-JSON и тело не по схеме — одна и та же беда, «ответ не
344
- // соответствует контракту», и говорить о ней надо одинаково.
211
+ // Same class as a schema failure: a non-JSON body is also an off-contract
212
+ // response and must carry the "may have been charged" warning.
345
213
  throw new ClipwrightResponseError(path, mayHaveTakenEffect, cause);
346
214
  }
347
215
  }
348
- /** Оценка стоимости без списания кредитов. */
216
+ /** Cost estimate; spends no credits. */
349
217
  async quoteUgc(input) {
350
218
  const body = await this.#request("/v1/skills/make_ugc/quote", false, {
351
219
  method: "POST",
@@ -353,35 +221,24 @@ export class ClipwrightClient {
353
221
  });
354
222
  return parseResponse(quoteResponse, body, "/v1/skills/make_ugc/quote", false);
355
223
  }
356
- /**
357
- * Запуск генерации; возвращает ран сразу (state=queued).
358
- *
359
- * Ключ идемпотентности формируется ЗДЕСЬ, а не на вызывающей поверхности:
360
- * суффикс `:N` (по `attempt`, дефолт 1) пишется ВСЕГДА, иначе MCP дал бы
361
- * `<hash>`, а CLI `<hash>:1` — межповерхностный шов, в котором дедуп ломается.
362
- */
224
+ /** Starts a render and returns the run at once (state=queued). The key is built */
225
+ /** here with an always-present `:N` suffix, so MCP and CLI dedupe alike. */
363
226
  async startUgc(input, opts) {
364
227
  return this.#startUgc(input, opts);
365
228
  }
366
- /** `signal` приходит только изнутри: дедлайн `makeUgc` обрывает и сам старт. */
229
+ /** `signal` is internal only: the `makeUgc` deadline also aborts the start. */
367
230
  async #startUgc(input, opts, signal) {
368
231
  const key = opts?.idempotencyKey ?? `${idempotencyKeyFor(input, this.#getClientId())}:${attemptSuffix(opts?.attempt)}`;
369
- // `true`: запрос уже ушёл, ран мог быть создан и оплачен.
232
+ // `true`: once sent, the run may have been created and charged.
370
233
  const body = await this.#request("/v1/skills/make_ugc/run", true, {
371
234
  method: "POST",
372
235
  body: JSON.stringify(input),
373
236
  headers: { "Idempotency-Key": key },
374
237
  signal: signal ?? null,
375
238
  });
376
- // `hasSideEffect: true` — запрос уже ушёл и ран мог быть создан и оплачен.
377
239
  return parseResponse(runSchema, body, "/v1/skills/make_ugc/run", true);
378
240
  }
379
- /**
380
- * Курируемый каталог голосов для `voice`/`voice_id` (US-516). Отдаёт то же,
381
- * что и `/v1/voices` — статический список из @clipwright/core, БЕЗ вендорских
382
- * id (они не покидают адаптер воркера). Каталог курируемый по дизайну: это
383
- * не полный список голосов вендора — остальные достижимы сырым `voice_id`.
384
- */
241
+ /** Uploads an image; returns its reference for later runs. */
385
242
  async uploadImage(bytes, mediaType) {
386
243
  const body = await this.#request(UPLOADS_PATH, true, {
387
244
  method: "POST",
@@ -390,15 +247,16 @@ export class ClipwrightClient {
390
247
  });
391
248
  return parseResponse(uploadResponse, body, UPLOADS_PATH, true);
392
249
  }
250
+ /** Curated voice catalog for `voice`/`voice_id`; other voices stay reachable by raw `voice_id`. */
393
251
  async listVoices(filters = {}) {
394
- // Ключи уходят как есть: незнакомый параметр отвергает сервер (`unknown_field`), а не срезает клиент.
252
+ // Keys pass as is: the server rejects an unknown one (`unknown_field`); the client does not strip it.
395
253
  const query = new URLSearchParams(Object.entries(filters).flatMap(([key, value]) => (value === undefined ? [] : [[key, String(value)]]))).toString();
396
254
  const body = await this.#request(query === "" ? "/v1/voices" : `/v1/voices?${query}`, false);
397
- // ТОЙ ЖЕ СХЕМОЙ, ЧТО ОТДАЁТ СЕРВЕР. `Array.isArray` пропускал массив чего
398
- // угодно: вызыватель падал на `.map` над строками, вдали от причины.
255
+ // Parsed with the server's own schema, so a malformed body fails here and
256
+ // not later in the caller.
399
257
  return parseResponse(voicesResponse, body, "/v1/voices", false).voices;
400
258
  }
401
- /** Состояние счёта — `GET /v1/account` (clipwright#135). Бесплатно. */
259
+ /** Account state via `GET /v1/account`. Free. */
402
260
  async getAccount() {
403
261
  const body = await this.#request("/v1/account", false);
404
262
  return parseResponse(accountSchema, body, "/v1/account", false);
@@ -416,7 +274,7 @@ export class ClipwrightClient {
416
274
  const body = await this.#request(path, false, { method: "POST", body: JSON.stringify(input) });
417
275
  return parseResponse(actorDefaults, body, path, false);
418
276
  }
419
- /** Оценка `create_actor` без списания кредитов (clipwright#120). */
277
+ /** `create_actor` estimate; spends no credits. */
420
278
  async quoteActor(input) {
421
279
  const body = await this.#request(CREATE_ACTOR_QUOTE_PATH, false, {
422
280
  method: "POST",
@@ -424,12 +282,12 @@ export class ClipwrightClient {
424
282
  });
425
283
  return parseResponse(createActorQuote, body, CREATE_ACTOR_QUOTE_PATH, false);
426
284
  }
427
- /** Запуск `create_actor`: ран возвращается сразу (state=queued), как у `startUgc`. */
428
- /** Ключ строится СВОЕЙ схемой — разбор `make_ugc` срезал бы поля актёра. */
285
+ /** Starts `create_actor`; returns the run at once (state=queued), like `startUgc`. */
286
+ /** The key uses its own schema: the `make_ugc` one would strip actor fields. */
429
287
  async createActor(input, opts) {
430
288
  const key = opts?.idempotencyKey ??
431
289
  `${actorIdempotencyKeyFor(input, this.#getClientId())}:${attemptSuffix(opts?.attempt)}`;
432
- // `true`: запрос уже ушёл, ран мог быть создан и оплачен.
290
+ // `true`: once sent, the run may have been created and charged.
433
291
  const body = await this.#request(CREATE_ACTOR_RUN_PATH, true, {
434
292
  method: "POST",
435
293
  body: JSON.stringify(input),
@@ -437,60 +295,47 @@ export class ClipwrightClient {
437
295
  });
438
296
  return parseResponse(runSchema, body, CREATE_ACTOR_RUN_PATH, true);
439
297
  }
440
- /** Удаление личного актёра. Ответ 204 без тела, поэтому разбирать нечего. */
298
+ /** Deletes a personal actor. The answer is 204 with no body. */
441
299
  async deleteActor(id) {
442
300
  await this.#request(actorItemPath(id), true, { method: "DELETE" });
443
301
  }
444
- /**
445
- * Чтение рана в ТОЛЕРАНТНОЙ проекции (`runRead`, `state: string`): сервер мог
446
- * добавить стадию, которой не знает установленный SDK (docs/12:198). Поэтому
447
- * `safeParse` с деградацией к сырому телу вместо строгого `run.parse` — иначе
448
- * неизвестная стадия уронила бы `getRun` у каждого уже установленного MCP.
449
- * Тип возврата — `RunRead` (`state: string`), а НЕ узкий `Run` (условие
450
- * Architect №3): иначе `isTerminal(state)` не типчекнулся бы и потребители
451
- * приняли бы `state` за закрытый enum.
452
- */
302
+ /** Reads a run tolerantly (`state: string`): a newer server stage must not */
303
+ /** break installed clients, so parsing falls back to the raw body. */
453
304
  async getRun(runId) {
454
305
  return this.#getRun(runId);
455
306
  }
456
- /** `signal` приходит только изнутри: дедлайн `makeUgc` обрывает и сам опрос. */
307
+ /** `signal` is internal only: the `makeUgc` deadline also aborts the poll. */
457
308
  async #getRun(runId, signal) {
458
309
  const body = await this.#request(`/v1/runs/${runId}`, false, { signal: signal ?? null });
459
310
  const parsed = runReadSchema.safeParse(body);
460
311
  return parsed.success ? parsed.data : body;
461
312
  }
462
- /** Запуск + поллинг до терминального состояния. `attempt` пробрасывается внутрь, */
463
- /** `maxWaitMs` — дедлайн, обрывающий и паузу, и сам запрос. */
313
+ /** Start plus polling to a terminal state. `maxWaitMs` is one deadline that */
314
+ /** aborts both the pause and the request itself. */
464
315
  async makeUgc(input, opts, onProgress) {
465
316
  const maxWaitMs = positiveMs(opts?.maxWaitMs, DEFAULT_MAX_WAIT_MS, "maxWaitMs");
466
317
  const deadline = Date.now() + maxWaitMs;
467
- // Дедлайн как сигнал отмены; потолок таймера — тот же, что у `sleep`.
318
+ // The deadline as an abort signal, capped like `sleep`.
468
319
  const callDeadline = AbortSignal.timeout(Math.min(maxWaitMs, MAX_TIMER_DELAY_MS));
469
- // Тип расширяем до `RunRead`: дальше сюда присваивается толерантный `getRun`.
470
- // Оборванный дедлайном СТАРТ летит наружу как есть — ран мог быть оплачен.
320
+ // Widened to `RunRead` for the tolerant `getRun`. A start aborted by the
321
+ // deadline propagates as is: the run may have been charged.
471
322
  let current = await this.#startUgc(input, { attempt: opts?.attempt }, callDeadline);
472
- // Пауза перед СЛЕДУЮЩИМ опросом. Обычно это интервал поллинга; отбитый
473
- // опрос заменяет её паузой, назначенной сервером (US-622).
323
+ // Pause before the NEXT poll; a refused poll replaces it with the server's.
474
324
  let nextDelayMs = this.#pollIntervalMs;
475
- // Последний отбитый опрос — только чтобы объяснить таймаут. Ран, который
476
- // упёрся в дедлайн из-за 429, и ран, который просто долго рендерится, — это
477
- // разные новости, и человеку они нужны разными.
325
+ // Kept only to explain a timeout: throttled and merely slow runs differ.
478
326
  let lastRetried;
479
- /** Один текст таймаута на оба места, где дедлайн срабатывает. */
327
+ /** One timeout message for both places the deadline fires. */
480
328
  const timedOut = () => new Error(`makeUgc timed out after ${maxWaitMs}ms; run ${current.run_id} is still ` +
481
329
  `${current.state}. Poll it later with getRun("${current.run_id}").` +
482
330
  (lastRetried === undefined
483
331
  ? ""
484
332
  : ` The last status check was refused with HTTP ${lastRetried.status}: ` +
485
333
  `${lastRetried.message}`));
486
- // Терминальность — через разделяемый `isTerminal`, а не литералы: неизвестный
487
- // ТЕРМИНАЛЬНЫЙ статус сервера (`isTerminal=false`) осознанно поллится до
488
- // `maxWaitMs` и даёт чистый таймаут с `run_id`, а не вечный цикл (PM4).
334
+ // Shared `isTerminal`: an unknown server state is polled until `maxWaitMs`
335
+ // and ends in a clean timeout with `run_id`, not an endless loop.
489
336
  while (!isTerminal(current.state)) {
490
- // ДЕДЛАЙН ОДИН НА ВЕСЬ ВЫЗОВ И НЕ СБРАСЫВАЕТСЯ РЕТРАЕМ. `deadline`
491
- // посчитан ДО цикла и здесь только читается: пересчитай его при отказе —
492
- // и цепочка 429 продлевала бы ожидание бесконечно, ровно вопреки тому,
493
- // ради чего `maxWaitMs` существует (US-207).
337
+ // One deadline per call, never reset by a retry; otherwise a chain of 429s
338
+ // would extend the wait forever.
494
339
  const remaining = deadline - Date.now();
495
340
  if (remaining <= 0)
496
341
  throw timedOut();
@@ -501,16 +346,11 @@ export class ClipwrightClient {
501
346
  onProgress?.(current);
502
347
  }
503
348
  catch (error) {
504
- // Дедлайн, сорвавший сам опрос, — тот же таймаут, что и дедлайн между
505
- // опросами: новость одна, значит и текст один.
349
+ // A deadline that aborts the poll itself is the same timeout.
506
350
  if (callDeadline.aborted && !(error instanceof ClipwrightApiError))
507
351
  throw timedOut();
508
- // ОТБИТЫЙ ОПРОС — НЕ ПРОВАЛ РАНА. Ран уже запущен и уже оплачен: 429 на
509
- // `GET /v1/runs/:id` до US-622 убивал `makeUgc` целиком, то есть бросал
510
- // работу, за которую заплатили. Повторяем — но только то, что повторять
511
- // ИМЕЕТ СМЫСЛ, и решает это core: 402 и прочие 4xx летят наружу
512
- // немедленно, потому что повтор даст тот же ответ, а агент тем временем
513
- // выест лимит частоты вместо того, чтобы сказать человеку правду.
352
+ // A refused poll is not a failed run: retry only what core calls
353
+ // retryable; 402 and other 4xx propagate at once.
514
354
  if (!(error instanceof ClipwrightApiError) || !isRetryableFailure(error.failure)) {
515
355
  throw error;
516
356
  }
@@ -518,9 +358,8 @@ export class ClipwrightClient {
518
358
  nextDelayMs = retryDelayMs(error.failure, this.#pollIntervalMs);
519
359
  }
520
360
  }
521
- // Терминально: различение исхода — именованной константой core (не
522
- // позиционным индексом массива: переупорядочивание молча инвертировало бы
523
- // успех/провал).
361
+ // Outcome by core's named constant, not an array index that reordering
362
+ // could silently invert.
524
363
  if (current.state === FAILED_STATE) {
525
364
  throw new Error(current.error ?? "run failed");
526
365
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clipwright/sdk",
3
- "version": "0.18.0",
3
+ "version": "0.20.0",
4
4
  "description": "TypeScript client for the Clipwright UGC video API",
5
5
  "license": "MIT",
6
6
  "author": "Dimantika Sp. z o.o.",
@@ -24,7 +24,7 @@
24
24
  },
25
25
  "dependencies": {
26
26
  "zod": "^4.4.3",
27
- "@clipwright/core": "0.18.0"
27
+ "@clipwright/core": "0.20.0"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@types/node": "^26.1.1"