@clipwright/core 0.1.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 +21 -0
- package/README.md +14 -0
- package/dist/aspect.d.ts +153 -0
- package/dist/aspect.js +237 -0
- package/dist/aspect.js.map +1 -0
- package/dist/contract-dispositions.d.ts +335 -0
- package/dist/contract-dispositions.js +358 -0
- package/dist/contract-dispositions.js.map +1 -0
- package/dist/idempotency.d.ts +45 -0
- package/dist/idempotency.js +72 -0
- package/dist/idempotency.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/pacing.d.ts +4 -0
- package/dist/pacing.js +7 -0
- package/dist/pacing.js.map +1 -0
- package/dist/render-backend.d.ts +157 -0
- package/dist/render-backend.js +31 -0
- package/dist/render-backend.js.map +1 -0
- package/dist/runs.d.ts +176 -0
- package/dist/runs.js +137 -0
- package/dist/runs.js.map +1 -0
- package/dist/skills.d.ts +270 -0
- package/dist/skills.js +291 -0
- package/dist/skills.js.map +1 -0
- package/dist/tts-backend.d.ts +67 -0
- package/dist/tts-backend.js +54 -0
- package/dist/tts-backend.js.map +1 -0
- package/dist/voices.d.ts +166 -0
- package/dist/voices.js +193 -0
- package/dist/voices.js.map +1 -0
- package/package.json +38 -0
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { makeUgcInputShape } from "./skills.js";
|
|
3
|
+
/**
|
|
4
|
+
* РЕЕСТР ДИСПОЗИЦИЙ ПОЛЕЙ ВХОДА `make_ugc`.
|
|
5
|
+
*
|
|
6
|
+
* ЗАЧЕМ ОН ЕСТЬ. Аудит 2026-07-21 показал: из четырнадцати полей публичного
|
|
7
|
+
* контракта на выход влияли четыре, а десять принимались и МОЛЧА игнорировались
|
|
8
|
+
* — включая все три поля идентичности и `webhook_url` (клиент подписывался на
|
|
9
|
+
* уведомление и не получал ничего). Это прямое нарушение правила проекта №3.
|
|
10
|
+
* Точечная починка вернула бы тот же класс дефекта при следующей фиче, поэтому
|
|
11
|
+
* лечится не список полей, а МЕХАНИЗМ: у каждого поля обязано быть записанное
|
|
12
|
+
* решение, и отсутствие решения ловится компилятором.
|
|
13
|
+
*
|
|
14
|
+
* ЧТО ЭТОТ ФАЙЛ НЕ ДЕЛАЕТ — И ЭТО ГЛАВНОЕ. Тип `Record<keyof …, Disposition>`
|
|
15
|
+
* — страж ПОЛНОТЫ, а не ИСТИННОСТИ: он ловит отсутствие строки, но не её
|
|
16
|
+
* неверность. Именно так `resolution` числился бы «работающим», хотя адаптер
|
|
17
|
+
* шлёт вендору литерал. Истинность строки `implemented` доказывает EGRESS-ТЕСТ
|
|
18
|
+
* (`contract-dispositions.egress.test.ts`): изменение значения поля обязано
|
|
19
|
+
* давать наблюдаемое различие в захваченном теле исходящего запроса вендору.
|
|
20
|
+
* Запись без egress-теста считается недоказанной — за этим следит мета-тест.
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Версия публичного контракта. Отдаётся заголовком `X-Clipwright-Contract` и
|
|
24
|
+
* полем `contract_version` в ответе quote. Любое следующее ломающее изменение
|
|
25
|
+
* обязано её двигать; до этого пересмотра версии не было вообще, поэтому первое
|
|
26
|
+
* её значение совпадает с месяцем самого пересмотра.
|
|
27
|
+
*/
|
|
28
|
+
export declare const CONTRACT_VERSION = "2026-08";
|
|
29
|
+
export declare const CONTRACT_VERSION_HEADER = "X-Clipwright-Contract";
|
|
30
|
+
/**
|
|
31
|
+
* Решение по одному полю входа.
|
|
32
|
+
*
|
|
33
|
+
* `implemented` — поле доезжает до вендора или до дерева композиции; `provenBy`
|
|
34
|
+
* называет, ЧЕМ это доказано, и мета-тест требует наличия такого теста.
|
|
35
|
+
* `rejected` — поле не работает и приниматься не должно: 400 на входе, до
|
|
36
|
+
* создания рана и до резервирования кредитов.
|
|
37
|
+
* `warned` — поле не работает, но отказ был бы хуже принятия (ломал бы
|
|
38
|
+
* happy-path или дефолт), поэтому несоблюдение объявляется в `warnings[]`.
|
|
39
|
+
*
|
|
40
|
+
* `triggersWhen` существует потому, что часть полей объявлена с `.default()` и
|
|
41
|
+
* после `parse` присутствует ВСЕГДА. Предикат «поле присутствует → warning»
|
|
42
|
+
* выдавал бы предупреждение на каждом дефолтном happy-path — прямое нарушение
|
|
43
|
+
* записанного в нашем же коде теста допустимости (`voices.ts`, условие (iii)).
|
|
44
|
+
* Для полей с дефолтом предикат — `differs-from-default`, для чисто
|
|
45
|
+
* опциональных — `present`.
|
|
46
|
+
*/
|
|
47
|
+
export type Disposition = {
|
|
48
|
+
kind: "implemented";
|
|
49
|
+
provenBy: "egress" | "composition";
|
|
50
|
+
} | {
|
|
51
|
+
kind: "rejected";
|
|
52
|
+
message: string;
|
|
53
|
+
} | {
|
|
54
|
+
kind: "warned";
|
|
55
|
+
warning: string;
|
|
56
|
+
triggersWhen: "present" | "differs-from-default";
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Таблица решений. `as const satisfies Record<…>` даёт СРАЗУ ДВА свойства:
|
|
60
|
+
* `satisfies` — страж полноты (поле входа без строки здесь не компилируется),
|
|
61
|
+
* `as const` — литеральные типы, из которых ниже выводится множество
|
|
62
|
+
* отклонённых полей. Обычная аннотация `: Record<…>` дала бы только первое, и
|
|
63
|
+
* `offeredUgcInputShape` пришлось бы перечислять руками — то есть завести
|
|
64
|
+
* второй источник правды ровно там, где мы чиним последствия первого.
|
|
65
|
+
*/
|
|
66
|
+
export declare const FIELD_DISPOSITIONS: {
|
|
67
|
+
readonly script: {
|
|
68
|
+
readonly kind: "implemented";
|
|
69
|
+
readonly provenBy: "egress";
|
|
70
|
+
};
|
|
71
|
+
readonly voice: {
|
|
72
|
+
readonly kind: "implemented";
|
|
73
|
+
readonly provenBy: "egress";
|
|
74
|
+
};
|
|
75
|
+
readonly voice_id: {
|
|
76
|
+
readonly kind: "implemented";
|
|
77
|
+
readonly provenBy: "egress";
|
|
78
|
+
};
|
|
79
|
+
readonly person: {
|
|
80
|
+
readonly kind: "warned";
|
|
81
|
+
readonly warning: "person is not honored yet: every clip is rendered with the default actor";
|
|
82
|
+
readonly triggersWhen: "present";
|
|
83
|
+
};
|
|
84
|
+
readonly name: {
|
|
85
|
+
readonly kind: "warned";
|
|
86
|
+
readonly warning: "name is not honored yet: it does not reach the renderer";
|
|
87
|
+
readonly triggersWhen: "present";
|
|
88
|
+
};
|
|
89
|
+
readonly look: {
|
|
90
|
+
readonly kind: "warned";
|
|
91
|
+
readonly warning: "look is not honored yet: it does not reach the renderer";
|
|
92
|
+
readonly triggersWhen: "differs-from-default";
|
|
93
|
+
};
|
|
94
|
+
readonly captions: {
|
|
95
|
+
readonly kind: "warned";
|
|
96
|
+
readonly warning: "captions requested but not rendered in this prototype (stage-B)";
|
|
97
|
+
readonly triggersWhen: "differs-from-default";
|
|
98
|
+
};
|
|
99
|
+
readonly caption_style: {
|
|
100
|
+
readonly kind: "warned";
|
|
101
|
+
readonly warning: "caption_style is not honored: captions are not rendered in this prototype (stage-B)";
|
|
102
|
+
readonly triggersWhen: "differs-from-default";
|
|
103
|
+
};
|
|
104
|
+
readonly resolution: {
|
|
105
|
+
readonly kind: "implemented";
|
|
106
|
+
readonly provenBy: "egress";
|
|
107
|
+
};
|
|
108
|
+
readonly aspect_ratio: {
|
|
109
|
+
readonly kind: "implemented";
|
|
110
|
+
readonly provenBy: "egress";
|
|
111
|
+
};
|
|
112
|
+
readonly image: {
|
|
113
|
+
readonly kind: "implemented";
|
|
114
|
+
readonly provenBy: "egress";
|
|
115
|
+
};
|
|
116
|
+
readonly segments: {
|
|
117
|
+
readonly kind: "rejected";
|
|
118
|
+
readonly message: "segmented clips are not available yet: pass `script` with the full spoken text instead";
|
|
119
|
+
};
|
|
120
|
+
readonly character: {
|
|
121
|
+
readonly kind: "rejected";
|
|
122
|
+
readonly message: "character is not supported: saved characters do not exist yet. Describe the actor with `person` instead, or omit it to use the default actor";
|
|
123
|
+
};
|
|
124
|
+
readonly broll_url: {
|
|
125
|
+
readonly kind: "rejected";
|
|
126
|
+
readonly message: "broll_url is not supported yet: b-roll requires segmented composition. Omit it";
|
|
127
|
+
};
|
|
128
|
+
readonly disclosure_overlay: {
|
|
129
|
+
readonly kind: "implemented";
|
|
130
|
+
readonly provenBy: "composition";
|
|
131
|
+
};
|
|
132
|
+
readonly background: {
|
|
133
|
+
readonly kind: "implemented";
|
|
134
|
+
readonly provenBy: "composition";
|
|
135
|
+
};
|
|
136
|
+
readonly webhook_url: {
|
|
137
|
+
readonly kind: "rejected";
|
|
138
|
+
readonly message: "webhook_url is not supported: no webhook is ever delivered. Poll get_run with the run_id instead";
|
|
139
|
+
};
|
|
140
|
+
};
|
|
141
|
+
export type ContractField = keyof typeof FIELD_DISPOSITIONS;
|
|
142
|
+
/**
|
|
143
|
+
* Операционные переключатели, меняющие диспозицию поля БЕЗ правки кода.
|
|
144
|
+
*
|
|
145
|
+
* Смысл ровно один: погасить инцидент. Исходящая сетевая поверхность (проба
|
|
146
|
+
* чужого `image`) выключается флагом, и тогда поле обязано ОТКЛОНЯТЬСЯ, а не
|
|
147
|
+
* приниматься и тихо игнорироваться — иначе выключение килсвитча само стало бы
|
|
148
|
+
* молчаливой подменой, то есть тем дефектом, который реестр и лечит. Запросы
|
|
149
|
+
* БЕЗ `image` при этом продолжают рендериться на дефолтном актёре.
|
|
150
|
+
*/
|
|
151
|
+
export interface ContractFlags {
|
|
152
|
+
remoteFetch: boolean;
|
|
153
|
+
/** Стадия композиции (US-527, `CLIPWRIGHT_COMPOSE`). */
|
|
154
|
+
compose: boolean;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Значение флагов из окружения. Читается один раз на процесс: килсвитч ставится
|
|
158
|
+
* на деплое, а не меняется от запроса к запросу, и `tools/list` не должен
|
|
159
|
+
* дрожать между двумя соседними вызовами.
|
|
160
|
+
*/
|
|
161
|
+
export declare function contractFlagsFromEnv(env?: Record<string, string | undefined>): ContractFlags;
|
|
162
|
+
export declare function resolveDispositions(flags: ContractFlags): Record<ContractField, Disposition>;
|
|
163
|
+
/**
|
|
164
|
+
* ДЕЙСТВУЮЩАЯ таблица процесса — то, из чего строятся все поверхности.
|
|
165
|
+
*
|
|
166
|
+
* Отличается от `FIELD_DISPOSITIONS` ровно на применённые флаги: базовая
|
|
167
|
+
* таблица говорит, что код УМЕЕТ, эта — что он предлагает прямо сейчас.
|
|
168
|
+
*/
|
|
169
|
+
export declare const EFFECTIVE_DISPOSITIONS: Record<"aspect_ratio" | "background" | "broll_url" | "caption_style" | "captions" | "character" | "disclosure_overlay" | "image" | "look" | "name" | "person" | "resolution" | "script" | "segments" | "voice" | "voice_id" | "webhook_url", Disposition>;
|
|
170
|
+
type RejectedField = {
|
|
171
|
+
[K in ContractField]: (typeof FIELD_DISPOSITIONS)[K]["kind"] extends "rejected" ? K : never;
|
|
172
|
+
}[ContractField];
|
|
173
|
+
/**
|
|
174
|
+
* Множество предлагаемых полей считается по БАЗОВОЙ таблице — и на уровне
|
|
175
|
+
* типов, и на уровне значения (см. примечание о топологии ниже). Килсвитч —
|
|
176
|
+
* аварийное состояние сервера, а не форма контракта.
|
|
177
|
+
*/
|
|
178
|
+
type OfferedField = Exclude<ContractField, RejectedField>;
|
|
179
|
+
/**
|
|
180
|
+
* Текст диспозиции для JSON-Schema `description` (блокер B9).
|
|
181
|
+
*
|
|
182
|
+
* ЗАЧЕМ: `offeredUgcInputShape` убирает отклонённое поле из схемы, но там, где
|
|
183
|
+
* поле почему-либо остаётся видимым, вызыватель обязан прочитать ПРИЧИНУ прямо
|
|
184
|
+
* в описании. Тогда самоописательность — свойство схемы по построению, а не
|
|
185
|
+
* разовая правка двух файлов, которую следующее поле воспроизведёт заново.
|
|
186
|
+
*/
|
|
187
|
+
/**
|
|
188
|
+
* Примечание для JSON-Schema `description` — по БАЗОВОЙ таблице.
|
|
189
|
+
*
|
|
190
|
+
* Варианта «по действующей таблице» здесь нет НАМЕРЕННО, и это следствие
|
|
191
|
+
* топологии: схему видит клиент, а флаги принадлежат серверу. Причину
|
|
192
|
+
* аварийного отказа вызыватель узнаёт из текста 400, а не из описания поля,
|
|
193
|
+
* которое у него в схеме и так осталось.
|
|
194
|
+
*/
|
|
195
|
+
export declare function dispositionNote(field: ContractField): string | null;
|
|
196
|
+
/**
|
|
197
|
+
* ПРИМЕЧАНИЕ О ТОПОЛОГИИ, БЕЗ КОТОРОГО ВЫБОР НИЖЕ ВЫГЛЯДИТ ПРОИЗВОЛЬНЫМ.
|
|
198
|
+
*
|
|
199
|
+
* `offeredUgcInputShape` порождает `tools/list` MCP-сервера, а MCP-сервер —
|
|
200
|
+
* stdio-процесс НА МАШИНЕ ПОЛЬЗОВАТЕЛЯ, говорящий с нашим API по HTTP. Значит
|
|
201
|
+
* его `process.env` — окружение КЛИЕНТА, а не сервера. Строй мы предлагаемую
|
|
202
|
+
* поверхность по флагам, аварийный рубильник сервера начал бы управлять
|
|
203
|
+
* клиентской схемой: у пользователя без `CLIPWRIGHT_REMOTE_FETCH` поле `image`
|
|
204
|
+
* пропадало бы из `tools/list`, даже когда на сервере оно работает, — и
|
|
205
|
+
* наоборот, выставив переменную у себя, клиент вернул бы поле в схему, а
|
|
206
|
+
* сервер ответил бы 400.
|
|
207
|
+
*
|
|
208
|
+
* Поэтому граница проведена так:
|
|
209
|
+
* - ЧТО ПРЕДЛАГАЕТСЯ (схема, типы SDK, `--help`) — из БАЗОВОЙ таблицы: это
|
|
210
|
+
* форма контракта, одинаковая у всех;
|
|
211
|
+
* - ЧТО ПРИНИМАЕТСЯ ПРЯМО СЕЙЧАС (`rejectedFields`, `dispositionWarnings`) —
|
|
212
|
+
* из ДЕЙСТВУЮЩЕЙ: это решение сервера, и принимает его сервер.
|
|
213
|
+
* Килсвитч остаётся аварийным отказом на входе API, а не правкой чужой схемы.
|
|
214
|
+
*/
|
|
215
|
+
/**
|
|
216
|
+
* Полный shape входа, где каждое несоблюдённое поле несёт причину в описании.
|
|
217
|
+
* Нужен там, где поверхность обязана показать ВСЕ поля (например, таблица
|
|
218
|
+
* диспозиций в доках); предлагать поля вызывателю следует не отсюда, а из
|
|
219
|
+
* `offeredUgcInputShape`.
|
|
220
|
+
*/
|
|
221
|
+
export declare const annotatedUgcInputShape: typeof makeUgcInputShape;
|
|
222
|
+
/**
|
|
223
|
+
* ПРЕДЛАГАЕМАЯ поверхность входа = полный shape МИНУС отклонённые поля
|
|
224
|
+
* (блокер B4).
|
|
225
|
+
*
|
|
226
|
+
* Отбивать отклонённое поле четырёхсотым, продолжая объявлять его в
|
|
227
|
+
* `tools/list`, в `--help` и в типах SDK, — это «предлагаем и наказываем»:
|
|
228
|
+
* агент читает схему, видит `character`, вызывает и получает 400. Множество
|
|
229
|
+
* выводится ИЗ РЕЕСТРА, поэтому смена диспозиции переносит поле между
|
|
230
|
+
* поверхностями одной строкой, а не правкой каждого потребителя.
|
|
231
|
+
*/
|
|
232
|
+
export declare const offeredUgcInputShape: Pick<typeof makeUgcInputShape, OfferedField>;
|
|
233
|
+
/**
|
|
234
|
+
* Тип ВХОДА для SDK/CLI/MCP — выводится из ПРЕДЛАГАЕМОГО shape, а не из
|
|
235
|
+
* полного (блокер B4 на поверхности типов). Раньше он строился из полной схемы,
|
|
236
|
+
* и TypeScript-пользователь получал автокомплит на `character`/`webhook_url`,
|
|
237
|
+
* вызывал и получал 400 — тот же дефект «предлагаем и наказываем», только не в
|
|
238
|
+
* MCP. По правилу проекта №2 типы SDK — контрактная поверхность наравне с
|
|
239
|
+
* остальными.
|
|
240
|
+
*
|
|
241
|
+
* ЗАЧЕМ отдельно от `MakeUgcInput` (= выход `z.infer`, где дефолты уже
|
|
242
|
+
* обязательны): без него SDK ждал бы полностью заполненный объект.
|
|
243
|
+
*/
|
|
244
|
+
export declare const offeredUgcInput: z.ZodObject<{
|
|
245
|
+
script: z.ZodOptional<z.ZodString>;
|
|
246
|
+
person: z.ZodOptional<z.ZodString>;
|
|
247
|
+
image: z.ZodOptional<z.ZodString>;
|
|
248
|
+
name: z.ZodOptional<z.ZodString>;
|
|
249
|
+
captions: z.ZodDefault<z.ZodBoolean>;
|
|
250
|
+
caption_style: z.ZodDefault<z.ZodEnum<{
|
|
251
|
+
hormozi: "hormozi";
|
|
252
|
+
minimal: "minimal";
|
|
253
|
+
tiktok: "tiktok";
|
|
254
|
+
}>>;
|
|
255
|
+
look: z.ZodDefault<z.ZodEnum<{
|
|
256
|
+
commercial: "commercial";
|
|
257
|
+
natural: "natural";
|
|
258
|
+
raw_iphone: "raw_iphone";
|
|
259
|
+
}>>;
|
|
260
|
+
aspect_ratio: z.ZodOptional<z.ZodEnum<{
|
|
261
|
+
"16:9": "16:9";
|
|
262
|
+
"1:1": "1:1";
|
|
263
|
+
"9:16": "9:16";
|
|
264
|
+
}>>;
|
|
265
|
+
resolution: z.ZodOptional<z.ZodEnum<{
|
|
266
|
+
"1080p": "1080p";
|
|
267
|
+
"4k": "4k";
|
|
268
|
+
"720p": "720p";
|
|
269
|
+
}>>;
|
|
270
|
+
voice: z.ZodOptional<z.ZodEnum<{
|
|
271
|
+
daria_ru_female: "daria_ru_female";
|
|
272
|
+
eric: "eric";
|
|
273
|
+
george: "george";
|
|
274
|
+
owner_ru_clone: "owner_ru_clone";
|
|
275
|
+
sarah: "sarah";
|
|
276
|
+
}>>;
|
|
277
|
+
voice_id: z.ZodOptional<z.ZodString>;
|
|
278
|
+
disclosure_overlay: z.ZodOptional<z.ZodBoolean>;
|
|
279
|
+
background: z.ZodOptional<z.ZodEnum<{
|
|
280
|
+
blur: "blur";
|
|
281
|
+
contain: "contain";
|
|
282
|
+
white: "white";
|
|
283
|
+
}>>;
|
|
284
|
+
}, z.core.$strip>;
|
|
285
|
+
export type MakeUgcInputArgs = z.input<typeof offeredUgcInput>;
|
|
286
|
+
/** Одно отклонённое поле, найденное во входе: имя и причина отказа. */
|
|
287
|
+
export interface RejectedFieldHit {
|
|
288
|
+
field: ContractField;
|
|
289
|
+
message: string;
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Отклонённые поля, ПРИСУТСТВУЮЩИЕ во входе. Один вызов — три поверхности:
|
|
293
|
+
* зовётся на входе API (400 до создания рана и до резервирования кредитов), в
|
|
294
|
+
* MCP и в SDK.
|
|
295
|
+
*/
|
|
296
|
+
export declare function rejectedFields(input: Readonly<Record<string, unknown>>): RejectedFieldHit[];
|
|
297
|
+
/**
|
|
298
|
+
* Warnings реестра для входа рана (правило проекта №3).
|
|
299
|
+
*
|
|
300
|
+
* Вход ожидается УЖЕ РАСПАРСЕННЫМ: дефолты подставлены, поэтому сравнение с
|
|
301
|
+
* дефолтом различает «клиент промолчал» и «клиент явно попросил другое».
|
|
302
|
+
* Сравнение через `===` достаточно: все дефолтные значения контракта —
|
|
303
|
+
* примитивы (строка или булев).
|
|
304
|
+
*
|
|
305
|
+
* Это статические тексты диспозиций. ДИНАМИЧЕСКИЕ warnings (подмена
|
|
306
|
+
* разрешения/формата, голосовые) порождаются именованными генераторами
|
|
307
|
+
* (`negotiateCapabilities`, `buildVoiceWarnings`,
|
|
308
|
+
* `RAW_VOICE_ID_VALIDATION_WARNING`) — каждый со своим тестом; реестр их не
|
|
309
|
+
* поглощает и на них не претендует.
|
|
310
|
+
*/
|
|
311
|
+
export declare function dispositionWarnings(input: Readonly<Record<string, unknown>>): string[];
|
|
312
|
+
/**
|
|
313
|
+
* Поля с диспозицией `implemented` — вход мета-тестов покрытия.
|
|
314
|
+
*
|
|
315
|
+
* Считается по БАЗОВОЙ таблице, а не по действующей: доказательство относится к
|
|
316
|
+
* КОДУ, и выключенный операционный килсвитч его не отменяет.
|
|
317
|
+
*/
|
|
318
|
+
export declare const IMPLEMENTED_FIELDS: ContractField[];
|
|
319
|
+
/**
|
|
320
|
+
* ДВА РОДА ДОКАЗАТЕЛЬСТВА, И ОНИ НЕ ВЗАИМОЗАМЕНЯЕМЫ (US-527).
|
|
321
|
+
*
|
|
322
|
+
* До этой стори `implemented` означало ровно одно: «поле доезжает до вендора»,
|
|
323
|
+
* и мета-тест сверял весь список с egress-покрытием. Композиция ввела второй
|
|
324
|
+
* род: `background` до вендора не доезжает НИКОГДА — он применяется у нас, уже
|
|
325
|
+
* после того как вендор отдал клип. Сверять его egress-тестом бессмысленно,
|
|
326
|
+
* а записать в тот же список — значит либо получить вечно красный мета-тест,
|
|
327
|
+
* либо ослабить его до бесполезности.
|
|
328
|
+
*
|
|
329
|
+
* Поэтому список разделён по `provenBy`, и у каждого рода — свой мета-тест:
|
|
330
|
+
* egress-поля сверяются с захватом исходящих запросов, композиционные — с
|
|
331
|
+
* тестами стадии композиции.
|
|
332
|
+
*/
|
|
333
|
+
export declare const EGRESS_PROVEN_FIELDS: ContractField[];
|
|
334
|
+
export declare const COMPOSITION_PROVEN_FIELDS: ContractField[];
|
|
335
|
+
export {};
|