@cliangdev/conductor 0.27.1 → 0.29.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/assets/claude/agents/conductor-content-art-director.md +16 -4
- package/assets/claude/agents/conductor-content-scriptwriter.md +4 -0
- package/assets/claude/commands/conductor/creative.md +2 -1
- package/assets/claude/skills/conductor-content-studio/SKILL.md +39 -17
- package/assets/claude/skills/conductor-content-studio/references/capabilities.md +16 -2
- package/assets/claude/skills/conductor-content-studio/references/compliance-checklist.md +1 -0
- package/assets/claude/skills/conductor-content-studio/references/idea-template.md +6 -1
- package/assets/claude/skills/conductor-content-studio/references/platform-specs.md +2 -2
- package/assets/claude/skills/conductor-content-studio/references/publish-pack-template.md +3 -1
- package/assets/claude/skills/conductor-content-studio/references/script-template.md +1 -1
- package/assets/claude/skills/conductor-creative/SKILL.md +67 -9
- package/assets/claude/skills/conductor-publisher/SKILL.md +6 -0
- package/assets/cli-manifest.json +8 -0
- package/dist/commands/doctor.d.ts +5 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +20 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/lib/codex-image.d.ts +51 -0
- package/dist/lib/codex-image.d.ts.map +1 -0
- package/dist/lib/codex-image.js +329 -0
- package/dist/lib/codex-image.js.map +1 -0
- package/dist/lib/creative-render.d.ts +8 -1
- package/dist/lib/creative-render.d.ts.map +1 -1
- package/dist/lib/creative-render.js +5 -5
- package/dist/lib/creative-render.js.map +1 -1
- package/dist/lib/media-probe.d.ts +4 -0
- package/dist/lib/media-probe.d.ts.map +1 -1
- package/dist/lib/media-probe.js +5 -2
- package/dist/lib/media-probe.js.map +1 -1
- package/dist/lib/provenance-sidecar.d.ts +19 -0
- package/dist/lib/provenance-sidecar.d.ts.map +1 -0
- package/dist/lib/provenance-sidecar.js +39 -0
- package/dist/lib/provenance-sidecar.js.map +1 -0
- package/dist/mcp/index.d.ts +1056 -5
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +94 -17
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/tools/creative-drafts.d.ts +21 -0
- package/dist/mcp/tools/creative-drafts.d.ts.map +1 -1
- package/dist/mcp/tools/creative-drafts.js +151 -10
- package/dist/mcp/tools/creative-drafts.js.map +1 -1
- package/dist/mcp/tools/creative-images.d.ts +39 -0
- package/dist/mcp/tools/creative-images.d.ts.map +1 -0
- package/dist/mcp/tools/creative-images.js +89 -0
- package/dist/mcp/tools/creative-images.js.map +1 -0
- package/dist/mcp/tools/creatives.d.ts +55 -1
- package/dist/mcp/tools/creatives.d.ts.map +1 -1
- package/dist/mcp/tools/creatives.js +159 -5
- package/dist/mcp/tools/creatives.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Photo generation through the person's own Codex CLI (`codex exec` with its built-in `image_gen`
|
|
3
|
+
* tool). Conductor never holds an image-model key: Claude writes the scene, Codex makes the image on
|
|
4
|
+
* this machine under the person's ChatGPT/Codex login, and the file lands in a project-local folder
|
|
5
|
+
* that drops straight into `photoPath`. Each image gets a `<file>.provenance.json` sidecar.
|
|
6
|
+
*
|
|
7
|
+
* The agent is asked to copy the generated files into the working directory and report them through
|
|
8
|
+
* `--output-schema`; when it doesn't, new files under `$CODEX_HOME/generated_images` are picked up
|
|
9
|
+
* and copied instead.
|
|
10
|
+
*/
|
|
11
|
+
import { spawn } from 'node:child_process';
|
|
12
|
+
import { copyFile, mkdir, readdir, readFile, stat, writeFile } from 'node:fs/promises';
|
|
13
|
+
import { homedir } from 'node:os';
|
|
14
|
+
import { extname, join, resolve, sep } from 'node:path';
|
|
15
|
+
import { readImageDimensions } from './image-dimensions.js';
|
|
16
|
+
import { binaryAvailable, resolveFfmpegPath } from './media-probe.js';
|
|
17
|
+
import { writeProvenanceSidecar } from './provenance-sidecar.js';
|
|
18
|
+
export const ASPECT_SIZES = {
|
|
19
|
+
portrait: '1024x1536',
|
|
20
|
+
square: '1024x1024',
|
|
21
|
+
landscape: '1536x1024',
|
|
22
|
+
};
|
|
23
|
+
export const NO_CODEX_HINT = 'Codex CLI not found — install it (npm i -g @openai/codex) and run `codex login`, or set CONDUCTOR_CODEX_PATH.';
|
|
24
|
+
export const NOT_LOGGED_IN_HINT = 'Codex CLI is not logged in — run `codex login` (see `conductor doctor`).';
|
|
25
|
+
const MAX_INLINE_IMAGE_BYTES = 1000000;
|
|
26
|
+
const IMAGE_EXTS = new Set(['.png', '.jpg', '.jpeg', '.webp']);
|
|
27
|
+
const OUTPUT_SCHEMA = {
|
|
28
|
+
type: 'object',
|
|
29
|
+
properties: {
|
|
30
|
+
files: { type: 'array', items: { type: 'string' } },
|
|
31
|
+
revisedPrompt: { type: 'string' },
|
|
32
|
+
},
|
|
33
|
+
required: ['files', 'revisedPrompt'],
|
|
34
|
+
additionalProperties: false,
|
|
35
|
+
};
|
|
36
|
+
let cachedCodexPath;
|
|
37
|
+
/** `CONDUCTOR_CODEX_PATH`, else `codex` on PATH. Cached for the process lifetime. */
|
|
38
|
+
export async function resolveCodexPath() {
|
|
39
|
+
if (cachedCodexPath)
|
|
40
|
+
return cachedCodexPath;
|
|
41
|
+
const candidate = process.env['CONDUCTOR_CODEX_PATH']?.trim() || 'codex';
|
|
42
|
+
if (await binaryAvailable(candidate, ['--version'])) {
|
|
43
|
+
cachedCodexPath = candidate;
|
|
44
|
+
return candidate;
|
|
45
|
+
}
|
|
46
|
+
throw new Error(NO_CODEX_HINT);
|
|
47
|
+
}
|
|
48
|
+
/** Test-only: the resolved path is cached, so tests that vary availability reset it. */
|
|
49
|
+
export function resetCodexPathCache() {
|
|
50
|
+
cachedCodexPath = undefined;
|
|
51
|
+
}
|
|
52
|
+
function runCapture(command, args) {
|
|
53
|
+
return new Promise((resolvePromise, reject) => {
|
|
54
|
+
const child = spawn(command, args, { stdio: ['ignore', 'pipe', 'pipe'] });
|
|
55
|
+
let output = '';
|
|
56
|
+
child.stdout?.on('data', (d) => (output += d));
|
|
57
|
+
child.stderr?.on('data', (d) => (output += d));
|
|
58
|
+
child.on('error', reject);
|
|
59
|
+
child.on('exit', (code) => resolvePromise({ code, output }));
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
async function assertLoggedIn(codex) {
|
|
63
|
+
let res;
|
|
64
|
+
try {
|
|
65
|
+
res = await runCapture(codex, ['login', 'status']);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
throw new Error(NO_CODEX_HINT);
|
|
69
|
+
}
|
|
70
|
+
if (res.code !== 0 || /not logged in/i.test(res.output))
|
|
71
|
+
throw new Error(NOT_LOGGED_IN_HINT);
|
|
72
|
+
}
|
|
73
|
+
/** For `conductor doctor`: never throws. */
|
|
74
|
+
export async function checkCodexCli() {
|
|
75
|
+
let codex;
|
|
76
|
+
try {
|
|
77
|
+
codex = await resolveCodexPath();
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return { state: 'missing' };
|
|
81
|
+
}
|
|
82
|
+
let version = 'unknown version';
|
|
83
|
+
try {
|
|
84
|
+
const v = await runCapture(codex, ['--version']);
|
|
85
|
+
version = v.output.trim().split('\n')[0] || version;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
/* keep the default */
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
await assertLoggedIn(codex);
|
|
92
|
+
return { state: 'ready', version };
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return { state: 'logged-out', version };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
export function buildPrompt(scene, aspect, count, hasReferences) {
|
|
99
|
+
return [
|
|
100
|
+
scene.trim(),
|
|
101
|
+
'',
|
|
102
|
+
'Rules:',
|
|
103
|
+
`- Use the image_gen tool to create exactly ${count} image${count === 1 ? '' : 's'} at size ${ASPECT_SIZES[aspect]}, high quality.`,
|
|
104
|
+
'- Photographic unless the scene above asks for another style.',
|
|
105
|
+
'- NO text, letters, numbers, logos, watermarks, UI, or phone/computer screens anywhere in the image.',
|
|
106
|
+
'- Leave clean negative space for a headline.',
|
|
107
|
+
...(hasReferences ? ['- Use the attached images as references.'] : []),
|
|
108
|
+
`- Then copy each generated file into the current directory as ${Array.from({ length: Math.min(count, 2) }, (_, i) => `image-${i + 1}.png`).join(', ')}${count > 2 ? '…' : ''}.`,
|
|
109
|
+
'- Reply with JSON: {"files": [absolute paths of the copies], "revisedPrompt": "the prompt the image tool actually used"}.',
|
|
110
|
+
].join('\n');
|
|
111
|
+
}
|
|
112
|
+
async function listImages(root) {
|
|
113
|
+
const out = [];
|
|
114
|
+
const walk = async (dir) => {
|
|
115
|
+
let entries;
|
|
116
|
+
try {
|
|
117
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
for (const e of entries) {
|
|
123
|
+
const p = join(dir, e.name);
|
|
124
|
+
if (e.isDirectory())
|
|
125
|
+
await walk(p);
|
|
126
|
+
else if (IMAGE_EXTS.has(extname(e.name).toLowerCase())) {
|
|
127
|
+
try {
|
|
128
|
+
out.push({ path: p, mtimeMs: (await stat(p)).mtimeMs });
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
/* gone */
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
await walk(root);
|
|
137
|
+
return out;
|
|
138
|
+
}
|
|
139
|
+
const codexHome = () => process.env['CODEX_HOME'] || join(homedir(), '.codex');
|
|
140
|
+
function runCodexExec(codex, args, prompt, timeoutMs, onProgress) {
|
|
141
|
+
return new Promise((resolvePromise, reject) => {
|
|
142
|
+
const child = spawn(codex, args, { stdio: ['pipe', 'pipe', 'pipe'] });
|
|
143
|
+
const outcome = {};
|
|
144
|
+
let settled = false;
|
|
145
|
+
let buffer = '';
|
|
146
|
+
let stderr = '';
|
|
147
|
+
const finish = (err) => {
|
|
148
|
+
if (settled)
|
|
149
|
+
return;
|
|
150
|
+
settled = true;
|
|
151
|
+
clearTimeout(timer);
|
|
152
|
+
if (err)
|
|
153
|
+
reject(err);
|
|
154
|
+
else
|
|
155
|
+
resolvePromise(outcome);
|
|
156
|
+
};
|
|
157
|
+
const timer = setTimeout(() => {
|
|
158
|
+
try {
|
|
159
|
+
child.kill();
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
/* already gone */
|
|
163
|
+
}
|
|
164
|
+
finish(new Error(`Codex image generation timed out after ${Math.round(timeoutMs / 1000)} s`));
|
|
165
|
+
}, timeoutMs);
|
|
166
|
+
timer.unref?.();
|
|
167
|
+
const handleLine = (line) => {
|
|
168
|
+
if (!line.trim())
|
|
169
|
+
return;
|
|
170
|
+
let ev;
|
|
171
|
+
try {
|
|
172
|
+
ev = JSON.parse(line);
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
const type = String(ev['type'] ?? '');
|
|
178
|
+
if (type === 'error') {
|
|
179
|
+
const message = String(ev['message'] ?? 'unknown error');
|
|
180
|
+
outcome.lastError = message;
|
|
181
|
+
onProgress?.(`Codex: ${message}`);
|
|
182
|
+
}
|
|
183
|
+
else if (type.startsWith('item.')) {
|
|
184
|
+
const item = (ev['item'] ?? {});
|
|
185
|
+
const itemType = String(item['type'] ?? 'item');
|
|
186
|
+
if (itemType === 'agent_message' && typeof item['text'] === 'string')
|
|
187
|
+
outcome.lastMessage = item['text'];
|
|
188
|
+
onProgress?.(`Codex: ${itemType.replace(/_/g, ' ')} ${type.slice(5)}`);
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
child.stdout?.on('data', (d) => {
|
|
192
|
+
buffer += d;
|
|
193
|
+
let nl;
|
|
194
|
+
while ((nl = buffer.indexOf('\n')) >= 0) {
|
|
195
|
+
handleLine(buffer.slice(0, nl));
|
|
196
|
+
buffer = buffer.slice(nl + 1);
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
child.stderr?.on('data', (d) => (stderr += d));
|
|
200
|
+
child.on('error', (err) => finish(err.code === 'ENOENT' ? new Error(NO_CODEX_HINT) : err));
|
|
201
|
+
child.on('exit', (code) => {
|
|
202
|
+
handleLine(buffer);
|
|
203
|
+
if (code === 0)
|
|
204
|
+
finish();
|
|
205
|
+
else {
|
|
206
|
+
const detail = outcome.lastError ?? (stderr.trim().split('\n').pop() || `exit ${code}`);
|
|
207
|
+
finish(new Error(`Codex failed: ${detail}`));
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
child.stdin?.on?.('error', () => { });
|
|
211
|
+
child.stdin?.end(prompt);
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
async function validImage(path) {
|
|
215
|
+
try {
|
|
216
|
+
const info = readImageDimensions(await readFile(path));
|
|
217
|
+
return info ? { path, width: info.width, height: info.height } : null;
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
async function jpegPreview(png, outDir) {
|
|
224
|
+
try {
|
|
225
|
+
const ffmpeg = await resolveFfmpegPath();
|
|
226
|
+
const out = join(outDir, '.preview.jpg');
|
|
227
|
+
for (const q of ['4', '10']) {
|
|
228
|
+
const res = await runCapture(ffmpeg, [
|
|
229
|
+
'-y', '-v', 'error', '-i', png,
|
|
230
|
+
'-vf', "scale='if(gt(iw,ih),min(1024,iw),-2)':'if(gt(iw,ih),-2,min(1024,ih))'",
|
|
231
|
+
'-q:v', q, out,
|
|
232
|
+
]);
|
|
233
|
+
if (res.code !== 0)
|
|
234
|
+
break;
|
|
235
|
+
const data = await readFile(out);
|
|
236
|
+
if (data.length <= MAX_INLINE_IMAGE_BYTES)
|
|
237
|
+
return { data, mimeType: 'image/jpeg' };
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
/* fall through to the PNG */
|
|
242
|
+
}
|
|
243
|
+
try {
|
|
244
|
+
const data = await readFile(png);
|
|
245
|
+
const info = readImageDimensions(data);
|
|
246
|
+
if (info && data.length < MAX_INLINE_IMAGE_BYTES)
|
|
247
|
+
return { data, mimeType: info.contentType };
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
/* no preview */
|
|
251
|
+
}
|
|
252
|
+
return undefined;
|
|
253
|
+
}
|
|
254
|
+
export async function generateImages(params) {
|
|
255
|
+
const { outDir, onProgress } = params;
|
|
256
|
+
const aspect = params.aspect ?? 'portrait';
|
|
257
|
+
const count = params.count ?? 1;
|
|
258
|
+
const refs = params.referenceImagePaths ?? [];
|
|
259
|
+
const timeoutMs = params.timeoutMs ?? 300000;
|
|
260
|
+
const codex = await resolveCodexPath();
|
|
261
|
+
await assertLoggedIn(codex);
|
|
262
|
+
await mkdir(outDir, { recursive: true });
|
|
263
|
+
const outRoot = resolve(outDir);
|
|
264
|
+
const schemaPath = join(outRoot, '.codex-schema.json');
|
|
265
|
+
const lastPath = join(outRoot, '.codex-last.json');
|
|
266
|
+
await writeFile(schemaPath, JSON.stringify(OUTPUT_SCHEMA));
|
|
267
|
+
const genRoot = join(codexHome(), 'generated_images');
|
|
268
|
+
const before = new Set((await listImages(genRoot)).map((f) => f.path));
|
|
269
|
+
const startedAt = Date.now() - 1000;
|
|
270
|
+
const args = [
|
|
271
|
+
'exec', '--ephemeral', '--skip-git-repo-check', '-s', 'workspace-write',
|
|
272
|
+
'-C', outRoot, '--output-schema', schemaPath, '-o', lastPath, '--json',
|
|
273
|
+
...refs.flatMap((r) => ['-i', r]),
|
|
274
|
+
'-',
|
|
275
|
+
];
|
|
276
|
+
onProgress?.('Starting Codex image generation');
|
|
277
|
+
const outcome = await runCodexExec(codex, args, buildPrompt(params.prompt, aspect, count, refs.length > 0), timeoutMs, onProgress);
|
|
278
|
+
let revisedPrompt = '';
|
|
279
|
+
const found = [];
|
|
280
|
+
// (a) files the agent copied into outDir and reported.
|
|
281
|
+
try {
|
|
282
|
+
const last = JSON.parse(await readFile(lastPath, 'utf8'));
|
|
283
|
+
if (typeof last.revisedPrompt === 'string')
|
|
284
|
+
revisedPrompt = last.revisedPrompt;
|
|
285
|
+
for (const f of Array.isArray(last.files) ? last.files : []) {
|
|
286
|
+
if (found.length >= count || typeof f !== 'string')
|
|
287
|
+
continue;
|
|
288
|
+
const abs = resolve(outRoot, f);
|
|
289
|
+
if (!abs.startsWith(outRoot + sep))
|
|
290
|
+
continue;
|
|
291
|
+
const img = await validImage(abs);
|
|
292
|
+
if (img && !found.some((x) => x.path === img.path))
|
|
293
|
+
found.push(img);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
/* no usable report — try the generated_images folder */
|
|
298
|
+
}
|
|
299
|
+
// (b) fallback: new files under $CODEX_HOME/generated_images, newest first.
|
|
300
|
+
if (found.length === 0) {
|
|
301
|
+
const fresh = (await listImages(genRoot))
|
|
302
|
+
.filter((f) => !before.has(f.path) && f.mtimeMs >= startedAt)
|
|
303
|
+
.sort((a, b) => b.mtimeMs - a.mtimeMs);
|
|
304
|
+
for (const f of fresh) {
|
|
305
|
+
if (found.length >= count)
|
|
306
|
+
break;
|
|
307
|
+
const dest = join(outRoot, `image-${found.length + 1}${extname(f.path).toLowerCase()}`);
|
|
308
|
+
await copyFile(f.path, dest);
|
|
309
|
+
const img = await validImage(dest);
|
|
310
|
+
if (img)
|
|
311
|
+
found.push(img);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
if (found.length === 0) {
|
|
315
|
+
const why = outcome.lastMessage ? ` Codex said: ${outcome.lastMessage.slice(0, 500)}` : '';
|
|
316
|
+
// A ChatGPT plan without image generation (e.g. Free) hides image_gen from `codex exec` entirely,
|
|
317
|
+
// and the run still exits 0 — so this is the error that person sees.
|
|
318
|
+
throw new Error(`Codex finished but produced no usable image.${why} ` +
|
|
319
|
+
"Codex's image generation needs a ChatGPT plan that includes it (Plus or higher) on the account `codex login` used.");
|
|
320
|
+
}
|
|
321
|
+
const date = new Date().toISOString().slice(0, 10);
|
|
322
|
+
const provenance = { source: `Generated with Codex image_gen on ${date}`, licence: 'Generated, house use', aiGenerated: true };
|
|
323
|
+
for (const img of found) {
|
|
324
|
+
await writeProvenanceSidecar(img.path, { ...provenance, prompt: params.prompt, revisedPrompt });
|
|
325
|
+
}
|
|
326
|
+
const preview = await jpegPreview(found[0].path, outRoot);
|
|
327
|
+
return { files: found, provenance, revisedPrompt, outDir: outRoot, ...(preview ? { preview } : {}) };
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=codex-image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-image.js","sourceRoot":"","sources":["../../src/lib/codex-image.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,6 +28,13 @@ export interface RenderCreativeResult {
|
|
|
28
28
|
error?: string | null;
|
|
29
29
|
frames: RenderFrame[];
|
|
30
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* A CLIP or CAROUSEL creative has no local browser render path at all — it's finished media used
|
|
33
|
+
* as-is (a video, or ordered images), and the backend assembles its frames itself synchronously. This just POSTs the render and relays what
|
|
34
|
+
* came back — `ApiError`'s `message` is already the server's own plain-English sentence (an RFC 7807
|
|
35
|
+
* `detail`), so a failure reaches the caller unchanged rather than wrapped in a generic message.
|
|
36
|
+
*/
|
|
37
|
+
export declare function renderViaApi(params: RenderCreativeParams, config: Config): Promise<RenderCreativeResult>;
|
|
31
38
|
/**
|
|
32
39
|
* Renders a Creative end to end. STILL and MOTION creatives both find a local browser and run the
|
|
33
40
|
* render core against the external API, reading back the stored render (frames with signed URLs,
|
|
@@ -36,7 +43,7 @@ export interface RenderCreativeResult {
|
|
|
36
43
|
* binary — resolved the same way `upload_creative_media`/`media-probe.ts` finds one (a system binary
|
|
37
44
|
* on PATH first, else the bundled `ffmpeg-static` fallback) — and runs at a fixed 30fps; a previewOnly
|
|
38
45
|
* MOTION render (the key-moments contact sheet) needs neither ffmpeg nor a video encode, so it skips
|
|
39
|
-
* this resolution entirely. CLIP creatives never launch a browser — see {@link renderViaApi}.
|
|
46
|
+
* this resolution entirely. CLIP and CAROUSEL creatives never launch a browser — see {@link renderViaApi}.
|
|
40
47
|
*/
|
|
41
48
|
export declare function renderCreative(params: RenderCreativeParams, config: Config, log?: (...args: unknown[]) => void): Promise<RenderCreativeResult>;
|
|
42
49
|
export interface DraftManifestFrame {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"creative-render.d.ts","sourceRoot":"","sources":["../../src/lib/creative-render.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAS9C,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,0GAA0G;IAC1G,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,OAAO,CAAA;IACX,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,MAAM,EAAE,WAAW,EAAE,CAAA;CACtB;
|
|
1
|
+
{"version":3,"file":"creative-render.d.ts","sourceRoot":"","sources":["../../src/lib/creative-render.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,12 +39,12 @@ async function loadRenderCore() {
|
|
|
39
39
|
return { run: renderMod.run, createApiTransport: transportMod.createApiTransport };
|
|
40
40
|
}
|
|
41
41
|
/**
|
|
42
|
-
* A CLIP creative has no local browser render path at all — it's
|
|
43
|
-
* the backend assembles its frames itself synchronously. This just POSTs the render and relays what
|
|
42
|
+
* A CLIP or CAROUSEL creative has no local browser render path at all — it's finished media used
|
|
43
|
+
* as-is (a video, or ordered images), and the backend assembles its frames itself synchronously. This just POSTs the render and relays what
|
|
44
44
|
* came back — `ApiError`'s `message` is already the server's own plain-English sentence (an RFC 7807
|
|
45
45
|
* `detail`), so a failure reaches the caller unchanged rather than wrapped in a generic message.
|
|
46
46
|
*/
|
|
47
|
-
async function renderViaApi(params, config) {
|
|
47
|
+
export async function renderViaApi(params, config) {
|
|
48
48
|
try {
|
|
49
49
|
const detail = await apiPost(`/api/v2/projects/${config.projectId}/marketing/creatives/${params.creativeId}/renders`, { previewOnly: !!params.previewOnly, renderer: params.renderer, workflowRunId: params.workflowRunId }, config);
|
|
50
50
|
return { ok: detail.state === 'SUCCEEDED', renderId: detail.id, state: detail.state, error: detail.error ?? null, frames: detail.frames ?? [] };
|
|
@@ -64,11 +64,11 @@ async function renderViaApi(params, config) {
|
|
|
64
64
|
* binary — resolved the same way `upload_creative_media`/`media-probe.ts` finds one (a system binary
|
|
65
65
|
* on PATH first, else the bundled `ffmpeg-static` fallback) — and runs at a fixed 30fps; a previewOnly
|
|
66
66
|
* MOTION render (the key-moments contact sheet) needs neither ffmpeg nor a video encode, so it skips
|
|
67
|
-
* this resolution entirely. CLIP creatives never launch a browser — see {@link renderViaApi}.
|
|
67
|
+
* this resolution entirely. CLIP and CAROUSEL creatives never launch a browser — see {@link renderViaApi}.
|
|
68
68
|
*/
|
|
69
69
|
export async function renderCreative(params, config, log = () => { }) {
|
|
70
70
|
const creative = await apiGet(`/api/v2/projects/${config.projectId}/marketing/creatives/${params.creativeId}`, config);
|
|
71
|
-
if (creative.kind === 'CLIP') {
|
|
71
|
+
if (creative.kind === 'CLIP' || creative.kind === 'CAROUSEL') {
|
|
72
72
|
return renderViaApi(params, config);
|
|
73
73
|
}
|
|
74
74
|
let ffmpegPath;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"creative-render.js","sourceRoot":"","sources":["../../src/lib/creative-render.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD;6DAC6D;AAC7D,MAAM,UAAU,GAAG,EAAE,CAAA;AAsErB;gFACgF;AAChF,SAAS,MAAM;IACb,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IACpD,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,CAAA;AAC5C,CAAC;AAED,KAAK,UAAU,cAAc;IAC3B,MAAM,GAAG,GAAG,MAAM,EAAE,CAAA;IACpB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAA;IAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAA;IAChD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CACb,wCAAwC,GAAG,oDAAoD;YAC7F,qFAAqF;YACrF,yDAAyD,CAC5D,CAAA;IACH,CAAC;IACD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAClD,MAAM,CAAC,UAAU,CAAwB;QACzC,MAAM,CAAC,aAAa,CAA6B;KAClD,CAAC,CAAA;IACF,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,kBAAkB,EAAE,YAAY,CAAC,kBAAkB,EAAE,CAAA;AACpF,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,YAAY,CAAC,MAA4B,EAAE,MAAc;
|
|
1
|
+
{"version":3,"file":"creative-render.js","sourceRoot":"","sources":["../../src/lib/creative-render.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,6 +39,10 @@ export declare const NO_FFMPEG_HINT: string;
|
|
|
39
39
|
* image ffprobe happened to be pointed at (format `image2`/`png_pipe`/etc.), not a video.
|
|
40
40
|
*/
|
|
41
41
|
export declare function parseProbeJson(json: FfprobeJson, filePath: string): MediaProbeResult;
|
|
42
|
+
/** True once the named command launches at all (any exit code) rather than failing to spawn
|
|
43
|
+
* (ENOENT) — that's enough to know it's a real binary on PATH, without caring what `-version`
|
|
44
|
+
* prints. Bounded by a timeout so a binary that launches but hangs doesn't wedge discovery forever. */
|
|
45
|
+
export declare function binaryAvailable(command: string, args?: string[]): Promise<boolean>;
|
|
42
46
|
export declare function resolveFfprobePath(): Promise<string>;
|
|
43
47
|
export declare function resolveFfmpegPath(): Promise<string>;
|
|
44
48
|
/** Test-only: binary discovery caches its result for the process lifetime (real launches are slow
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media-probe.d.ts","sourceRoot":"","sources":["../../src/lib/media-probe.ts"],"names":[],"mappings":"AAqBA,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAA;AAEnD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,SAAS,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,UAAU,aAAa;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CACxC;AAED,UAAU,aAAa;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,aAAa,EAAE,CAAA;IACzB,MAAM,CAAC,EAAE,aAAa,CAAA;CACvB;AAED,eAAO,MAAM,eAAe,QAE8D,CAAA;AAC1F,eAAO,MAAM,cAAc,QAEiD,CAAA;AA0B5E;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAmCpF;
|
|
1
|
+
{"version":3,"file":"media-probe.d.ts","sourceRoot":"","sources":["../../src/lib/media-probe.ts"],"names":[],"mappings":"AAqBA,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAA;AAEnD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,SAAS,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,UAAU,aAAa;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CACxC;AAED,UAAU,aAAa;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,aAAa,EAAE,CAAA;IACzB,MAAM,CAAC,EAAE,aAAa,CAAA;CACvB;AAED,eAAO,MAAM,eAAe,QAE8D,CAAA;AAC1F,eAAO,MAAM,cAAc,QAEiD,CAAA;AA0B5E;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAmCpF;AAKD;;uGAEuG;AACvG,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAoBhG;AAMD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAiB1D;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAgBzD;AAED;;6BAE6B;AAC7B,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C;AAwBD;0EAC0E;AAC1E,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAI5E;AAgBD;6FAC6F;AAC7F,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAQnG"}
|
package/dist/lib/media-probe.js
CHANGED
|
@@ -92,7 +92,7 @@ let cachedFfmpegPath;
|
|
|
92
92
|
/** True once the named command launches at all (any exit code) rather than failing to spawn
|
|
93
93
|
* (ENOENT) — that's enough to know it's a real binary on PATH, without caring what `-version`
|
|
94
94
|
* prints. Bounded by a timeout so a binary that launches but hangs doesn't wedge discovery forever. */
|
|
95
|
-
function
|
|
95
|
+
export function binaryAvailable(command, args = ['-version']) {
|
|
96
96
|
return new Promise((resolve) => {
|
|
97
97
|
let settled = false;
|
|
98
98
|
const finish = (ok) => {
|
|
@@ -103,7 +103,7 @@ function systemBinaryAvailable(command) {
|
|
|
103
103
|
};
|
|
104
104
|
let child;
|
|
105
105
|
try {
|
|
106
|
-
child = spawn(command,
|
|
106
|
+
child = spawn(command, args, { stdio: 'ignore' });
|
|
107
107
|
}
|
|
108
108
|
catch {
|
|
109
109
|
finish(false);
|
|
@@ -115,6 +115,9 @@ function systemBinaryAvailable(command) {
|
|
|
115
115
|
timer.unref?.();
|
|
116
116
|
});
|
|
117
117
|
}
|
|
118
|
+
function systemBinaryAvailable(command) {
|
|
119
|
+
return binaryAvailable(command);
|
|
120
|
+
}
|
|
118
121
|
export async function resolveFfprobePath() {
|
|
119
122
|
if (cachedFfprobePath)
|
|
120
123
|
return cachedFfprobePath;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media-probe.js","sourceRoot":"","sources":["../../src/lib/media-probe.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"media-probe.js","sourceRoot":"","sources":["../../src/lib/media-probe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Provenance recorded on a media file when it is uploaded. */
|
|
2
|
+
export interface SidecarProvenance {
|
|
3
|
+
source: string;
|
|
4
|
+
licence: string;
|
|
5
|
+
aiGenerated: boolean;
|
|
6
|
+
}
|
|
7
|
+
/** The on-disk shape: provenance plus optional generation detail kept for the record. */
|
|
8
|
+
export interface SidecarData extends SidecarProvenance {
|
|
9
|
+
prompt?: string;
|
|
10
|
+
revisedPrompt?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare const sidecarPath: (filePath: string) => string;
|
|
13
|
+
/**
|
|
14
|
+
* Reads `<file>.provenance.json`. Returns null when there is none; throws a clear error when it exists
|
|
15
|
+
* but is not valid JSON or has the wrong field types — a bad sidecar must not silently upload as "unknown".
|
|
16
|
+
*/
|
|
17
|
+
export declare function readProvenanceSidecar(filePath: string): Promise<SidecarProvenance | null>;
|
|
18
|
+
export declare function writeProvenanceSidecar(filePath: string, data: SidecarData): Promise<void>;
|
|
19
|
+
//# sourceMappingURL=provenance-sidecar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provenance-sidecar.d.ts","sourceRoot":"","sources":["../../src/lib/provenance-sidecar.ts"],"names":[],"mappings":"AAEA,+DAA+D;AAC/D,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,OAAO,CAAA;CACrB;AAED,yFAAyF;AACzF,MAAM,WAAW,WAAY,SAAQ,iBAAiB;IACpD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,eAAO,MAAM,WAAW,GAAI,UAAU,MAAM,KAAG,MAAuC,CAAA;AAEtF;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAqB/F;AAED,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/F"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
export const sidecarPath = (filePath) => `${filePath}.provenance.json`;
|
|
3
|
+
/**
|
|
4
|
+
* Reads `<file>.provenance.json`. Returns null when there is none; throws a clear error when it exists
|
|
5
|
+
* but is not valid JSON or has the wrong field types — a bad sidecar must not silently upload as "unknown".
|
|
6
|
+
*/
|
|
7
|
+
export async function readProvenanceSidecar(filePath) {
|
|
8
|
+
const p = sidecarPath(filePath);
|
|
9
|
+
let raw;
|
|
10
|
+
try {
|
|
11
|
+
raw = await readFile(p, 'utf8');
|
|
12
|
+
}
|
|
13
|
+
catch (err) {
|
|
14
|
+
if (err.code === 'ENOENT')
|
|
15
|
+
return null;
|
|
16
|
+
throw err;
|
|
17
|
+
}
|
|
18
|
+
let data;
|
|
19
|
+
try {
|
|
20
|
+
data = JSON.parse(raw);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
throw new Error(`${p} is not valid JSON.`);
|
|
24
|
+
}
|
|
25
|
+
const o = data;
|
|
26
|
+
if (!o || typeof o !== 'object' || Array.isArray(o))
|
|
27
|
+
throw new Error(`${p} must be a JSON object.`);
|
|
28
|
+
if (typeof o['source'] !== 'string')
|
|
29
|
+
throw new Error(`${p}: "source" must be a string.`);
|
|
30
|
+
if (typeof o['licence'] !== 'string')
|
|
31
|
+
throw new Error(`${p}: "licence" must be a string.`);
|
|
32
|
+
if (typeof o['aiGenerated'] !== 'boolean')
|
|
33
|
+
throw new Error(`${p}: "aiGenerated" must be a boolean.`);
|
|
34
|
+
return { source: o['source'], licence: o['licence'], aiGenerated: o['aiGenerated'] };
|
|
35
|
+
}
|
|
36
|
+
export async function writeProvenanceSidecar(filePath, data) {
|
|
37
|
+
await writeFile(sidecarPath(filePath), JSON.stringify(data, null, 2) + '\n');
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=provenance-sidecar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provenance-sidecar.js","sourceRoot":"","sources":["../../src/lib/provenance-sidecar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAetD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,QAAgB,EAAU,EAAE,CAAC,GAAG,QAAQ,kBAAkB,CAAA;AAEtF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,QAAgB;IAC1D,MAAM,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAA;IAC/B,IAAI,GAAW,CAAA;IACf,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAA;QACjE,MAAM,GAAG,CAAA;IACX,CAAC;IACD,IAAI,IAAa,CAAA;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;IAC5C,CAAC;IACD,MAAM,CAAC,GAAG,IAA+B,CAAA;IACzC,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;IACnG,IAAI,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAA;IACxF,IAAI,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAA;IAC1F,IAAI,OAAO,CAAC,CAAC,aAAa,CAAC,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAA;IACpG,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,CAAA;AACtF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,QAAgB,EAAE,IAAiB;IAC9E,MAAM,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;AAC9E,CAAC"}
|