gooseworks 0.5.7-dev.44.7984b705 → 0.5.7-dev.46.ade46de2

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 (41) hide show
  1. package/dist/kit/maker/cues.d.ts +67 -0
  2. package/dist/kit/maker/cues.d.ts.map +1 -0
  3. package/dist/kit/maker/cues.js +204 -0
  4. package/dist/kit/maker/cues.js.map +1 -0
  5. package/dist/kit/maker/encode.d.ts +5 -0
  6. package/dist/kit/maker/encode.d.ts.map +1 -1
  7. package/dist/kit/maker/encode.js +7 -1
  8. package/dist/kit/maker/encode.js.map +1 -1
  9. package/dist/kit/maker/facts.d.ts +46 -0
  10. package/dist/kit/maker/facts.d.ts.map +1 -0
  11. package/dist/kit/maker/facts.js +159 -0
  12. package/dist/kit/maker/facts.js.map +1 -0
  13. package/dist/kit/maker/inputs.d.ts +48 -3
  14. package/dist/kit/maker/inputs.d.ts.map +1 -1
  15. package/dist/kit/maker/inputs.js +151 -22
  16. package/dist/kit/maker/inputs.js.map +1 -1
  17. package/dist/kit/maker/make.d.ts +20 -1
  18. package/dist/kit/maker/make.d.ts.map +1 -1
  19. package/dist/kit/maker/make.js +125 -19
  20. package/dist/kit/maker/make.js.map +1 -1
  21. package/dist/kit/maker/page.d.ts.map +1 -1
  22. package/dist/kit/maker/page.js +49 -1
  23. package/dist/kit/maker/page.js.map +1 -1
  24. package/dist/kit/maker/parts/html-frames/1.2.0/part.json +1083 -0
  25. package/dist/kit/maker/parts/html-frames/src/part.d.ts.map +1 -1
  26. package/dist/kit/maker/parts/html-frames/src/part.js +4 -1
  27. package/dist/kit/maker/parts/html-frames/src/part.js.map +1 -1
  28. package/dist/kit/maker/runtime.d.ts.map +1 -1
  29. package/dist/kit/maker/runtime.js +54 -7
  30. package/dist/kit/maker/runtime.js.map +1 -1
  31. package/dist/kit/maker/timing.d.ts +74 -0
  32. package/dist/kit/maker/timing.d.ts.map +1 -0
  33. package/dist/kit/maker/timing.js +152 -0
  34. package/dist/kit/maker/timing.js.map +1 -0
  35. package/dist/kit/maker/under.d.ts +126 -0
  36. package/dist/kit/maker/under.d.ts.map +1 -0
  37. package/dist/kit/maker/under.js +299 -0
  38. package/dist/kit/maker/under.js.map +1 -0
  39. package/package.json +2 -2
  40. package/skills/manifest.json +1 -1
  41. package/dist/kit/maker/parts/html-frames/1.1.0/part.json +0 -199
@@ -0,0 +1,299 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.QUIET_SAFE = void 0;
37
+ exports.probeUnder = probeUnder;
38
+ exports.coverFit = coverFit;
39
+ exports.coverFilter = coverFilter;
40
+ exports.quietBandOf = quietBandOf;
41
+ exports.quietBands = quietBands;
42
+ exports.underIsShared = underIsShared;
43
+ exports.underSceneFrames = underSceneFrames;
44
+ exports.alphaSegmentArgs = alphaSegmentArgs;
45
+ exports.compositeArgs = compositeArgs;
46
+ exports.passThroughTimeline = passThroughTimeline;
47
+ // Drawing a frame page over another step's video (html-frames 1.2.0 `under`).
48
+ // The page is captured transparent, its frames are kept with their alpha in
49
+ // short PNG-in-MOV segments, and one last ffmpeg pass lays them over the video,
50
+ // keeping its sound. Before the page runs, each scene's quiet band (the
51
+ // emptiest horizontal band of its middle frame) is measured here in Node, since
52
+ // a file:// page may not read a video's pixels. Bundled into the part.
53
+ const promises_1 = require("node:fs/promises");
54
+ const path = __importStar(require("node:path"));
55
+ const encode_1 = require("./encode");
56
+ /** The band a quiet band is looked for in, and its height, as fractions of the height. */
57
+ exports.QUIET_SAFE = { top: 0.15, bottom: 0.85, height: 0.15 };
58
+ /** The size the middle frame is measured at: a few pixels a row is plenty for "busy or not". */
59
+ const MEASURE_WIDTH = 96;
60
+ function numberOf(value) {
61
+ const n = typeof value === 'string' ? Number(value) : value;
62
+ return typeof n === 'number' && Number.isFinite(n) ? n : undefined;
63
+ }
64
+ function rateOf(value) {
65
+ if (typeof value !== 'string')
66
+ return null;
67
+ const [a, b] = value.split('/').map(Number);
68
+ const rate = b ? a / b : a;
69
+ return Number.isFinite(rate) && rate > 0 ? rate : null;
70
+ }
71
+ /** Reads the video's picture length, size, frame rate and whether it has sound, with ffprobe. */
72
+ async function probeUnder(tools, file) {
73
+ let parsed;
74
+ try {
75
+ const { stdout } = await tools.exec('ffprobe', [
76
+ '-v', 'error',
77
+ '-show_entries', 'stream=codec_type,width,height,duration,avg_frame_rate,r_frame_rate:format=duration',
78
+ '-of', 'json', file,
79
+ ]);
80
+ parsed = JSON.parse(stdout);
81
+ }
82
+ catch {
83
+ return null;
84
+ }
85
+ const streams = parsed.streams ?? [];
86
+ const video = streams.find((s) => s.codec_type === 'video');
87
+ if (!video)
88
+ return null;
89
+ const width = numberOf(video.width);
90
+ const height = numberOf(video.height);
91
+ const seconds = numberOf(video.duration) ?? numberOf(parsed.format?.duration);
92
+ if (!width || !height || !seconds || seconds <= 0)
93
+ return null;
94
+ return {
95
+ seconds,
96
+ width,
97
+ height,
98
+ fps: rateOf(video.avg_frame_rate) ?? rateOf(video.r_frame_rate),
99
+ hasAudio: streams.some((s) => s.codec_type === 'audio'),
100
+ };
101
+ }
102
+ function coverFit(from, to) {
103
+ const scale = Math.max(to.width / from.width, to.height / from.height);
104
+ return { scale, offsetX: (from.width * scale - to.width) / 2, offsetY: (from.height * scale - to.height) / 2 };
105
+ }
106
+ /** The ffmpeg filter that fits the video to the page: cover, centre crop, square pixels. */
107
+ function coverFilter(size) {
108
+ return `scale=${size.width}:${size.height}:force_original_aspect_ratio=increase:flags=bicubic,crop=${size.width}:${size.height},setsar=1`;
109
+ }
110
+ /**
111
+ * The emptiest band of a grey picture: rows are scored by how much the picture
112
+ * changes along and down them (the per-row gradient), and the band of
113
+ * QUIET_SAFE.height whose rows change least, inside QUIET_SAFE, wins. Ties go
114
+ * to the band nearer the bottom, where captions usually sit.
115
+ */
116
+ function quietBandOf(gray, width, height) {
117
+ const rows = new Float64Array(height);
118
+ for (let y = 0; y < height; y++) {
119
+ let sum = 0;
120
+ const row = y * width;
121
+ for (let x = 0; x < width; x++) {
122
+ const v = gray[row + x];
123
+ if (x + 1 < width)
124
+ sum += Math.abs(gray[row + x + 1] - v);
125
+ if (y + 1 < height)
126
+ sum += Math.abs(gray[row + width + x] - v);
127
+ }
128
+ rows[y] = sum / width;
129
+ }
130
+ const band = Math.max(1, Math.round(exports.QUIET_SAFE.height * height));
131
+ const first = Math.ceil(exports.QUIET_SAFE.top * height);
132
+ const last = Math.max(first, Math.floor(exports.QUIET_SAFE.bottom * height) - band);
133
+ let best = first;
134
+ let bestScore = Infinity;
135
+ for (let y0 = first; y0 <= last; y0++) {
136
+ let score = 0;
137
+ for (let y = y0; y < y0 + band && y < height; y++)
138
+ score += rows[y];
139
+ // A band must be clearly quieter to win over one further down.
140
+ if (score <= bestScore + 1e-9) {
141
+ best = y0;
142
+ bestScore = score;
143
+ }
144
+ }
145
+ const round = (n) => Math.round(n * 10000) / 10000;
146
+ return { y0: round(best / height), y1: round(Math.min(height, best + band) / height) };
147
+ }
148
+ /**
149
+ * Each scene's quiet band, from the video's frame at the middle of the scene,
150
+ * fitted to the page the way the last pass fits it (cover, centre crop), so the
151
+ * band describes what shows. Frames are read one at a time as raw grey pixels into `dir`.
152
+ */
153
+ async function quietBands(tools, file, info, times, dir, page) {
154
+ const width = MEASURE_WIDTH;
155
+ const height = Math.max(2, Math.round((page.height / page.width) * width));
156
+ const bands = [];
157
+ for (let i = 0; i < times.length; i++) {
158
+ const middle = Math.min(Math.max(0, (times[i].start_s + times[i].end_s) / 2), Math.max(0, info.seconds - 0.05));
159
+ const out = path.join(dir, `quiet-${i}.gray`);
160
+ await tools.exec('ffmpeg', [
161
+ '-hide_banner', '-nostdin', '-loglevel', 'error', '-y',
162
+ '-ss', middle.toFixed(3), '-i', file,
163
+ '-frames:v', '1', '-an',
164
+ '-vf', `${coverFilter({ width, height })},format=gray`,
165
+ '-f', 'rawvideo', '-pix_fmt', 'gray', out,
166
+ ]);
167
+ const gray = await (0, promises_1.readFile)(out);
168
+ await (0, promises_1.rm)(out, { force: true });
169
+ bands.push(gray.length >= width * height ? quietBandOf(gray, width, height) : { y0: 0.7, y1: 0.85 });
170
+ }
171
+ return bands;
172
+ }
173
+ /**
174
+ * True when the plan's scenes share the video drawn over evenly: that video is
175
+ * one scene (one clip, say) and the plan has several.
176
+ */
177
+ function underIsShared(ids, timeline) {
178
+ return timeline.scenes.length === 1 && ids.length > 1;
179
+ }
180
+ /**
181
+ * Scene start frames from the timeline of the video drawn over. Each plan scene
182
+ * takes the time of the timeline scene with its id; when ids do not match and
183
+ * both list the same number of scenes, they pair in order. When that video is
184
+ * one scene and the plan has several, the plan's scenes share it evenly on
185
+ * whole frames, as they share a video of a given length. Returns null when the
186
+ * scenes cannot be paired.
187
+ */
188
+ function underSceneFrames(ids, timeline, fps, frameCount) {
189
+ if (underIsShared(ids, timeline)) {
190
+ if (frameCount < ids.length)
191
+ return null;
192
+ const shared = ids.map((_, i) => Math.round((i * frameCount) / ids.length));
193
+ shared.push(frameCount);
194
+ return shared;
195
+ }
196
+ const byId = new Map(timeline.scenes.map((s) => [s.id, s]));
197
+ const matched = ids.map((id) => byId.get(id) ?? null);
198
+ let spans;
199
+ if (matched.every((s) => s))
200
+ spans = matched;
201
+ else if (timeline.scenes.length === ids.length)
202
+ spans = ids.map((id, i) => byId.get(id) ?? timeline.scenes[i]);
203
+ else
204
+ return null;
205
+ const frames = spans.map((s) => Math.min(frameCount, Math.max(0, Math.round(s.start_s * fps))));
206
+ for (let i = 1; i < frames.length; i++)
207
+ if (frames[i] < frames[i - 1])
208
+ return null;
209
+ frames.push(frameCount);
210
+ return frames;
211
+ }
212
+ /** One segment of transparent page frames, kept with their alpha (PNG in MOV), to be laid over the video later. */
213
+ function alphaSegmentArgs(opts) {
214
+ return [
215
+ '-hide_banner', '-nostdin', '-loglevel', 'error', '-y',
216
+ '-framerate', String(opts.fps),
217
+ '-start_number', String(opts.start),
218
+ '-i', `${opts.framesDir}/${opts.framePattern}`,
219
+ '-frames:v', String(opts.count),
220
+ '-c:v', 'png', '-pix_fmt', 'rgba',
221
+ '-fflags', '+bitexact', '-flags', '+bitexact', '-map_metadata', '-1',
222
+ '-an', '-r', String(opts.fps),
223
+ opts.out,
224
+ ];
225
+ }
226
+ /**
227
+ * The last pass: the video fitted to the page, the page's frames laid over it,
228
+ * encoded like every html-frames video, with the video's sound kept as AAC.
229
+ */
230
+ function compositeArgs(opts) {
231
+ const seconds = (opts.frames / opts.fps).toFixed(6);
232
+ const graph = [
233
+ `[0:v]setpts=PTS-STARTPTS,fps=${opts.fps},${coverFilter(opts.size)}[base]`,
234
+ `[1:v]setpts=PTS-STARTPTS,format=rgba[page]`,
235
+ `[base][page]overlay=0:0:format=auto:eof_action=pass:shortest=0,scale=out_color_matrix=bt709:out_range=tv,format=yuv420p[v]`,
236
+ ].join(';');
237
+ return [
238
+ '-hide_banner', '-nostdin', '-loglevel', 'error', '-y',
239
+ '-i', opts.under,
240
+ '-f', 'concat', '-safe', '0', '-i', opts.list,
241
+ '-filter_complex', graph,
242
+ '-map', '[v]',
243
+ ...(opts.hasAudio ? ['-map', '0:a:0'] : []),
244
+ '-frames:v', String(opts.frames),
245
+ ...opts.tools.encodeArgs('h264-master'),
246
+ ...encode_1.MASTER_RATE_CAP,
247
+ '-c:v', 'libx264',
248
+ '-pix_fmt', 'yuv420p',
249
+ '-colorspace', 'bt709', '-color_primaries', 'bt709', '-color_trc', 'bt709', '-color_range', 'tv',
250
+ ...(opts.hasAudio ? [...opts.tools.encodeArgs('aac'), '-t', seconds] : ['-an']),
251
+ '-r', String(opts.fps),
252
+ opts.out,
253
+ ];
254
+ }
255
+ /** A zone of the video drawn over, moved onto the page's picture (scaled to cover, cropped to the middle). */
256
+ function fitZone(zone, fit, size) {
257
+ const x0 = Math.max(0, zone.x * fit.scale - fit.offsetX);
258
+ const y0 = Math.max(0, zone.y * fit.scale - fit.offsetY);
259
+ const x1 = Math.min(size.width, (zone.x + zone.w) * fit.scale - fit.offsetX);
260
+ const y1 = Math.min(size.height, (zone.y + zone.h) * fit.scale - fit.offsetY);
261
+ if (x1 - x0 < 1 || y1 - y0 < 1)
262
+ return null;
263
+ return { ...zone, x: Math.round(x0), y: Math.round(y0), w: Math.round(x1 - x0), h: Math.round(y1 - y0) };
264
+ }
265
+ /**
266
+ * The timeline of a video drawn over: the video's own scenes, speech, end card
267
+ * and safe zones carried through (cut to the new length, zones moved to the
268
+ * new picture), with this video's length, size and frame rate. When the plan's
269
+ * scenes shared a one-scene video (`scenes` given), they are the scenes, and a
270
+ * speech entry that names a scene names the one it starts in.
271
+ */
272
+ function passThroughTimeline(under, out, scenes) {
273
+ const end = out.duration_s;
274
+ const cut = (items) => items.filter((item) => item.start_s < end).map((item) => (item.end_s > end ? { ...item, end_s: end } : item));
275
+ let speech = cut(under.speech);
276
+ if (scenes?.length) {
277
+ const sceneAt = (t) => scenes.find((s) => t < s.end_s) ?? scenes[scenes.length - 1];
278
+ speech = speech.map((entry) => (typeof entry.scene_id === 'string' ? { ...entry, scene_id: sceneAt(entry.start_s).id } : entry));
279
+ }
280
+ const timeline = {
281
+ duration_s: out.duration_s,
282
+ width: out.width,
283
+ height: out.height,
284
+ fps: out.fps,
285
+ scenes: cut((scenes ?? under.scenes).map((s) => ({ id: s.id, start_s: s.start_s, end_s: s.end_s }))),
286
+ speech,
287
+ };
288
+ if (under.end_card && under.end_card.start_s < end)
289
+ timeline.end_card = { start_s: under.end_card.start_s, end_s: Math.min(end, under.end_card.end_s) };
290
+ const fit = coverFit({ width: under.width, height: under.height }, out);
291
+ const zones = (under.safe_zones ?? [])
292
+ .map((z) => fitZone(z, fit, out))
293
+ .filter((z) => !!z)
294
+ .slice(0, 8);
295
+ if (zones.length)
296
+ timeline.safe_zones = zones;
297
+ return timeline;
298
+ }
299
+ //# sourceMappingURL=under.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"under.js","sourceRoot":"","sources":["../../../src/kit/maker/under.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gooseworks",
3
- "version": "0.5.7-dev.44.7984b705",
3
+ "version": "0.5.7-dev.46.ade46de2",
4
4
  "description": "GooseWorks CLI — give your coding agent real data tools",
5
5
  "bin": {
6
6
  "gooseworks": "./dist/index.js"
@@ -61,7 +61,7 @@
61
61
  "homepage": "https://gooseworks.ai",
62
62
  "author": "GooseWorks <help@gooseworks.ai>",
63
63
  "gooseworksRelease": {
64
- "commit": "7984b705b85982aefe86bb3ab93e6f41400b58cf",
64
+ "commit": "ade46de23e7191424a021470e98fd2b7730cfad0",
65
65
  "branch": "dev"
66
66
  }
67
67
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "package": "gooseworks",
3
- "version": "0.5.7-dev.44.7984b705",
3
+ "version": "0.5.7-dev.46.ade46de2",
4
4
  "entries": {
5
5
  "gooseworks": "6a54a8962a390d34639d56226d9078b63a9005b0a8f5c65d7811f2ef5808cec4",
6
6
  "goose-ads": "de1b0342fcc82942e1f9c6a3aa01818973c968cbdb65f7109d73761536d029f8",
@@ -1,199 +0,0 @@
1
- {
2
- "interface": 1,
3
- "id": "html-frames",
4
- "version": "1.1.0",
5
- "kind": "render_html",
6
- "title": "HTML frames",
7
- "summary": "Lays out a style's frame page with the plan's scenes, products and brand in the kit's Chromium, steps a virtual clock frame by frame and encodes the frames to H.264.",
8
- "runtime": "node",
9
- "entry": "part.mjs",
10
- "files": ["part.mjs"],
11
- "kit": ">=1.0.0 <2.0.0",
12
- "needs": {
13
- "browser": true,
14
- "ffmpeg": { "filters": ["scale", "setsar", "format", "transpose", "hflip", "vflip"], "encoders": ["libx264", "png", "mjpeg"] },
15
- "network": false,
16
- "models": [],
17
- "disk_mb": 1024
18
- },
19
- "inputs": {
20
- "type": "object",
21
- "additionalProperties": false,
22
- "required": ["template", "scenes", "aspect", "max_words"],
23
- "oneOf": [{ "required": ["duration_s"] }, { "required": ["scene_s"] }],
24
- "properties": {
25
- "template": {
26
- "description": "The style's frame page. The maker puts the kit runtime first in its head; the page reads window.kit and draws each frame from kit.render(fn), renderAt(t), seek(ms), or CSS and Web Animations.",
27
- "type": "object",
28
- "x-kit-file": { "media": "html" }
29
- },
30
- "frames": {
31
- "description": "Every other file the page uses (css, js, json, svg, png, jpg, webp), kept at the same places relative to the template. The page can load nothing else.",
32
- "type": "array",
33
- "maxItems": 200,
34
- "items": {
35
- "anyOf": [
36
- { "type": "object", "x-kit-file": { "media": "html" } },
37
- { "type": "object", "x-kit-file": { "media": "text" } },
38
- { "type": "object", "x-kit-file": { "media": "json" } },
39
- { "type": "object", "x-kit-file": { "media": "image" } }
40
- ]
41
- }
42
- },
43
- "fonts": {
44
- "description": "The style's fonts (ttf, otf, woff, woff2). CSS uses each by its file name without the extension.",
45
- "type": "array",
46
- "maxItems": 20,
47
- "items": { "type": "object", "x-kit-file": { "media": "font" } }
48
- },
49
- "scenes": {
50
- "description": "plan.scenes, in order. The scenes share the video evenly; kit.scenes carries each one's start_s and end_s, and picture and image as URLs when they are files.",
51
- "type": "array",
52
- "minItems": 1,
53
- "maxItems": 30,
54
- "items": {
55
- "type": "object",
56
- "properties": {
57
- "id": { "type": ["string", "null"], "maxLength": 64 },
58
- "line": { "type": ["string", "null"], "maxLength": 2000 },
59
- "on_screen": { "type": ["string", "null"], "maxLength": 2000 },
60
- "picture": {
61
- "anyOf": [
62
- { "type": "null" },
63
- { "type": "string", "maxLength": 2000 },
64
- { "type": "object", "x-kit-file": { "media": "image" } }
65
- ]
66
- },
67
- "image": {
68
- "description": "A picture the customer uploaded for this scene, as kit.scenes[i].image (a URL the page can load).",
69
- "anyOf": [{ "type": "null" }, { "type": "object", "x-kit-file": { "media": "image" } }]
70
- }
71
- }
72
- }
73
- },
74
- "max_words": {
75
- "description": "The style's scenes.max_words. A scene whose line or on-screen text has more words is refused.",
76
- "type": "integer",
77
- "minimum": 1,
78
- "maximum": 200
79
- },
80
- "products": {
81
- "description": "plan.products, in the customer's order. A PNG, JPEG or WebP photo over 2048 px on its long side, as shown after its EXIF orientation, reaches the page turned upright and scaled down to 2048 px (a PNG or WebP as PNG, keeping its transparency).",
82
- "type": "array",
83
- "maxItems": 12,
84
- "items": {
85
- "type": "object",
86
- "required": ["id"],
87
- "properties": {
88
- "id": { "type": "string", "minLength": 1 },
89
- "name": { "type": ["string", "null"], "maxLength": 2000 },
90
- "images": {
91
- "type": "array",
92
- "maxItems": 20,
93
- "items": { "type": "object", "x-kit-file": { "media": "image" } }
94
- }
95
- }
96
- }
97
- },
98
- "brand": {
99
- "description": "The brand frozen at the yes ({\"from\": \"brand\"}): name, logo, colors, fonts (heading, body), cta. Colours become CSS variables (--brand-primary, ...); fonts are brand-heading and brand-body.",
100
- "type": ["object", "null"],
101
- "properties": {
102
- "name": { "type": ["string", "null"], "maxLength": 2000 },
103
- "logo": { "anyOf": [{ "type": "null" }, { "type": "object", "x-kit-file": { "media": "image" } }] },
104
- "colors": { "type": ["object", "null"] },
105
- "fonts": {
106
- "type": ["object", "null"],
107
- "properties": {
108
- "heading": { "anyOf": [{ "type": "null" }, { "type": "object", "x-kit-file": { "media": "font" } }] },
109
- "body": { "anyOf": [{ "type": "null" }, { "type": "object", "x-kit-file": { "media": "font" } }] }
110
- }
111
- },
112
- "cta": { "type": ["object", "null"] }
113
- }
114
- },
115
- "aspect": { "enum": ["9:16", "1:1", "4:5", "16:9"] },
116
- "duration_s": {
117
- "description": "Length of the whole video, in seconds. Give this or scene_s.",
118
- "type": "number",
119
- "minimum": 0.5,
120
- "maximum": 180
121
- },
122
- "scene_s": {
123
- "description": "Seconds per scene; the video is this times the number of scenes. Give this or duration_s.",
124
- "type": "number",
125
- "exclusiveMinimum": 0,
126
- "maximum": 60
127
- },
128
- "fps": { "type": "integer", "minimum": 1, "maximum": 60, "default": 30 },
129
- "short_side": {
130
- "description": "Pixels on the short side of the video. The page is always laid out at 1080 and scaled.",
131
- "enum": [720, 1080],
132
- "default": 1080
133
- },
134
- "values": {
135
- "description": "The style's own plain values for its page (labels, look choices), as kit.values.",
136
- "type": "object"
137
- }
138
- }
139
- },
140
- "outputs": {
141
- "type": "object",
142
- "additionalProperties": false,
143
- "required": ["video", "seconds", "timeline"],
144
- "properties": {
145
- "video": {
146
- "description": "H.264 in yuv420p, BT.709, no sound, at the aspect's size.",
147
- "type": "object",
148
- "x-kit-file": { "media": "video", "mime": ["video/mp4"] }
149
- },
150
- "seconds": { "type": "number", "exclusiveMinimum": 0 },
151
- "timeline": {
152
- "description": "duration_s, width, height, fps, scenes [{id, start_s, end_s}], an empty speech list and, when the page shows the brand's logo, safe_zones with its box in the video's pixels (the picture of kit.brand.logo as drawn on the last frame that shows it).",
153
- "type": "object",
154
- "required": ["duration_s", "width", "height", "fps", "scenes", "speech"],
155
- "properties": {
156
- "duration_s": { "type": "number" },
157
- "width": { "type": "integer" },
158
- "height": { "type": "integer" },
159
- "fps": { "type": "number" },
160
- "scenes": {
161
- "type": "array",
162
- "items": {
163
- "type": "object",
164
- "required": ["id", "start_s", "end_s"],
165
- "properties": {
166
- "id": { "type": "string" },
167
- "start_s": { "type": "number" },
168
- "end_s": { "type": "number" }
169
- }
170
- }
171
- },
172
- "speech": { "type": "array", "maxItems": 0 },
173
- "safe_zones": {
174
- "type": "array",
175
- "maxItems": 1,
176
- "items": {
177
- "type": "object",
178
- "additionalProperties": false,
179
- "required": ["use", "x", "y", "w", "h"],
180
- "properties": {
181
- "use": { "enum": ["logo"] },
182
- "x": { "type": "number", "minimum": 0 },
183
- "y": { "type": "number", "minimum": 0 },
184
- "w": { "type": "number", "exclusiveMinimum": 0 },
185
- "h": { "type": "number", "exclusiveMinimum": 0 }
186
- }
187
- }
188
- }
189
- }
190
- }
191
- }
192
- },
193
- "cost": { "basis": "free" },
194
- "determinism": "pure",
195
- "timing": { "typical_s": 90, "timeout_s": 1200 },
196
- "retry": { "transient": 1 },
197
- "replaces": ["render-html-frames", "render-search-grid", "render-photo-grid-card", "render-logo-equation-card", "create-kinetic-typography"],
198
- "x-determinism-scope": "pure within one render environment: the same inputs give the same bytes on the same operating system, Chromium build and fonts. The kit's toolchain id carries the browser's render fingerprint (version, platform and a hash of a probe page drawn with the system's fonts), so a cached step is never reused on a computer that would draw it differently."
199
- }