@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.
- package/LICENSE +1 -1
- package/dist/__fixtures__/queue-promises.d.ts +87 -0
- package/dist/__fixtures__/queue-promises.js +99 -0
- package/dist/__fixtures__/queue-promises.js.map +1 -0
- package/dist/account.d.ts +49 -0
- package/dist/account.js +45 -0
- package/dist/account.js.map +1 -0
- package/dist/api-failure.d.ts +192 -0
- package/dist/api-failure.js +491 -0
- package/dist/api-failure.js.map +1 -0
- package/dist/contract-dispositions.d.ts +2 -19
- package/dist/contract-dispositions.js +2 -19
- package/dist/contract-dispositions.js.map +1 -1
- package/dist/errors.d.ts +148 -0
- package/dist/errors.js +192 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -1
- package/dist/public-endpoints.d.ts +29 -0
- package/dist/public-endpoints.js +49 -0
- package/dist/public-endpoints.js.map +1 -0
- package/dist/rate-limit.d.ts +160 -0
- package/dist/rate-limit.js +182 -0
- package/dist/rate-limit.js.map +1 -0
- package/dist/render-backend.d.ts +44 -6
- package/dist/render-backend.js +24 -0
- package/dist/render-backend.js.map +1 -1
- package/dist/run-static-warnings.d.ts +5 -0
- package/dist/run-static-warnings.js +30 -0
- package/dist/run-static-warnings.js.map +1 -0
- package/dist/runs.d.ts +3 -0
- package/dist/runs.js +18 -1
- package/dist/runs.js.map +1 -1
- package/dist/skills.d.ts +27 -2
- package/dist/skills.js +48 -8
- package/dist/skills.js.map +1 -1
- package/dist/tts-backend.d.ts +4 -0
- package/dist/tts-backend.js +0 -13
- package/dist/tts-backend.js.map +1 -1
- package/dist/vendor-response.d.ts +98 -0
- package/dist/vendor-response.js +152 -0
- package/dist/vendor-response.js.map +1 -0
- package/dist/voices.d.ts +42 -26
- package/dist/voices.js +11 -8
- package/dist/voices.js.map +1 -1
- package/package.json +2 -2
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* ТЕЛА ОТКАЗОВ — СХЕМАМИ, А НЕ `c.json({...})` В ОБРАБОТЧИКЕ.
|
|
4
|
+
*
|
|
5
|
+
* До US-602 каждая ошибка API собиралась объектным литералом прямо в
|
|
6
|
+
* `apps/api/src/app.ts`, и это сходило с рук ровно потому, что все они несли
|
|
7
|
+
* одну и ту же пару `code`/`message`: разъехаться было нечему. С деньгами это
|
|
8
|
+
* перестаёт быть правдой — отказ 402 несёт ЧИСЛА, и агент по ним принимает
|
|
9
|
+
* решение (пополнить и повторить либо остановиться). Литерал в обработчике,
|
|
10
|
+
* потерявший `balance_credits`, оставил бы агента с сообщением «не хватило
|
|
11
|
+
* кредитов» без единой цифры, и обнаружилось бы это у клиента.
|
|
12
|
+
*
|
|
13
|
+
* Поэтому форма живёт здесь (правило проекта №2), а обработчик обязан пройти
|
|
14
|
+
* через `.parse()`: тело, собранное мимо схемы, не соберётся вовсе.
|
|
15
|
+
*
|
|
16
|
+
* ЧИСЛА ЛЕЖАТ ВНУТРИ `error`, А НЕ РЯДОМ С НИМ. Прецедент задан отказом по
|
|
17
|
+
* отклонённым полям (`error.fields`) и держится одним доводом: у ответа
|
|
18
|
+
* ошибки один конверт, и всё, что объясняет отказ, лежит в нём. Разложи числа
|
|
19
|
+
* по верхнему уровню — и клиенту придётся знать, для каких кодов смотреть в
|
|
20
|
+
* конверт, а для каких мимо него.
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Общий конверт ошибки. Толерантен к дополнительным полям внутри `error`:
|
|
24
|
+
* типизированные отказы ниже — его расширения, и общий разбор не должен
|
|
25
|
+
* ломаться от того, что конкретный код принёс с собой числа.
|
|
26
|
+
*/
|
|
27
|
+
export declare const apiError: z.ZodObject<{
|
|
28
|
+
error: z.ZodObject<{
|
|
29
|
+
code: z.ZodString;
|
|
30
|
+
message: z.ZodString;
|
|
31
|
+
}, z.core.$strip>;
|
|
32
|
+
}, z.core.$strip>;
|
|
33
|
+
export type ApiError = z.infer<typeof apiError>;
|
|
34
|
+
/** Кредитов на балансе меньше веса рана. Значит «пополни». */
|
|
35
|
+
export declare const insufficientCreditsError: z.ZodObject<{
|
|
36
|
+
error: z.ZodObject<{
|
|
37
|
+
code: z.ZodLiteral<"insufficient_credits">;
|
|
38
|
+
message: z.ZodString;
|
|
39
|
+
balance_credits: z.ZodNumber;
|
|
40
|
+
required_credits: z.ZodNumber;
|
|
41
|
+
}, z.core.$strip>;
|
|
42
|
+
}, z.core.$strip>;
|
|
43
|
+
export type InsufficientCreditsError = z.infer<typeof insufficientCreditsError>;
|
|
44
|
+
/**
|
|
45
|
+
* На аккаунте висит непогашенный долг.
|
|
46
|
+
*
|
|
47
|
+
* ОТДЕЛЬНЫЙ КОД, А НЕ ОТТЕНОК ПРЕДЫДУЩЕГО, и довод у этого ровно один: у счёта
|
|
48
|
+
* с долгом деньги на балансе БЫВАЮТ. Такое состояние оставляет `topUpHold`
|
|
49
|
+
* (ветка `deferred_to_debt`) — он наращивает долг, не трогая баланс; два других
|
|
50
|
+
* производителя долга обнуляют баланс, заводя его. Ответ «недостаточно
|
|
51
|
+
* кредитов» сказал бы такому счёту заведомую неправду.
|
|
52
|
+
*
|
|
53
|
+
* ⚠️ ВТОРАЯ ПОЛОВИНА ПРЕЖНЕГО ДОВОДА — «агента отправило бы покупать кредиты,
|
|
54
|
+
* которые не снимут блокировку» — СНЯТА КАК ЛОЖНАЯ (clipwright#27): кредиты
|
|
55
|
+
* снимают. Вывод пережил свою причину, и это стоит сказать прямо: оставь я
|
|
56
|
+
* старую формулировку, следующий читатель либо слил бы два кода, увидев, что
|
|
57
|
+
* лечение одно, либо заново вывел бы из неё неверный совет клиенту.
|
|
58
|
+
*/
|
|
59
|
+
export declare const debtOutstandingError: z.ZodObject<{
|
|
60
|
+
error: z.ZodObject<{
|
|
61
|
+
code: z.ZodLiteral<"debt_outstanding">;
|
|
62
|
+
message: z.ZodString;
|
|
63
|
+
debt_credits: z.ZodNumber;
|
|
64
|
+
}, z.core.$strip>;
|
|
65
|
+
}, z.core.$strip>;
|
|
66
|
+
export type DebtOutstandingError = z.infer<typeof debtOutstandingError>;
|
|
67
|
+
/**
|
|
68
|
+
* Аккаунт не допущен в бету (US-620). Ни «пополни», ни «погаси»: доступ выдаёт
|
|
69
|
+
* владелец, и деньги на это не влияют.
|
|
70
|
+
*
|
|
71
|
+
* Отдельный код по тому же доводу, что отделил долг от нехватки: у
|
|
72
|
+
* недопущенного аккаунта деньги на балансе БЫВАЮТ, и оба денежных ответа
|
|
73
|
+
* отправили бы его агента совершать действия, которые блокировку не снимут.
|
|
74
|
+
* Отказ терминальный: повтор того же запроса даст то же самое, пока владелец не
|
|
75
|
+
* допустит аккаунт командой `admit`.
|
|
76
|
+
*
|
|
77
|
+
* ЧИСЕЛ В ТЕЛЕ НЕТ, И ЭТО НЕ ЭКОНОМИЯ. Порядковый номер мы не считаем: доступ
|
|
78
|
+
* даётся решением человека, а не по счётчику, и назвать номер значило бы
|
|
79
|
+
* обещать срок, которого никто не давал.
|
|
80
|
+
*
|
|
81
|
+
* ПО ТОЙ ЖЕ ПРИЧИНЕ ТЕЛО НЕ НАЗЫВАЕТ НИ СРОКА, НИ НОМЕРА, НИ БЛИЗОСТИ РАЗВЯЗКИ.
|
|
82
|
+
* Из отказа известно ровно одно: доступа нет. Так же отвечает аккаунт, у
|
|
83
|
+
* которого доступ СНЯЛИ, — и обещание скорого приёма было бы для него ложью в
|
|
84
|
+
* самый неподходящий момент. Правило принималось трижды и трижды чинилось по адресу
|
|
85
|
+
* находки: сперва в совете агенту (`api-failure.ts`), потом в `SKILL.md`, и
|
|
86
|
+
* только тогда — ЗДЕСЬ, в единственном месте, которое порождает эту строку для
|
|
87
|
+
* всех остальных. Проверка стоит на этой функции, а не на её производных.
|
|
88
|
+
*
|
|
89
|
+
* ПРАВИЛО РАСПРОСТРАНЯЕТСЯ НА ЛЮБУЮ ПОВЕРХНОСТЬ, объясняющую этот отказ, а не
|
|
90
|
+
* только на те, что существуют сегодня. Ближайшие будущие — страница ключей
|
|
91
|
+
* (US-608) и лендинг US-614; там соблазн назвать срок сильнее всего. Сторож
|
|
92
|
+
* (`scripts/docs-consistency.test.ts`) их уже обходит, но HTML он читает как
|
|
93
|
+
* текст и поймает только то, что стоит рядом с именем кода.
|
|
94
|
+
*/
|
|
95
|
+
export declare const accountNotAdmittedError: z.ZodObject<{
|
|
96
|
+
error: z.ZodObject<{
|
|
97
|
+
code: z.ZodLiteral<"account_not_admitted">;
|
|
98
|
+
message: z.ZodString;
|
|
99
|
+
}, z.core.$strip>;
|
|
100
|
+
}, z.core.$strip>;
|
|
101
|
+
export type AccountNotAdmittedError = z.infer<typeof accountNotAdmittedError>;
|
|
102
|
+
/**
|
|
103
|
+
* Сборка тела «не хватило кредитов».
|
|
104
|
+
*
|
|
105
|
+
* Формулировка живёт ЗДЕСЬ, а не в обработчике, по той же причине, что и
|
|
106
|
+
* форма: два места, отвечающие 402 (сегодня — создание рана, завтра — любой
|
|
107
|
+
* другой платный вызов), обязаны объяснять отказ одинаково.
|
|
108
|
+
*/
|
|
109
|
+
export declare function insufficientCreditsBody(args: {
|
|
110
|
+
balanceCredits: number;
|
|
111
|
+
requiredCredits: number;
|
|
112
|
+
}): InsufficientCreditsError;
|
|
113
|
+
/** Сборка тела «не допущен в бету». См. довод о формулировке выше. */
|
|
114
|
+
export declare function accountNotAdmittedBody(): AccountNotAdmittedError;
|
|
115
|
+
/** Сборка тела «висит долг». См. довод о формулировке выше. */
|
|
116
|
+
export declare function debtOutstandingBody(args: {
|
|
117
|
+
debtCredits: number;
|
|
118
|
+
}): DebtOutstandingError;
|
|
119
|
+
/** Во входе есть поле, которое продукт отклоняет. `fields` называет их поимённо: */
|
|
120
|
+
/** агенту чинить нечего, пока он не знает, какое именно убрать. */
|
|
121
|
+
export declare const rejectedFieldError: z.ZodObject<{
|
|
122
|
+
error: z.ZodObject<{
|
|
123
|
+
code: z.ZodLiteral<"rejected_field">;
|
|
124
|
+
message: z.ZodString;
|
|
125
|
+
fields: z.ZodArray<z.ZodString>;
|
|
126
|
+
}, z.core.$strip>;
|
|
127
|
+
}, z.core.$strip>;
|
|
128
|
+
export type RejectedFieldError = z.infer<typeof rejectedFieldError>;
|
|
129
|
+
/** Сборка тела «поле отклонено». Причина берётся из реестра диспозиций. */
|
|
130
|
+
export declare function rejectedFieldBody(hits: readonly {
|
|
131
|
+
field: string;
|
|
132
|
+
message: string;
|
|
133
|
+
}[]): RejectedFieldError;
|
|
134
|
+
/** КОДЫ С ГОЛЫМ КОНВЕРТОМ — ОДНИМ РЕЕСТРОМ: перечень §6 `docs/03-api.md` объявлен */
|
|
135
|
+
/** исчерпывающим. Устройство сторожей — `docs/41-api-error-contract.md`. */
|
|
136
|
+
declare const BARE_ERROR_CODES: readonly ["aspect_conflict", "idempotency_key_required", "idempotency_key_reused", "internal_error", "invalid_request", "not_found", "paid_render_disabled", "payload_too_large", "unauthorized", "upstream_error"];
|
|
137
|
+
/** Код отказа, тело которого несёт только `code` и `message`. */
|
|
138
|
+
export type BareApiErrorCode = (typeof BARE_ERROR_CODES)[number];
|
|
139
|
+
/** ВСЕ коды, которые умеет вернуть API: голые плюс типизированные. Значения вторых */
|
|
140
|
+
/** берутся из их схем, поэтому переименование доедет сюда само. */
|
|
141
|
+
export declare const API_ERROR_CODES: readonly string[];
|
|
142
|
+
/** Тело голого отказа. Единственный путь к нему: код вне реестра не компилируется, */
|
|
143
|
+
/** а конверт мимо этой функции валит `scripts/api-error-envelope.test.ts`. */
|
|
144
|
+
export declare function apiErrorBody(args: {
|
|
145
|
+
code: BareApiErrorCode;
|
|
146
|
+
message: string;
|
|
147
|
+
}): ApiError;
|
|
148
|
+
export {};
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
// Только ради кода 429 в реестре ниже: имя берётся из его схемы, а не пишется
|
|
3
|
+
// здесь литералом (единственный дом формы 429 — `rate-limit.ts`).
|
|
4
|
+
import { rateLimitedError } from "./rate-limit.js";
|
|
5
|
+
/**
|
|
6
|
+
* ТЕЛА ОТКАЗОВ — СХЕМАМИ, А НЕ `c.json({...})` В ОБРАБОТЧИКЕ.
|
|
7
|
+
*
|
|
8
|
+
* До US-602 каждая ошибка API собиралась объектным литералом прямо в
|
|
9
|
+
* `apps/api/src/app.ts`, и это сходило с рук ровно потому, что все они несли
|
|
10
|
+
* одну и ту же пару `code`/`message`: разъехаться было нечему. С деньгами это
|
|
11
|
+
* перестаёт быть правдой — отказ 402 несёт ЧИСЛА, и агент по ним принимает
|
|
12
|
+
* решение (пополнить и повторить либо остановиться). Литерал в обработчике,
|
|
13
|
+
* потерявший `balance_credits`, оставил бы агента с сообщением «не хватило
|
|
14
|
+
* кредитов» без единой цифры, и обнаружилось бы это у клиента.
|
|
15
|
+
*
|
|
16
|
+
* Поэтому форма живёт здесь (правило проекта №2), а обработчик обязан пройти
|
|
17
|
+
* через `.parse()`: тело, собранное мимо схемы, не соберётся вовсе.
|
|
18
|
+
*
|
|
19
|
+
* ЧИСЛА ЛЕЖАТ ВНУТРИ `error`, А НЕ РЯДОМ С НИМ. Прецедент задан отказом по
|
|
20
|
+
* отклонённым полям (`error.fields`) и держится одним доводом: у ответа
|
|
21
|
+
* ошибки один конверт, и всё, что объясняет отказ, лежит в нём. Разложи числа
|
|
22
|
+
* по верхнему уровню — и клиенту придётся знать, для каких кодов смотреть в
|
|
23
|
+
* конверт, а для каких мимо него.
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Общий конверт ошибки. Толерантен к дополнительным полям внутри `error`:
|
|
27
|
+
* типизированные отказы ниже — его расширения, и общий разбор не должен
|
|
28
|
+
* ломаться от того, что конкретный код принёс с собой числа.
|
|
29
|
+
*/
|
|
30
|
+
export const apiError = z.object({
|
|
31
|
+
error: z.object({
|
|
32
|
+
code: z.string().min(1),
|
|
33
|
+
message: z.string().min(1),
|
|
34
|
+
}),
|
|
35
|
+
});
|
|
36
|
+
/** Кредитов на балансе меньше веса рана. Значит «пополни». */
|
|
37
|
+
export const insufficientCreditsError = z.object({
|
|
38
|
+
error: z.object({
|
|
39
|
+
code: z.literal("insufficient_credits"),
|
|
40
|
+
message: z.string().min(1),
|
|
41
|
+
/** Сколько есть СЕЙЧАС. Ноль — законное значение. */
|
|
42
|
+
balance_credits: z.number().int().nonnegative(),
|
|
43
|
+
/** Сколько нужно на этот ран — та же оценка, что вернул `quote`. */
|
|
44
|
+
required_credits: z.number().int().positive(),
|
|
45
|
+
}),
|
|
46
|
+
});
|
|
47
|
+
/**
|
|
48
|
+
* На аккаунте висит непогашенный долг.
|
|
49
|
+
*
|
|
50
|
+
* ОТДЕЛЬНЫЙ КОД, А НЕ ОТТЕНОК ПРЕДЫДУЩЕГО, и довод у этого ровно один: у счёта
|
|
51
|
+
* с долгом деньги на балансе БЫВАЮТ. Такое состояние оставляет `topUpHold`
|
|
52
|
+
* (ветка `deferred_to_debt`) — он наращивает долг, не трогая баланс; два других
|
|
53
|
+
* производителя долга обнуляют баланс, заводя его. Ответ «недостаточно
|
|
54
|
+
* кредитов» сказал бы такому счёту заведомую неправду.
|
|
55
|
+
*
|
|
56
|
+
* ⚠️ ВТОРАЯ ПОЛОВИНА ПРЕЖНЕГО ДОВОДА — «агента отправило бы покупать кредиты,
|
|
57
|
+
* которые не снимут блокировку» — СНЯТА КАК ЛОЖНАЯ (clipwright#27): кредиты
|
|
58
|
+
* снимают. Вывод пережил свою причину, и это стоит сказать прямо: оставь я
|
|
59
|
+
* старую формулировку, следующий читатель либо слил бы два кода, увидев, что
|
|
60
|
+
* лечение одно, либо заново вывел бы из неё неверный совет клиенту.
|
|
61
|
+
*/
|
|
62
|
+
export const debtOutstandingError = z.object({
|
|
63
|
+
error: z.object({
|
|
64
|
+
code: z.literal("debt_outstanding"),
|
|
65
|
+
message: z.string().min(1),
|
|
66
|
+
debt_credits: z.number().int().positive(),
|
|
67
|
+
}),
|
|
68
|
+
});
|
|
69
|
+
/**
|
|
70
|
+
* Аккаунт не допущен в бету (US-620). Ни «пополни», ни «погаси»: доступ выдаёт
|
|
71
|
+
* владелец, и деньги на это не влияют.
|
|
72
|
+
*
|
|
73
|
+
* Отдельный код по тому же доводу, что отделил долг от нехватки: у
|
|
74
|
+
* недопущенного аккаунта деньги на балансе БЫВАЮТ, и оба денежных ответа
|
|
75
|
+
* отправили бы его агента совершать действия, которые блокировку не снимут.
|
|
76
|
+
* Отказ терминальный: повтор того же запроса даст то же самое, пока владелец не
|
|
77
|
+
* допустит аккаунт командой `admit`.
|
|
78
|
+
*
|
|
79
|
+
* ЧИСЕЛ В ТЕЛЕ НЕТ, И ЭТО НЕ ЭКОНОМИЯ. Порядковый номер мы не считаем: доступ
|
|
80
|
+
* даётся решением человека, а не по счётчику, и назвать номер значило бы
|
|
81
|
+
* обещать срок, которого никто не давал.
|
|
82
|
+
*
|
|
83
|
+
* ПО ТОЙ ЖЕ ПРИЧИНЕ ТЕЛО НЕ НАЗЫВАЕТ НИ СРОКА, НИ НОМЕРА, НИ БЛИЗОСТИ РАЗВЯЗКИ.
|
|
84
|
+
* Из отказа известно ровно одно: доступа нет. Так же отвечает аккаунт, у
|
|
85
|
+
* которого доступ СНЯЛИ, — и обещание скорого приёма было бы для него ложью в
|
|
86
|
+
* самый неподходящий момент. Правило принималось трижды и трижды чинилось по адресу
|
|
87
|
+
* находки: сперва в совете агенту (`api-failure.ts`), потом в `SKILL.md`, и
|
|
88
|
+
* только тогда — ЗДЕСЬ, в единственном месте, которое порождает эту строку для
|
|
89
|
+
* всех остальных. Проверка стоит на этой функции, а не на её производных.
|
|
90
|
+
*
|
|
91
|
+
* ПРАВИЛО РАСПРОСТРАНЯЕТСЯ НА ЛЮБУЮ ПОВЕРХНОСТЬ, объясняющую этот отказ, а не
|
|
92
|
+
* только на те, что существуют сегодня. Ближайшие будущие — страница ключей
|
|
93
|
+
* (US-608) и лендинг US-614; там соблазн назвать срок сильнее всего. Сторож
|
|
94
|
+
* (`scripts/docs-consistency.test.ts`) их уже обходит, но HTML он читает как
|
|
95
|
+
* текст и поймает только то, что стоит рядом с именем кода.
|
|
96
|
+
*/
|
|
97
|
+
export const accountNotAdmittedError = z.object({
|
|
98
|
+
error: z.object({
|
|
99
|
+
code: z.literal("account_not_admitted"),
|
|
100
|
+
message: z.string().min(1),
|
|
101
|
+
}),
|
|
102
|
+
});
|
|
103
|
+
/**
|
|
104
|
+
* Сборка тела «не хватило кредитов».
|
|
105
|
+
*
|
|
106
|
+
* Формулировка живёт ЗДЕСЬ, а не в обработчике, по той же причине, что и
|
|
107
|
+
* форма: два места, отвечающие 402 (сегодня — создание рана, завтра — любой
|
|
108
|
+
* другой платный вызов), обязаны объяснять отказ одинаково.
|
|
109
|
+
*/
|
|
110
|
+
export function insufficientCreditsBody(args) {
|
|
111
|
+
return insufficientCreditsError.parse({
|
|
112
|
+
error: {
|
|
113
|
+
code: "insufficient_credits",
|
|
114
|
+
message: `This run needs ${args.requiredCredits} credits, the account has ${args.balanceCredits}. ` +
|
|
115
|
+
"Top up the balance and retry; nothing was charged and no run was created.",
|
|
116
|
+
balance_credits: args.balanceCredits,
|
|
117
|
+
required_credits: args.requiredCredits,
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
/** Сборка тела «не допущен в бету». См. довод о формулировке выше. */
|
|
122
|
+
export function accountNotAdmittedBody() {
|
|
123
|
+
return accountNotAdmittedError.parse({
|
|
124
|
+
error: {
|
|
125
|
+
code: "account_not_admitted",
|
|
126
|
+
message: "This account is not admitted to the beta. Nothing was charged and no run was created. " +
|
|
127
|
+
"Ask the operator about this account; retrying will not change the answer.",
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
/** Сборка тела «висит долг». См. довод о формулировке выше. */
|
|
132
|
+
export function debtOutstandingBody(args) {
|
|
133
|
+
return debtOutstandingError.parse({
|
|
134
|
+
error: {
|
|
135
|
+
code: "debt_outstanding",
|
|
136
|
+
message: `An outstanding debt of ${args.debtCredits} credits blocks new paid runs. ` +
|
|
137
|
+
"Buy credits to clear it: incoming credits pay the debt down before any of them " +
|
|
138
|
+
"reach the balance. Clearing it lifts this block; a run still needs enough " +
|
|
139
|
+
"credits of its own, so a purchase equal to the debt adds nothing to the balance.",
|
|
140
|
+
debt_credits: args.debtCredits,
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
/** Во входе есть поле, которое продукт отклоняет. `fields` называет их поимённо: */
|
|
145
|
+
/** агенту чинить нечего, пока он не знает, какое именно убрать. */
|
|
146
|
+
export const rejectedFieldError = z.object({
|
|
147
|
+
error: z.object({
|
|
148
|
+
code: z.literal("rejected_field"),
|
|
149
|
+
message: z.string().min(1),
|
|
150
|
+
fields: z.array(z.string().min(1)).min(1),
|
|
151
|
+
}),
|
|
152
|
+
});
|
|
153
|
+
/** Сборка тела «поле отклонено». Причина берётся из реестра диспозиций. */
|
|
154
|
+
export function rejectedFieldBody(hits) {
|
|
155
|
+
return rejectedFieldError.parse({
|
|
156
|
+
error: {
|
|
157
|
+
code: "rejected_field",
|
|
158
|
+
message: hits.map((hit) => hit.message).join("; "),
|
|
159
|
+
fields: hits.map((hit) => hit.field),
|
|
160
|
+
},
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
/** КОДЫ С ГОЛЫМ КОНВЕРТОМ — ОДНИМ РЕЕСТРОМ: перечень §6 `docs/03-api.md` объявлен */
|
|
164
|
+
/** исчерпывающим. Устройство сторожей — `docs/41-api-error-contract.md`. */
|
|
165
|
+
const BARE_ERROR_CODES = [
|
|
166
|
+
"aspect_conflict",
|
|
167
|
+
"idempotency_key_required",
|
|
168
|
+
"idempotency_key_reused",
|
|
169
|
+
"internal_error",
|
|
170
|
+
"invalid_request",
|
|
171
|
+
"not_found",
|
|
172
|
+
"paid_render_disabled",
|
|
173
|
+
"payload_too_large",
|
|
174
|
+
"unauthorized",
|
|
175
|
+
"upstream_error",
|
|
176
|
+
];
|
|
177
|
+
/** ВСЕ коды, которые умеет вернуть API: голые плюс типизированные. Значения вторых */
|
|
178
|
+
/** берутся из их схем, поэтому переименование доедет сюда само. */
|
|
179
|
+
export const API_ERROR_CODES = [
|
|
180
|
+
...BARE_ERROR_CODES,
|
|
181
|
+
rejectedFieldError.shape.error.shape.code.value,
|
|
182
|
+
insufficientCreditsError.shape.error.shape.code.value,
|
|
183
|
+
debtOutstandingError.shape.error.shape.code.value,
|
|
184
|
+
accountNotAdmittedError.shape.error.shape.code.value,
|
|
185
|
+
rateLimitedError.shape.error.shape.code.value,
|
|
186
|
+
];
|
|
187
|
+
/** Тело голого отказа. Единственный путь к нему: код вне реестра не компилируется, */
|
|
188
|
+
/** а конверт мимо этой функции валит `scripts/api-error-envelope.test.ts`. */
|
|
189
|
+
export function apiErrorBody(args) {
|
|
190
|
+
return apiError.parse({ error: { code: args.code, message: args.message } });
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,13 @@ export * from "./contract-dispositions.js";
|
|
|
3
3
|
export * from "./aspect.js";
|
|
4
4
|
export * from "./voices.js";
|
|
5
5
|
export * from "./runs.js";
|
|
6
|
+
export * from "./errors.js";
|
|
7
|
+
export * from "./rate-limit.js";
|
|
8
|
+
export * from "./api-failure.js";
|
|
9
|
+
export * from "./account.js";
|
|
6
10
|
export * from "./pacing.js";
|
|
7
11
|
export * from "./render-backend.js";
|
|
8
12
|
export * from "./tts-backend.js";
|
|
13
|
+
export * from "./vendor-response.js";
|
|
14
|
+
export * from "./public-endpoints.js";
|
|
15
|
+
export * from "./run-static-warnings.js";
|
package/dist/index.js
CHANGED
|
@@ -8,8 +8,29 @@ export * from "./contract-dispositions.js";
|
|
|
8
8
|
export * from "./aspect.js";
|
|
9
9
|
export * from "./voices.js";
|
|
10
10
|
export * from "./runs.js";
|
|
11
|
+
// Тела отказов: форма ответа об ошибке — тоже контракт, и с появлением чисел в
|
|
12
|
+
// теле (402) она перестала быть выводимой из кода ответа.
|
|
13
|
+
export * from "./errors.js";
|
|
14
|
+
// Rate limit: форма 429 и имена заголовков — тот же контракт, что и тела
|
|
15
|
+
// отказов выше, и по той же причине не выводится из кода ответа.
|
|
16
|
+
export * from "./rate-limit.js";
|
|
17
|
+
// Разбор отказа: тела уже описаны выше, здесь — что с ними ДЕЛАТЬ. Живёт в
|
|
18
|
+
// core, потому что решение «ретраить или остановиться» обязано быть общим у
|
|
19
|
+
// SDK, MCP и CLI (US-622).
|
|
20
|
+
export * from "./api-failure.js";
|
|
21
|
+
export * from "./account.js";
|
|
11
22
|
export * from "./pacing.js";
|
|
12
23
|
// Вендор-нейтральные контракты: всё вендорское живёт в адаптерах, не здесь.
|
|
13
24
|
export * from "./render-backend.js";
|
|
14
25
|
export * from "./tts-backend.js";
|
|
26
|
+
// Обязанность реализаций обоих контрактов выше: пометить ошибку кодом ответа,
|
|
27
|
+
// если ответ был. Без неё «вендор отказал» и «ответа не было» неразличимы
|
|
28
|
+
// (US-606a).
|
|
29
|
+
export * from "./vendor-response.js";
|
|
30
|
+
// Публичные адреса и имена пакетов: их печатают SDK, документация и лендинг,
|
|
31
|
+
// поэтому расхождение видит посетитель, а не тест (US-614).
|
|
32
|
+
export * from "./public-endpoints.js";
|
|
33
|
+
// Статические warnings рана выводятся из сохранённого входа — один ответ у API
|
|
34
|
+
// и у кабинета на любом состоянии рана (clipwright#64).
|
|
35
|
+
export * from "./run-static-warnings.js";
|
|
15
36
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,gFAAgF;AAChF,6EAA6E;AAC7E,2BAA2B;AAC3B,cAAc,4BAA4B,CAAC;AAC3C,4EAA4E;AAC5E,gEAAgE;AAChE,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,4EAA4E;AAC5E,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,gFAAgF;AAChF,6EAA6E;AAC7E,2BAA2B;AAC3B,cAAc,4BAA4B,CAAC;AAC3C,4EAA4E;AAC5E,gEAAgE;AAChE,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,+EAA+E;AAC/E,0DAA0D;AAC1D,cAAc,aAAa,CAAC;AAC5B,yEAAyE;AACzE,iEAAiE;AACjE,cAAc,iBAAiB,CAAC;AAChC,2EAA2E;AAC3E,4EAA4E;AAC5E,2BAA2B;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,4EAA4E;AAC5E,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,8EAA8E;AAC9E,0EAA0E;AAC1E,aAAa;AACb,cAAc,sBAAsB,CAAC;AACrC,6EAA6E;AAC7E,4DAA4D;AAC5D,cAAc,uBAAuB,CAAC;AACtC,+EAA+E;AAC/E,wDAAwD;AACxD,cAAc,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ПУБЛИЧНЫЕ АДРЕСА ПРОДУКТА — ОДНОЙ КОНСТАНТОЙ НА ВСЕХ (US-614).
|
|
3
|
+
*
|
|
4
|
+
* ЗАЧЕМ В `core`, А НЕ В SDK, ГДЕ ОН ЖИЛ. Литерал стоял приватной константой
|
|
5
|
+
* `DEFAULT_BASE_URL` в `packages/sdk/src/index.ts`, и до лендинга второго
|
|
6
|
+
* читателя у него не было. С лендингом их стало два: страница печатает команду
|
|
7
|
+
* `curl`, которую посетитель копирует и запускает, — то есть УТВЕРЖДАЕТ адрес.
|
|
8
|
+
* Напиши мы его там литералом, и правило проекта №2 нарушилось бы на самом
|
|
9
|
+
* заметном месте: клиент ходил бы на один адрес, а страница называла другой, и
|
|
10
|
+
* расхождение обнаружил бы посетитель, а не тест.
|
|
11
|
+
*
|
|
12
|
+
* ПОЧЕМУ ЗДЕСЬ АДРЕС ПЛОЩАДКИ, А НЕ `api.clipwright.io`. `spec.md` обещает
|
|
13
|
+
* второе, и US-613 его заведёт; на 2026-08-09 у `api.clipwright.io` нет ни `A`,
|
|
14
|
+
* ни `CNAME` (замер `dig`), то есть команда с этим адресом не работает ни у
|
|
15
|
+
* кого. Напечатать её на странице значило бы продать неработающий пример —
|
|
16
|
+
* ровно то, что запрещает главное правило брифа лендинга. Смена адреса в
|
|
17
|
+
* US-613 будет правкой ЭТОЙ строки, и обе поверхности переедут вместе.
|
|
18
|
+
*/
|
|
19
|
+
export declare const PUBLIC_API_BASE_URL = "https://api-production-7e69.up.railway.app";
|
|
20
|
+
/**
|
|
21
|
+
* Пакеты npm, которыми продукт вызывается. Названия печатает и лендинг, и
|
|
22
|
+
* `--help`, и документация — значит это тоже контракт, а не текст страницы.
|
|
23
|
+
*/
|
|
24
|
+
export declare const CLI_PACKAGE = "@clipwright/cli";
|
|
25
|
+
export declare const CLI_BIN = "clipwright";
|
|
26
|
+
export declare const MCP_PACKAGE = "@clipwright/mcp-server";
|
|
27
|
+
/** Адрес API ИЗ ОКРУЖЕНИЯ — только `https:`: по нему уходит `Authorization: Bearer */
|
|
28
|
+
/** cw_…`. Программный `baseUrl` встраивателя не трогаем — его выбирает автор кода. */
|
|
29
|
+
export declare function apiBaseUrlFromEnv(raw: string | undefined): string | undefined;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ПУБЛИЧНЫЕ АДРЕСА ПРОДУКТА — ОДНОЙ КОНСТАНТОЙ НА ВСЕХ (US-614).
|
|
3
|
+
*
|
|
4
|
+
* ЗАЧЕМ В `core`, А НЕ В SDK, ГДЕ ОН ЖИЛ. Литерал стоял приватной константой
|
|
5
|
+
* `DEFAULT_BASE_URL` в `packages/sdk/src/index.ts`, и до лендинга второго
|
|
6
|
+
* читателя у него не было. С лендингом их стало два: страница печатает команду
|
|
7
|
+
* `curl`, которую посетитель копирует и запускает, — то есть УТВЕРЖДАЕТ адрес.
|
|
8
|
+
* Напиши мы его там литералом, и правило проекта №2 нарушилось бы на самом
|
|
9
|
+
* заметном месте: клиент ходил бы на один адрес, а страница называла другой, и
|
|
10
|
+
* расхождение обнаружил бы посетитель, а не тест.
|
|
11
|
+
*
|
|
12
|
+
* ПОЧЕМУ ЗДЕСЬ АДРЕС ПЛОЩАДКИ, А НЕ `api.clipwright.io`. `spec.md` обещает
|
|
13
|
+
* второе, и US-613 его заведёт; на 2026-08-09 у `api.clipwright.io` нет ни `A`,
|
|
14
|
+
* ни `CNAME` (замер `dig`), то есть команда с этим адресом не работает ни у
|
|
15
|
+
* кого. Напечатать её на странице значило бы продать неработающий пример —
|
|
16
|
+
* ровно то, что запрещает главное правило брифа лендинга. Смена адреса в
|
|
17
|
+
* US-613 будет правкой ЭТОЙ строки, и обе поверхности переедут вместе.
|
|
18
|
+
*/
|
|
19
|
+
export const PUBLIC_API_BASE_URL = "https://api-production-7e69.up.railway.app";
|
|
20
|
+
/**
|
|
21
|
+
* Пакеты npm, которыми продукт вызывается. Названия печатает и лендинг, и
|
|
22
|
+
* `--help`, и документация — значит это тоже контракт, а не текст страницы.
|
|
23
|
+
*/
|
|
24
|
+
export const CLI_PACKAGE = "@clipwright/cli";
|
|
25
|
+
export const CLI_BIN = "clipwright";
|
|
26
|
+
export const MCP_PACKAGE = "@clipwright/mcp-server";
|
|
27
|
+
/** Петлевые имена — единственное, чему разрешён `http:`: локальный API никуда не */
|
|
28
|
+
/** выходит, и требовать там сертификат значило бы запретить разработку. */
|
|
29
|
+
const LOOPBACK_HOSTS = new Set(["localhost", "127.0.0.1", "[::1]", "::1"]);
|
|
30
|
+
/** Адрес API ИЗ ОКРУЖЕНИЯ — только `https:`: по нему уходит `Authorization: Bearer */
|
|
31
|
+
/** cw_…`. Программный `baseUrl` встраивателя не трогаем — его выбирает автор кода. */
|
|
32
|
+
export function apiBaseUrlFromEnv(raw) {
|
|
33
|
+
if (raw === undefined || raw === "")
|
|
34
|
+
return undefined;
|
|
35
|
+
let url;
|
|
36
|
+
try {
|
|
37
|
+
url = new URL(raw);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
throw new Error(`CLIPWRIGHT_API_URL is not a URL: ${raw}`);
|
|
41
|
+
}
|
|
42
|
+
if (url.protocol === "https:")
|
|
43
|
+
return raw;
|
|
44
|
+
if (url.protocol === "http:" && LOOPBACK_HOSTS.has(url.hostname))
|
|
45
|
+
return raw;
|
|
46
|
+
throw new Error(`CLIPWRIGHT_API_URL must be https (loopback may be http), got ${url.protocol}//${url.hostname}. ` +
|
|
47
|
+
"The api key travels in the Authorization header of every request to it.");
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=public-endpoints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-endpoints.js","sourceRoot":"","sources":["../src/public-endpoints.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,4CAA4C,CAAC;AAEhF;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,iBAAiB,CAAC;AAC7C,MAAM,CAAC,MAAM,OAAO,GAAG,YAAY,CAAC;AACpC,MAAM,CAAC,MAAM,WAAW,GAAG,wBAAwB,CAAC;AAEpD,oFAAoF;AACpF,2EAA2E;AAC3E,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;AAE3E,sFAAsF;AACtF,sFAAsF;AACtF,MAAM,UAAU,iBAAiB,CAAC,GAAuB;IACvD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAEtD,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,oCAAoC,GAAG,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IAC1C,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,GAAG,CAAC;IAE7E,MAAM,IAAI,KAAK,CACb,gEAAgE,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,QAAQ,IAAI;QAC/F,yEAAyE,CAC5E,CAAC;AACJ,CAAC"}
|