@clipwright/core 0.2.0 → 0.4.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/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/api-failure.d.ts +20 -2
- package/dist/api-failure.js +46 -5
- package/dist/api-failure.js.map +1 -1
- 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 +79 -5
- package/dist/errors.js +110 -6
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/public-endpoints.d.ts +14 -0
- package/dist/public-endpoints.js +34 -0
- package/dist/public-endpoints.js.map +1 -0
- package/dist/rate-limit.d.ts +22 -0
- package/dist/rate-limit.js +30 -0
- package/dist/rate-limit.js.map +1 -1
- 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 +1 -1
package/dist/errors.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
// Только ради кода 429 в реестре ниже: имя берётся из его схемы, а не пишется
|
|
3
|
+
// здесь литералом (единственный дом формы 429 — `rate-limit.ts`).
|
|
4
|
+
import { rateLimitedError } from "./rate-limit.js";
|
|
2
5
|
/**
|
|
3
6
|
* ТЕЛА ОТКАЗОВ — СХЕМАМИ, А НЕ `c.json({...})` В ОБРАБОТЧИКЕ.
|
|
4
7
|
*
|
|
@@ -42,12 +45,19 @@ export const insufficientCreditsError = z.object({
|
|
|
42
45
|
}),
|
|
43
46
|
});
|
|
44
47
|
/**
|
|
45
|
-
* На аккаунте висит непогашенный долг.
|
|
48
|
+
* На аккаунте висит непогашенный долг.
|
|
46
49
|
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
50
|
+
* ОТДЕЛЬНЫЙ КОД, А НЕ ОТТЕНОК ПРЕДЫДУЩЕГО, и довод у этого ровно один: у счёта
|
|
51
|
+
* с долгом деньги на балансе БЫВАЮТ. Такое состояние оставляет `topUpHold`
|
|
52
|
+
* (ветка `deferred_to_debt`) — он наращивает долг, не трогая баланс; два других
|
|
53
|
+
* производителя долга обнуляют баланс, заводя его. Ответ «недостаточно
|
|
54
|
+
* кредитов» сказал бы такому счёту заведомую неправду.
|
|
55
|
+
*
|
|
56
|
+
* ⚠️ ВТОРАЯ ПОЛОВИНА ПРЕЖНЕГО ДОВОДА — «агента отправило бы покупать кредиты,
|
|
57
|
+
* которые не снимут блокировку» — СНЯТА КАК ЛОЖНАЯ (clipwright#27): кредиты
|
|
58
|
+
* снимают. Вывод пережил свою причину, и это стоит сказать прямо: оставь я
|
|
59
|
+
* старую формулировку, следующий читатель либо слил бы два кода, увидев, что
|
|
60
|
+
* лечение одно, либо заново вывел бы из неё неверный совет клиенту.
|
|
51
61
|
*/
|
|
52
62
|
export const debtOutstandingError = z.object({
|
|
53
63
|
error: z.object({
|
|
@@ -56,6 +66,40 @@ export const debtOutstandingError = z.object({
|
|
|
56
66
|
debt_credits: z.number().int().positive(),
|
|
57
67
|
}),
|
|
58
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
|
+
});
|
|
59
103
|
/**
|
|
60
104
|
* Сборка тела «не хватило кредитов».
|
|
61
105
|
*
|
|
@@ -74,15 +118,75 @@ export function insufficientCreditsBody(args) {
|
|
|
74
118
|
},
|
|
75
119
|
});
|
|
76
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
|
+
}
|
|
77
131
|
/** Сборка тела «висит долг». См. довод о формулировке выше. */
|
|
78
132
|
export function debtOutstandingBody(args) {
|
|
79
133
|
return debtOutstandingError.parse({
|
|
80
134
|
error: {
|
|
81
135
|
code: "debt_outstanding",
|
|
82
136
|
message: `An outstanding debt of ${args.debtCredits} credits blocks new paid runs. ` +
|
|
83
|
-
"
|
|
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.",
|
|
84
140
|
debt_credits: args.debtCredits,
|
|
85
141
|
},
|
|
86
142
|
});
|
|
87
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
|
+
}
|
|
88
192
|
//# sourceMappingURL=errors.js.map
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;;;;;;;;;;;GAmBG;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;KAC3B,CAAC;CACH,CAAC,CAAC;AAGH,8DAA8D;AAC9D,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC;QACvC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,qDAAqD;QACrD,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;QAC/C,oEAAoE;QACpE,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;KAC9C,CAAC;CACH,CAAC,CAAC;AAGH
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -23,4 +23,14 @@ export * from "./pacing.js";
|
|
|
23
23
|
// Вендор-нейтральные контракты: всё вендорское живёт в адаптерах, не здесь.
|
|
24
24
|
export * from "./render-backend.js";
|
|
25
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";
|
|
26
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,+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"}
|
|
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,14 @@
|
|
|
1
|
+
/** Публичные адреса продукта — одной константой на всех: клиент и лендинг */
|
|
2
|
+
/** обязаны называть один адрес. Разбор и переезд — `docs/03-api.md` §1. */
|
|
3
|
+
/** Свой домен с US-613; адрес площадки жив и не снят (`docs/03-api.md` §1). */
|
|
4
|
+
export declare const PUBLIC_API_BASE_URL = "https://api.clipwright.io";
|
|
5
|
+
/**
|
|
6
|
+
* Пакеты npm, которыми продукт вызывается. Названия печатает и лендинг, и
|
|
7
|
+
* `--help`, и документация — значит это тоже контракт, а не текст страницы.
|
|
8
|
+
*/
|
|
9
|
+
export declare const CLI_PACKAGE = "@clipwright/cli";
|
|
10
|
+
export declare const CLI_BIN = "clipwright";
|
|
11
|
+
export declare const MCP_PACKAGE = "@clipwright/mcp-server";
|
|
12
|
+
/** Адрес API ИЗ ОКРУЖЕНИЯ — только `https:`: по нему уходит `Authorization: Bearer */
|
|
13
|
+
/** cw_…`. Программный `baseUrl` встраивателя не трогаем — его выбирает автор кода. */
|
|
14
|
+
export declare function apiBaseUrlFromEnv(raw: string | undefined): string | undefined;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** Публичные адреса продукта — одной константой на всех: клиент и лендинг */
|
|
2
|
+
/** обязаны называть один адрес. Разбор и переезд — `docs/03-api.md` §1. */
|
|
3
|
+
/** Свой домен с US-613; адрес площадки жив и не снят (`docs/03-api.md` §1). */
|
|
4
|
+
export const PUBLIC_API_BASE_URL = "https://api.clipwright.io";
|
|
5
|
+
/**
|
|
6
|
+
* Пакеты npm, которыми продукт вызывается. Названия печатает и лендинг, и
|
|
7
|
+
* `--help`, и документация — значит это тоже контракт, а не текст страницы.
|
|
8
|
+
*/
|
|
9
|
+
export const CLI_PACKAGE = "@clipwright/cli";
|
|
10
|
+
export const CLI_BIN = "clipwright";
|
|
11
|
+
export const MCP_PACKAGE = "@clipwright/mcp-server";
|
|
12
|
+
/** Петлевые имена — единственное, чему разрешён `http:`: локальный API никуда не */
|
|
13
|
+
/** выходит, и требовать там сертификат значило бы запретить разработку. */
|
|
14
|
+
const LOOPBACK_HOSTS = new Set(["localhost", "127.0.0.1", "[::1]", "::1"]);
|
|
15
|
+
/** Адрес API ИЗ ОКРУЖЕНИЯ — только `https:`: по нему уходит `Authorization: Bearer */
|
|
16
|
+
/** cw_…`. Программный `baseUrl` встраивателя не трогаем — его выбирает автор кода. */
|
|
17
|
+
export function apiBaseUrlFromEnv(raw) {
|
|
18
|
+
if (raw === undefined || raw === "")
|
|
19
|
+
return undefined;
|
|
20
|
+
let url;
|
|
21
|
+
try {
|
|
22
|
+
url = new URL(raw);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
throw new Error(`CLIPWRIGHT_API_URL is not a URL: ${raw}`);
|
|
26
|
+
}
|
|
27
|
+
if (url.protocol === "https:")
|
|
28
|
+
return raw;
|
|
29
|
+
if (url.protocol === "http:" && LOOPBACK_HOSTS.has(url.hostname))
|
|
30
|
+
return raw;
|
|
31
|
+
throw new Error(`CLIPWRIGHT_API_URL must be https (loopback may be http), got ${url.protocol}//${url.hostname}. ` +
|
|
32
|
+
"The api key travels in the Authorization header of every request to it.");
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=public-endpoints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-endpoints.js","sourceRoot":"","sources":["../src/public-endpoints.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,2EAA2E;AAE3E,+EAA+E;AAC/E,MAAM,CAAC,MAAM,mBAAmB,GAAG,2BAA2B,CAAC;AAE/D;;;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"}
|
package/dist/rate-limit.d.ts
CHANGED
|
@@ -136,3 +136,25 @@ export declare function rateLimitedBody(args: {
|
|
|
136
136
|
*/
|
|
137
137
|
targetsRunCreation?: boolean;
|
|
138
138
|
}): RateLimitedError;
|
|
139
|
+
/**
|
|
140
|
+
* Сборка тела «слишком много НЕУДАЧНЫХ ПОПЫТОК АУТЕНТИФИКАЦИИ» (US-626, круг
|
|
141
|
+
* подтверждения).
|
|
142
|
+
*
|
|
143
|
+
* ЖИВЁТ ЗДЕСЬ, А НЕ В МИДЛВАРЕ, ПО ПРАВИЛУ ПРОЕКТА №2 — и это не формальность:
|
|
144
|
+
* литерал `rate_limited`, собранный на месте, поймал сторож
|
|
145
|
+
* `rate-limit.single-source.test.ts` в тот же прогон. Форма 429 у продукта одна,
|
|
146
|
+
* потому что разбирают её клиентские пакеты одной схемой (`rateLimitedError`):
|
|
147
|
+
* тело без любого из трёх чисел не пройдёт разбор вовсе, и агент получит
|
|
148
|
+
* «неизвестный отказ» вместо «подожди столько секунд».
|
|
149
|
+
*
|
|
150
|
+
* ОТЛИЧИЕ ОТ `rateLimitedBody` — ТОЛЬКО СООБЩЕНИЕ, и различать их обязательно.
|
|
151
|
+
* Тот отказ адресован ДЕЙСТВУЮЩЕМУ клиенту и говорит про ведро аккаунта,
|
|
152
|
+
* идемпотентность и второй платный рендер. Этот приходит тому, кто предъявил
|
|
153
|
+
* НЕработающий ключ: ни аккаунта, ни рана у него нет, и совет про
|
|
154
|
+
* `Idempotency-Key` был бы разговором о невозможном.
|
|
155
|
+
*/
|
|
156
|
+
export declare function authThrottledBody(args: {
|
|
157
|
+
limit: number;
|
|
158
|
+
windowSeconds: number;
|
|
159
|
+
retryAfterSeconds: number;
|
|
160
|
+
}): RateLimitedError;
|
package/dist/rate-limit.js
CHANGED
|
@@ -149,4 +149,34 @@ export function rateLimitedBody(args) {
|
|
|
149
149
|
},
|
|
150
150
|
});
|
|
151
151
|
}
|
|
152
|
+
/**
|
|
153
|
+
* Сборка тела «слишком много НЕУДАЧНЫХ ПОПЫТОК АУТЕНТИФИКАЦИИ» (US-626, круг
|
|
154
|
+
* подтверждения).
|
|
155
|
+
*
|
|
156
|
+
* ЖИВЁТ ЗДЕСЬ, А НЕ В МИДЛВАРЕ, ПО ПРАВИЛУ ПРОЕКТА №2 — и это не формальность:
|
|
157
|
+
* литерал `rate_limited`, собранный на месте, поймал сторож
|
|
158
|
+
* `rate-limit.single-source.test.ts` в тот же прогон. Форма 429 у продукта одна,
|
|
159
|
+
* потому что разбирают её клиентские пакеты одной схемой (`rateLimitedError`):
|
|
160
|
+
* тело без любого из трёх чисел не пройдёт разбор вовсе, и агент получит
|
|
161
|
+
* «неизвестный отказ» вместо «подожди столько секунд».
|
|
162
|
+
*
|
|
163
|
+
* ОТЛИЧИЕ ОТ `rateLimitedBody` — ТОЛЬКО СООБЩЕНИЕ, и различать их обязательно.
|
|
164
|
+
* Тот отказ адресован ДЕЙСТВУЮЩЕМУ клиенту и говорит про ведро аккаунта,
|
|
165
|
+
* идемпотентность и второй платный рендер. Этот приходит тому, кто предъявил
|
|
166
|
+
* НЕработающий ключ: ни аккаунта, ни рана у него нет, и совет про
|
|
167
|
+
* `Idempotency-Key` был бы разговором о невозможном.
|
|
168
|
+
*/
|
|
169
|
+
export function authThrottledBody(args) {
|
|
170
|
+
return rateLimitedError.parse({
|
|
171
|
+
error: {
|
|
172
|
+
code: "rate_limited",
|
|
173
|
+
message: `Too many failed authentication attempts: ${args.limit} per ${args.windowSeconds} seconds ` +
|
|
174
|
+
`from this address. Retry in ${args.retryAfterSeconds} seconds. ` +
|
|
175
|
+
`Nothing was charged, and no account was identified.`,
|
|
176
|
+
limit: args.limit,
|
|
177
|
+
window_seconds: args.windowSeconds,
|
|
178
|
+
retry_after_seconds: args.retryAfterSeconds,
|
|
179
|
+
},
|
|
180
|
+
});
|
|
181
|
+
}
|
|
152
182
|
//# sourceMappingURL=rate-limit.js.map
|
package/dist/rate-limit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../src/rate-limit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;;;;;;GAcG;AAEH,gFAAgF;AAChF,MAAM,CAAC,MAAM,uBAAuB,GAAG,mBAAmB,CAAC;AAE3D,8EAA8E;AAC9E,MAAM,CAAC,MAAM,2BAA2B,GAAG,uBAAuB,CAAC;AAEnE;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,mBAAmB,CAAC;AAE3D,uEAAuE;AACvE,MAAM,CAAC,MAAM,kBAAkB,GAAG,aAAa,CAAC;AAEhD,wEAAwE;AACxE,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,CAAC;AAE7C;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAE9C;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAAC,CAAC;AAYpD;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;QAC/B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,6CAA6C;QAC7C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QAClC,gEAAgE;QAChE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QAC3C,iEAAiE;QACjE,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;KACjD,CAAC;CACH,CAAC,CAAC;AAGH;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,IA0B/B;IACC,qFAAqF;IACrF,EAAE;IACF,8EAA8E;IAC9E,eAAe;IACf,EAAE;IACF,wEAAwE;IACxE,0EAA0E;IAC1E,oEAAoE;IACpE,uCAAuC;IACvC,EAAE;IACF,4EAA4E;IAC5E,2EAA2E;IAC3E,6EAA6E;IAC7E,sEAAsE;IACtE,0EAA0E;IAC1E,sEAAsE;IACtE,6EAA6E;IAC7E,mEAAmE;IACnE,0EAA0E;IAC1E,0EAA0E;IAC1E,MAAM,OAAO,GACX,IAAI,CAAC,KAAK,KAAK,MAAM;QACnB,CAAC,CAAC,yEAAyE;QAC3E,CAAC,CAAC,qDAAqD,CAAC;IAE5D,mEAAmE;IACnE,EAAE;IACF,qEAAqE;IACrE,6EAA6E;IAC7E,wEAAwE;IACxE,6EAA6E;IAC7E,gFAAgF;IAChF,MAAM,IAAI,GACR,IAAI,CAAC,KAAK,KAAK,MAAM;QACnB,CAAC,CAAC,4EAA4E;QAC9E,CAAC,CAAC,IAAI,CAAC,kBAAkB,KAAK,IAAI;YAChC,CAAC,CAAC,qIAAqI;YACvI,CAAC,CAAC,sBAAsB,CAAC;IAC/B,OAAO,gBAAgB,CAAC,KAAK,CAAC;QAC5B,KAAK,EAAE;YACL,IAAI,EAAE,cAAc;YACpB,OAAO,EACL,iBAAiB,IAAI,CAAC,KAAK,IAAI,OAAO,QAAQ,IAAI,CAAC,aAAa,wBAAwB;gBACxF,8BAA8B,IAAI,CAAC,iBAAiB,aAAa,IAAI,EAAE;YACzE,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,cAAc,EAAE,IAAI,CAAC,aAAa;YAClC,mBAAmB,EAAE,IAAI,CAAC,iBAAiB;SAC5C;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../src/rate-limit.ts"],"names":[],"mappings":"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"}
|
package/dist/render-backend.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { AspectRatio, Resolution } from "./skills.js";
|
|
2
|
+
import type { VendorRefusalClass } from "./vendor-response.js";
|
|
2
3
|
/**
|
|
3
4
|
* Вендор-нейтральный контракт рендера аватара.
|
|
4
5
|
*
|
|
@@ -44,8 +45,9 @@ export type ImageSource = {
|
|
|
44
45
|
*/
|
|
45
46
|
export interface AvatarClipRequest {
|
|
46
47
|
/**
|
|
47
|
-
* Наш run_id. Адаптер обязан пробросить
|
|
48
|
-
* (`Idempotency-Key`,
|
|
48
|
+
* Наш run_id. Адаптер обязан пробросить в идемпотентность вендора
|
|
49
|
+
* (`Idempotency-Key`, если она есть) ОБЛАСТЬ — `idempotencyScope ?? runId`,
|
|
50
|
+
* а не сам `runId` безусловно: разбор — у поля `idempotencyScope` ниже.
|
|
49
51
|
*/
|
|
50
52
|
runId: string;
|
|
51
53
|
/**
|
|
@@ -122,10 +124,23 @@ export interface RenderBackend {
|
|
|
122
124
|
* Реализация обязана:
|
|
123
125
|
* - разрешать внешность персонажа ВНУТРИ (вендорский каталог), не принимая её
|
|
124
126
|
* из запроса — идентификаторы аватара и каталог наружу не торчат;
|
|
125
|
-
* - слать вендорский `Idempotency-Key`, детерминированный от
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
*
|
|
127
|
+
* - слать вендорский `Idempotency-Key`, детерминированный от ОБЛАСТИ
|
|
128
|
+
* идемпотентности (`req.idempotencyScope ?? req.runId`, US-526), — вторая
|
|
129
|
+
* независимая линия против двойного списания (подтверждено, docs/13).
|
|
130
|
+
* Именно от области, а не от `runId`: у сегментного ролика на один ран
|
|
131
|
+
* приходится несколько платных create, и общий ключ заставил бы вендора
|
|
132
|
+
* вернуть первый ролик в ответ на каждый следующий — молча и с кодом 200;
|
|
133
|
+
* - помечать ошибку признаком `retryable`: 4xx кроме 429 — `false`, 5xx и
|
|
134
|
+
* 429 — `true`.
|
|
135
|
+
*
|
|
136
|
+
* ПРИЗНАК ОПИСЫВАЕТ ПРИРОДУ ОШИБКИ, А НЕ РАЗРЕШЕНИЕ ПОВТОРИТЬ ЭТОТ ВЫЗОВ
|
|
137
|
+
* (уточнение US-606b, круг 11 внешнего ревью; прежняя редакция говорила «их
|
|
138
|
+
* ретрай починит» и читалась как позволение). «Транзиентная» и «можно
|
|
139
|
+
* повторить» — разные утверждения, и для ПЛАТНОГО создания второе всегда
|
|
140
|
+
* ложно: 429 означает, что вендор отбил, а 5xx — что неизвестно, начал ли он
|
|
141
|
+
* работу, и повтор превратил бы одно возможное списание в два достоверных.
|
|
142
|
+
* Признак читается ТОЛЬКО на бесплатном поллинге (`utils/poll-retry.ts`);
|
|
143
|
+
* `createAvatarJob` не повторяется ни при каком статусе.
|
|
129
144
|
*/
|
|
130
145
|
createAvatarJob(req: AvatarClipRequest): Promise<AvatarJobHandle>;
|
|
131
146
|
/**
|
|
@@ -141,7 +156,30 @@ export interface RenderBackend {
|
|
|
141
156
|
* ожидания и бросать по его превышению, а не висеть на зависшей очереди.
|
|
142
157
|
*/
|
|
143
158
|
pollAvatarJob(handle: AvatarJobHandle): Promise<AvatarClipResult>;
|
|
159
|
+
/** Чья причина за отказом: наш счёт у вендора или его беда. ОБЯЗАТЕЛЕН — */
|
|
160
|
+
/** новый вендор без него не скомпилируется. Разбор — `docs/18` §11.6. */
|
|
161
|
+
classifyRefusal(error: unknown): VendorRefusalClass;
|
|
144
162
|
}
|
|
163
|
+
/**
|
|
164
|
+
* ЧИТАТЕЛЬ ПРИЗНАКА, КОТОРЫЙ ТРЕБУЕТ КОНТРАКТ ВЫШЕ (US-606b).
|
|
165
|
+
*
|
|
166
|
+
* ЧТО ОН ЧИТАЕТ: природу ошибки, а не разрешение повторить операцию. Кто и что
|
|
167
|
+
* повторяет — решает вызывающий, и на ПЛАТНОМ создании ответ всегда «ничего»
|
|
168
|
+
* (см. `createAvatarJob` выше). Сегодня единственный потребитель — ретрай
|
|
169
|
+
* бесплатного поллинга.
|
|
170
|
+
*
|
|
171
|
+
* ЗАЧЕМ ЗДЕСЬ, А НЕ У ВЫЗЫВАЮЩЕГО. Обязанность помечать ошибку записана строкой
|
|
172
|
+
* выше, и до этой стори её никто не читал: адаптер считал признак, а
|
|
173
|
+
* потребителя у него не было — то есть контракт держался тестами адаптера на
|
|
174
|
+
* самого себя. Читатель обязан жить там же, где написана обязанность, иначе он
|
|
175
|
+
* станет разбором формы КОНКРЕТНОГО адаптера по месту, и второй бэкенд (Argil в
|
|
176
|
+
* docs/05) выполнит контракт, а вызывающий его не заметит.
|
|
177
|
+
*
|
|
178
|
+
* СТРОГОЕ РАВЕНСТВО `true`, А НЕ ПРИВЕДЕНИЕ К ИСТИНЕ: решение о повторе рядом с
|
|
179
|
+
* деньгами — последнее место, где уместна догадка «похоже на да». Чего в
|
|
180
|
+
* признаке нет (ошибка без поля, чужой объект, строка) — то не повторяется.
|
|
181
|
+
*/
|
|
182
|
+
export declare function isRetryableVendorError(error: unknown): boolean;
|
|
145
183
|
/**
|
|
146
184
|
* Приведение запроса к возможностям бэкенда.
|
|
147
185
|
*
|
package/dist/render-backend.js
CHANGED
|
@@ -1,3 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ЧИТАТЕЛЬ ПРИЗНАКА, КОТОРЫЙ ТРЕБУЕТ КОНТРАКТ ВЫШЕ (US-606b).
|
|
3
|
+
*
|
|
4
|
+
* ЧТО ОН ЧИТАЕТ: природу ошибки, а не разрешение повторить операцию. Кто и что
|
|
5
|
+
* повторяет — решает вызывающий, и на ПЛАТНОМ создании ответ всегда «ничего»
|
|
6
|
+
* (см. `createAvatarJob` выше). Сегодня единственный потребитель — ретрай
|
|
7
|
+
* бесплатного поллинга.
|
|
8
|
+
*
|
|
9
|
+
* ЗАЧЕМ ЗДЕСЬ, А НЕ У ВЫЗЫВАЮЩЕГО. Обязанность помечать ошибку записана строкой
|
|
10
|
+
* выше, и до этой стори её никто не читал: адаптер считал признак, а
|
|
11
|
+
* потребителя у него не было — то есть контракт держался тестами адаптера на
|
|
12
|
+
* самого себя. Читатель обязан жить там же, где написана обязанность, иначе он
|
|
13
|
+
* станет разбором формы КОНКРЕТНОГО адаптера по месту, и второй бэкенд (Argil в
|
|
14
|
+
* docs/05) выполнит контракт, а вызывающий его не заметит.
|
|
15
|
+
*
|
|
16
|
+
* СТРОГОЕ РАВЕНСТВО `true`, А НЕ ПРИВЕДЕНИЕ К ИСТИНЕ: решение о повторе рядом с
|
|
17
|
+
* деньгами — последнее место, где уместна догадка «похоже на да». Чего в
|
|
18
|
+
* признаке нет (ошибка без поля, чужой объект, строка) — то не повторяется.
|
|
19
|
+
*/
|
|
20
|
+
export function isRetryableVendorError(error) {
|
|
21
|
+
return (typeof error === "object" &&
|
|
22
|
+
error !== null &&
|
|
23
|
+
error.retryable === true);
|
|
24
|
+
}
|
|
1
25
|
/**
|
|
2
26
|
* Приведение запроса к возможностям бэкенда.
|
|
3
27
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-backend.js","sourceRoot":"","sources":["../src/render-backend.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"render-backend.js","sourceRoot":"","sources":["../src/render-backend.ts"],"names":[],"mappings":"AAsKA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACb,KAAiC,CAAC,SAAS,KAAK,IAAI,CACtD,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,GAA0D,EAC1D,IAAyB,EACzB,WAAmB;IAEnB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;IAChC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,WAAW,WAAW,oCAAoC,CAAC,CAAC;QAC9E,CAAC;QACD,QAAQ,CAAC,IAAI,CACX,cAAc,UAAU,wBAAwB,WAAW,iBAAiB,QAAQ,EAAE,CACvF,CAAC;QACF,UAAU,GAAG,QAAQ,CAAC;IACxB,CAAC;IAED,IAAI,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC;IAClC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,WAAW,WAAW,sCAAsC,CAAC,CAAC;QAChF,CAAC;QACD,QAAQ,CAAC,IAAI,CACX,gBAAgB,WAAW,wBAAwB,WAAW,iBAAiB,QAAQ,EAAE,CAC1F,CAAC;QACF,WAAW,GAAG,QAAQ,CAAC;IACzB,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Сохранённый вход нечитаем: перечислить несоблюдённые поля нечем. */
|
|
2
|
+
export declare const UNREADABLE_RUN_INPUT_WARNING = "run input could not be read: parameters that are accepted but not honored cannot be listed for this run";
|
|
3
|
+
export declare function derivedRunWarnings(storedInput: unknown): string[];
|
|
4
|
+
/** Полный `warnings[]` рана. Выводимое первым — тем же порядком, что у `quote`. */
|
|
5
|
+
export declare function composeRunWarnings(stored: unknown, storedInput: unknown): string[];
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { makeUgcInput, resolvedScript } from "./skills.js";
|
|
2
|
+
import { dispositionWarnings } from "./contract-dispositions.js";
|
|
3
|
+
import { buildVoiceWarnings } from "./voices.js";
|
|
4
|
+
// Писатели хранят невыводимое, читатель выводит статику. Рационал — docs/18, Д41.
|
|
5
|
+
/** Сохранённый вход нечитаем: перечислить несоблюдённые поля нечем. */
|
|
6
|
+
export const UNREADABLE_RUN_INPUT_WARNING = "run input could not be read: parameters that are accepted but not honored cannot be listed for this run";
|
|
7
|
+
// Реестр диспозиций и языковой warning пресета. Почему без `voice_id` —
|
|
8
|
+
// docs/18, Д41.
|
|
9
|
+
export function derivedRunWarnings(storedInput) {
|
|
10
|
+
const parsed = makeUgcInput.safeParse(storedInput);
|
|
11
|
+
if (!parsed.success) {
|
|
12
|
+
return [UNREADABLE_RUN_INPUT_WARNING];
|
|
13
|
+
}
|
|
14
|
+
const input = parsed.data;
|
|
15
|
+
return [
|
|
16
|
+
...dispositionWarnings(input),
|
|
17
|
+
...buildVoiceWarnings({ voice: input.voice, script: resolvedScript(input) }),
|
|
18
|
+
];
|
|
19
|
+
}
|
|
20
|
+
/** Строки колонки `warnings`; нечитаемое значение даёт пустой список. */
|
|
21
|
+
function storedStrings(stored) {
|
|
22
|
+
if (!Array.isArray(stored))
|
|
23
|
+
return [];
|
|
24
|
+
return stored.filter((item) => typeof item === "string");
|
|
25
|
+
}
|
|
26
|
+
/** Полный `warnings[]` рана. Выводимое первым — тем же порядком, что у `quote`. */
|
|
27
|
+
export function composeRunWarnings(stored, storedInput) {
|
|
28
|
+
return [...new Set([...derivedRunWarnings(storedInput), ...storedStrings(stored)])];
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=run-static-warnings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-static-warnings.js","sourceRoot":"","sources":["../src/run-static-warnings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,kFAAkF;AAElF,uEAAuE;AACvE,MAAM,CAAC,MAAM,4BAA4B,GACvC,yGAAyG,CAAC;AAE5G,wEAAwE;AACxE,gBAAgB;AAChB,MAAM,UAAU,kBAAkB,CAAC,WAAoB;IACrD,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACnD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,4BAA4B,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;IAC1B,OAAO;QACL,GAAG,mBAAmB,CAAC,KAAK,CAAC;QAC7B,GAAG,kBAAkB,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;KAC7E,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,SAAS,aAAa,CAAC,MAAe;IACpC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC;AAC3E,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,kBAAkB,CAAC,MAAe,EAAE,WAAoB;IACtE,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,kBAAkB,CAAC,WAAW,CAAC,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AACtF,CAAC"}
|
package/dist/runs.d.ts
CHANGED
|
@@ -53,6 +53,9 @@ export declare const AI_DISCLOSURE_TEXT = "This video was generated with AI: the
|
|
|
53
53
|
* всегда и детерминированно, без разбора боксов MP4.
|
|
54
54
|
*/
|
|
55
55
|
export declare const AI_DISCLOSURE_OBJECT_METADATA: Readonly<Record<string, string>>;
|
|
56
|
+
/** Форма идентификатора рана. Отдельной схемой, потому что её спрашивают и на */
|
|
57
|
+
/** ВХОДЕ — MCP-тул `get_run`, где голый `z.string()` пускал мусор до сети. */
|
|
58
|
+
export declare const runId: z.ZodString;
|
|
56
59
|
export declare const run: z.ZodObject<{
|
|
57
60
|
run_id: z.ZodString;
|
|
58
61
|
skill: z.ZodString;
|
package/dist/runs.js
CHANGED
|
@@ -49,13 +49,30 @@ export const AI_DISCLOSURE_OBJECT_METADATA = {
|
|
|
49
49
|
generator: "clipwright",
|
|
50
50
|
"ai-disclosure": AI_DISCLOSURE_TEXT,
|
|
51
51
|
};
|
|
52
|
+
/** Форма идентификатора рана. Отдельной схемой, потому что её спрашивают и на */
|
|
53
|
+
/** ВХОДЕ — MCP-тул `get_run`, где голый `z.string()` пускал мусор до сети. */
|
|
54
|
+
export const runId = z.string().regex(/^run_[a-zA-Z0-9]+$/);
|
|
52
55
|
export const run = z.object({
|
|
53
|
-
run_id:
|
|
56
|
+
run_id: runId,
|
|
54
57
|
skill: z.string(),
|
|
55
58
|
state: runState,
|
|
56
59
|
credits_reserved: z.number().int().nonnegative(),
|
|
57
60
|
credits_charged: z.number().int().nonnegative().nullable(),
|
|
58
61
|
warnings: z.array(z.string()).default([]),
|
|
62
|
+
/**
|
|
63
|
+
* Причина. НЕПУСТОЙ `error` НЕ ЗНАЧИТ `state: "failed"` — и это стало правдой
|
|
64
|
+
* с clipwright#48, поэтому сказано здесь, в контракте, а не только в коде.
|
|
65
|
+
*
|
|
66
|
+
* Второй случай: ран, не доживший до расчёта, чей счёт записал предыдущий
|
|
67
|
+
* проход сборщика. Его исход НЕИЗВЕСТЕН — успел он отдать видео или упал,
|
|
68
|
+
* по строке рана не различить, — поэтому состояние остаётся нетерминальным
|
|
69
|
+
* (врать о нём нельзя), а `error` несёт пометку «нужен разбор человеком».
|
|
70
|
+
* Пишет её `markRunForReview`.
|
|
71
|
+
*
|
|
72
|
+
* ЧТО ИЗ ЭТОГО СЛЕДУЕТ КЛИЕНТУ: опрос по-прежнему ждёт `succeeded` либо
|
|
73
|
+
* `failed`, а `error` при нетерминальном состоянии читается как объяснение
|
|
74
|
+
* задержки, а не как исход. Ран в этом состоянии сам не завершится.
|
|
75
|
+
*/
|
|
59
76
|
error: z.string().nullable(),
|
|
60
77
|
final_output: z
|
|
61
78
|
.object({
|
package/dist/runs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runs.js","sourceRoot":"","sources":["../src/runs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,qDAAqD;AACrD,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,QAAQ;IACR,WAAW;IACX,KAAK;IACL,QAAQ;IACR,aAAa;IACb,WAAW;IACX,WAAW;IACX,QAAQ;CACA,CAAC;AAEX,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAG3C,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC5D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC5C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC7C,SAAS,EAAE,CAAC;SACT,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;SACrF,OAAO,CAAC,EAAE,CAAC;CACf,CAAC,CAAC;AAEH;;;;GAIG;AACH;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAC7B,wFAAwF,CAAC;AAE3F;;;;;GAKG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAqC;IAC7E,cAAc,EAAE,MAAM;IACtB,SAAS,EAAE,YAAY;IACvB,eAAe,EAAE,kBAAkB;CACpC,CAAC;AAEF,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"runs.js","sourceRoot":"","sources":["../src/runs.ts"],"names":[],"mappings":"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"}
|
package/dist/skills.d.ts
CHANGED
|
@@ -45,7 +45,23 @@ export declare const DEV_RESOLUTION: Resolution;
|
|
|
45
45
|
*/
|
|
46
46
|
export declare function resolveResolution(requested: Resolution | undefined, isDev: boolean): Resolution;
|
|
47
47
|
/**
|
|
48
|
-
*
|
|
48
|
+
* ⚠️ ЭТО БАЗИС ВЫВОДА ПОТОЛКА СЛОВ, А НЕ ПОТОЛОК СЕКУНД, и имя переименовано
|
|
49
|
+
* ровно поэтому (находка внешней приёмки, круг 23). Прежнее — `MAX_SCRIPT_SECONDS`
|
|
50
|
+
* — читалось как «максимум секунд» и дважды подряд стало источником ДЕНЕЖНОГО
|
|
51
|
+
* дефекта на публичной странице цены: ею зажимали длительность, обещая клиенту
|
|
52
|
+
* меньше возможного счёта. Схема ограничивает только СЛОВА; сколько из них выйдет
|
|
53
|
+
* секунд, не ограничено ничем, потому что гейт пейсинга удалён.
|
|
54
|
+
*
|
|
55
|
+
* Число осталось прежним, роль названа честно: это множимое, из которого вместе
|
|
56
|
+
* с быстрым краем пейсинга получается `MAX_SCRIPT_WORDS`.
|
|
57
|
+
*
|
|
58
|
+
* ⚠️ ИСХОДНЫЙ ДОВОД НИЖЕ ОПИСЫВАЕТ ПОЛОЖЕНИЕ ДО УДАЛЕНИЯ ГЕЙТА ПЕЙСИНГА и
|
|
59
|
+
* оставлен как история, а не как действующее объяснение (находка внешней
|
|
60
|
+
* приёмки, круг 24): он объясняет число через «~45с озвучки» и пейсинг-гейт,
|
|
61
|
+
* которого с 2026-07-22 не существует. Действующее объяснение — абзац выше:
|
|
62
|
+
* это множимое, и ограничивает контракт только слова.
|
|
63
|
+
*
|
|
64
|
+
* Исходный довод (docs/12 §11) — временная замена
|
|
49
65
|
* мульти-тейка (docs/12 §3: длинные скрипты раньше резались на несколько
|
|
50
66
|
* тейков, эта логика вырезана на время прототипа). Пока мульти-тейк не
|
|
51
67
|
* вернули, скрипт длиннее одного тейка нужно отклонять на входе, а не
|
|
@@ -56,8 +72,17 @@ export declare function resolveResolution(requested: Resolution | undefined, isD
|
|
|
56
72
|
* потолок секунд без нарушения пейсинг-гейта. Числа пейсинга не дублируем,
|
|
57
73
|
* берём готовые константы из pacing.ts.
|
|
58
74
|
*/
|
|
59
|
-
export declare const
|
|
75
|
+
export declare const SCRIPT_SECONDS_BASIS = 45;
|
|
60
76
|
export declare const MAX_SCRIPT_WORDS: number;
|
|
77
|
+
/** Потолок длины ЛЮБОГО адреса из чужого тела: без него поле берёт весь потолок */
|
|
78
|
+
/** тела запроса. Число — верхний предел, который переваривает любой браузер и CDN. */
|
|
79
|
+
export declare const MAX_URL_LENGTH = 2048;
|
|
80
|
+
/** ЧТО ДЕЛАЕТ `make_ugc` — один текст на обе контрактные поверхности: публичный */
|
|
81
|
+
/** REST-каталог и MCP `tools/list`. Разойдясь, они описали бы РАЗНЫЙ скилл. */
|
|
82
|
+
export declare const MAKE_UGC_DESCRIPTION: string;
|
|
83
|
+
/** Как ЗВАТЬ скилл по MCP. Отдельно от описания выше: имена соседних тулов и */
|
|
84
|
+
/** поллинг — свойства протокола, и REST-каталогу они не адресованы. */
|
|
85
|
+
export declare const MAKE_UGC_AGENT_PROTOCOL: string;
|
|
61
86
|
/**
|
|
62
87
|
* Сырой zod-shape входа make_ugc — БЕЗ `.refine()`.
|
|
63
88
|
*
|