@cliangdev/conductor 0.22.0 → 0.24.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 (43) hide show
  1. package/assets/claude/skills/conductor-creative/SKILL.md +57 -0
  2. package/assets/cli-manifest.json +6 -1
  3. package/dist/commands/creative.d.ts.map +1 -1
  4. package/dist/commands/creative.js +6 -1
  5. package/dist/commands/creative.js.map +1 -1
  6. package/dist/creative/assertions.js +4 -4
  7. package/dist/creative/frame.css +21 -0
  8. package/dist/creative/frame.js +39 -0
  9. package/dist/creative/job/render.mjs +261 -4
  10. package/dist/creative/job/transport.mjs +47 -13
  11. package/dist/creative/layouts/bleed/layout.css +6 -2
  12. package/dist/creative/layouts/card/layout.css +3 -0
  13. package/dist/creative/layouts/split/layout.css +3 -0
  14. package/dist/creative/layouts/stacked/layout.css +3 -0
  15. package/dist/creative/motion.js +347 -0
  16. package/dist/creative/placements.js +28 -0
  17. package/dist/creative/placements.json +36 -0
  18. package/dist/creative/render.js +29 -0
  19. package/dist/creative/sheet.html +4 -0
  20. package/dist/creative/sheet.js +39 -2
  21. package/dist/creative/styles.css +36 -2
  22. package/dist/lib/creative-render.d.ts +13 -3
  23. package/dist/lib/creative-render.d.ts.map +1 -1
  24. package/dist/lib/creative-render.js +47 -5
  25. package/dist/lib/creative-render.js.map +1 -1
  26. package/dist/lib/media-probe.d.ts +55 -0
  27. package/dist/lib/media-probe.d.ts.map +1 -0
  28. package/dist/lib/media-probe.js +221 -0
  29. package/dist/lib/media-probe.js.map +1 -0
  30. package/dist/lib/poster-sheet.d.ts +10 -0
  31. package/dist/lib/poster-sheet.d.ts.map +1 -0
  32. package/dist/lib/poster-sheet.js +57 -0
  33. package/dist/lib/poster-sheet.js.map +1 -0
  34. package/dist/mcp/index.d.ts +10587 -0
  35. package/dist/mcp/index.d.ts.map +1 -1
  36. package/dist/mcp/index.js +93 -10
  37. package/dist/mcp/index.js.map +1 -1
  38. package/dist/mcp/tools/creatives.d.ts +29 -2
  39. package/dist/mcp/tools/creatives.d.ts.map +1 -1
  40. package/dist/mcp/tools/creatives.js +282 -35
  41. package/dist/mcp/tools/creatives.js.map +1 -1
  42. package/package.json +3 -1
  43. package/scripts/build-creative.mjs +7 -2
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Composes several poster JPEGs (one per CLIP placement) into a single small "key moments" sheet
3
+ * image with ffmpeg's hstack filter, so `preview_creative` has something to show for a CLIP
4
+ * creative — which has no server-rendered contact sheet the way a STILL creative's previewOnly
5
+ * render does (rendering one locally isn't possible either: CLIP has no browser-driven render path,
6
+ * see render_creative in tools/creatives.ts). Shares ffmpeg discovery with media-probe.ts rather
7
+ * than duplicating it.
8
+ */
9
+ import { spawn } from 'node:child_process';
10
+ import { readFile, unlink } from 'node:fs/promises';
11
+ import { tmpdir } from 'node:os';
12
+ import { join } from 'node:path';
13
+ import { randomUUID } from 'node:crypto';
14
+ import { resolveFfmpegPath } from './media-probe.js';
15
+ const SHEET_HEIGHT = 360;
16
+ /** One `scale=-2:360` per input, then an hstack chaining every scaled output left to right. A single
17
+ * input skips the stack (nothing to stack) and just scales. */
18
+ export function buildSheetFilterComplex(count) {
19
+ if (count === 1)
20
+ return `[0:v]scale=-2:${SHEET_HEIGHT}[v]`;
21
+ const scales = Array.from({ length: count }, (_, i) => `[${i}:v]scale=-2:${SHEET_HEIGHT}[v${i}]`).join(';');
22
+ const stackInputs = Array.from({ length: count }, (_, i) => `[v${i}]`).join('');
23
+ return `${scales};${stackInputs}hstack=inputs=${count}[v]`;
24
+ }
25
+ /**
26
+ * Composes the given local poster JPEGs left to right into one JPEG sheet, each scaled to ~360px
27
+ * high. Throws on any ffmpeg failure (no binary, a bad/corrupt poster, etc.) — callers should catch
28
+ * this and fall back to showing a single poster on its own rather than nothing.
29
+ */
30
+ export async function composePosterSheet(posterPaths) {
31
+ if (posterPaths.length === 0) {
32
+ throw new Error('composePosterSheet needs at least one poster image');
33
+ }
34
+ const ffmpegPath = await resolveFfmpegPath();
35
+ const outPath = join(tmpdir(), `conductor-sheet-${randomUUID()}.jpg`);
36
+ const inputs = posterPaths.flatMap((p) => ['-i', p]);
37
+ const args = ['-y', ...inputs, '-filter_complex', buildSheetFilterComplex(posterPaths.length), '-map', '[v]', '-q:v', '3', outPath];
38
+ await new Promise((resolve, reject) => {
39
+ const child = spawn(ffmpegPath, args, { stdio: ['ignore', 'ignore', 'pipe'] });
40
+ let stderr = '';
41
+ child.stderr.on('data', (d) => (stderr += d));
42
+ child.on('error', reject);
43
+ child.on('exit', (code) => {
44
+ if (code === 0)
45
+ resolve();
46
+ else
47
+ reject(new Error(`ffmpeg sheet composition failed (exit ${code}): ${stderr.trim().slice(-2000) || 'no error output'}`));
48
+ });
49
+ });
50
+ try {
51
+ return await readFile(outPath);
52
+ }
53
+ finally {
54
+ await unlink(outPath).catch(() => { });
55
+ }
56
+ }
57
+ //# sourceMappingURL=poster-sheet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poster-sheet.js","sourceRoot":"","sources":["../../src/lib/poster-sheet.ts"],"names":[],"mappings":"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"}