@cliangdev/conductor 0.21.0 → 0.23.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.
Files changed (74) hide show
  1. package/assets/claude/skills/conductor-creative/SKILL.md +168 -0
  2. package/assets/claude/skills/conductor-publisher/SKILL.md +4 -0
  3. package/assets/cli-manifest.json +99 -0
  4. package/dist/commands/creative.d.ts +3 -0
  5. package/dist/commands/creative.d.ts.map +1 -0
  6. package/dist/commands/creative.js +63 -0
  7. package/dist/commands/creative.js.map +1 -0
  8. package/dist/creative/assertions.js +221 -0
  9. package/dist/creative/font.js +39 -0
  10. package/dist/creative/frame.css +126 -0
  11. package/dist/creative/frame.html +29 -0
  12. package/dist/creative/frame.js +76 -0
  13. package/dist/creative/job/render.mjs +203 -0
  14. package/dist/creative/job/server.mjs +72 -0
  15. package/dist/creative/job/transport.mjs +167 -0
  16. package/dist/creative/layouts/bleed/layout.css +47 -0
  17. package/dist/creative/layouts/bleed/layout.json +17 -0
  18. package/dist/creative/layouts/card/layout.css +24 -0
  19. package/dist/creative/layouts/card/layout.json +17 -0
  20. package/dist/creative/layouts/index.js +62 -0
  21. package/dist/creative/layouts/index.json +1 -0
  22. package/dist/creative/layouts/split/layout.css +22 -0
  23. package/dist/creative/layouts/split/layout.json +17 -0
  24. package/dist/creative/layouts/stacked/layout.css +40 -0
  25. package/dist/creative/layouts/stacked/layout.json +23 -0
  26. package/dist/creative/placements.js +228 -0
  27. package/dist/creative/placements.json +268 -0
  28. package/dist/creative/render.js +457 -0
  29. package/dist/creative/sheet.html +27 -0
  30. package/dist/creative/sheet.js +94 -0
  31. package/dist/creative/styles.css +314 -0
  32. package/dist/creative/tokens.css +33 -0
  33. package/dist/index.js +2 -0
  34. package/dist/index.js.map +1 -1
  35. package/dist/lib/creative-browser.d.ts +25 -0
  36. package/dist/lib/creative-browser.d.ts.map +1 -0
  37. package/dist/lib/creative-browser.js +36 -0
  38. package/dist/lib/creative-browser.js.map +1 -0
  39. package/dist/lib/creative-id.d.ts +8 -0
  40. package/dist/lib/creative-id.d.ts.map +1 -0
  41. package/dist/lib/creative-id.js +14 -0
  42. package/dist/lib/creative-id.js.map +1 -0
  43. package/dist/lib/creative-render.d.ts +38 -0
  44. package/dist/lib/creative-render.d.ts.map +1 -0
  45. package/dist/lib/creative-render.js +95 -0
  46. package/dist/lib/creative-render.js.map +1 -0
  47. package/dist/lib/image-dimensions.d.ts +20 -0
  48. package/dist/lib/image-dimensions.d.ts.map +1 -0
  49. package/dist/lib/image-dimensions.js +115 -0
  50. package/dist/lib/image-dimensions.js.map +1 -0
  51. package/dist/lib/media-probe.d.ts +55 -0
  52. package/dist/lib/media-probe.d.ts.map +1 -0
  53. package/dist/lib/media-probe.js +221 -0
  54. package/dist/lib/media-probe.js.map +1 -0
  55. package/dist/lib/plugin-assets.d.ts.map +1 -1
  56. package/dist/lib/plugin-assets.js +1 -0
  57. package/dist/lib/plugin-assets.js.map +1 -1
  58. package/dist/lib/poster-sheet.d.ts +10 -0
  59. package/dist/lib/poster-sheet.d.ts.map +1 -0
  60. package/dist/lib/poster-sheet.js +57 -0
  61. package/dist/lib/poster-sheet.js.map +1 -0
  62. package/dist/mcp/index.d.ts +18 -0
  63. package/dist/mcp/index.d.ts.map +1 -1
  64. package/dist/mcp/index.js +313 -1
  65. package/dist/mcp/index.js.map +1 -1
  66. package/dist/mcp/tools/creatives.d.ts +114 -0
  67. package/dist/mcp/tools/creatives.d.ts.map +1 -0
  68. package/dist/mcp/tools/creatives.js +477 -0
  69. package/dist/mcp/tools/creatives.js.map +1 -0
  70. package/dist/mcp/tools/insights.d.ts.map +1 -1
  71. package/dist/mcp/tools/insights.js +14 -0
  72. package/dist/mcp/tools/insights.js.map +1 -1
  73. package/package.json +6 -3
  74. package/scripts/build-creative.mjs +93 -0
@@ -0,0 +1,114 @@
1
+ import { Config } from '../config.js';
2
+ export declare function getBrandKit(params: {
3
+ kitId?: string;
4
+ }, config: Config): Promise<Record<string, unknown>>;
5
+ export declare function listCreatives(params: {
6
+ state?: string;
7
+ brandKitId?: string;
8
+ }, config: Config): Promise<Array<Record<string, unknown>>>;
9
+ export declare function getCreative(params: {
10
+ creativeId: string;
11
+ }, config: Config): Promise<Record<string, unknown>>;
12
+ /**
13
+ * Starts a hook experiment on a Creative family (>= 2 lettered variants; one RUNNING experiment per
14
+ * family at a time — a second attempt is refused with a 409). It settles on its own once every variant
15
+ * has published and reported (or via the weekly "what's working" job) — nothing further to call. Read
16
+ * the result through get_creative, whose experiment field carries the current state, and once DECIDED,
17
+ * the winner and its numbers.
18
+ */
19
+ export declare function createExperiment(params: {
20
+ creativeId: string;
21
+ metric?: string;
22
+ windowHours?: number;
23
+ }, config: Config): Promise<Record<string, unknown>>;
24
+ export interface CreativeLayoutOverrides {
25
+ band?: Record<string, number>;
26
+ padBottom?: Record<string, number>;
27
+ }
28
+ export interface CreativeFields {
29
+ brandKitId?: string;
30
+ name?: string;
31
+ state?: string;
32
+ /** STILL (default): brand-rendered photo/headline artwork. CLIP: a finished video used as-is, via
33
+ * clipMedia — no brand layout, no photo/headline required. MOTION: accepted, but rendering it
34
+ * 422s until PR 2 ships. */
35
+ kind?: string;
36
+ layout?: string;
37
+ theme?: string;
38
+ photoId?: string;
39
+ /** CLIP only: media ids per placement, e.g. {"default": mediaId, "9x16": mediaId}. "default"
40
+ * covers any placement without its own entry. */
41
+ clipMedia?: Record<string, string>;
42
+ focalOverride?: Record<string, string>;
43
+ headline?: string;
44
+ body?: string;
45
+ caption?: string;
46
+ altText?: string;
47
+ placements?: string[];
48
+ sequenceKind?: string;
49
+ sequence?: Array<Record<string, unknown>>;
50
+ carouselRatio?: string;
51
+ /** 'plain' (default) or 'chip' — puts the logo lockup on a white pill, for busy photography. */
52
+ lockup?: string;
53
+ /** Per-placement overrides of layout-derived numbers, in pixels — see conductor-creative/README.md. */
54
+ layoutOverrides?: CreativeLayoutOverrides;
55
+ }
56
+ export interface CreateCreativeParams extends CreativeFields {
57
+ /** Cuts a lettered variant of this existing Creative instead of creating a fresh one — everything
58
+ * else on this call except `headline` and `name` is ignored, matching the variants endpoint. */
59
+ variantOf?: string;
60
+ }
61
+ export declare function createCreative(params: CreateCreativeParams, config: Config): Promise<Record<string, unknown>>;
62
+ export interface UpdateCreativeParams extends CreativeFields {
63
+ creativeId: string;
64
+ version: number;
65
+ }
66
+ export declare function updateCreative(params: UpdateCreativeParams, config: Config): Promise<Record<string, unknown>>;
67
+ export interface UploadCreativeMediaParams {
68
+ filePath?: string;
69
+ url?: string;
70
+ label?: string;
71
+ source?: string;
72
+ licence?: string;
73
+ aiGenerated?: boolean;
74
+ }
75
+ export interface UploadCreativeMediaResult {
76
+ media: Record<string, unknown>;
77
+ warnings: string[];
78
+ }
79
+ /**
80
+ * Uploads a photo, video or audio file into the project's media library from a local path or a
81
+ * public URL, detecting its kind, dimensions/duration/audio automatically, and — for a video —
82
+ * extracting and uploading a poster frame. Shared by `upload_creative_media` and the deprecated
83
+ * `upload_creative_photo` alias, so the two never drift.
84
+ */
85
+ export declare function uploadCreativeMedia(params: UploadCreativeMediaParams, config: Config): Promise<UploadCreativeMediaResult>;
86
+ /** Deprecated alias for {@link uploadCreativeMedia}, kept so existing callers naming the old tool
87
+ * still work — same implementation, same behavior, including for photos. */
88
+ export declare const uploadCreativePhoto: typeof uploadCreativeMedia;
89
+ export declare function renderCreativeTool(params: {
90
+ creativeId: string;
91
+ previewOnly?: boolean;
92
+ renderer?: string;
93
+ workflowRunId?: string;
94
+ }, config: Config): Promise<Record<string, unknown>>;
95
+ export interface PreviewCreativeResult {
96
+ renderId?: string;
97
+ state?: string;
98
+ url?: string;
99
+ image?: {
100
+ data: Buffer;
101
+ mimeType: string;
102
+ };
103
+ note?: string;
104
+ }
105
+ export declare function previewCreative(params: {
106
+ creativeId: string;
107
+ }, config: Config): Promise<PreviewCreativeResult>;
108
+ export declare function attachCreativeToPost(params: {
109
+ creativeId: string;
110
+ postId?: string;
111
+ workItemId?: string;
112
+ renderId?: string;
113
+ }, config: Config): Promise<Record<string, unknown>>;
114
+ //# sourceMappingURL=creatives.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"creatives.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/creatives.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,477 @@
1
+ import { readFile, mkdtemp, writeFile, rm } from 'node:fs/promises';
2
+ import { basename, extname, join } from 'node:path';
3
+ import { tmpdir } from 'node:os';
4
+ import { apiGet, apiPost, apiPatch, putBytes, ApiError } from '../api.js';
5
+ import { readImageDimensions } from '../../lib/image-dimensions.js';
6
+ import { probeMedia, extractPoster } from '../../lib/media-probe.js';
7
+ import { composePosterSheet } from '../../lib/poster-sheet.js';
8
+ import { renderCreative as runLocalRender } from '../../lib/creative-render.js';
9
+ /**
10
+ * Conductor Creatives: a Brand Kit (tokens, copy rules, approved lines) governs one or more
11
+ * Creatives (photo + headline + layout, optionally a story/carousel sequence and lettered
12
+ * variants), which render locally (Playwright, driven by this MCP server) to upload-ready JPEGs
13
+ * that attach to a Post like any other media. See docs/mcp-tool-guidelines.md's action-verify and
14
+ * dispatch-status patterns, both used below.
15
+ */
16
+ const V2_PROJECT = (config) => `/api/v2/projects/${config.projectId}`;
17
+ const creativesBase = (config) => `${V2_PROJECT(config)}/marketing/creatives`;
18
+ const experimentsBase = (config) => `${V2_PROJECT(config)}/marketing/experiments`;
19
+ /** Rounds a rate-like number to 4 decimals; leaves null/undefined alone. */
20
+ function round4(n) {
21
+ if (typeof n !== 'number')
22
+ return n;
23
+ return Math.round(n * 10000) / 10000;
24
+ }
25
+ /** The fields worth an agent's context for one variant's performance — a subset of CreativePerformanceEntry. */
26
+ function trimPerformanceEntry(entry) {
27
+ return {
28
+ creativeId: entry['creativeId'],
29
+ label: entry['label'],
30
+ headline: entry['headline'],
31
+ posts: entry['posts'],
32
+ views: entry['views'],
33
+ engagementRate: round4(entry['engagementRate']),
34
+ avgViewPct: round4(entry['avgViewPct']),
35
+ views72h: entry['views72h'],
36
+ };
37
+ }
38
+ /** The fields worth an agent's context for the family's active/last experiment. */
39
+ function trimExperiment(experiment) {
40
+ return {
41
+ id: experiment['id'],
42
+ state: experiment['state'],
43
+ metric: experiment['metric'],
44
+ windowHours: experiment['windowHours'],
45
+ winnerCreativeId: experiment['winnerCreativeId'],
46
+ decidedAt: experiment['decidedAt'],
47
+ summary: experiment['summary'],
48
+ winnerLineConfirmedAt: experiment['winnerLineConfirmedAt'],
49
+ };
50
+ }
51
+ /**
52
+ * The backend's 422 body for a Creative validation failure is `{ message, violations: [{ field,
53
+ * ruleId, message }] }` — not the RFC 7807 `detail`/`title` shape `ApiError` otherwise expects, so
54
+ * its `message` ends up holding the raw JSON text. This re-parses that into one readable string
55
+ * (`[field] message`, one per violation) so the model gets something it can act on directly rather
56
+ * than a JSON string to parse itself. A 409 (stale `version`) already carries a plain-English
57
+ * `detail` and passes through unchanged.
58
+ */
59
+ async function withCreativeErrors(fn) {
60
+ try {
61
+ return await fn();
62
+ }
63
+ catch (err) {
64
+ if (err instanceof ApiError && (err.status === 422 || err.status === 409)) {
65
+ let violations;
66
+ try {
67
+ const parsed = JSON.parse(err.message);
68
+ if (Array.isArray(parsed.violations))
69
+ violations = parsed.violations;
70
+ }
71
+ catch {
72
+ // Not JSON (e.g. a plain 409 conflict message) — use it as-is below.
73
+ }
74
+ const message = violations
75
+ ? violations.map((v) => `[${v.field ?? v.ruleId ?? '?'}] ${v.message}`).join('; ')
76
+ : err.message;
77
+ throw new ApiError(err.status, message, { code: err.code, title: err.title });
78
+ }
79
+ throw err;
80
+ }
81
+ }
82
+ // --- Brand Kit ------------------------------------------------------------
83
+ export async function getBrandKit(params, config) {
84
+ if (params.kitId) {
85
+ return apiGet(`${V2_PROJECT(config)}/marketing/brand-kits/${params.kitId}`, config);
86
+ }
87
+ const kits = await apiGet(`${V2_PROJECT(config)}/marketing/brand-kits`, config);
88
+ const found = kits.find((k) => k['isDefault']) ?? kits[0];
89
+ if (!found) {
90
+ throw new Error('This project has no Brand Kit yet — one is created for every workspace by default; check Settings.');
91
+ }
92
+ return found;
93
+ }
94
+ // --- Creatives --------------------------------------------------------------
95
+ export async function listCreatives(params, config) {
96
+ const query = new URLSearchParams();
97
+ if (params.state)
98
+ query.set('state', params.state);
99
+ if (params.brandKitId)
100
+ query.set('brandKitId', params.brandKitId);
101
+ const qs = query.toString();
102
+ return apiGet(`${creativesBase(config)}${qs ? `?${qs}` : ''}`, config);
103
+ }
104
+ export async function getCreative(params, config) {
105
+ const [creative, readiness, all, performance] = await Promise.all([
106
+ apiGet(`${creativesBase(config)}/${params.creativeId}`, config),
107
+ apiGet(`${creativesBase(config)}/${params.creativeId}/readiness`, config),
108
+ apiGet(creativesBase(config), config),
109
+ apiGet(`${creativesBase(config)}/${params.creativeId}/performance`, config),
110
+ ]);
111
+ const variants = all
112
+ .filter((c) => c['number'] === creative['number'] && c['id'] !== creative['id'])
113
+ .map((c) => ({ id: c['id'], displayId: c['displayId'], state: c['state'], headline: c['headline'] }));
114
+ const activeExperimentId = creative['activeExperimentId'];
115
+ let experiment;
116
+ if (activeExperimentId) {
117
+ experiment = await apiGet(`${experimentsBase(config)}/${activeExperimentId}`, config);
118
+ }
119
+ else {
120
+ const experiments = await apiGet(`${experimentsBase(config)}?creativeId=${params.creativeId}`, config);
121
+ experiment = experiments[0];
122
+ }
123
+ const family = performance['family'] ?? [];
124
+ return {
125
+ ...creative,
126
+ readiness,
127
+ variants,
128
+ performance: family.map(trimPerformanceEntry),
129
+ experiment: experiment ? trimExperiment(experiment) : null,
130
+ };
131
+ }
132
+ /**
133
+ * Starts a hook experiment on a Creative family (>= 2 lettered variants; one RUNNING experiment per
134
+ * family at a time — a second attempt is refused with a 409). It settles on its own once every variant
135
+ * has published and reported (or via the weekly "what's working" job) — nothing further to call. Read
136
+ * the result through get_creative, whose experiment field carries the current state, and once DECIDED,
137
+ * the winner and its numbers.
138
+ */
139
+ export async function createExperiment(params, config) {
140
+ return withCreativeErrors(() => apiPost(experimentsBase(config), { creativeId: params.creativeId, metric: params.metric, windowHours: params.windowHours }, config));
141
+ }
142
+ export async function createCreative(params, config) {
143
+ return withCreativeErrors(async () => {
144
+ if (params.variantOf) {
145
+ return apiPost(`${creativesBase(config)}/${params.variantOf}/variants`, { headline: params.headline, name: params.name }, config);
146
+ }
147
+ return apiPost(creativesBase(config), { ...params, variantOf: undefined }, config);
148
+ });
149
+ }
150
+ export async function updateCreative(params, config) {
151
+ const { creativeId, ...patch } = params;
152
+ return withCreativeErrors(() => apiPatch(`${creativesBase(config)}/${creativeId}`, patch, config));
153
+ }
154
+ // --- Media (photo library: photos, video, audio) -----------------------------
155
+ const VIDEO_LENGTH_WARNING_SECONDS = 180;
156
+ async function readMediaSource(params) {
157
+ if (params.filePath) {
158
+ return { bytes: new Uint8Array(await readFile(params.filePath)), filename: basename(params.filePath), filePath: params.filePath };
159
+ }
160
+ const raw = params.url;
161
+ let parsed;
162
+ try {
163
+ parsed = new URL(raw);
164
+ }
165
+ catch {
166
+ throw new Error(`"${raw}" is not a valid URL`);
167
+ }
168
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
169
+ throw new Error(`Only http(s) URLs can be fetched, not ${parsed.protocol}`);
170
+ }
171
+ const response = await fetch(parsed);
172
+ if (!response.ok) {
173
+ throw new Error(`Fetching ${raw} failed: HTTP ${response.status}`);
174
+ }
175
+ const bytes = new Uint8Array(await response.arrayBuffer());
176
+ return { bytes, filename: basename(parsed.pathname) || 'media' };
177
+ }
178
+ function stripExtension(filename) {
179
+ const ext = extname(filename);
180
+ return ext ? filename.slice(0, -ext.length) : filename;
181
+ }
182
+ /** The fields worth an agent's context for one uploaded media item — trims whatever else the
183
+ * backend's photo library response carries (checked/blocked review metadata, timestamps, etc.). */
184
+ const MEDIA_RESULT_FIELDS = [
185
+ 'id', 'label', 'mediaKind', 'contentType', 'width', 'height', 'durationSeconds', 'hasAudio',
186
+ 'posterUrl', 'url', 'sizeBytes', 'source', 'licence', 'aiGenerated', 'uploadStatus', 'checked', 'blocked',
187
+ ];
188
+ function trimMedia(media) {
189
+ const out = {};
190
+ for (const key of MEDIA_RESULT_FIELDS) {
191
+ if (key in media)
192
+ out[key] = media[key];
193
+ }
194
+ return out;
195
+ }
196
+ async function uploadPoster(mediaId, localVideoPath, config, warnings) {
197
+ const posterPath = join(tmpdir(), `conductor-poster-${mediaId}.jpg`);
198
+ try {
199
+ await extractPoster(localVideoPath, posterPath, 1);
200
+ const posterBytes = await readFile(posterPath);
201
+ const posterMint = await apiPost(`${V2_PROJECT(config)}/marketing/photos/${mediaId}/poster`, {}, config);
202
+ await putBytes(posterMint.uploadUrl, 'image/jpeg', posterBytes);
203
+ await apiPost(`${V2_PROJECT(config)}/marketing/photos/${mediaId}/poster/confirm`, { gcsPath: posterMint.gcsPath }, config);
204
+ }
205
+ catch (err) {
206
+ warnings.push(`Could not extract or upload a poster frame: ${err instanceof Error ? err.message : String(err)}`);
207
+ }
208
+ finally {
209
+ await rm(posterPath, { force: true }).catch(() => { });
210
+ }
211
+ }
212
+ /**
213
+ * Uploads a photo, video or audio file into the project's media library from a local path or a
214
+ * public URL, detecting its kind, dimensions/duration/audio automatically, and — for a video —
215
+ * extracting and uploading a poster frame. Shared by `upload_creative_media` and the deprecated
216
+ * `upload_creative_photo` alias, so the two never drift.
217
+ */
218
+ export async function uploadCreativeMedia(params, config) {
219
+ if (!params.filePath && !params.url) {
220
+ throw new Error('Pass filePath (a file on this machine) or url (a public http(s) URL).');
221
+ }
222
+ const source = await readMediaSource(params);
223
+ const label = params.label ?? stripExtension(source.filename);
224
+ const warnings = [];
225
+ const imageInfo = readImageDimensions(source.bytes);
226
+ if (imageInfo) {
227
+ const mint = await apiPost(`${V2_PROJECT(config)}/marketing/photos`, {
228
+ label,
229
+ contentType: imageInfo.contentType,
230
+ sizeBytes: source.bytes.byteLength,
231
+ width: imageInfo.width,
232
+ height: imageInfo.height,
233
+ source: params.source ?? null,
234
+ licence: params.licence ?? null,
235
+ aiGenerated: !!params.aiGenerated,
236
+ }, config);
237
+ if (!mint.uploadUrl) {
238
+ throw new Error('The mint response carried no uploadUrl — cannot upload bytes.');
239
+ }
240
+ await putBytes(mint.uploadUrl, imageInfo.contentType, source.bytes);
241
+ const confirmed = await apiPost(`${V2_PROJECT(config)}/marketing/photos/${mint.id}/confirm`, { sizeBytes: source.bytes.byteLength }, config);
242
+ return { media: trimMedia(confirmed), warnings };
243
+ }
244
+ // Not an image — probe it as video/audio, which needs a real file on disk.
245
+ let probePath = source.filePath;
246
+ let tempDir;
247
+ if (!probePath) {
248
+ tempDir = await mkdtemp(join(tmpdir(), 'conductor-media-'));
249
+ probePath = join(tempDir, source.filename || 'media');
250
+ await writeFile(probePath, source.bytes);
251
+ }
252
+ let probe;
253
+ try {
254
+ probe = await probeMedia(probePath);
255
+ }
256
+ catch (err) {
257
+ if (tempDir)
258
+ await rm(tempDir, { recursive: true, force: true }).catch(() => { });
259
+ throw new Error(`Could not read "${source.filename}" as a photo, video or audio file: ${err instanceof Error ? err.message : String(err)}`);
260
+ }
261
+ if (probe.kind !== 'VIDEO' && probe.kind !== 'AUDIO') {
262
+ if (tempDir)
263
+ await rm(tempDir, { recursive: true, force: true }).catch(() => { });
264
+ throw new Error(`"${source.filename}" is not a recognizable photo, video or audio file.`);
265
+ }
266
+ if (probe.kind === 'VIDEO' && probe.durationSeconds && probe.durationSeconds > VIDEO_LENGTH_WARNING_SECONDS) {
267
+ warnings.push(`This video is ${Math.round(probe.durationSeconds)}s long — longer than most platforms take.`);
268
+ }
269
+ try {
270
+ const mint = await apiPost(`${V2_PROJECT(config)}/marketing/photos`, {
271
+ mediaKind: probe.kind,
272
+ label,
273
+ contentType: probe.contentType,
274
+ sizeBytes: source.bytes.byteLength,
275
+ width: probe.width ?? null,
276
+ height: probe.height ?? null,
277
+ durationSeconds: probe.durationSeconds ?? null,
278
+ hasAudio: probe.kind === 'VIDEO' ? !!probe.hasAudio : undefined,
279
+ source: params.source ?? null,
280
+ licence: params.licence ?? null,
281
+ aiGenerated: !!params.aiGenerated,
282
+ }, config);
283
+ if (!mint.uploadUrl) {
284
+ throw new Error('The mint response carried no uploadUrl — cannot upload bytes.');
285
+ }
286
+ await putBytes(mint.uploadUrl, probe.contentType, source.bytes);
287
+ const confirmed = await apiPost(`${V2_PROJECT(config)}/marketing/photos/${mint.id}/confirm`, { sizeBytes: source.bytes.byteLength }, config);
288
+ let finalMedia = confirmed;
289
+ if (probe.kind === 'VIDEO') {
290
+ await uploadPoster(mint.id, probePath, config, warnings);
291
+ finalMedia = await apiGet(`${V2_PROJECT(config)}/marketing/photos/${mint.id}`, config).catch(() => confirmed);
292
+ }
293
+ return { media: trimMedia(finalMedia), warnings };
294
+ }
295
+ finally {
296
+ if (tempDir)
297
+ await rm(tempDir, { recursive: true, force: true }).catch(() => { });
298
+ }
299
+ }
300
+ /** Deprecated alias for {@link uploadCreativeMedia}, kept so existing callers naming the old tool
301
+ * still work — same implementation, same behavior, including for photos. */
302
+ export const uploadCreativePhoto = uploadCreativeMedia;
303
+ export async function renderCreativeTool(params, config) {
304
+ const result = await runLocalRender({ creativeId: params.creativeId, previewOnly: !!params.previewOnly, renderer: params.renderer ?? 'mcp', workflowRunId: params.workflowRunId }, config);
305
+ return {
306
+ renderId: result.renderId,
307
+ state: result.state,
308
+ ok: result.ok,
309
+ error: result.error,
310
+ frames: result.frames,
311
+ nextStep: result.ok
312
+ ? 'Call preview_creative to look at the render, or get_creative for the stored frame list.'
313
+ : 'Fix what `error` names and call render_creative again.',
314
+ };
315
+ }
316
+ const MAX_INLINE_IMAGE_BYTES = 1000000; // ~1MB — no downscale available without an image library
317
+ // Only a sheet rendered from the creative as it is now is worth showing: an older one would show the model
318
+ // an ad it has since edited. One too large to inline is skipped too, so a fresh (small) one is rendered.
319
+ function findCurrentSheetFrame(renders, version) {
320
+ for (const render of renders) {
321
+ if (render.state !== 'SUCCEEDED')
322
+ continue;
323
+ if (version !== undefined && render.creativeVersion !== version)
324
+ continue;
325
+ const frame = (render.frames ?? []).find((f) => f.placementKey === 'sheet');
326
+ if (frame && (frame.sizeBytes ?? 0) <= MAX_INLINE_IMAGE_BYTES)
327
+ return { render, frame };
328
+ }
329
+ return undefined;
330
+ }
331
+ // The latest SUCCEEDED render (of the creative's current version) that actually has frames — CLIP has
332
+ // no dedicated 'sheet' frame the way a STILL previewOnly render does, so any frame set will do.
333
+ function findLatestRenderWithFrames(renders, version) {
334
+ for (const render of renders) {
335
+ if (render.state !== 'SUCCEEDED')
336
+ continue;
337
+ if (version !== undefined && render.creativeVersion !== version)
338
+ continue;
339
+ if (render.frames && render.frames.length)
340
+ return render;
341
+ }
342
+ return undefined;
343
+ }
344
+ /**
345
+ * CLIP preview: there is no server-rendered contact sheet (previewOnly renders 422 for CLIP), so this
346
+ * downloads each placement frame's poster JPEG and composes them into one small sheet locally with
347
+ * ffmpeg (see poster-sheet.ts), falling back to just the first poster on its own if composition fails
348
+ * — showing one frame beats showing nothing. Frame count is placement count, so it's always at least 1.
349
+ */
350
+ async function previewClip(creativeId, version, renders, config) {
351
+ let render = findLatestRenderWithFrames(renders, version);
352
+ if (!render) {
353
+ // previewOnly renders are refused for CLIP — the only way to get frames is a real render.
354
+ const rendered = await runLocalRender({ creativeId, previewOnly: false, renderer: 'mcp' }, config);
355
+ if (!rendered.ok || !rendered.frames.length) {
356
+ return {
357
+ renderId: rendered.renderId,
358
+ state: rendered.state,
359
+ note: `Rendering failed${rendered.error ? `: ${rendered.error}` : '.'} There is nothing to show.`,
360
+ };
361
+ }
362
+ render = { id: rendered.renderId, state: rendered.state ?? 'SUCCEEDED', frames: rendered.frames };
363
+ }
364
+ const frames = (render.frames ?? []).filter((f) => f.posterUrl);
365
+ if (!frames.length) {
366
+ return { renderId: render.id, state: render.state, note: 'The render produced no poster frame to preview.' };
367
+ }
368
+ const summary = frames
369
+ .map((f) => {
370
+ const size = f.width && f.height ? `${f.width}x${f.height}` : '';
371
+ const duration = f.durationSeconds != null ? `${f.durationSeconds}s` : '';
372
+ return `${f.placementKey}: ${[size, duration].filter(Boolean).join(', ') || 'unknown'}`;
373
+ })
374
+ .join('\n');
375
+ const dir = await mkdtemp(join(tmpdir(), 'conductor-preview-'));
376
+ try {
377
+ const posterPaths = [];
378
+ let firstPoster;
379
+ for (const frame of frames) {
380
+ const response = await fetch(frame.posterUrl);
381
+ if (!response.ok)
382
+ continue;
383
+ const bytes = Buffer.from(await response.arrayBuffer());
384
+ if (!firstPoster)
385
+ firstPoster = bytes;
386
+ const filePath = join(dir, `${frame.placementKey}.jpg`);
387
+ await writeFile(filePath, bytes);
388
+ posterPaths.push(filePath);
389
+ }
390
+ if (!posterPaths.length || !firstPoster) {
391
+ return { renderId: render.id, state: render.state, note: 'Could not download any poster frame to preview.' };
392
+ }
393
+ try {
394
+ const sheet = await composePosterSheet(posterPaths);
395
+ return { renderId: render.id, state: render.state, image: { data: sheet, mimeType: 'image/jpeg' }, note: summary };
396
+ }
397
+ catch {
398
+ return {
399
+ renderId: render.id,
400
+ state: render.state,
401
+ image: { data: firstPoster, mimeType: 'image/jpeg' },
402
+ note: `${summary}\n(Could not compose a combined sheet — showing the first placement's poster only.)`,
403
+ };
404
+ }
405
+ }
406
+ finally {
407
+ await rm(dir, { recursive: true, force: true }).catch(() => { });
408
+ }
409
+ }
410
+ export async function previewCreative(params, config) {
411
+ const [creative, renders] = await Promise.all([
412
+ apiGet(`${creativesBase(config)}/${params.creativeId}`, config),
413
+ apiGet(`${creativesBase(config)}/${params.creativeId}/renders`, config),
414
+ ]);
415
+ if (creative?.kind === 'CLIP') {
416
+ return previewClip(params.creativeId, creative?.version, renders, config);
417
+ }
418
+ let found = findCurrentSheetFrame(renders, creative?.version);
419
+ if (!found) {
420
+ const rendered = await runLocalRender({ creativeId: params.creativeId, previewOnly: true, renderer: 'mcp' }, config);
421
+ if (!rendered.ok || !rendered.renderId) {
422
+ return {
423
+ renderId: rendered.renderId,
424
+ state: rendered.state,
425
+ note: `Rendering a preview failed${rendered.error ? `: ${rendered.error}` : '.'} There is nothing to show.`,
426
+ };
427
+ }
428
+ const sheetFrame = rendered.frames.find((f) => f.placementKey === 'sheet');
429
+ if (!sheetFrame) {
430
+ return { renderId: rendered.renderId, state: rendered.state, note: 'The preview render produced no contact sheet frame.' };
431
+ }
432
+ found = { render: { id: rendered.renderId, state: rendered.state ?? 'SUCCEEDED' }, frame: sheetFrame };
433
+ }
434
+ const { render, frame } = found;
435
+ if (!frame.url) {
436
+ return { renderId: render.id, state: render.state, note: 'The contact sheet frame has no download URL yet.' };
437
+ }
438
+ if ((frame.sizeBytes ?? 0) > MAX_INLINE_IMAGE_BYTES) {
439
+ return {
440
+ renderId: render.id,
441
+ state: render.state,
442
+ url: frame.url,
443
+ note: `The rendered image is ${Math.round((frame.sizeBytes ?? 0) / 1024)} KB, larger than this tool can inline (~1 MB) — open the URL directly instead.`,
444
+ };
445
+ }
446
+ const response = await fetch(frame.url);
447
+ if (!response.ok) {
448
+ return { renderId: render.id, state: render.state, url: frame.url, note: `Could not download the frame (HTTP ${response.status}) — open the URL directly instead.` };
449
+ }
450
+ const bytes = new Uint8Array(await response.arrayBuffer());
451
+ if (bytes.byteLength > MAX_INLINE_IMAGE_BYTES) {
452
+ return { renderId: render.id, state: render.state, url: frame.url, note: 'The rendered image is larger than this tool can inline — open the URL directly instead.' };
453
+ }
454
+ // The `sheet` contact sheet is a 1x JPEG; the mime type comes off the response rather than being
455
+ // hardcoded so an older PNG sheet is never mislabelled (see docs/creatives.md).
456
+ const mimeType = (response.headers.get('content-type') || 'image/jpeg').split(';')[0].trim();
457
+ return { renderId: render.id, state: render.state, url: frame.url, image: { data: Buffer.from(bytes), mimeType } };
458
+ }
459
+ export async function attachCreativeToPost(params, config) {
460
+ // `postId` is the primary name (it matches get_post_status's own param); `workItemId` is kept as a
461
+ // deprecated alias so existing callers don't break.
462
+ const postId = params.postId ?? params.workItemId;
463
+ if (!postId) {
464
+ throw new Error('postId is required (the Post\'s Work Item id).');
465
+ }
466
+ let renderId = params.renderId;
467
+ if (!renderId) {
468
+ const renders = await apiGet(`${creativesBase(config)}/${params.creativeId}/renders`, config);
469
+ const latest = renders.find((r) => r.state === 'SUCCEEDED' && !r.previewOnly);
470
+ if (!latest) {
471
+ throw new Error('No SUCCEEDED render exists for this Creative yet — call render_creative (previewOnly: false) first, or pass an explicit renderId.');
472
+ }
473
+ renderId = latest.id;
474
+ }
475
+ return apiPost(`${creativesBase(config)}/${params.creativeId}/attach`, { renderId, workItemId: postId }, config);
476
+ }
477
+ //# sourceMappingURL=creatives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"creatives.js","sourceRoot":"","sources":["../../../src/mcp/tools/creatives.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAA;AACnE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAEhC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AACnE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAyB,MAAM,0BAA0B,CAAA;AAC3F,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,cAAc,IAAI,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAE/E;;;;;;GAMG;AAEH,MAAM,UAAU,GAAG,CAAC,MAAc,EAAU,EAAE,CAAC,oBAAoB,MAAM,CAAC,SAAS,EAAE,CAAA;AACrF,MAAM,aAAa,GAAG,CAAC,MAAc,EAAU,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,sBAAsB,CAAA;AAC7F,MAAM,eAAe,GAAG,CAAC,MAAc,EAAU,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,wBAAwB,CAAA;AAEjG,4EAA4E;AAC5E,SAAS,MAAM,CAAC,CAAU;IACxB,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAqB,CAAA;IACvD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAA;AACtC,CAAC;AAED,gHAAgH;AAChH,SAAS,oBAAoB,CAAC,KAA8B;IAC1D,OAAO;QACL,UAAU,EAAE,KAAK,CAAC,YAAY,CAAC;QAC/B,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;QACrB,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC;QAC3B,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;QACrB,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC/C,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACvC,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC;KAC5B,CAAA;AACH,CAAC;AAED,mFAAmF;AACnF,SAAS,cAAc,CAAC,UAAmC;IACzD,OAAO;QACL,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC;QACpB,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC;QAC1B,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC;QAC5B,WAAW,EAAE,UAAU,CAAC,aAAa,CAAC;QACtC,gBAAgB,EAAE,UAAU,CAAC,kBAAkB,CAAC;QAChD,SAAS,EAAE,UAAU,CAAC,WAAW,CAAC;QAClC,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC;QAC9B,qBAAqB,EAAE,UAAU,CAAC,uBAAuB,CAAC;KAC3D,CAAA;AACH,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,kBAAkB,CAAI,EAAoB;IACvD,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAA;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,QAAQ,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,EAAE,CAAC;YAC1E,IAAI,UAAmF,CAAA;YACvF,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAA6B,CAAA;gBAClE,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC;oBAAE,UAAU,GAAG,MAAM,CAAC,UAA+B,CAAA;YAC3F,CAAC;YAAC,MAAM,CAAC;gBACP,qEAAqE;YACvE,CAAC;YACD,MAAM,OAAO,GAAG,UAAU;gBACxB,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBAClF,CAAC,CAAC,GAAG,CAAC,OAAO,CAAA;YACf,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAA;QAC/E,CAAC;QACD,MAAM,GAAG,CAAA;IACX,CAAC;AACH,CAAC;AAED,6EAA6E;AAE7E,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAA0B,EAAE,MAAc;IAC1E,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,MAAM,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,yBAAyB,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAA;IACrF,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAiC,GAAG,UAAU,CAAC,MAAM,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAA;IAC/G,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAA;IACzD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,oGAAoG,CAAC,CAAA;IACvH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,+EAA+E;AAE/E,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAA+C,EAC/C,MAAc;IAEd,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAA;IACnC,IAAI,MAAM,CAAC,KAAK;QAAE,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IAClD,IAAI,MAAM,CAAC,UAAU;QAAE,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;IACjE,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAA;IAC3B,OAAO,MAAM,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAA;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAA8B,EAAE,MAAc;IAC9E,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAChE,MAAM,CAA0B,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC;QACxF,MAAM,CAA0B,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,YAAY,EAAE,MAAM,CAAC;QAClG,MAAM,CAAiC,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QACrE,MAAM,CAA0B,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,cAAc,EAAE,MAAM,CAAC;KACrG,CAAC,CAAA;IACF,MAAM,QAAQ,GAAG,GAAG;SACjB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAC;SAC/E,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAA;IAEvG,MAAM,kBAAkB,GAAG,QAAQ,CAAC,oBAAoB,CAA8B,CAAA;IACtF,IAAI,UAA+C,CAAA;IACnD,IAAI,kBAAkB,EAAE,CAAC;QACvB,UAAU,GAAG,MAAM,MAAM,CAA0B,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,kBAAkB,EAAE,EAAE,MAAM,CAAC,CAAA;IAChH,CAAC;SAAM,CAAC;QACN,MAAM,WAAW,GAAG,MAAM,MAAM,CAC9B,GAAG,eAAe,CAAC,MAAM,CAAC,eAAe,MAAM,CAAC,UAAU,EAAE,EAC5D,MAAM,CACP,CAAA;QACD,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;IAC7B,CAAC;IAED,MAAM,MAAM,GAAI,WAAW,CAAC,QAAQ,CAAgD,IAAI,EAAE,CAAA;IAC1F,OAAO;QACL,GAAG,QAAQ;QACX,SAAS;QACT,QAAQ;QACR,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC;QAC7C,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI;KAC3D,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAqE,EACrE,MAAc;IAEd,OAAO,kBAAkB,CAAC,GAAG,EAAE,CAC7B,OAAO,CACL,eAAe,CAAC,MAAM,CAAC,EACvB,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,EACzF,MAAM,CACP,CACF,CAAA;AACH,CAAC;AA0CD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAA4B,EAAE,MAAc;IAC/E,OAAO,kBAAkB,CAAC,KAAK,IAAI,EAAE;QACnC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,OAAO,OAAO,CACZ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,SAAS,WAAW,EACvD,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAChD,MAAM,CACP,CAAA;QACH,CAAC;QACD,OAAO,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAA;IACpF,CAAC,CAAC,CAAA;AACJ,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAA4B,EAAE,MAAc;IAC/E,MAAM,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,CAAA;IACvC,OAAO,kBAAkB,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA;AACpG,CAAC;AAED,gFAAgF;AAEhF,MAAM,4BAA4B,GAAG,GAAG,CAAA;AAWxC,KAAK,UAAU,eAAe,CAAC,MAA2C;IACxE,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,OAAO,EAAE,KAAK,EAAE,IAAI,UAAU,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAA;IACnI,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAa,CAAA;IAChC,IAAI,MAAW,CAAA;IACf,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,IAAI,GAAG,sBAAsB,CAAC,CAAA;IAChD,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,yCAAyC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC7E,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAA;IACpC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,iBAAiB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IACpE,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAA;IAC1D,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,OAAO,EAAE,CAAA;AAClE,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACtC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC7B,OAAO,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;AACxD,CAAC;AAED;mGACmG;AACnG,MAAM,mBAAmB,GAAG;IAC1B,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,UAAU;IAC3F,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS;CACjG,CAAA;AAEV,SAAS,SAAS,CAAC,KAA8B;IAC/C,MAAM,GAAG,GAA4B,EAAE,CAAA;IACvC,KAAK,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;QACtC,IAAI,GAAG,IAAI,KAAK;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA;IACzC,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,cAAsB,EAAE,MAAc,EAAE,QAAkB;IACrG,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,oBAAoB,OAAO,MAAM,CAAC,CAAA;IACpE,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,cAAc,EAAE,UAAU,EAAE,CAAC,CAAC,CAAA;QAClD,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAA;QAC9C,MAAM,UAAU,GAAG,MAAM,OAAO,CAC9B,GAAG,UAAU,CAAC,MAAM,CAAC,qBAAqB,OAAO,SAAS,EAC1D,EAAE,EACF,MAAM,CACP,CAAA;QACD,MAAM,QAAQ,CAAC,UAAU,CAAC,SAAS,EAAE,YAAY,EAAE,WAAW,CAAC,CAAA;QAC/D,MAAM,OAAO,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,qBAAqB,OAAO,iBAAiB,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAA;IAC5H,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,QAAQ,CAAC,IAAI,CAAC,+CAA+C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAClH,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IACvD,CAAC;AACH,CAAC;AAgBD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAAiC,EAAE,MAAc;IACzF,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAA;IAC1F,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,CAAA;IAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC7D,MAAM,QAAQ,GAAa,EAAE,CAAA;IAE7B,MAAM,SAAS,GAAG,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACnD,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,GAAG,UAAU,CAAC,MAAM,CAAC,mBAAmB,EACxC;YACE,KAAK;YACL,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU;YAClC,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI;YAC7B,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,IAAI;YAC/B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW;SAClC,EACD,MAAM,CACP,CAAA;QACD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAA;QAClF,CAAC;QACD,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;QACnE,MAAM,SAAS,GAAG,MAAM,OAAO,CAC7B,GAAG,UAAU,CAAC,MAAM,CAAC,qBAAqB,IAAI,CAAC,EAAE,UAAU,EAC3D,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,EACtC,MAAM,CACP,CAAA;QACD,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAA;IAClD,CAAC;IAED,2EAA2E;IAC3E,IAAI,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAA;IAC/B,IAAI,OAA2B,CAAA;IAC/B,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAA;QAC3D,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAA;QACrD,MAAM,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IAC1C,CAAC;IAED,IAAI,KAAuB,CAAA;IAC3B,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,CAAA;IACrC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,OAAO;YAAE,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAChF,MAAM,IAAI,KAAK,CACb,mBAAmB,MAAM,CAAC,QAAQ,sCAAsC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC3H,CAAA;IACH,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACrD,IAAI,OAAO;YAAE,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAChF,MAAM,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,qDAAqD,CAAC,CAAA;IAC3F,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,eAAe,GAAG,4BAA4B,EAAE,CAAC;QAC5G,QAAQ,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,2CAA2C,CAAC,CAAA;IAC9G,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,GAAG,UAAU,CAAC,MAAM,CAAC,mBAAmB,EACxC;YACE,SAAS,EAAE,KAAK,CAAC,IAAI;YACrB,KAAK;YACL,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU;YAClC,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI;YAC1B,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;YAC5B,eAAe,EAAE,KAAK,CAAC,eAAe,IAAI,IAAI;YAC9C,QAAQ,EAAE,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;YAC/D,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI;YAC7B,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,IAAI;YAC/B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW;SAClC,EACD,MAAM,CACP,CAAA;QACD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAA;QAClF,CAAC;QACD,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;QAC/D,MAAM,SAAS,GAAG,MAAM,OAAO,CAC7B,GAAG,UAAU,CAAC,MAAM,CAAC,qBAAqB,IAAI,CAAC,EAAE,UAAU,EAC3D,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,EACtC,MAAM,CACP,CAAA;QAED,IAAI,UAAU,GAAG,SAAS,CAAA;QAC1B,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC3B,MAAM,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;YACxD,UAAU,GAAG,MAAM,MAAM,CAA0B,GAAG,UAAU,CAAC,MAAM,CAAC,qBAAqB,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,KAAK,CACnH,GAAG,EAAE,CAAC,SAAS,CAChB,CAAA;QACH,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAA;IACnD,CAAC;YAAS,CAAC;QACT,IAAI,OAAO;YAAE,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IAClF,CAAC;AACH,CAAC;AAED;4EAC4E;AAC5E,MAAM,CAAC,MAAM,mBAAmB,GAAG,mBAAmB,CAAA;AA8BtD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAgG,EAChG,MAAc;IAEd,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,EAC7I,MAAM,CACP,CAAA;IACD,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,MAAM,CAAC,EAAE;YACjB,CAAC,CAAC,yFAAyF;YAC3F,CAAC,CAAC,wDAAwD;KAC7D,CAAA;AACH,CAAC;AAED,MAAM,sBAAsB,GAAG,OAAS,CAAA,CAAC,yDAAyD;AAUlG,2GAA2G;AAC3G,yGAAyG;AACzG,SAAS,qBAAqB,CAC5B,OAAwB,EACxB,OAA2B;IAE3B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,KAAK,KAAK,WAAW;YAAE,SAAQ;QAC1C,IAAI,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,eAAe,KAAK,OAAO;YAAE,SAAQ;QACzE,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,OAAO,CAAC,CAAA;QAC3E,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,sBAAsB;YAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;IACzF,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,sGAAsG;AACtG,gGAAgG;AAChG,SAAS,0BAA0B,CAAC,OAAwB,EAAE,OAA2B;IACvF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,KAAK,KAAK,WAAW;YAAE,SAAQ;QAC1C,IAAI,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,eAAe,KAAK,OAAO;YAAE,SAAQ;QACzE,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM;YAAE,OAAO,MAAM,CAAA;IAC1D,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,WAAW,CACxB,UAAkB,EAClB,OAA2B,EAC3B,OAAwB,EACxB,MAAc;IAEd,IAAI,MAAM,GAAG,0BAA0B,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACzD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,0FAA0F;QAC1F,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,MAAM,CAAC,CAAA;QAClG,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAC5C,OAAO;gBACL,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,IAAI,EAAE,mBAAmB,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,4BAA4B;aAClG,CAAA;QACH,CAAC;QACD,MAAM,GAAG,EAAE,EAAE,EAAE,QAAQ,CAAC,QAAS,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,MAA0B,EAAE,CAAA;IACxH,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IAC/D,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,iDAAiD,EAAE,CAAA;IAC9G,CAAC;IAED,MAAM,OAAO,GAAG,MAAM;SACnB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QAChE,MAAM,QAAQ,GAAG,CAAC,CAAC,eAAe,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;QACzE,OAAO,GAAG,CAAC,CAAC,YAAY,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,EAAE,CAAA;IACzF,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAA;IAC/D,IAAI,CAAC;QACH,MAAM,WAAW,GAAa,EAAE,CAAA;QAChC,IAAI,WAA+B,CAAA;QACnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,SAAU,CAAC,CAAA;YAC9C,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,SAAQ;YAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAA;YACvD,IAAI,CAAC,WAAW;gBAAE,WAAW,GAAG,KAAK,CAAA;YACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,YAAY,MAAM,CAAC,CAAA;YACvD,MAAM,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;YAChC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC5B,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,iDAAiD,EAAE,CAAA;QAC9G,CAAC;QAED,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,WAAW,CAAC,CAAA;YACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;QACpH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE;gBACpD,IAAI,EAAE,GAAG,OAAO,qFAAqF;aACtG,CAAA;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IACjE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAA8B,EAAE,MAAc;IAClF,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC5C,MAAM,CAAsC,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC;QACpG,MAAM,CAAkB,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,UAAU,EAAE,MAAM,CAAC;KACzF,CAAC,CAAA;IAEF,IAAI,QAAQ,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;QAC9B,OAAO,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;IAC3E,CAAC;IAED,IAAI,KAAK,GAAG,qBAAqB,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;IAE7D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,MAAM,CAAC,CAAA;QACpH,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACvC,OAAO;gBACL,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,IAAI,EAAE,6BAA6B,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,4BAA4B;aAC5G,CAAA;QACH,CAAC;QACD,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,OAAO,CAAC,CAAA;QAC1E,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,qDAAqD,EAAE,CAAA;QAC5H,CAAC;QACD,KAAK,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,WAAW,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAA;IACxG,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAA;IAC/B,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACf,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,kDAAkD,EAAE,CAAA;IAC/G,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,sBAAsB,EAAE,CAAC;QACpD,OAAO;YACL,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,IAAI,EAAE,yBAAyB,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,gFAAgF;SACzJ,CAAA;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACvC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,sCAAsC,QAAQ,CAAC,MAAM,oCAAoC,EAAE,CAAA;IACtK,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAA;IAC1D,IAAI,KAAK,CAAC,UAAU,GAAG,sBAAsB,EAAE,CAAC;QAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,yFAAyF,EAAE,CAAA;IACtK,CAAC;IACD,iGAAiG;IACjG,gFAAgF;IAChF,MAAM,QAAQ,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,YAAY,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAC5F,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAA;AACpH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAuF,EACvF,MAAc;IAEd,mGAAmG;IACnG,oDAAoD;IACpD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,CAAA;IACjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;IACnE,CAAC;IACD,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAA;IAC9B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,MAAM,MAAM,CAAkB,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,UAAU,EAAE,MAAM,CAAC,CAAA;QAC9G,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,WAAW,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAA;QAC7E,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,mIAAmI,CACpI,CAAA;QACH,CAAC;QACD,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAA;IACtB,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,SAAS,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,CAAA;AAClH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"insights.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/insights.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AA2HrC;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE;IAAE,MAAM,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3D,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAwBlC"}
1
+ {"version":3,"file":"insights.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/insights.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AA6JrC;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE;IAAE,MAAM,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3D,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAyBlC"}