@pinepaper.studio/mcp-server 1.6.15 → 1.6.17
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/README.de.md +1 -1
- package/README.es.md +1 -1
- package/README.fr.md +1 -1
- package/README.hi.md +1 -1
- package/README.ja.md +1 -1
- package/README.ko.md +1 -1
- package/README.md +110 -4
- package/README.pt-BR.md +1 -1
- package/README.zh-CN.md +1 -1
- package/dist/build-info.json +2 -2
- package/dist/ontology/upstream-vocabulary.d.ts +2 -2
- package/dist/ontology/upstream-vocabulary.js +2 -2
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js +164 -19
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/engine-methods.d.ts.map +1 -1
- package/dist/tools/engine-methods.js +4 -0
- package/dist/tools/engine-methods.js.map +1 -1
- package/dist/tools/engine-surface.d.ts +1 -1
- package/dist/tools/engine-surface.d.ts.map +1 -1
- package/dist/tools/engine-surface.js +30 -9
- package/dist/tools/engine-surface.js.map +1 -1
- package/dist/tools/handlers/beats.d.ts +64 -0
- package/dist/tools/handlers/beats.d.ts.map +1 -0
- package/dist/tools/handlers/beats.js +83 -0
- package/dist/tools/handlers/beats.js.map +1 -0
- package/dist/tools/handlers/camera.d.ts.map +1 -1
- package/dist/tools/handlers/camera.js +11 -0
- package/dist/tools/handlers/camera.js.map +1 -1
- package/dist/tools/handlers/generate.d.ts +324 -0
- package/dist/tools/handlers/generate.d.ts.map +1 -0
- package/dist/tools/handlers/generate.js +264 -0
- package/dist/tools/handlers/generate.js.map +1 -0
- package/dist/tools/handlers.d.ts.map +1 -1
- package/dist/tools/handlers.js +79 -9
- package/dist/tools/handlers.js.map +1 -1
- package/dist/tools/minimal-descriptions.d.ts.map +1 -1
- package/dist/tools/minimal-descriptions.js +5 -0
- package/dist/tools/minimal-descriptions.js.map +1 -1
- package/dist/tools/shape-params.d.ts +2 -2
- package/dist/tools/shape-params.js +2 -2
- package/dist/tools/stick-vocabulary.d.ts +1 -1
- package/dist/tools/stick-vocabulary.js +1 -1
- package/dist/tools/toolkits.d.ts.map +1 -1
- package/dist/tools/toolkits.js +5 -0
- package/dist/tools/toolkits.js.map +1 -1
- package/dist/types/code-generator.d.ts +38 -0
- package/dist/types/code-generator.d.ts.map +1 -1
- package/dist/types/code-generator.js +552 -44
- package/dist/types/code-generator.js.map +1 -1
- package/dist/types/schemas.d.ts +614 -82
- package/dist/types/schemas.d.ts.map +1 -1
- package/dist/types/schemas.js +53 -21
- package/dist/types/schemas.js.map +1 -1
- package/dist/utils/a11y.d.ts +2 -0
- package/dist/utils/a11y.d.ts.map +1 -1
- package/dist/utils/a11y.js +1 -1
- package/dist/utils/a11y.js.map +1 -1
- package/dist/utils/beats.d.ts +58 -0
- package/dist/utils/beats.d.ts.map +1 -0
- package/dist/utils/beats.js +110 -0
- package/dist/utils/beats.js.map +1 -0
- package/dist/utils/svg-size.d.ts +22 -0
- package/dist/utils/svg-size.d.ts.map +1 -0
- package/dist/utils/svg-size.js +43 -0
- package/dist/utils/svg-size.js.map +1 -0
- package/dist/vendor/design/design-style.js +1 -1
- package/manifest.json +21 -1
- package/package.json +1 -1
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { errorResult, handleToolCall } from '../handlers.js';
|
|
3
|
+
import { ErrorCodes } from '../../types/schemas.js';
|
|
4
|
+
import { emitTextLayersPlacement } from '../../types/code-generator.js';
|
|
5
|
+
const GenerateInputSchema = z.object({
|
|
6
|
+
prompt: z.string().min(1),
|
|
7
|
+
aspect: z.enum(['16:9', '9:16', '1:1', '4:5']).optional(),
|
|
8
|
+
n: z.number().int().min(1).max(4).optional(),
|
|
9
|
+
seed: z.number().int().optional(),
|
|
10
|
+
negativePrompt: z.string().optional(),
|
|
11
|
+
// The cloud's own rule: https, or one of the org's own images as
|
|
12
|
+
// /scene-assets/<32 hex> — how a generated still becomes a video's start
|
|
13
|
+
// frame or a character reference without leaving the cloud.
|
|
14
|
+
imageUrls: z.array(z.string().refine((u) => /^https:\/\//.test(u) || /^\/scene-assets\/[0-9a-f]{32}$/.test(u), {
|
|
15
|
+
message: 'an https URL, or your own image as /scene-assets/<id> (the ref a generation returns)',
|
|
16
|
+
})).max(14).optional(),
|
|
17
|
+
// Video: clip length in seconds; each model allows its own set.
|
|
18
|
+
seconds: z.number().positive().max(60).optional(),
|
|
19
|
+
// WORDS ARE VECTOR: the plate comes back text-free and these come back as
|
|
20
|
+
// textLayers, to be added as real text. allowText (words drawn BY the model)
|
|
21
|
+
// is refused except on eval-tier models.
|
|
22
|
+
text: z.array(z.object({
|
|
23
|
+
content: z.string().min(1).max(500),
|
|
24
|
+
role: z.enum(['headline', 'subhead', 'caption', 'cta', 'label']).optional(),
|
|
25
|
+
font: z.string().max(80).optional(),
|
|
26
|
+
})).max(12).optional(),
|
|
27
|
+
allowText: z.boolean().optional(),
|
|
28
|
+
});
|
|
29
|
+
export const GenerateEstimateArgsSchema = z.object({
|
|
30
|
+
model: z.string().min(1).optional(),
|
|
31
|
+
useCase: z.string().min(1).optional(),
|
|
32
|
+
input: GenerateInputSchema.optional(),
|
|
33
|
+
listModels: z.boolean().optional(),
|
|
34
|
+
}).refine((v) => v.listModels || (v.input && (v.model || v.useCase)), { message: 'give input and a model or useCase — or listModels: true to see the models and their prices' });
|
|
35
|
+
export const GenerateArgsSchema = z.object({
|
|
36
|
+
model: z.string().min(1).optional(),
|
|
37
|
+
useCase: z.string().min(1).optional(),
|
|
38
|
+
input: GenerateInputSchema,
|
|
39
|
+
brief: z.string().max(2000).optional(),
|
|
40
|
+
designRef: z.object({ kind: z.string().min(1), id: z.string().min(1) }).optional(),
|
|
41
|
+
place: z.union([z.boolean(), z.enum(['cover', 'contain'])]).optional(),
|
|
42
|
+
timeoutSec: z.number().int().min(10).max(1800).optional(),
|
|
43
|
+
}).refine((v) => !!(v.model || v.useCase), { message: 'give a model (see pinepaper_generate_estimate listModels) or a useCase' });
|
|
44
|
+
/** Injectable for tests: the network and the clock. */
|
|
45
|
+
export const generateDeps = {
|
|
46
|
+
fetch: (url, init) => fetch(url, init),
|
|
47
|
+
sleep: (ms) => new Promise((r) => setTimeout(r, ms)),
|
|
48
|
+
now: () => Date.now(),
|
|
49
|
+
};
|
|
50
|
+
function cloudConfig() {
|
|
51
|
+
const key = (process.env.PINEPAPER_API_KEY || '').trim();
|
|
52
|
+
const base = (process.env.PINEPAPER_CLOUD_URL || 'https://cloud.pinepaper.studio').replace(/\/+$/, '');
|
|
53
|
+
if (!key) {
|
|
54
|
+
return { error: 'generation runs in the PinePaper cloud and needs a service-account key: set PINEPAPER_API_KEY (pp_sa_…, with the render:create scope) in this server\'s environment. Generation is an internal beta, enabled per organisation (the ai-media feature).' };
|
|
55
|
+
}
|
|
56
|
+
return { base, key };
|
|
57
|
+
}
|
|
58
|
+
/** What a refusal means, in the caller's terms. Every one says whether anything was charged. */
|
|
59
|
+
function explain(status, body) {
|
|
60
|
+
const said = String(body?.error || body?.detail || body?.title || '').trim();
|
|
61
|
+
const code = String(body?.code || body?.type || '').toUpperCase();
|
|
62
|
+
if (status === 401)
|
|
63
|
+
return 'the cloud did not accept PINEPAPER_API_KEY (invalid or revoked). Nothing was charged.';
|
|
64
|
+
if (status === 403 && /INSUFFICIENT_SCOPE/.test(code))
|
|
65
|
+
return `this key lacks the render:create scope that generation needs. ${said} Nothing was charged.`;
|
|
66
|
+
if (status === 403)
|
|
67
|
+
return 'generation (ai-media) is not enabled for your organisation — it is an internal beta, granted per organisation. Ask the PinePaper team for access. Nothing was charged.';
|
|
68
|
+
if (status === 402)
|
|
69
|
+
return `${said || 'not enough credits, or a spend cap was reached'}. Nothing was charged.`;
|
|
70
|
+
if (status === 422)
|
|
71
|
+
return `the request was refused as invalid: ${said || 'check model, aspect, n and imageUrls'}.`;
|
|
72
|
+
if (status === 503)
|
|
73
|
+
return said || 'generation is unavailable on this deployment right now. Nothing was charged.';
|
|
74
|
+
return `${said || 'the cloud refused the request'} (HTTP ${status}).`;
|
|
75
|
+
}
|
|
76
|
+
async function call(cfg, method, path, body) {
|
|
77
|
+
let res;
|
|
78
|
+
try {
|
|
79
|
+
res = await generateDeps.fetch(cfg.base + path, {
|
|
80
|
+
method,
|
|
81
|
+
headers: { Authorization: `Bearer ${cfg.key}`, ...(body !== undefined ? { 'Content-Type': 'application/json' } : {}), 'User-Agent': 'PinePaper-MCP' },
|
|
82
|
+
...(body !== undefined ? { body: JSON.stringify(body) } : {}),
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
catch (e) {
|
|
86
|
+
return { ok: false, message: `could not reach ${cfg.base}: ${e instanceof Error ? e.message : String(e)}. Nothing was charged.` };
|
|
87
|
+
}
|
|
88
|
+
let json = {};
|
|
89
|
+
try {
|
|
90
|
+
json = await res.json();
|
|
91
|
+
}
|
|
92
|
+
catch { /* a non-JSON body is described by its status */ }
|
|
93
|
+
if (!res.ok)
|
|
94
|
+
return { ok: false, status: res.status, code: json?.code, message: explain(res.status, json) };
|
|
95
|
+
return { ok: true, status: res.status, body: json };
|
|
96
|
+
}
|
|
97
|
+
const text = (v) => ({ content: [{ type: 'text', text: JSON.stringify(v, null, 2) }] });
|
|
98
|
+
const fail = (r) => errorResult(r.status === 422 ? ErrorCodes.INVALID_PARAMS : ErrorCodes.EXECUTION_ERROR, r.message, { ...(r.status ? { status: r.status } : {}), ...(r.code ? { code: r.code } : {}) });
|
|
99
|
+
const jobBody = (a) => ({
|
|
100
|
+
...(a.model ? { model: a.model } : {}), ...(a.useCase ? { useCase: a.useCase } : {}), input: a.input,
|
|
101
|
+
});
|
|
102
|
+
/**
|
|
103
|
+
* Bring the first asset into the studio, fitted to the canvas: an image as an
|
|
104
|
+
* image item, a video (it has a duration) as a video layer. The fit is
|
|
105
|
+
* computed in the page from the placed item's own bounds, never from the
|
|
106
|
+
* requested aspect: models deliver their own sizes (2752x1536 is 1.79, not
|
|
107
|
+
* 16:9), and those are what fill the frame.
|
|
108
|
+
*/
|
|
109
|
+
async function placeAsset(cfg, asset, mode, options) {
|
|
110
|
+
let res;
|
|
111
|
+
try {
|
|
112
|
+
res = await generateDeps.fetch(`${cfg.base}/v1/assets/${encodeURIComponent(asset.assetId)}`, { headers: { Authorization: `Bearer ${cfg.key}` } });
|
|
113
|
+
}
|
|
114
|
+
catch (e) {
|
|
115
|
+
return { placed: false, error: `could not download the asset: ${e instanceof Error ? e.message : String(e)}` };
|
|
116
|
+
}
|
|
117
|
+
if (!res.ok)
|
|
118
|
+
return { placed: false, error: `the cloud refused the asset download (HTTP ${res.status})` };
|
|
119
|
+
const type = (res.headers.get('content-type') || '').split(';')[0].trim();
|
|
120
|
+
const isVideo = typeof asset.durationSeconds === 'number' || type.startsWith('video/');
|
|
121
|
+
const dataUrl = `data:${type || (isVideo ? 'video/mp4' : 'image/png')};base64,${Buffer.from(await res.arrayBuffer()).toString('base64')}`;
|
|
122
|
+
const placedRes = isVideo
|
|
123
|
+
? await handleToolCall('pinepaper_media', { action: 'upload_video', url: dataUrl }, options)
|
|
124
|
+
: await handleToolCall('pinepaper_import_image', { url: dataUrl }, options);
|
|
125
|
+
const placedText = (placedRes.content ?? []).map((c) => ('text' in c ? c.text : '')).join('\n');
|
|
126
|
+
const ref = isVideo
|
|
127
|
+
? (/"registryId":\s*"([^"]+)"/.exec(placedText)?.[1] ?? /"id":\s*"([^"]+)"/.exec(placedText)?.[1])
|
|
128
|
+
: /"itemId":\s*"([^"]+)"/.exec(placedText)?.[1];
|
|
129
|
+
if (placedRes.isError || !ref)
|
|
130
|
+
return { placed: false, kind: isVideo ? 'video' : 'image', error: `generated, but could not be placed: ${placedText.slice(0, 300)}` };
|
|
131
|
+
// Cover fills the canvas (the overflow is outside the frame); contain fits
|
|
132
|
+
// inside it. Centred either way. A video's media id resolves to its item.
|
|
133
|
+
const fit = await handleToolCall('pinepaper_execute_custom_code', {
|
|
134
|
+
code: `let it = app.getItemById(${JSON.stringify(ref)});
|
|
135
|
+
if (!it && window.PinePaperAgent && typeof window.PinePaperAgent.listMedia === 'function') {
|
|
136
|
+
const m = window.PinePaperAgent.listMedia().find(function(x) { return x.id === ${JSON.stringify(ref)} || x.registryId === ${JSON.stringify(ref)}; });
|
|
137
|
+
if (m) it = app.getItemById(m.registryId);
|
|
138
|
+
}
|
|
139
|
+
const cs = app.getCanvasSize(); const b = it && it.bounds;
|
|
140
|
+
if (!it || !b || !(b.width > 0)) return { fitted: false };
|
|
141
|
+
const s = ${mode === 'cover' ? 'Math.max' : 'Math.min'}(cs.width / b.width, cs.height / b.height);
|
|
142
|
+
it.scale(s); it.position = new paper.Point(cs.width / 2, cs.height / 2);
|
|
143
|
+
return { fitted: true, width: Math.round(it.bounds.width), height: Math.round(it.bounds.height) };`,
|
|
144
|
+
}, options);
|
|
145
|
+
return {
|
|
146
|
+
placed: true, kind: isVideo ? 'video' : 'image', itemId: ref, fit: mode,
|
|
147
|
+
...(isVideo ? { durationSeconds: asset.durationSeconds, ...(asset.fps ? { fps: asset.fps } : {}) } : {}),
|
|
148
|
+
...(fit.isError ? { fitNote: 'placed at its own size; fitting it to the canvas failed' } : {}),
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
export const generateHandlers = {
|
|
152
|
+
'pinepaper_generate_estimate': async (args) => {
|
|
153
|
+
const a = GenerateEstimateArgsSchema.parse(args);
|
|
154
|
+
const cfg = cloudConfig();
|
|
155
|
+
if ('error' in cfg)
|
|
156
|
+
return errorResult(ErrorCodes.INVALID_PARAMS, cfg.error);
|
|
157
|
+
const out = {};
|
|
158
|
+
if (a.listModels) {
|
|
159
|
+
const m = await call(cfg, 'GET', '/v1/generate/models');
|
|
160
|
+
if (!m.ok)
|
|
161
|
+
return fail(m);
|
|
162
|
+
out.models = m.body.models;
|
|
163
|
+
out.defaults = m.body.defaults;
|
|
164
|
+
out.available = m.body.available;
|
|
165
|
+
}
|
|
166
|
+
if (a.input) {
|
|
167
|
+
const e = await call(cfg, 'POST', '/v1/generate:estimate', jobBody(a));
|
|
168
|
+
if (!e.ok)
|
|
169
|
+
return fail(e);
|
|
170
|
+
out.estimate = e.body.estimate;
|
|
171
|
+
}
|
|
172
|
+
return text({ success: true, free: true, ...out });
|
|
173
|
+
},
|
|
174
|
+
'pinepaper_generate': async (args, options) => {
|
|
175
|
+
const a = GenerateArgsSchema.parse(args);
|
|
176
|
+
const cfg = cloudConfig();
|
|
177
|
+
if ('error' in cfg)
|
|
178
|
+
return errorResult(ErrorCodes.INVALID_PARAMS, cfg.error);
|
|
179
|
+
// brief and designRef always travel: the cloud records each generation as
|
|
180
|
+
// a node in the design graph, and they are what tie it to the design.
|
|
181
|
+
const submitted = await call(cfg, 'POST', '/v1/generate', { ...jobBody(a), ...(a.brief ? { brief: a.brief } : {}), ...(a.designRef ? { designRef: a.designRef } : {}) });
|
|
182
|
+
if (!submitted.ok)
|
|
183
|
+
return fail(submitted);
|
|
184
|
+
const jobId = submitted.body?.job?.id;
|
|
185
|
+
const est = submitted.body?.estimate;
|
|
186
|
+
if (!jobId)
|
|
187
|
+
return errorResult(ErrorCodes.EXECUTION_ERROR, 'the cloud accepted the job but returned no id to poll', { response: submitted.body });
|
|
188
|
+
// Poll to a terminal state. Stills take seconds; video will take minutes,
|
|
189
|
+
// so the budget is the caller's (timeoutSec), backing off 2 s → 10 s.
|
|
190
|
+
const deadline = generateDeps.now() + (a.timeoutSec ?? 180) * 1000;
|
|
191
|
+
let wait = 2000;
|
|
192
|
+
let job = submitted.body.job;
|
|
193
|
+
while (!['done', 'failed', 'refused'].includes(job.status)) {
|
|
194
|
+
if (generateDeps.now() >= deadline) {
|
|
195
|
+
return text({ success: false, pending: true, jobId, status: job.status, estimate: est,
|
|
196
|
+
note: `still ${job.status} after ${a.timeoutSec ?? 180} s. It keeps running in the cloud and is charged only if it delivers; call pinepaper_generate_status {jobId: "${jobId}"} to collect it (or retry with a larger timeoutSec — video can take minutes).` });
|
|
197
|
+
}
|
|
198
|
+
await generateDeps.sleep(wait);
|
|
199
|
+
wait = Math.min(10_000, Math.round(wait * 1.5));
|
|
200
|
+
// Polling is a GET, safe to repeat: one retry on a 5xx or an unreachable
|
|
201
|
+
// cloud before it is reported (a transient 500 mid-job failed a run
|
|
202
|
+
// that the rerun passed).
|
|
203
|
+
let polled = await call(cfg, 'GET', `/v1/generate/${encodeURIComponent(jobId)}`);
|
|
204
|
+
if (!polled.ok && (polled.status === undefined || polled.status >= 500)) {
|
|
205
|
+
await generateDeps.sleep(3000);
|
|
206
|
+
polled = await call(cfg, 'GET', `/v1/generate/${encodeURIComponent(jobId)}`);
|
|
207
|
+
}
|
|
208
|
+
if (!polled.ok)
|
|
209
|
+
return fail({ ...polled, message: `${polled.message} The job ${jobId} may still finish: collect it with pinepaper_generate_status.` });
|
|
210
|
+
job = polled.body.job ?? job;
|
|
211
|
+
}
|
|
212
|
+
if (job.status !== 'done') {
|
|
213
|
+
return errorResult(job.status === 'refused' ? ErrorCodes.INVALID_PARAMS : ErrorCodes.EXECUTION_ERROR, String(job.error || (job.status === 'refused' ? "the model's safety filter refused this. Nothing was charged." : 'the generation failed. Nothing was charged.')), { jobId, status: job.status });
|
|
214
|
+
}
|
|
215
|
+
const assets = (job.assets ?? []);
|
|
216
|
+
const result = {
|
|
217
|
+
success: true, jobId, model: job.model, assets, chargedUsd: job.chargedUsd,
|
|
218
|
+
...(job.filtered ? { filtered: job.filtered, filteredNote: `${job.filtered} output(s) were removed by the safety filter and not charged.` } : {}),
|
|
219
|
+
// A model may choose its own size for an aspect (nano-banana-pro: 928x1152
|
|
220
|
+
// for 4:5); the sizes above are the files', not the request's.
|
|
221
|
+
...(est?.notes ? { notes: est.notes } : {}),
|
|
222
|
+
...(Array.isArray(job.textLayers) && job.textLayers.length ? { textLayers: job.textLayers, hint: job.hint } : {}),
|
|
223
|
+
};
|
|
224
|
+
if (a.place && assets.length) {
|
|
225
|
+
const placement = await placeAsset(cfg, assets[0], a.place === 'contain' ? 'contain' : 'cover', options);
|
|
226
|
+
// The words, as real text over the plate (role layout, title-safe,
|
|
227
|
+
// contrast-checked against the plate). Their ids come back to restyle.
|
|
228
|
+
if (placement.placed && Array.isArray(job.textLayers) && job.textLayers.length) {
|
|
229
|
+
const laid = await handleToolCall('pinepaper_execute_custom_code', { code: emitTextLayersPlacement(job.textLayers, String(placement.itemId)) }, options);
|
|
230
|
+
// The first text block is the executed result as JSON: {success, result}.
|
|
231
|
+
const first = laid.content?.[0];
|
|
232
|
+
let body = null;
|
|
233
|
+
try {
|
|
234
|
+
body = first && 'text' in first ? JSON.parse(first.text) : null;
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
body = null;
|
|
238
|
+
}
|
|
239
|
+
const items = body?.result?.textItems;
|
|
240
|
+
placement.text = laid.isError || !Array.isArray(items)
|
|
241
|
+
? { placed: false, error: (first && 'text' in first ? first.text : '').slice(0, 300) }
|
|
242
|
+
: { placed: true, items, ...(body?.result?.fonts?.length ? { fonts: body.result.fonts } : {}) };
|
|
243
|
+
}
|
|
244
|
+
result.placement = placement;
|
|
245
|
+
}
|
|
246
|
+
return text(result);
|
|
247
|
+
},
|
|
248
|
+
'pinepaper_generate_status': async (args, options) => {
|
|
249
|
+
const a = z.object({ jobId: z.string().min(1), place: z.union([z.boolean(), z.enum(['cover', 'contain'])]).optional() }).parse(args);
|
|
250
|
+
const cfg = cloudConfig();
|
|
251
|
+
if ('error' in cfg)
|
|
252
|
+
return errorResult(ErrorCodes.INVALID_PARAMS, cfg.error);
|
|
253
|
+
const polled = await call(cfg, 'GET', `/v1/generate/${encodeURIComponent(a.jobId)}`);
|
|
254
|
+
if (!polled.ok)
|
|
255
|
+
return fail(polled);
|
|
256
|
+
const job = polled.body.job ?? {};
|
|
257
|
+
const out = { success: job.status === 'done', jobId: a.jobId, status: job.status, ...(job.assets ? { assets: job.assets } : {}),
|
|
258
|
+
...(job.chargedUsd != null ? { chargedUsd: job.chargedUsd } : {}), ...(job.error ? { error: job.error } : {}) };
|
|
259
|
+
if (job.status === 'done' && a.place && job.assets?.length)
|
|
260
|
+
out.placement = await placeAsset(cfg, job.assets[0], a.place === 'contain' ? 'contain' : 'cover', options);
|
|
261
|
+
return text(out);
|
|
262
|
+
},
|
|
263
|
+
};
|
|
264
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/tools/handlers/generate.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,cAAc,EAAuB,MAAM,gBAAgB,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAExE,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE;IACzD,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC5C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACjC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,iEAAiE;IACjE,yEAAyE;IACzE,4DAA4D;IAC5D,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,gCAAgC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;QAC7G,OAAO,EAAE,sFAAsF;KAChG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;IACtB,gEAAgE;IAChE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;IACjD,0EAA0E;IAC1E,6EAA6E;IAC7E,yCAAyC;IACzC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;QACnC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;QAC3E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;KACpC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;IACtB,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACnC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACrC,KAAK,EAAE,mBAAmB,CAAC,QAAQ,EAAE;IACrC,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,4FAA4F,EAAE,CAAC,CAAC;AAEjL,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACnC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACrC,KAAK,EAAE,mBAAmB;IAC1B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;IACtC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;IAClF,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACtE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;CAC1D,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,wEAAwE,EAAE,CAAC,CAAC;AAElI,uDAAuD;AACvD,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,KAAK,EAAE,CAAC,GAAW,EAAE,IAAkB,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC;IAC5D,KAAK,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;CACtB,CAAC;AAEF,SAAS,WAAW;IAClB,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,gCAAgC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACvG,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,KAAK,EAAE,uPAAuP,EAAE,CAAC;IAC5Q,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AACvB,CAAC;AAID,gGAAgG;AAChG,SAAS,OAAO,CAAC,MAAc,EAAE,IAAyB;IACxD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,MAAM,IAAI,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAClE,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,uFAAuF,CAAC;IACnH,IAAI,MAAM,KAAK,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,iEAAiE,IAAI,uBAAuB,CAAC;IAC3J,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,wKAAwK,CAAC;IACpM,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,GAAG,IAAI,IAAI,gDAAgD,wBAAwB,CAAC;IAC/G,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,uCAAuC,IAAI,IAAI,sCAAsC,GAAG,CAAC;IACpH,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,IAAI,8EAA8E,CAAC;IAClH,OAAO,GAAG,IAAI,IAAI,+BAA+B,UAAU,MAAM,IAAI,CAAC;AACxE,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,GAAkC,EAAE,MAAsB,EAAE,IAAY,EAAE,IAAc;IAC1G,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,EAAE;YAC9C,MAAM;YACN,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,eAAe,EAAE;YACrJ,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,GAAG,CAAC,IAAI,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,wBAAwB,EAAE,CAAC;IACpI,CAAC;IACD,IAAI,IAAI,GAAwB,EAAE,CAAC;IACnC,IAAI,CAAC;QAAC,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAyB,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,gDAAgD,CAAC,CAAC;IAClH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;IAC5G,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACtD,CAAC;AAED,MAAM,IAAI,GAAG,CAAC,CAAU,EAAkB,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAC1H,MAAM,IAAI,GAAG,CAAC,CAAsD,EAAkB,EAAE,CACtF,WAAW,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAExL,MAAM,OAAO,GAAG,CAAC,CAAkF,EAAE,EAAE,CAAC,CAAC;IACvG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK;CACrG,CAAC,CAAC;AAIH;;;;;;GAMG;AACH,KAAK,UAAU,UAAU,CAAC,GAAkC,EAAE,KAAe,EAAE,IAAyB,EAAE,OAAuB;IAC/H,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,IAAI,cAAc,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IACpJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,iCAAiC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACjH,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,8CAA8C,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;IAC1G,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1E,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACvF,MAAM,OAAO,GAAG,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC1I,MAAM,SAAS,GAAG,OAAO;QACvB,CAAC,CAAC,MAAM,cAAc,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC;QAC5F,CAAC,CAAC,MAAM,cAAc,CAAC,wBAAwB,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;IAC9E,MAAM,UAAU,GAAG,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChG,MAAM,GAAG,GAAG,OAAO;QACjB,CAAC,CAAC,CAAC,2BAA2B,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClG,CAAC,CAAC,uBAAuB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClD,IAAI,SAAS,CAAC,OAAO,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,uCAAuC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;IACrK,2EAA2E;IAC3E,0EAA0E;IAC1E,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,+BAA+B,EAAE;QAChE,IAAI,EAAE,4BAA4B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;;mFAE0B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,wBAAwB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;;;;;YAKrI,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU;;mGAE6C;KAChG,EAAE,OAAO,CAAC,CAAC;IACZ,OAAO;QACL,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI;QACvE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,yDAAyD,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/F,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAwG;IACnI,6BAA6B,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC5C,MAAM,CAAC,GAAG,0BAA0B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;QAC1B,IAAI,OAAO,IAAI,GAAG;YAAE,OAAO,WAAW,CAAC,UAAU,CAAC,cAAc,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7E,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;YACjB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,qBAAqB,CAAC,CAAC;YACxD,IAAI,CAAC,CAAC,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;YAC1B,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;YAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;QAC/F,CAAC;QACD,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;YACZ,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,uBAAuB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YACvE,IAAI,CAAC,CAAC,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;YAC1B,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;QACjC,CAAC;QACD,OAAO,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,oBAAoB,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QAC5C,MAAM,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;QAC1B,IAAI,OAAO,IAAI,GAAG;YAAE,OAAO,WAAW,CAAC,UAAU,CAAC,cAAc,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7E,0EAA0E;QAC1E,sEAAsE;QACtE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACzK,IAAI,CAAC,SAAS,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,EAAwB,CAAC;QAC5D,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC;QACrC,IAAI,CAAC,KAAK;YAAE,OAAO,WAAW,CAAC,UAAU,CAAC,eAAe,EAAE,uDAAuD,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAElJ,0EAA0E;QAC1E,sEAAsE;QACtE,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;QACnE,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,GAAG,GAAwB,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;QAClD,OAAO,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3D,IAAI,YAAY,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;gBACnC,OAAO,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG;oBACnF,IAAI,EAAE,SAAS,GAAG,CAAC,MAAM,UAAU,CAAC,CAAC,UAAU,IAAI,GAAG,iHAAiH,KAAK,gFAAgF,EAAE,CAAC,CAAC;YACpQ,CAAC;YACD,MAAM,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;YAChD,yEAAyE;YACzE,oEAAoE;YACpE,0BAA0B;YAC1B,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,gBAAgB,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACjF,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC;gBACxE,MAAM,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC/B,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,gBAAgB,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC/E,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,OAAO,YAAY,KAAK,+DAA+D,EAAE,CAAC,CAAC;YACvJ,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC;QAC/B,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC1B,OAAO,WAAW,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,eAAe,EAClG,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,8DAA8D,CAAC,CAAC,CAAC,6CAA6C,CAAC,CAAC,EAChK,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACnC,CAAC;QACD,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAe,CAAC;QAChD,MAAM,MAAM,GAA4B;YACtC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1E,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC,QAAQ,+DAA+D,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjJ,2EAA2E;YAC3E,+DAA+D;YAC/D,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClH,CAAC;QACF,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACzG,mEAAmE;YACnE,uEAAuE;YACvE,IAAI,SAAS,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;gBAC/E,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,+BAA+B,EAAE,EAAE,IAAI,EAAE,uBAAuB,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBACzJ,0EAA0E;gBAC1E,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,IAAI,GAAqE,IAAI,CAAC;gBAClF,IAAI,CAAC;oBAAC,IAAI,GAAG,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC;oBAAC,IAAI,GAAG,IAAI,CAAC;gBAAC,CAAC;gBAC/F,MAAM,KAAK,GAAG,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC;gBACtC,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;oBACpD,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;oBACtF,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YACpG,CAAC;YACD,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;QAC/B,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IAED,2BAA2B,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QACnD,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrI,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;QAC1B,IAAI,OAAO,IAAI,GAAG;YAAE,OAAO,WAAW,CAAC,UAAU,CAAC,cAAc,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,gBAAgB,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrF,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;QAClC,MAAM,GAAG,GAA4B,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtJ,GAAG,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAClH,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM;YAAE,GAAG,CAAC,SAAS,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACvK,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/tools/handlers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,cAAc,EAA6B,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/tools/handlers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,cAAc,EAA6B,MAAM,oCAAoC,CAAC;AAmJ/F,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACL,0BAA0B,EAG3B,MAAM,oCAAoC,CAAC;AAG5C,OAAO,EAAE,YAAY,EAA0C,MAAM,uBAAuB,CAAC;AAwC7F;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE/D;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,CAOlD;AAaD,eAAO,MAAM,mBAAmB,aAAqG,CAAC;AA6EtI,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAoBnG;AAoCD,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CA0BpG;AAwBD,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CA2CpG;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGvD;AAqQD;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,MAAM,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAOhD;AAMD,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,qEAAqE;IACrE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,mEAAmE;IACnE,iBAAiB,CAAC,EAAE,0BAA0B,CAAC;IAC/C,oEAAoE;IACpE,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,sEAAsE;IACtE,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,gGAAgG;IAChG,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAoID,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,OAAO,EACpB,OAAO,CAAC,EAAE,YAAY,GACrB,cAAc,CAoChB;AAyBD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM;AAChB;;;;GAIG;AACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,OAAO,CAAC,cAAc,CAAC,CA4NzB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAkD1D;AAMD,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,WAAW,GAAG,SAAS,EAC7B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GACtC,MAAM,CASR;AAiHD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAWnG;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,cAAc,CAAC,CAoBzB"}
|
package/dist/tools/handlers.js
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* Supports i18n for localized error and success messages.
|
|
6
6
|
* Supports browser execution via Puppeteer.
|
|
7
7
|
*/
|
|
8
|
-
import { codeGenerator } from '../types/code-generator.js';
|
|
9
|
-
import { CreateItemInputSchema, ModifyItemInputSchema, DeleteItemInputSchema, AddRelationInputSchema, RemoveRelationInputSchema, QueryRelationsInputSchema, AnimateItemInputSchema, ImportMotionCaptureInputSchema, KeyframeAnimateInputSchema, ExecuteGeneratorInputSchema, ApplyEffectInputSchema, GetItemsInputSchema, PlayTimelineInputSchema, SetBackgroundColorInputSchema, SetCanvasSizeInputSchema, ImportSVGInputSchema, ImportMermaidInputSchema, AddFilterInputSchema, CreateGlossySphereInputSchema, CreateDiagonalStripesInputSchema, BatchCreateInputSchema, BatchModifyInputSchema, CreateGridInputSchema, GeometryInputSchema, EquationPathInputSchema, EventInputSchema, ConstructionSequenceInputSchema, ValidateSceneInputSchema, CaptureFramesInputSchema, InstantiateOntologyInputSchema, LintSceneInputSchema, MediaInputSchema, TextStyleInputSchema, TextEffectInputSchema, DesignMediumInputSchema, ShatterImageInputSchema, ImportLayeredCharacterInputSchema, CharacterInputSchema, GameInputSchema, World3DInputSchema, BrandKitInputSchema, ComponentInputSchema, ArtboardInputSchema, CommentInputSchema, ProvenanceInputSchema, SceneDiffInputSchema, AudioBeatsInputSchema, TemplateParamsInputSchema, RenderBatchInputSchema, AccessibilityCheckInputSchema, ComposeInputSchema, CropImageInputSchema, PathOpInputSchema, MotionInputSchema, SoundInputSchema, InterchangeInputSchema, StickInputSchema, DesignSystemInputSchema, StoryInputSchema, ChromaKeyInputSchema, RiggingInputSchema, GroupInputSchema, CameraDirectorInputSchema, DetectObjectsInputSchema, ExtractObjectInputSchema, ArrangeInputSchema, CreateSceneInputSchema, GetPerformanceMetricsInputSchema, DiagnosticReportInputSchema, SearchAssetsInputSchema, ImportAssetInputSchema, P5DrawInputSchema,
|
|
8
|
+
import { codeGenerator, generateQueryMutationsCode } from '../types/code-generator.js';
|
|
9
|
+
import { CreateItemInputSchema, ModifyItemInputSchema, DeleteItemInputSchema, AddRelationInputSchema, RemoveRelationInputSchema, QueryRelationsInputSchema, AnimateItemInputSchema, ImportMotionCaptureInputSchema, KeyframeAnimateInputSchema, ExecuteGeneratorInputSchema, ApplyEffectInputSchema, GetItemsInputSchema, PlayTimelineInputSchema, SetBackgroundColorInputSchema, SetCanvasSizeInputSchema, ImportSVGInputSchema, ImportMermaidInputSchema, AddFilterInputSchema, CreateGlossySphereInputSchema, CreateDiagonalStripesInputSchema, BatchCreateInputSchema, BatchModifyInputSchema, CreateGridInputSchema, GeometryInputSchema, EquationPathInputSchema, EventInputSchema, ConstructionSequenceInputSchema, ValidateSceneInputSchema, CaptureFramesInputSchema, InstantiateOntologyInputSchema, LintSceneInputSchema, MediaInputSchema, TextStyleInputSchema, TextEffectInputSchema, DesignMediumInputSchema, ShatterImageInputSchema, ImportLayeredCharacterInputSchema, CharacterInputSchema, GameInputSchema, World3DInputSchema, BrandKitInputSchema, ComponentInputSchema, ArtboardInputSchema, CommentInputSchema, ProvenanceInputSchema, SceneDiffInputSchema, AudioBeatsInputSchema, TemplateParamsInputSchema, RenderBatchInputSchema, AccessibilityCheckInputSchema, QueryMutationsInputSchema, ComposeInputSchema, CropImageInputSchema, PathOpInputSchema, MotionInputSchema, SoundInputSchema, InterchangeInputSchema, StickInputSchema, DesignSystemInputSchema, StoryInputSchema, ChromaKeyInputSchema, RiggingInputSchema, GroupInputSchema, CameraDirectorInputSchema, DetectObjectsInputSchema, ExtractObjectInputSchema, ArrangeInputSchema, CreateSceneInputSchema, GetPerformanceMetricsInputSchema, DiagnosticReportInputSchema, SearchAssetsInputSchema, ImportAssetInputSchema, P5DrawInputSchema,
|
|
10
10
|
// Diagram schemas
|
|
11
11
|
CreateDiagramShapeInputSchema, ConnectInputSchema, ConnectPortsInputSchema, AddPortsInputSchema, AutoLayoutInputSchema, GetDiagramShapesInputSchema, UpdateConnectorInputSchema, RemoveConnectorInputSchema, DiagramModeInputSchema,
|
|
12
12
|
// Agent flow mode schemas
|
|
@@ -46,6 +46,8 @@ import { mapHandlers } from './handlers/maps.js';
|
|
|
46
46
|
import { ontologyHandlers } from './handlers/ontology.js';
|
|
47
47
|
import * as designSystems from '../design/design-systems.js';
|
|
48
48
|
import { exportHandlers } from './handlers/export.js';
|
|
49
|
+
import { generateHandlers } from './handlers/generate.js';
|
|
50
|
+
import { beatHandlers } from './handlers/beats.js';
|
|
49
51
|
import { planCharacter, generateCharacterCode } from './handlers/character.js';
|
|
50
52
|
import { buildZip } from '../utils/zip.js';
|
|
51
53
|
import { buildScc } from '../utils/scc.js';
|
|
@@ -64,6 +66,8 @@ function getDomainHandlers() {
|
|
|
64
66
|
mapHandlers,
|
|
65
67
|
ontologyHandlers,
|
|
66
68
|
exportHandlers,
|
|
69
|
+
generateHandlers,
|
|
70
|
+
beatHandlers,
|
|
67
71
|
];
|
|
68
72
|
}
|
|
69
73
|
/**
|
|
@@ -592,6 +596,13 @@ function executedResult(code, result, screenshot, description, report) {
|
|
|
592
596
|
const governor = {};
|
|
593
597
|
if (warnings.length)
|
|
594
598
|
governor.warnings = warnings;
|
|
599
|
+
// The engine's STRUCTURED warnings (GeneratedCodeRunner: report.warnings
|
|
600
|
+
// holds only their sentences; report.engineWarnings holds the objects —
|
|
601
|
+
// {message, code, droppedProperties, itemId, …}). Forwarded whole, so an
|
|
602
|
+
// agent can act on keyframe_track_replaced without parsing prose.
|
|
603
|
+
const engineWarnings = Array.isArray(report.engineWarnings) ? report.engineWarnings.filter((w) => w && typeof w === 'object') : [];
|
|
604
|
+
if (engineWarnings.length)
|
|
605
|
+
governor.engineWarnings = engineWarnings;
|
|
595
606
|
if (items && typeof items.created === 'number')
|
|
596
607
|
governor.itemsCreated = items.created;
|
|
597
608
|
if (report.guard?.tripped)
|
|
@@ -1084,6 +1095,8 @@ const IGNORED_ARGUMENT_SCHEMAS = {
|
|
|
1084
1095
|
// common slip here (round 7 retest, 1.63).
|
|
1085
1096
|
pinepaper_create_item: CreateItemInputSchema,
|
|
1086
1097
|
pinepaper_modify_item: ModifyItemInputSchema,
|
|
1098
|
+
// Its options live in `options` / `spec`; a key beside them was dropped.
|
|
1099
|
+
pinepaper_sound: SoundInputSchema,
|
|
1087
1100
|
};
|
|
1088
1101
|
const IGNORED_ARGUMENT_HINTS = {
|
|
1089
1102
|
pinepaper_create_item: Object.fromEntries(['width', 'height', 'radius', 'color', 'fillColor', 'strokeColor', 'strokeWidth', 'content', 'fontSize', 'fontFamily', 'opacity', 'rotation', 'x', 'y']
|
|
@@ -1585,8 +1598,31 @@ async function handleToolCallInner(toolName, args, options, tracker, baseTimerId
|
|
|
1585
1598
|
}
|
|
1586
1599
|
case 'pinepaper_audio_beats': {
|
|
1587
1600
|
const input = AudioBeatsInputSchema.parse(args);
|
|
1588
|
-
|
|
1589
|
-
|
|
1601
|
+
// A LARGE SOURCE GOES BESIDE THE CODE (gap 5.5). A data: URL over
|
|
1602
|
+
// ~350 KB inlined into the generated code made the governor's
|
|
1603
|
+
// transform bail and the analysis answered success with no result.
|
|
1604
|
+
// Same route as pinepaper_media: URLs, file:// and local paths are
|
|
1605
|
+
// read HERE (a path used to fail "Unable to decode audio data"), and
|
|
1606
|
+
// anything large is staged. Upload / asset ids pass through.
|
|
1607
|
+
let source = input.source;
|
|
1608
|
+
const looksLikeFile = typeof source === 'string'
|
|
1609
|
+
&& (/^(data:|https?:|file:)/i.test(source.trim()) || /\.(wav|mp3|ogg|oga|m4a|aac|flac|webm|mp4|mov)$/i.test(source.trim()));
|
|
1610
|
+
if (looksLikeFile) {
|
|
1611
|
+
const resolved = await resolveMediaSource(source);
|
|
1612
|
+
if ('error' in resolved) {
|
|
1613
|
+
return errorResult(ErrorCodes.INVALID_PARAMS, resolved.error, { source }, { toolName: 'pinepaper_audio_beats' });
|
|
1614
|
+
}
|
|
1615
|
+
source = resolved.src;
|
|
1616
|
+
}
|
|
1617
|
+
const staged = typeof source === 'string' && source.startsWith('data:') && source.length > 64_000;
|
|
1618
|
+
const stageKey = staged ? `audio_${Date.now().toString(36)}` : undefined;
|
|
1619
|
+
const code = codeGenerator.generateAudioBeats({ ...input, source: staged ? `__ppStage:${stageKey}` : source });
|
|
1620
|
+
return executeOrGenerate(code, `Audio: ${input.action}`, options, 'pinepaper_audio_beats', staged ? { [stageKey]: source } : undefined);
|
|
1621
|
+
}
|
|
1622
|
+
case 'pinepaper_query_mutations': {
|
|
1623
|
+
const input = QueryMutationsInputSchema.parse(args);
|
|
1624
|
+
const code = generateQueryMutationsCode(input.itemId, input.property, input.range, input.fps);
|
|
1625
|
+
return executeOrGenerate(code, `Keyframe series: ${input.itemId}`, options, 'pinepaper_query_mutations');
|
|
1590
1626
|
}
|
|
1591
1627
|
case 'pinepaper_accessibility_check': {
|
|
1592
1628
|
const input = AccessibilityCheckInputSchema.parse(args);
|
|
@@ -1605,9 +1641,23 @@ async function handleToolCallInner(toolName, args, options, tracker, baseTimerId
|
|
|
1605
1641
|
const report = {};
|
|
1606
1642
|
const page = parseCssColor(m.page);
|
|
1607
1643
|
if (m.texts) {
|
|
1644
|
+
// Samples over time: each text judged at every moment it showed,
|
|
1645
|
+
// reported at its worst. Nothing visible at any sampled time is not
|
|
1646
|
+
// a pass — it was a vacuous one (round 12, 12.9).
|
|
1608
1647
|
const c = checkContrast(m.texts, page);
|
|
1609
|
-
|
|
1610
|
-
|
|
1648
|
+
const worst = new Map();
|
|
1649
|
+
for (const f of c.failing) {
|
|
1650
|
+
const prev = worst.get(f.id);
|
|
1651
|
+
if (!prev || f.ratio < prev.ratio)
|
|
1652
|
+
worst.set(f.id, f);
|
|
1653
|
+
}
|
|
1654
|
+
const ids = new Set(m.texts.filter((t) => t.fill).map((t) => t.id));
|
|
1655
|
+
const skippedIds = [...new Map(c.skipped.map((x) => [x.id, x])).values()];
|
|
1656
|
+
report.contrast = ids.size === 0
|
|
1657
|
+
? { pass: null, checked: 0, sampledTimes: m.sampledTimes, skipped: skippedIds,
|
|
1658
|
+
note: 'no text was visible at any sampled time (0 s, each text\'s lifetime, keyframe times, every second of duration), so contrast was not checked — pass the scene duration, or check a frame where the text shows.' }
|
|
1659
|
+
: { pass: worst.size === 0, checked: ids.size, sampledTimes: m.sampledTimes, failing: [...worst.values()], skipped: skippedIds,
|
|
1660
|
+
method: 'WCAG 1.4.3 AA (4.5:1, 3:1 for large text) between each text fill and the solid fill of the topmost item under its centre, or the page background' + (c.pageAssumed ? ' (none set, so white was assumed)' : '') + ', at every sampled time the text showed; the worst is reported. Approximate: text over a photo or gradient is not judged.' };
|
|
1611
1661
|
}
|
|
1612
1662
|
if (m.flashUnavailable)
|
|
1613
1663
|
report.flash = { checked: false, reason: m.flashUnavailable };
|
|
@@ -1617,7 +1667,9 @@ async function handleToolCallInner(toolName, args, options, tracker, baseTimerId
|
|
|
1617
1667
|
frames: m.series.length, fps: m.fps,
|
|
1618
1668
|
method: 'WCAG 2.3.1 general flash: opposing luminance changes of >= 10% with the darker state below 0.8, over a 3 x 3 grid; more than 3 flashes in any second fails. A heuristic screen, not a certified PSE test (red flashes are not checked).' };
|
|
1619
1669
|
}
|
|
1620
|
-
|
|
1670
|
+
// A check that could not run (pass: null) is not a pass.
|
|
1671
|
+
const verdicts = Object.values(report).map((r) => r.pass);
|
|
1672
|
+
const pass = verdicts.some((v) => v === false) ? false : verdicts.some((v) => v === null) ? null : true;
|
|
1621
1673
|
return dataResult({ success: true, pass, ...report });
|
|
1622
1674
|
}
|
|
1623
1675
|
case 'pinepaper_render_batch': {
|
|
@@ -2570,7 +2622,12 @@ You can now start creating new items on a clean canvas.`,
|
|
|
2570
2622
|
}
|
|
2571
2623
|
// Import the SVG onto canvas using existing import_svg tool
|
|
2572
2624
|
const code = codeGenerator.generateImportSVG(svg, undefined, input.position, input.scale);
|
|
2573
|
-
|
|
2625
|
+
// A URL import has no catalogue metadata (no title, no licence): this
|
|
2626
|
+
// line read metadata.license.name on it, so every URL import that
|
|
2627
|
+
// FETCHED fine then threw "Cannot read properties of undefined".
|
|
2628
|
+
const description = metadata?.source === 'url'
|
|
2629
|
+
? `Imported SVG from ${metadata.url}`
|
|
2630
|
+
: `Imported asset: ${metadata?.title ?? input.assetId}${metadata?.license?.name ? ` (${metadata.license.name})` : ''}`;
|
|
2574
2631
|
return executeOrGenerate(code, description, options, 'pinepaper_import_asset');
|
|
2575
2632
|
}
|
|
2576
2633
|
catch (error) {
|
|
@@ -2872,6 +2929,16 @@ You can now start creating new items on a clean canvas.`,
|
|
|
2872
2929
|
}
|
|
2873
2930
|
}
|
|
2874
2931
|
case 'pinepaper_agent_export': {
|
|
2932
|
+
// Formats a DOOH / projection deliverable asks for that no browser
|
|
2933
|
+
// encoder can make (round 12, 12.12): named, with the route that works,
|
|
2934
|
+
// not a generic enum error.
|
|
2935
|
+
const askedFormat = String(args.format ?? '').toLowerCase();
|
|
2936
|
+
if (/^(prores|prores4444|prores422|hap|hapq|hap-alpha|dnxhd|dnxhr|cineform)$/.test(askedFormat)) {
|
|
2937
|
+
return errorResult(ErrorCodes.INVALID_PARAMS, `${askedFormat} is not supported: the studio encodes in the browser, which has no ${askedFormat.startsWith('hap') ? 'HAP' : askedFormat.startsWith('prores') ? 'ProRes' : askedFormat.toUpperCase()} encoder. `
|
|
2938
|
+
+ 'Export a lossless png sequence (pinepaper_interchange export_png_sequence, transparent if you need alpha) and convert it, e.g. '
|
|
2939
|
+
+ (askedFormat.startsWith('hap') ? 'ffmpeg -i frame_%05d.png -c:v hap -format hap_q out.mov' : 'ffmpeg -i frame_%05d.png -c:v prores_ks -profile:v 4444 out.mov')
|
|
2940
|
+
+ ' — or webm / apng for alpha in the browser.');
|
|
2941
|
+
}
|
|
2875
2942
|
const input = AgentExportInputSchema.parse(args);
|
|
2876
2943
|
const code = codeGenerator.generateAgentExport(input);
|
|
2877
2944
|
const description = `Smart export for ${input.platform} as ${input.format || 'auto'}`;
|
|
@@ -3130,7 +3197,10 @@ You can now start creating new items on a clean canvas.`,
|
|
|
3130
3197
|
return executeOrGenerate(code, soundDescription, options, 'pinepaper_sound');
|
|
3131
3198
|
}
|
|
3132
3199
|
}
|
|
3133
|
-
|
|
3200
|
+
// A soundtrack render is an export: it gets the export budget, not the
|
|
3201
|
+
// governor's 10 s default, which cut off any soundtrack that took
|
|
3202
|
+
// longer to render (the patch downstream kept re-applying).
|
|
3203
|
+
const wavResult = await soundController.executeCode(code, false, { governorTimeoutMs: exportGovernorTimeoutMs() });
|
|
3134
3204
|
if (!wavResult.success) {
|
|
3135
3205
|
const canvasState = await captureCanvasState(soundController);
|
|
3136
3206
|
return errorResult(ErrorCodes.EXECUTION_ERROR, wavResult.error || 'Rendering the soundtrack failed', { code }, { toolName: 'pinepaper_sound', canvasState: canvasState || undefined });
|