@clipwright/core 0.14.0 → 0.16.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 +89 -0
- package/dist/account-actors.d.ts +292 -0
- package/dist/account-actors.js +222 -0
- package/dist/account-actors.js.map +1 -0
- package/dist/actor-bounds.d.ts +14 -0
- package/dist/actor-bounds.js +13 -0
- package/dist/actor-bounds.js.map +1 -0
- package/dist/actor-qualities.d.ts +8 -0
- package/dist/actor-qualities.js +7 -0
- package/dist/actor-qualities.js.map +1 -0
- package/dist/actors.d.ts +23 -0
- package/dist/actors.js +33 -0
- package/dist/actors.js.map +1 -1
- package/dist/aspect.js +1 -1
- package/dist/aspect.js.map +1 -1
- package/dist/contract-dispositions.d.ts +14 -2
- package/dist/contract-dispositions.js +21 -2
- package/dist/contract-dispositions.js.map +1 -1
- package/dist/endpoints.d.ts +1 -1
- package/dist/endpoints.js +3 -0
- package/dist/endpoints.js.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.js +5 -1
- package/dist/errors.js.map +1 -1
- package/dist/idempotency.d.ts +3 -0
- package/dist/idempotency.js +9 -0
- package/dist/idempotency.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/public-endpoints.d.ts +1 -0
- package/dist/public-endpoints.js +1 -0
- package/dist/public-endpoints.js.map +1 -1
- package/dist/rate-limit.d.ts +25 -0
- package/dist/rate-limit.js +40 -0
- package/dist/rate-limit.js.map +1 -1
- package/dist/run-static-warnings.d.ts +8 -4
- package/dist/run-static-warnings.js +29 -7
- package/dist/run-static-warnings.js.map +1 -1
- package/dist/runs.d.ts +42 -2
- package/dist/runs.js +5 -1
- package/dist/runs.js.map +1 -1
- package/dist/skills.d.ts +20 -0
- package/dist/skills.js +39 -13
- package/dist/skills.js.map +1 -1
- package/dist/voice-admission.d.ts +4 -0
- package/dist/voice-listing.d.ts +1 -0
- package/dist/voice-listing.js +2 -0
- package/dist/voice-listing.js.map +1 -1
- package/dist/voices.d.ts +12 -31
- package/dist/voices.js +20 -36
- package/dist/voices.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,95 @@ on the client side. Entries marked *Server-side* changed the API itself: every
|
|
|
10
10
|
client version sees them from the day the API was deployed, not from the package
|
|
11
11
|
release they are listed under.
|
|
12
12
|
|
|
13
|
+
Entries marked *Dashboard:* changed the web app (the dashboard or a public page of the site)
|
|
14
|
+
and no package. This file is also the public changelog at /changelog, so they are listed here:
|
|
15
|
+
a customer reading it should not miss what appeared in the product. Like *Server-side* entries,
|
|
16
|
+
they are live from the day the web app was deployed, not from the package release they are
|
|
17
|
+
listed under.
|
|
18
|
+
|
|
19
|
+
## [0.16.0] - 2026-09-16
|
|
20
|
+
|
|
21
|
+
### Added
|
|
22
|
+
|
|
23
|
+
- *Server-side:* a new skill, `create_actor`, builds a personal actor for the
|
|
24
|
+
account from a description of a fictional adult: a 9:16 portrait with exactly
|
|
25
|
+
one face, plus the other requested formats edited from it. `POST
|
|
26
|
+
/v1/skills/create_actor/quote` and `/run` take the description, `gender`,
|
|
27
|
+
`approximate_age`, `name`, `quality` and `aspect_ratios`; the run reports
|
|
28
|
+
`created_actor` when it succeeds, and the returned `actor_id` goes to
|
|
29
|
+
`make_ugc` in the same field a catalog actor does. `GET /v1/actors` lists the
|
|
30
|
+
account's own actors after the catalog, and `DELETE /v1/actors/{id}` takes one
|
|
31
|
+
out of the choice. The skill appears in `GET /v1/public/skills` only while
|
|
32
|
+
generation is switched on; until then quote and run answer 503
|
|
33
|
+
`actor_generation_disabled` and no run is created. (clipwright#120)
|
|
34
|
+
- *Server-side:* runs have a new state, `generating`, which only `create_actor`
|
|
35
|
+
enters. The set of terminal states is unchanged: `succeeded` and `failed`, and
|
|
36
|
+
nothing else. (clipwright#120)
|
|
37
|
+
- Personal actors reached the clients. The SDK gained `quoteActor`,
|
|
38
|
+
`createActor` and `deleteActor`; the CLI gained `quote-actor`, `create-actor`
|
|
39
|
+
and `delete-actor`; the MCP server gained `quote_actor`, `create_actor` and
|
|
40
|
+
`delete_actor`, so `tools/list` now returns ten tools instead of seven. The
|
|
41
|
+
idempotency key of an actor run is built from the actor's own schema: two
|
|
42
|
+
different descriptions are two different keys, and a repeated call with the
|
|
43
|
+
same description returns the run already paid for. (clipwright#120)
|
|
44
|
+
- *Dashboard:* `/actors` shows the account's personal actors next to the
|
|
45
|
+
catalog and deletes one on confirmation. A deleted actor stops being offered
|
|
46
|
+
at once; its images are removed by a daily cleanup. (clipwright#120)
|
|
47
|
+
|
|
48
|
+
### Changed
|
|
49
|
+
|
|
50
|
+
- *Server-side:* a request with `person` and generation switched on gets a
|
|
51
|
+
warning that points at `create_actor` instead of only saying the field is not
|
|
52
|
+
honored. (clipwright#120)
|
|
53
|
+
- *Server-side:* `create_actor` is charged per published image, not per second:
|
|
54
|
+
the portrait and each extra format cost what the quote showed, a partial
|
|
55
|
+
result charges only what was published and names the rest in `warnings`, and a
|
|
56
|
+
failed run costs nothing at all. Refused descriptions and unusable portraits
|
|
57
|
+
are free. (clipwright#120)
|
|
58
|
+
|
|
59
|
+
## [0.15.0] - 2026-09-14
|
|
60
|
+
|
|
61
|
+
### Changed
|
|
62
|
+
|
|
63
|
+
- *Server-side:* in `GET /v1/voices`, a catalog voice carries `preview_url` and
|
|
64
|
+
`preview_expires_at` once its sample is recorded: a short clip of that voice on
|
|
65
|
+
`eleven_v3`, in the voice's own language. The link is signed by us and
|
|
66
|
+
expires like a preset's. A voice without a recorded sample for its current
|
|
67
|
+
model and sample text still has neither field, and the list never links to
|
|
68
|
+
the vendor. The sample texts outside English and Russian are machine
|
|
69
|
+
translations that no native speaker has checked. (clipwright#164)
|
|
70
|
+
- *Server-side:* without `voice` or `voice_id`, the voice follows the actor's
|
|
71
|
+
gender: a woman from `actor_id` speaks `sarah`, a man speaks `george`. The
|
|
72
|
+
default actor still speaks `george`, and an explicit voice always wins.
|
|
73
|
+
(clipwright#183)
|
|
74
|
+
- *Server-side:* a request with `image` and no voice gets a warning that the
|
|
75
|
+
male `george` voice is used, naming `voice` and `actor_gender` as the fix.
|
|
76
|
+
`GET /v1/runs/{id}` derives it from the stored input, so runs started before
|
|
77
|
+
this change show it too. A request with `actor_gender` next to `voice` or
|
|
78
|
+
`voice_id` gets a warning that the hint changed nothing. (clipwright#183)
|
|
79
|
+
- *Server-side:* the contract version moved to `2026-09-14`. (clipwright#183)
|
|
80
|
+
- *Dashboard:* `/actors` says that an actor without a chosen voice speaks the
|
|
81
|
+
default voice of their gender. (clipwright#183)
|
|
82
|
+
|
|
83
|
+
### Added
|
|
84
|
+
|
|
85
|
+
- `actor_gender` (`female` or `male`) in the `make_ugc` input: next to `image`
|
|
86
|
+
it picks the default voice of that gender. It is refused with `actor_id` and
|
|
87
|
+
without `image`, and the remote fetch killswitch turns it off together with
|
|
88
|
+
`image`. The REST API accepts it from the day the API is deployed; the MCP
|
|
89
|
+
tool schema, the SDK types and the CLI flag `--actor-gender` arrive with this
|
|
90
|
+
release. (clipwright#183)
|
|
91
|
+
|
|
92
|
+
- *Dashboard:* `/actors` shows the actor library as a gallery: every published portrait with
|
|
93
|
+
its `actor_id` to copy, next to gender, approximate age, description and version. A person
|
|
94
|
+
can pick a face without calling `GET /v1/actors` first. (clipwright#148)
|
|
95
|
+
- *Dashboard:* `/videos` lists the finished videos of the account. Each one is a still frame
|
|
96
|
+
taken from the delivered file, with the length of the clip and the day it finished, and a
|
|
97
|
+
tile with a frame plays the video. Runs that are still going or that failed stay on the
|
|
98
|
+
Balance page. (clipwright#138)
|
|
99
|
+
- *Dashboard:* `/changelog` renders this file as a public page, so the release notes are
|
|
100
|
+
readable without installing a package. (clipwright#102)
|
|
101
|
+
|
|
13
102
|
## [0.14.0] - 2026-09-13
|
|
14
103
|
|
|
15
104
|
### Changed
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { type ActorQuality } from "./actor-qualities.js";
|
|
3
|
+
import { type AspectRatio } from "./skills.js";
|
|
4
|
+
/** Личные актёры аккаунта (clipwright#120, этап 2). Решение и доводы — docs/adr/0003-account-actors.md. */
|
|
5
|
+
export { ACTOR_DEFAULT_QUALITY, ACTOR_QUALITIES_ACCEPTED, ACTOR_QUALITIES_KNOWN } from "./actor-qualities.js";
|
|
6
|
+
export type { ActorQuality, ActorQualityAccepted } from "./actor-qualities.js";
|
|
7
|
+
export { ACTOR_AGE_FLOOR, ACTOR_ASPECTS_KNOWN, ACTOR_DESCRIPTION_MAX_CHARS, ACTOR_GENDERS_ACCEPTED, ACTOR_GENDERS_KNOWN, ACTOR_MAX_AGE, ACTOR_MIN_AGE, ACTOR_NAME_MAX_CHARS, } from "./actor-bounds.js";
|
|
8
|
+
export type { ActorAspectKnown, ActorGender } from "./actor-bounds.js";
|
|
9
|
+
export declare const PERSONAL_ACTOR_ID_PREFIX = "actor_u_";
|
|
10
|
+
/** `actor_u_` и 26 знаков base32 (RFC 4648, строчные) — 128 случайных бит. */
|
|
11
|
+
export declare const personalActorId: z.ZodString;
|
|
12
|
+
export declare const ACTOR_SCOPES: readonly ["clipwright", "account"];
|
|
13
|
+
export type ActorScope = (typeof ACTOR_SCOPES)[number];
|
|
14
|
+
/** Чей актёр — по форме id. Каталог Clipwright префикс `actor_u_` не занимает: это сверяет тест. */
|
|
15
|
+
export declare function actorIdScope(actorId: string): ActorScope;
|
|
16
|
+
/** Случайность приходит снаружи: core не зависит от криптографии рантайма. */
|
|
17
|
+
export declare function newPersonalActorId(random: Uint8Array): string;
|
|
18
|
+
/** Портрет — всегда 9:16; остальные форматы правятся из него. */
|
|
19
|
+
export declare const ACTOR_PORTRAIT_ASPECT: "9:16";
|
|
20
|
+
/** Размеры генерации compact (решение владельца 2026-09-14, замер G0). */
|
|
21
|
+
export declare const ACTOR_SIZE_SET: {
|
|
22
|
+
readonly "9:16": {
|
|
23
|
+
readonly width: 1024;
|
|
24
|
+
readonly height: 1824;
|
|
25
|
+
};
|
|
26
|
+
readonly "1:1": {
|
|
27
|
+
readonly width: 1024;
|
|
28
|
+
readonly height: 1024;
|
|
29
|
+
};
|
|
30
|
+
readonly "16:9": {
|
|
31
|
+
readonly width: 1824;
|
|
32
|
+
readonly height: 1024;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
type AcceptedQualities = readonly [ActorQuality, ...ActorQuality[]];
|
|
36
|
+
/** Вход при данном множестве принимаемых качеств. */
|
|
37
|
+
export declare function createActorInputWith<const Q extends AcceptedQualities>(accepted: Q, defaultQuality: Q[number]): z.ZodObject<{
|
|
38
|
+
description: z.ZodString;
|
|
39
|
+
gender: z.ZodEnum<{
|
|
40
|
+
female: "female";
|
|
41
|
+
male: "male";
|
|
42
|
+
}>;
|
|
43
|
+
approximate_age: z.ZodNumber;
|
|
44
|
+
name: z.ZodString;
|
|
45
|
+
aspect_ratios: z.ZodDefault<z.ZodArray<z.ZodEnum<{
|
|
46
|
+
"16:9": "16:9";
|
|
47
|
+
"1:1": "1:1";
|
|
48
|
+
"9:16": "9:16";
|
|
49
|
+
}>>>;
|
|
50
|
+
quality: z.ZodDefault<z.ZodEnum<{ [k in Q[number]]: k; } extends infer T ? { [k in keyof T]: T[k]; } : never>>;
|
|
51
|
+
}, z.core.$strict>;
|
|
52
|
+
export declare const createActorInput: z.ZodObject<{
|
|
53
|
+
description: z.ZodString;
|
|
54
|
+
gender: z.ZodEnum<{
|
|
55
|
+
female: "female";
|
|
56
|
+
male: "male";
|
|
57
|
+
}>;
|
|
58
|
+
approximate_age: z.ZodNumber;
|
|
59
|
+
name: z.ZodString;
|
|
60
|
+
aspect_ratios: z.ZodDefault<z.ZodArray<z.ZodEnum<{
|
|
61
|
+
"16:9": "16:9";
|
|
62
|
+
"1:1": "1:1";
|
|
63
|
+
"9:16": "9:16";
|
|
64
|
+
}>>>;
|
|
65
|
+
quality: z.ZodDefault<z.ZodEnum<{
|
|
66
|
+
high: "high";
|
|
67
|
+
medium: "medium";
|
|
68
|
+
}>>;
|
|
69
|
+
}, z.core.$strict>;
|
|
70
|
+
export type CreateActorInput = z.infer<typeof createActorInput>;
|
|
71
|
+
/** Вход ДО дефолтов — то, что пишет вызыватель: `quality` и `aspect_ratios` необязательны. */
|
|
72
|
+
/** Тот же приём, что у `MakeUgcInputArgs`: клиенту нельзя навязывать поля со значением по умолчанию. */
|
|
73
|
+
export type CreateActorInputArgs = z.input<typeof createActorInput>;
|
|
74
|
+
/** Плоская форма для MCP: инструмент публикует ту же схему, что проверяет сервер. */
|
|
75
|
+
export declare const createActorInputShape: {
|
|
76
|
+
description: z.ZodString;
|
|
77
|
+
gender: z.ZodEnum<{
|
|
78
|
+
female: "female";
|
|
79
|
+
male: "male";
|
|
80
|
+
}>;
|
|
81
|
+
approximate_age: z.ZodNumber;
|
|
82
|
+
name: z.ZodString;
|
|
83
|
+
aspect_ratios: z.ZodDefault<z.ZodArray<z.ZodEnum<{
|
|
84
|
+
"16:9": "16:9";
|
|
85
|
+
"1:1": "1:1";
|
|
86
|
+
"9:16": "9:16";
|
|
87
|
+
}>>>;
|
|
88
|
+
quality: z.ZodDefault<z.ZodEnum<{
|
|
89
|
+
high: "high";
|
|
90
|
+
medium: "medium";
|
|
91
|
+
}>>;
|
|
92
|
+
};
|
|
93
|
+
export declare const actorUnitCredits: z.ZodObject<{
|
|
94
|
+
portrait: z.ZodNumber;
|
|
95
|
+
variant: z.ZodNumber;
|
|
96
|
+
}, z.core.$strip>;
|
|
97
|
+
/** Цены единиц и запрошенные форматы, закреплённые при допуске; расчёт идёт по ним, а не по таблице. */
|
|
98
|
+
export declare const actorPricingSnapshot: z.ZodObject<{
|
|
99
|
+
quality: z.ZodEnum<{
|
|
100
|
+
high: "high";
|
|
101
|
+
medium: "medium";
|
|
102
|
+
}>;
|
|
103
|
+
unit_credits: z.ZodObject<{
|
|
104
|
+
portrait: z.ZodNumber;
|
|
105
|
+
variant: z.ZodNumber;
|
|
106
|
+
}, z.core.$strip>;
|
|
107
|
+
requested_aspects: z.ZodArray<z.ZodEnum<{
|
|
108
|
+
"16:9": "16:9";
|
|
109
|
+
"1:1": "1:1";
|
|
110
|
+
"9:16": "9:16";
|
|
111
|
+
}>>;
|
|
112
|
+
}, z.core.$strip>;
|
|
113
|
+
export type ActorPricingSnapshot = z.infer<typeof actorPricingSnapshot>;
|
|
114
|
+
/** Снимок, который допуск создаёт: форматы приёма, портрет обязателен, повторов нет. */
|
|
115
|
+
export declare const admittedActorPricingSnapshot: z.ZodObject<{
|
|
116
|
+
quality: z.ZodEnum<{
|
|
117
|
+
high: "high";
|
|
118
|
+
medium: "medium";
|
|
119
|
+
}>;
|
|
120
|
+
unit_credits: z.ZodObject<{
|
|
121
|
+
portrait: z.ZodNumber;
|
|
122
|
+
variant: z.ZodNumber;
|
|
123
|
+
}, z.core.$strip>;
|
|
124
|
+
requested_aspects: z.ZodArray<z.ZodEnum<{
|
|
125
|
+
"16:9": "16:9";
|
|
126
|
+
"1:1": "1:1";
|
|
127
|
+
"9:16": "9:16";
|
|
128
|
+
}>>;
|
|
129
|
+
}, z.core.$strip>;
|
|
130
|
+
/** Сохранённый вход рана. Качество и форматы обязаны совпасть со снимком: иначе генерация */
|
|
131
|
+
/** разошлась бы со списанием, поэтому такой ран не читается (`run_input_unreadable`, ноль кредитов). */
|
|
132
|
+
export declare const storedCreateActorInput: z.ZodObject<{
|
|
133
|
+
description: z.ZodString;
|
|
134
|
+
gender: z.ZodEnum<{
|
|
135
|
+
female: "female";
|
|
136
|
+
male: "male";
|
|
137
|
+
}>;
|
|
138
|
+
approximate_age: z.ZodNumber;
|
|
139
|
+
name: z.ZodString;
|
|
140
|
+
aspect_ratios: z.ZodArray<z.ZodEnum<{
|
|
141
|
+
"16:9": "16:9";
|
|
142
|
+
"1:1": "1:1";
|
|
143
|
+
"9:16": "9:16";
|
|
144
|
+
}>>;
|
|
145
|
+
quality: z.ZodEnum<{
|
|
146
|
+
high: "high";
|
|
147
|
+
medium: "medium";
|
|
148
|
+
}>;
|
|
149
|
+
pricing_snapshot: z.ZodObject<{
|
|
150
|
+
quality: z.ZodEnum<{
|
|
151
|
+
high: "high";
|
|
152
|
+
medium: "medium";
|
|
153
|
+
}>;
|
|
154
|
+
unit_credits: z.ZodObject<{
|
|
155
|
+
portrait: z.ZodNumber;
|
|
156
|
+
variant: z.ZodNumber;
|
|
157
|
+
}, z.core.$strip>;
|
|
158
|
+
requested_aspects: z.ZodArray<z.ZodEnum<{
|
|
159
|
+
"16:9": "16:9";
|
|
160
|
+
"1:1": "1:1";
|
|
161
|
+
"9:16": "9:16";
|
|
162
|
+
}>>;
|
|
163
|
+
}, z.core.$strip>;
|
|
164
|
+
}, z.core.$strip>;
|
|
165
|
+
export type StoredCreateActorInput = z.infer<typeof storedCreateActorInput>;
|
|
166
|
+
export declare const createActorQuote: z.ZodObject<{
|
|
167
|
+
skill: z.ZodLiteral<"create_actor">;
|
|
168
|
+
credits_estimate: z.ZodNumber;
|
|
169
|
+
pricing_snapshot: z.ZodObject<{
|
|
170
|
+
quality: z.ZodEnum<{
|
|
171
|
+
high: "high";
|
|
172
|
+
medium: "medium";
|
|
173
|
+
}>;
|
|
174
|
+
unit_credits: z.ZodObject<{
|
|
175
|
+
portrait: z.ZodNumber;
|
|
176
|
+
variant: z.ZodNumber;
|
|
177
|
+
}, z.core.$strip>;
|
|
178
|
+
requested_aspects: z.ZodArray<z.ZodEnum<{
|
|
179
|
+
"16:9": "16:9";
|
|
180
|
+
"1:1": "1:1";
|
|
181
|
+
"9:16": "9:16";
|
|
182
|
+
}>>;
|
|
183
|
+
}, z.core.$strip>;
|
|
184
|
+
warnings: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
185
|
+
contract_version: z.ZodString;
|
|
186
|
+
}, z.core.$strip>;
|
|
187
|
+
export type CreateActorQuote = z.infer<typeof createActorQuote>;
|
|
188
|
+
/** Актёр, созданный раном, при чтении. Удаление актёра стирает имя и снимает форматы с публикации, */
|
|
189
|
+
/** а `get_run` старого рана обязан отвечать, поэтому пустые имя и форматы читаются. */
|
|
190
|
+
export declare const createdActor: z.ZodObject<{
|
|
191
|
+
actor_id: z.ZodString;
|
|
192
|
+
name: z.ZodString;
|
|
193
|
+
gender: z.ZodEnum<{
|
|
194
|
+
female: "female";
|
|
195
|
+
male: "male";
|
|
196
|
+
}>;
|
|
197
|
+
approximate_age: z.ZodNumber;
|
|
198
|
+
version: z.ZodNumber;
|
|
199
|
+
quality: z.ZodEnum<{
|
|
200
|
+
high: "high";
|
|
201
|
+
medium: "medium";
|
|
202
|
+
}>;
|
|
203
|
+
aspect_ratios: z.ZodArray<z.ZodEnum<{
|
|
204
|
+
"16:9": "16:9";
|
|
205
|
+
"1:1": "1:1";
|
|
206
|
+
"9:16": "9:16";
|
|
207
|
+
}>>;
|
|
208
|
+
}, z.core.$strip>;
|
|
209
|
+
export type CreatedActor = z.infer<typeof createdActor>;
|
|
210
|
+
/** Итог, который пишет успешный ран: имя и опубликованные форматы, среди них портрет 9:16. */
|
|
211
|
+
export declare const producedCreatedActor: z.ZodObject<{
|
|
212
|
+
actor_id: z.ZodString;
|
|
213
|
+
gender: z.ZodEnum<{
|
|
214
|
+
female: "female";
|
|
215
|
+
male: "male";
|
|
216
|
+
}>;
|
|
217
|
+
approximate_age: z.ZodNumber;
|
|
218
|
+
version: z.ZodNumber;
|
|
219
|
+
quality: z.ZodEnum<{
|
|
220
|
+
high: "high";
|
|
221
|
+
medium: "medium";
|
|
222
|
+
}>;
|
|
223
|
+
name: z.ZodString;
|
|
224
|
+
aspect_ratios: z.ZodArray<z.ZodEnum<{
|
|
225
|
+
"16:9": "16:9";
|
|
226
|
+
"1:1": "1:1";
|
|
227
|
+
"9:16": "9:16";
|
|
228
|
+
}>>;
|
|
229
|
+
}, z.core.$strip>;
|
|
230
|
+
/** Решение по полю входа `create_actor`; смысл видов — как у реестра `make_ugc` (contract-dispositions.ts). */
|
|
231
|
+
export type CreateActorDisposition = {
|
|
232
|
+
kind: "implemented";
|
|
233
|
+
provenBy: "egress" | "listing";
|
|
234
|
+
} | {
|
|
235
|
+
kind: "warned";
|
|
236
|
+
warning: string;
|
|
237
|
+
triggersWhen: "present";
|
|
238
|
+
};
|
|
239
|
+
export declare const CREATE_ACTOR_FIELD_DISPOSITIONS: {
|
|
240
|
+
readonly description: {
|
|
241
|
+
readonly kind: "implemented";
|
|
242
|
+
readonly provenBy: "egress";
|
|
243
|
+
};
|
|
244
|
+
readonly gender: {
|
|
245
|
+
readonly kind: "implemented";
|
|
246
|
+
readonly provenBy: "egress";
|
|
247
|
+
};
|
|
248
|
+
readonly approximate_age: {
|
|
249
|
+
readonly kind: "implemented";
|
|
250
|
+
readonly provenBy: "egress";
|
|
251
|
+
};
|
|
252
|
+
readonly name: {
|
|
253
|
+
readonly kind: "implemented";
|
|
254
|
+
readonly provenBy: "listing";
|
|
255
|
+
};
|
|
256
|
+
readonly quality: {
|
|
257
|
+
readonly kind: "implemented";
|
|
258
|
+
readonly provenBy: "egress";
|
|
259
|
+
};
|
|
260
|
+
readonly aspect_ratios: {
|
|
261
|
+
readonly kind: "implemented";
|
|
262
|
+
readonly provenBy: "egress";
|
|
263
|
+
};
|
|
264
|
+
};
|
|
265
|
+
/** Предупреждения допуска — только из реестра; пишутся в `runs.warnings` и не пересчитываются при чтении. */
|
|
266
|
+
export declare function createActorAdmissionWarnings(input: Readonly<Record<string, unknown>>, dispositions?: Readonly<Record<string, CreateActorDisposition>>): string[];
|
|
267
|
+
/** Коды провала рана `create_actor`: у каждого — ноль кредитов. Колонка `error` — `код: текст`. */
|
|
268
|
+
export declare const CREATE_ACTOR_RUN_ERRORS: {
|
|
269
|
+
readonly actor_portrait_unusable: "the generated portrait did not show exactly one face; no actor was created and nothing was charged";
|
|
270
|
+
readonly actor_prompt_refused: string;
|
|
271
|
+
readonly face_check_unavailable: "the face check is unavailable right now; no actor was created and nothing was charged. Retry later";
|
|
272
|
+
readonly prompt_check_unavailable: "the description check is unavailable right now; no actor was created and nothing was charged. Retry later";
|
|
273
|
+
readonly run_input_unreadable: "the stored run input could not be read; no actor was created and nothing was charged";
|
|
274
|
+
readonly actor_portrait_not_delivered: "the portrait could not be generated or stored; no actor was created and nothing was charged. Retry later";
|
|
275
|
+
readonly actor_generation_disabled: "actor generation is disabled right now; no actor was created and nothing was charged";
|
|
276
|
+
readonly actor_run_interrupted: "the run stopped before it finished; no actor was created and nothing was charged";
|
|
277
|
+
readonly actor_spend_refused: "our spend guard refused the paid call; no actor was created and nothing was charged. Retry later";
|
|
278
|
+
};
|
|
279
|
+
export type CreateActorRunErrorCode = keyof typeof CREATE_ACTOR_RUN_ERRORS;
|
|
280
|
+
export declare const CREATE_ACTOR_RUN_ERROR_CODES: CreateActorRunErrorCode[];
|
|
281
|
+
export declare function createActorRunError(code: CreateActorRunErrorCode): string;
|
|
282
|
+
/** Формат `runs.error` для кода с уточнением: код до двоеточия читают алерты. */
|
|
283
|
+
export declare function createActorRunErrorWith(code: CreateActorRunErrorCode, detail: string): string;
|
|
284
|
+
export declare const ACTOR_VARIANT_ASPECTS: ("16:9" | "1:1")[];
|
|
285
|
+
/** Вариант, не созданный по нашей причине: успешный ран несёт эту строку в `warnings`. */
|
|
286
|
+
export declare function actorVariantWarning(aspect: AspectRatio, reason: string): string;
|
|
287
|
+
/** Сорванная проверка лица на этапе вариантов: ран УСПЕШЕН, кода провала нет. */
|
|
288
|
+
/** Одно определение на писателя (таск) и счётчик (алерт 10), сравнение — целой строкой. */
|
|
289
|
+
export declare const ACTOR_VARIANT_FACE_CHECK_REASON = "the face check was unavailable";
|
|
290
|
+
export declare const ACTOR_VARIANT_FACE_CHECK_WARNINGS: readonly string[];
|
|
291
|
+
/** Что делает `create_actor` — один текст для публичного каталога скиллов и клиентов. */
|
|
292
|
+
export declare const CREATE_ACTOR_DESCRIPTION: string;
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ACTOR_DEFAULT_QUALITY, ACTOR_QUALITIES_ACCEPTED, ACTOR_QUALITIES_KNOWN, } from "./actor-qualities.js";
|
|
3
|
+
import { ACTOR_AGE_FLOOR, ACTOR_ASPECTS_KNOWN, ACTOR_DESCRIPTION_MAX_CHARS, ACTOR_GENDERS_ACCEPTED, ACTOR_GENDERS_KNOWN, ACTOR_MAX_AGE, ACTOR_MIN_AGE, ACTOR_NAME_MAX_CHARS, } from "./actor-bounds.js";
|
|
4
|
+
import { ASPECT_RATIOS } from "./skills.js";
|
|
5
|
+
/** Личные актёры аккаунта (clipwright#120, этап 2). Решение и доводы — docs/adr/0003-account-actors.md. */
|
|
6
|
+
export { ACTOR_DEFAULT_QUALITY, ACTOR_QUALITIES_ACCEPTED, ACTOR_QUALITIES_KNOWN } from "./actor-qualities.js";
|
|
7
|
+
export { ACTOR_AGE_FLOOR, ACTOR_ASPECTS_KNOWN, ACTOR_DESCRIPTION_MAX_CHARS, ACTOR_GENDERS_ACCEPTED, ACTOR_GENDERS_KNOWN, ACTOR_MAX_AGE, ACTOR_MIN_AGE, ACTOR_NAME_MAX_CHARS, } from "./actor-bounds.js";
|
|
8
|
+
export const PERSONAL_ACTOR_ID_PREFIX = "actor_u_";
|
|
9
|
+
const PERSONAL_ACTOR_ID_BYTES = 16;
|
|
10
|
+
const BASE32_ALPHABET = "abcdefghijklmnopqrstuvwxyz234567";
|
|
11
|
+
/** `actor_u_` и 26 знаков base32 (RFC 4648, строчные) — 128 случайных бит. */
|
|
12
|
+
export const personalActorId = z.string().regex(/^actor_u_[a-z2-7]{26}$/);
|
|
13
|
+
export const ACTOR_SCOPES = ["clipwright", "account"];
|
|
14
|
+
/** Чей актёр — по форме id. Каталог Clipwright префикс `actor_u_` не занимает: это сверяет тест. */
|
|
15
|
+
export function actorIdScope(actorId) {
|
|
16
|
+
return personalActorId.safeParse(actorId).success ? "account" : "clipwright";
|
|
17
|
+
}
|
|
18
|
+
/** Случайность приходит снаружи: core не зависит от криптографии рантайма. */
|
|
19
|
+
export function newPersonalActorId(random) {
|
|
20
|
+
if (random.length !== PERSONAL_ACTOR_ID_BYTES) {
|
|
21
|
+
throw new Error(`personal actor id needs ${PERSONAL_ACTOR_ID_BYTES} random bytes, got ${random.length}`);
|
|
22
|
+
}
|
|
23
|
+
let buffer = 0;
|
|
24
|
+
let bits = 0;
|
|
25
|
+
let encoded = "";
|
|
26
|
+
for (const byte of random) {
|
|
27
|
+
buffer = (buffer << 8) | byte;
|
|
28
|
+
bits += 8;
|
|
29
|
+
while (bits >= 5) {
|
|
30
|
+
bits -= 5;
|
|
31
|
+
encoded += BASE32_ALPHABET.charAt((buffer >> bits) & 31);
|
|
32
|
+
}
|
|
33
|
+
buffer &= (1 << bits) - 1;
|
|
34
|
+
}
|
|
35
|
+
if (bits > 0)
|
|
36
|
+
encoded += BASE32_ALPHABET.charAt((buffer << (5 - bits)) & 31);
|
|
37
|
+
return PERSONAL_ACTOR_ID_PREFIX + encoded;
|
|
38
|
+
}
|
|
39
|
+
/** Портрет — всегда 9:16; остальные форматы правятся из него. */
|
|
40
|
+
export const ACTOR_PORTRAIT_ASPECT = "9:16";
|
|
41
|
+
/** Размеры генерации compact (решение владельца 2026-09-14, замер G0). */
|
|
42
|
+
export const ACTOR_SIZE_SET = {
|
|
43
|
+
"9:16": { width: 1024, height: 1824 },
|
|
44
|
+
"1:1": { width: 1024, height: 1024 },
|
|
45
|
+
"16:9": { width: 1824, height: 1024 },
|
|
46
|
+
};
|
|
47
|
+
const includesPortrait = (ratios) => ratios.includes(ACTOR_PORTRAIT_ASPECT);
|
|
48
|
+
const hasNoRepeats = (ratios) => new Set(ratios).size === ratios.length;
|
|
49
|
+
/** Поля строгого входа без качества. Границы — из actor-bounds.ts; схемы чтения их не берут. */
|
|
50
|
+
const actorFieldShape = {
|
|
51
|
+
description: z
|
|
52
|
+
.string()
|
|
53
|
+
.min(1)
|
|
54
|
+
.max(ACTOR_DESCRIPTION_MAX_CHARS)
|
|
55
|
+
.describe("Words describing a fictional adult: appearance, clothing, setting. Naming a real person or a likeness " +
|
|
56
|
+
"to one is refused before any charge (actor_prompt_refused)."),
|
|
57
|
+
gender: z
|
|
58
|
+
.enum(ACTOR_GENDERS_ACCEPTED)
|
|
59
|
+
.describe(`${ACTOR_GENDERS_ACCEPTED.join(" | ")}. Fixes the actor's gender and the default voice of videos with this actor.`),
|
|
60
|
+
approximate_age: z
|
|
61
|
+
.number()
|
|
62
|
+
.int()
|
|
63
|
+
.min(ACTOR_MIN_AGE)
|
|
64
|
+
.max(ACTOR_MAX_AGE)
|
|
65
|
+
.describe(`Approximate age in years, ${ACTOR_MIN_AGE} to ${ACTOR_MAX_AGE}: actors are adults.`),
|
|
66
|
+
name: z.string().min(1).max(ACTOR_NAME_MAX_CHARS).describe("Name shown in list_actors."),
|
|
67
|
+
aspect_ratios: z
|
|
68
|
+
.array(z.enum(ASPECT_RATIOS))
|
|
69
|
+
.min(1)
|
|
70
|
+
.max(ASPECT_RATIOS.length)
|
|
71
|
+
.refine(includesPortrait, {
|
|
72
|
+
error: `aspect_ratios must include ${ACTOR_PORTRAIT_ASPECT}: every actor starts from a ${ACTOR_PORTRAIT_ASPECT} portrait`,
|
|
73
|
+
})
|
|
74
|
+
.refine(hasNoRepeats, { error: "aspect_ratios must not repeat a format" })
|
|
75
|
+
.default([...ASPECT_RATIOS])
|
|
76
|
+
.describe(`Formats to create: ${ASPECT_RATIOS.join(" | ")}, always including ${ACTOR_PORTRAIT_ASPECT}. Omitted means all ` +
|
|
77
|
+
"three. Formats that fail the identity check are not charged and are named in warnings."),
|
|
78
|
+
};
|
|
79
|
+
function unknownFieldsRefusal(keys) {
|
|
80
|
+
if (keys.includes("image")) {
|
|
81
|
+
return "create_actor takes no image or other reference: describe a fictional adult in description";
|
|
82
|
+
}
|
|
83
|
+
return `unknown field(s) ${keys.join(", ")}: create_actor accepts description, gender, approximate_age, name, quality, aspect_ratios`;
|
|
84
|
+
}
|
|
85
|
+
/** Вход при данном множестве принимаемых качеств. */
|
|
86
|
+
export function createActorInputWith(accepted, defaultQuality) {
|
|
87
|
+
return z.strictObject({
|
|
88
|
+
...actorFieldShape,
|
|
89
|
+
quality: z
|
|
90
|
+
.enum(accepted, {
|
|
91
|
+
error: (issue) => `quality ${JSON.stringify(issue.input)} is not accepted: choose one of ${accepted.join(" | ")}`,
|
|
92
|
+
})
|
|
93
|
+
.default(defaultQuality)
|
|
94
|
+
.describe(`Image quality: ${accepted.join(" | ")}. Omitted means ${defaultQuality}. The price per image depends on it; ` +
|
|
95
|
+
"quote shows it before any charge."),
|
|
96
|
+
}, {
|
|
97
|
+
error: (issue) => (issue.code === "unrecognized_keys" ? unknownFieldsRefusal(issue.keys) : undefined),
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
export const createActorInput = createActorInputWith(ACTOR_QUALITIES_ACCEPTED, ACTOR_DEFAULT_QUALITY);
|
|
101
|
+
/** Плоская форма для MCP: инструмент публикует ту же схему, что проверяет сервер. */
|
|
102
|
+
export const createActorInputShape = createActorInput.shape;
|
|
103
|
+
export const actorUnitCredits = z.object({
|
|
104
|
+
portrait: z.number().int().positive(),
|
|
105
|
+
variant: z.number().int().positive(),
|
|
106
|
+
});
|
|
107
|
+
/** Схемы чтения зависят только от того, что могло быть записано: известных множеств и CHECK 0031. */
|
|
108
|
+
/** Границы приёма в них не входят, поэтому сужение приёма старых ранов не ломает. */
|
|
109
|
+
const storedAspects = z.array(z.enum(ACTOR_ASPECTS_KNOWN)).min(1);
|
|
110
|
+
/** Цены единиц и запрошенные форматы, закреплённые при допуске; расчёт идёт по ним, а не по таблице. */
|
|
111
|
+
export const actorPricingSnapshot = z.object({
|
|
112
|
+
quality: z.enum(ACTOR_QUALITIES_KNOWN),
|
|
113
|
+
unit_credits: actorUnitCredits,
|
|
114
|
+
requested_aspects: storedAspects,
|
|
115
|
+
});
|
|
116
|
+
/** Снимок, который допуск создаёт: форматы приёма, портрет обязателен, повторов нет. */
|
|
117
|
+
export const admittedActorPricingSnapshot = actorPricingSnapshot.extend({
|
|
118
|
+
requested_aspects: z
|
|
119
|
+
.array(z.enum(ASPECT_RATIOS))
|
|
120
|
+
.min(1)
|
|
121
|
+
.refine(includesPortrait, { error: `requested_aspects must include ${ACTOR_PORTRAIT_ASPECT}` })
|
|
122
|
+
.refine(hasNoRepeats, { error: "requested_aspects must not repeat a format" }),
|
|
123
|
+
});
|
|
124
|
+
function sameFormats(left, right) {
|
|
125
|
+
const a = new Set(left);
|
|
126
|
+
const b = new Set(right);
|
|
127
|
+
return a.size === b.size && [...a].every((ratio) => b.has(ratio));
|
|
128
|
+
}
|
|
129
|
+
/** Сохранённый вход рана. Качество и форматы обязаны совпасть со снимком: иначе генерация */
|
|
130
|
+
/** разошлась бы со списанием, поэтому такой ран не читается (`run_input_unreadable`, ноль кредитов). */
|
|
131
|
+
export const storedCreateActorInput = z
|
|
132
|
+
.object({
|
|
133
|
+
description: z.string().min(1),
|
|
134
|
+
gender: z.enum(ACTOR_GENDERS_KNOWN),
|
|
135
|
+
approximate_age: z.number().int().min(ACTOR_AGE_FLOOR),
|
|
136
|
+
name: z.string().min(1),
|
|
137
|
+
aspect_ratios: storedAspects,
|
|
138
|
+
quality: z.enum(ACTOR_QUALITIES_KNOWN),
|
|
139
|
+
pricing_snapshot: actorPricingSnapshot,
|
|
140
|
+
})
|
|
141
|
+
.refine((input) => input.quality === input.pricing_snapshot.quality, {
|
|
142
|
+
error: "stored quality differs from pricing_snapshot.quality",
|
|
143
|
+
path: ["quality"],
|
|
144
|
+
})
|
|
145
|
+
.refine((input) => sameFormats(input.aspect_ratios, input.pricing_snapshot.requested_aspects), {
|
|
146
|
+
error: "stored aspect_ratios differ from pricing_snapshot.requested_aspects",
|
|
147
|
+
path: ["aspect_ratios"],
|
|
148
|
+
});
|
|
149
|
+
export const createActorQuote = z.object({
|
|
150
|
+
skill: z.literal("create_actor"),
|
|
151
|
+
credits_estimate: z.number().int().nonnegative(),
|
|
152
|
+
pricing_snapshot: actorPricingSnapshot,
|
|
153
|
+
warnings: z.array(z.string()).default([]),
|
|
154
|
+
contract_version: z.string(),
|
|
155
|
+
});
|
|
156
|
+
/** Актёр, созданный раном, при чтении. Удаление актёра стирает имя и снимает форматы с публикации, */
|
|
157
|
+
/** а `get_run` старого рана обязан отвечать, поэтому пустые имя и форматы читаются. */
|
|
158
|
+
export const createdActor = z.object({
|
|
159
|
+
actor_id: personalActorId,
|
|
160
|
+
name: z.string(),
|
|
161
|
+
gender: z.enum(ACTOR_GENDERS_KNOWN),
|
|
162
|
+
approximate_age: z.number().int().min(ACTOR_AGE_FLOOR),
|
|
163
|
+
version: z.number().int().positive(),
|
|
164
|
+
quality: z.enum(ACTOR_QUALITIES_KNOWN),
|
|
165
|
+
aspect_ratios: z.array(z.enum(ACTOR_ASPECTS_KNOWN)),
|
|
166
|
+
});
|
|
167
|
+
/** Итог, который пишет успешный ран: имя и опубликованные форматы, среди них портрет 9:16. */
|
|
168
|
+
export const producedCreatedActor = createdActor.extend({
|
|
169
|
+
name: z.string().min(1),
|
|
170
|
+
aspect_ratios: storedAspects.refine(includesPortrait, {
|
|
171
|
+
error: `created_actor.aspect_ratios must include ${ACTOR_PORTRAIT_ASPECT}`,
|
|
172
|
+
}),
|
|
173
|
+
});
|
|
174
|
+
export const CREATE_ACTOR_FIELD_DISPOSITIONS = {
|
|
175
|
+
description: { kind: "implemented", provenBy: "egress" },
|
|
176
|
+
gender: { kind: "implemented", provenBy: "egress" },
|
|
177
|
+
approximate_age: { kind: "implemented", provenBy: "egress" },
|
|
178
|
+
name: { kind: "implemented", provenBy: "listing" },
|
|
179
|
+
quality: { kind: "implemented", provenBy: "egress" },
|
|
180
|
+
aspect_ratios: { kind: "implemented", provenBy: "egress" },
|
|
181
|
+
};
|
|
182
|
+
/** Предупреждения допуска — только из реестра; пишутся в `runs.warnings` и не пересчитываются при чтении. */
|
|
183
|
+
export function createActorAdmissionWarnings(input, dispositions = CREATE_ACTOR_FIELD_DISPOSITIONS) {
|
|
184
|
+
return Object.entries(dispositions).flatMap(([field, disposition]) => disposition.kind === "warned" && input[field] !== undefined ? [disposition.warning] : []);
|
|
185
|
+
}
|
|
186
|
+
/** Коды провала рана `create_actor`: у каждого — ноль кредитов. Колонка `error` — `код: текст`. */
|
|
187
|
+
export const CREATE_ACTOR_RUN_ERRORS = {
|
|
188
|
+
actor_portrait_unusable: "the generated portrait did not show exactly one face; no actor was created and nothing was charged",
|
|
189
|
+
actor_prompt_refused: "the description names or resembles a real person, or moderation refused the portrait; describe a fictional adult. " +
|
|
190
|
+
"No actor was created and nothing was charged",
|
|
191
|
+
face_check_unavailable: "the face check is unavailable right now; no actor was created and nothing was charged. Retry later",
|
|
192
|
+
prompt_check_unavailable: "the description check is unavailable right now; no actor was created and nothing was charged. Retry later",
|
|
193
|
+
run_input_unreadable: "the stored run input could not be read; no actor was created and nothing was charged",
|
|
194
|
+
actor_portrait_not_delivered: "the portrait could not be generated or stored; no actor was created and nothing was charged. Retry later",
|
|
195
|
+
actor_generation_disabled: "actor generation is disabled right now; no actor was created and nothing was charged",
|
|
196
|
+
actor_run_interrupted: "the run stopped before it finished; no actor was created and nothing was charged",
|
|
197
|
+
actor_spend_refused: "our spend guard refused the paid call; no actor was created and nothing was charged. Retry later",
|
|
198
|
+
};
|
|
199
|
+
export const CREATE_ACTOR_RUN_ERROR_CODES = Object.keys(CREATE_ACTOR_RUN_ERRORS);
|
|
200
|
+
export function createActorRunError(code) {
|
|
201
|
+
return `${code}: ${CREATE_ACTOR_RUN_ERRORS[code]}`;
|
|
202
|
+
}
|
|
203
|
+
/** Формат `runs.error` для кода с уточнением: код до двоеточия читают алерты. */
|
|
204
|
+
export function createActorRunErrorWith(code, detail) {
|
|
205
|
+
return `${createActorRunError(code)} (${detail})`;
|
|
206
|
+
}
|
|
207
|
+
export const ACTOR_VARIANT_ASPECTS = ASPECT_RATIOS.filter((aspect) => aspect !== ACTOR_PORTRAIT_ASPECT);
|
|
208
|
+
/** Вариант, не созданный по нашей причине: успешный ран несёт эту строку в `warnings`. */
|
|
209
|
+
export function actorVariantWarning(aspect, reason) {
|
|
210
|
+
return `${aspect} was not created: ${reason}; it was not charged`;
|
|
211
|
+
}
|
|
212
|
+
/** Сорванная проверка лица на этапе вариантов: ран УСПЕШЕН, кода провала нет. */
|
|
213
|
+
/** Одно определение на писателя (таск) и счётчик (алерт 10), сравнение — целой строкой. */
|
|
214
|
+
export const ACTOR_VARIANT_FACE_CHECK_REASON = "the face check was unavailable";
|
|
215
|
+
export const ACTOR_VARIANT_FACE_CHECK_WARNINGS = ACTOR_VARIANT_ASPECTS.map((aspect) => actorVariantWarning(aspect, ACTOR_VARIANT_FACE_CHECK_REASON));
|
|
216
|
+
/** Что делает `create_actor` — один текст для публичного каталога скиллов и клиентов. */
|
|
217
|
+
export const CREATE_ACTOR_DESCRIPTION = "Create a personal actor for this account from words describing a fictional adult: a 9:16 portrait with exactly " +
|
|
218
|
+
"one face, plus the other requested formats edited from it. Returns a run_id immediately; poll get_run until " +
|
|
219
|
+
"'succeeded' (created_actor.actor_id, then pass it as actor_id to make_ugc) or 'failed'. Each published image is " +
|
|
220
|
+
"charged at the price quote shows; refused descriptions and unusable portraits cost nothing. When generation is " +
|
|
221
|
+
"switched off the call fails with actor_generation_disabled.";
|
|
222
|
+
//# sourceMappingURL=account-actors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-actors.js","sourceRoot":"","sources":["../src/account-actors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,qBAAqB,GAEtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,2BAA2B,EAC3B,sBAAsB,EACtB,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAoB,MAAM,aAAa,CAAC;AAE9D,2GAA2G;AAE3G,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE9G,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,2BAA2B,EAC3B,sBAAsB,EACtB,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAG3B,MAAM,CAAC,MAAM,wBAAwB,GAAG,UAAU,CAAC;AACnD,MAAM,uBAAuB,GAAG,EAAE,CAAC;AACnC,MAAM,eAAe,GAAG,kCAAkC,CAAC;AAE3D,8EAA8E;AAC9E,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;AAE1E,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,YAAY,EAAE,SAAS,CAAU,CAAC;AAG/D,oGAAoG;AACpG,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,eAAe,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;AAC/E,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,kBAAkB,CAAC,MAAkB;IACnD,IAAI,MAAM,CAAC,MAAM,KAAK,uBAAuB,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,2BAA2B,uBAAuB,sBAAsB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3G,CAAC;IACD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;QAC9B,IAAI,IAAI,CAAC,CAAC;QACV,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC;YACjB,IAAI,IAAI,CAAC,CAAC;YACV,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7E,OAAO,wBAAwB,GAAG,OAAO,CAAC;AAC5C,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAqC,CAAC;AAE3E,0EAA0E;AAC1E,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IACrC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IACpC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;CACoC,CAAC;AAE5E,MAAM,gBAAgB,GAAG,CAAC,MAAyB,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;AAC/F,MAAM,YAAY,GAAG,CAAC,MAAyB,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC;AAE3F,gGAAgG;AAChG,MAAM,eAAe,GAAG;IACtB,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,2BAA2B,CAAC;SAChC,QAAQ,CACP,wGAAwG;QACtG,6DAA6D,CAChE;IACH,MAAM,EAAE,CAAC;SACN,IAAI,CAAC,sBAAsB,CAAC;SAC5B,QAAQ,CACP,GAAG,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,6EAA6E,CACnH;IACH,eAAe,EAAE,CAAC;SACf,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,aAAa,CAAC;SAClB,GAAG,CAAC,aAAa,CAAC;SAClB,QAAQ,CAAC,6BAA6B,aAAa,OAAO,aAAa,sBAAsB,CAAC;IACjG,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IACxF,aAAa,EAAE,CAAC;SACb,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;SAC5B,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC;SACzB,MAAM,CAAC,gBAAgB,EAAE;QACxB,KAAK,EAAE,8BAA8B,qBAAqB,+BAA+B,qBAAqB,WAAW;KAC1H,CAAC;SACD,MAAM,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,wCAAwC,EAAE,CAAC;SACzE,OAAO,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC;SAC3B,QAAQ,CACP,sBAAsB,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,sBAAsB,qBAAqB,sBAAsB;QAC9G,wFAAwF,CAC3F;CACK,CAAC;AAIX,SAAS,oBAAoB,CAAC,IAAuB;IACnD,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,2FAA2F,CAAC;IACrG,CAAC;IACD,OAAO,oBAAoB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,2FAA2F,CAAC;AACxI,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,oBAAoB,CAAoC,QAAW,EAAE,cAAyB;IAC5G,OAAO,CAAC,CAAC,YAAY,CACnB;QACE,GAAG,eAAe;QAClB,OAAO,EAAE,CAAC;aACP,IAAI,CAAC,QAAQ,EAAE;YACd,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,WAAW,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,mCAAmC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;SAClG,CAAC;aACD,OAAO,CAAC,cAAc,CAAC;aACvB,QAAQ,CACP,kBAAkB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,cAAc,uCAAuC;YAC5G,mCAAmC,CACtC;KACJ,EACD;QACE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,mBAAmB,CAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;KACtG,CACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,wBAAwB,EAAE,qBAAqB,CAAC,CAAC;AAOtG,qFAAqF;AACrF,MAAM,CAAC,MAAM,qBAAqB,GAAG,gBAAgB,CAAC,KAAK,CAAC;AAE5D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACrC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC;AAEH,qGAAqG;AACrG,qFAAqF;AACrF,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAElE,wGAAwG;AACxG,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC;IACtC,YAAY,EAAE,gBAAgB;IAC9B,iBAAiB,EAAE,aAAa;CACjC,CAAC,CAAC;AAGH,wFAAwF;AACxF,MAAM,CAAC,MAAM,4BAA4B,GAAG,oBAAoB,CAAC,MAAM,CAAC;IACtE,iBAAiB,EAAE,CAAC;SACjB,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;SAC5B,GAAG,CAAC,CAAC,CAAC;SACN,MAAM,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,kCAAkC,qBAAqB,EAAE,EAAE,CAAC;SAC9F,MAAM,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,4CAA4C,EAAE,CAAC;CACjF,CAAC,CAAC;AAEH,SAAS,WAAW,CAAC,IAAuB,EAAE,KAAwB;IACpE,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IACxB,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IACzB,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,6FAA6F;AAC7F,wGAAwG;AACxG,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC;KACpC,MAAM,CAAC;IACN,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC;IACnC,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC;IACtD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,aAAa,EAAE,aAAa;IAC5B,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC;IACtC,gBAAgB,EAAE,oBAAoB;CACvC,CAAC;KACD,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE;IACnE,KAAK,EAAE,sDAAsD;IAC7D,IAAI,EAAE,CAAC,SAAS,CAAC;CAClB,CAAC;KACD,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,EAAE;IAC7F,KAAK,EAAE,qEAAqE;IAC5E,IAAI,EAAE,CAAC,eAAe,CAAC;CACxB,CAAC,CAAC;AAGL,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;IAChC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAChD,gBAAgB,EAAE,oBAAoB;IACtC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACzC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE;CAC7B,CAAC,CAAC;AAGH,sGAAsG;AACtG,uFAAuF;AACvF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,QAAQ,EAAE,eAAe;IACzB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC;IACnC,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC;IACtD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACpC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC;IACtC,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;CACpD,CAAC,CAAC;AAGH,8FAA8F;AAC9F,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAAC,MAAM,CAAC;IACtD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,gBAAgB,EAAE;QACpD,KAAK,EAAE,4CAA4C,qBAAqB,EAAE;KAC3E,CAAC;CACH,CAAC,CAAC;AASH,MAAM,CAAC,MAAM,+BAA+B,GAAG;IAC7C,WAAW,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACxD,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACnD,eAAe,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE;IAC5D,IAAI,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE;IAClD,OAAO,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACpD,aAAa,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE;CACS,CAAC;AAEtE,6GAA6G;AAC7G,MAAM,UAAU,4BAA4B,CAC1C,KAAwC,EACxC,YAAY,GAAqD,+BAA+B;IAEhG,OAAO,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,EAAE,CACnE,WAAW,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CACzF,CAAC;AACJ,CAAC;AAED,mGAAmG;AACnG,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,uBAAuB,EACrB,oGAAoG;IACtG,oBAAoB,EAClB,oHAAoH;QACpH,8CAA8C;IAChD,sBAAsB,EACpB,oGAAoG;IACtG,wBAAwB,EACtB,2GAA2G;IAC7G,oBAAoB,EAAE,sFAAsF;IAC5G,4BAA4B,EAC1B,0GAA0G;IAC5G,yBAAyB,EAAE,sFAAsF;IACjH,qBAAqB,EAAE,kFAAkF;IACzG,mBAAmB,EACjB,kGAAkG;CAC5F,CAAC;AAEX,MAAM,CAAC,MAAM,4BAA4B,GAAG,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAA8B,CAAC;AAE9G,MAAM,UAAU,mBAAmB,CAAC,IAA6B;IAC/D,OAAO,GAAG,IAAI,KAAK,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;AACrD,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,uBAAuB,CAAC,IAA6B,EAAE,MAAc;IACnF,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,KAAK,MAAM,GAAG,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,aAAa,CAAC,MAAM,CACvD,CAAC,MAAM,EAAgE,EAAE,CAAC,MAAM,KAAK,qBAAqB,CAC3G,CAAC;AAEF,0FAA0F;AAC1F,MAAM,UAAU,mBAAmB,CAAC,MAAmB,EAAE,MAAc;IACrE,OAAO,GAAG,MAAM,qBAAqB,MAAM,sBAAsB,CAAC;AACpE,CAAC;AAED,iFAAiF;AACjF,2FAA2F;AAC3F,MAAM,CAAC,MAAM,+BAA+B,GAAG,gCAAgC,CAAC;AAChF,MAAM,CAAC,MAAM,iCAAiC,GAAsB,qBAAqB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACvG,mBAAmB,CAAC,MAAM,EAAE,+BAA+B,CAAC,CAC7D,CAAC;AAEF,yFAAyF;AACzF,MAAM,CAAC,MAAM,wBAAwB,GACnC,iHAAiH;IACjH,8GAA8G;IAC9G,kHAAkH;IAClH,iHAAiH;IACjH,6DAA6D,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Известное только пополняется и совпадает с CHECK 0031: по нему читаются сохранённые раны и ответы. */
|
|
2
|
+
export declare const ACTOR_GENDERS_KNOWN: readonly ["female", "male"];
|
|
3
|
+
export type ActorGender = (typeof ACTOR_GENDERS_KNOWN)[number];
|
|
4
|
+
export declare const ACTOR_ASPECTS_KNOWN: readonly ["9:16", "1:1", "16:9"];
|
|
5
|
+
export type ActorAspectKnown = (typeof ACTOR_ASPECTS_KNOWN)[number];
|
|
6
|
+
/** Нижняя граница `account_actors_adult`: младше неё не записано ничего. */
|
|
7
|
+
export declare const ACTOR_AGE_FLOOR = 18;
|
|
8
|
+
/** Границы приёма — решение продукта и могут сузиться. Отдельный модуль: тест сужает */
|
|
9
|
+
/** каждую подменой и проверяет, что ни одна схема чтения от них не зависит. */
|
|
10
|
+
export declare const ACTOR_DESCRIPTION_MAX_CHARS = 500;
|
|
11
|
+
export declare const ACTOR_NAME_MAX_CHARS = 100;
|
|
12
|
+
export declare const ACTOR_MIN_AGE = 18;
|
|
13
|
+
export declare const ACTOR_MAX_AGE = 90;
|
|
14
|
+
export declare const ACTOR_GENDERS_ACCEPTED: readonly ["female", "male"];
|