@hraness/slopcamera 3.8.1 → 3.9.1
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/NOTICE.md +14 -0
- package/README.md +13 -6
- package/apps/desktop/application/html-overlay-integrity.ts +56 -6
- package/apps/desktop/application/operation.ts +1 -1
- package/apps/desktop/cli/capability-manifest.ts +15 -2
- package/apps/desktop/cli/commands.ts +1 -1
- package/apps/desktop/cli/help.ts +23 -4
- package/apps/desktop/cli/html-overlay-renderer.ts +23 -9
- package/apps/desktop/cli/portable-surface.ts +1 -0
- package/apps/desktop/cli/verbs.ts +4 -0
- package/apps/desktop/dist/cli/main.js +306 -284
- package/dist/cli.js +24 -4
- package/dist/{index-6jrxaser.js → index-jmyg6t9c.js} +4 -4
- package/dist/{index-842t02pp.js → index-m6g0ca9b.js} +1 -1
- package/dist/{index-y8spxs77.js → index-mgychzh3.js} +6 -3
- package/dist/index.js +1 -1
- package/dist/operations.js +1 -1
- package/dist/workflow.js +1 -1
- package/package.json +4 -2
- package/skills/slopcamera/SKILL.md +2 -0
- package/skills/slopcamera/references/customization.md +8 -1
- package/skills/slopcamera/references/icon-place.md +76 -0
- package/skills/slopcamera/references/install.md +2 -2
- package/skills/slopcamera/references/music-video.md +10 -2
- package/skills/slopcamera/references/soundtracks.md +58 -0
- package/src/bounded-file.ts +135 -0
- package/src/cli.ts +191 -0
- package/src/icon-scene.ts +695 -0
- package/src/index.ts +2 -0
- package/src/mcp/tools.ts +311 -0
- package/src/mcp/types.ts +4 -0
- package/src/operations.ts +306 -0
- package/src/soundtrack.ts +489 -0
- package/src/version.ts +1 -1
package/NOTICE.md
CHANGED
|
@@ -52,3 +52,17 @@ The complete local workflow host uses
|
|
|
52
52
|
License (Copyright 2023 Effectful Technologies Inc). It remains a separately
|
|
53
53
|
installed runtime dependency and is not relicensed by this project. Portable
|
|
54
54
|
workflow authoring and graph compilation do not load this runtime.
|
|
55
|
+
|
|
56
|
+
Icon scene composition and rendering use
|
|
57
|
+
[`@hraness/iconplace`](https://github.com/hraness/iconplace) 0.1.0, the
|
|
58
|
+
icon.place library, and soundtrack scores and beat grids use
|
|
59
|
+
[`@hraness/soundfish`](https://github.com/hraness/soundfish) 0.7.0. Both are
|
|
60
|
+
distributed under the MIT License and remain separately installed runtime
|
|
61
|
+
dependencies pinned to exact versions; neither is relicensed by this project.
|
|
62
|
+
The letterform outline data in `@hraness/iconplace/scene` and
|
|
63
|
+
`@hraness/iconplace/collections` is derived from Cormorant Garamond and
|
|
64
|
+
UnifrakturMaguntia and stays under the SIL Open Font License 1.1, as that
|
|
65
|
+
package's `THIRD_PARTY_NOTICES.md` and `licenses/` record.
|
|
66
|
+
Slopcamera imports their library entry points only and never runs their
|
|
67
|
+
commands. The Soundfish Agent Skill ships with `@hraness/soundfish`, not with
|
|
68
|
+
Slopcamera.
|
package/README.md
CHANGED
|
@@ -23,7 +23,9 @@ file and a new render.
|
|
|
23
23
|
is a JSON file of boxes and arrows, a title animation is an HTML scaffold
|
|
24
24
|
for one of seven profiles, and a 3D shot is scene JSON with a named camera.
|
|
25
25
|
The renderer, frame timing, encoding, and export formats are already
|
|
26
|
-
installed.
|
|
26
|
+
installed. This does not make it cheaper in tokens: in our
|
|
27
|
+
[benchmark](https://slopcamera.com/docs/explanation/token-benchmark), the median cost with
|
|
28
|
+
SlopCamera installed was higher than without it on all four tasks.
|
|
27
29
|
- **Revisions change the source, not the whole result.** Change one label,
|
|
28
30
|
camera, or cut and render again. Every export comes from the same source, so
|
|
29
31
|
light and dark versions, or 16:9 and 9:16 cuts, stay in step.
|
|
@@ -41,11 +43,11 @@ file and a new render.
|
|
|
41
43
|
## Install SlopCamera
|
|
42
44
|
|
|
43
45
|
Install [Bun 1.3.14 or newer](https://bun.sh), then install the
|
|
44
|
-
[SlopCamera v3.
|
|
46
|
+
[SlopCamera v3.9.0 release](https://github.com/hraness/slopcamera/releases/tag/v3.9.0)
|
|
45
47
|
and its matching Agent Skill:
|
|
46
48
|
|
|
47
49
|
```sh
|
|
48
|
-
bun add --global https://github.com/hraness/slopcamera/releases/download/v3.
|
|
50
|
+
bun add --global https://github.com/hraness/slopcamera/releases/download/v3.9.0/hraness-slopcamera-3.9.0.tgz
|
|
49
51
|
slopcamera skill install --target agents
|
|
50
52
|
```
|
|
51
53
|
|
|
@@ -192,6 +194,10 @@ them all with their requirements.
|
|
|
192
194
|
| Explainer video | A Manim scene, captions, and a presenter | A lesson video with typeset math | [Geometry lesson](https://slopcamera.com/docs/how-to/educational-video#inspect-the-finished-example) |
|
|
193
195
|
| Footage edits | Cuts, captions, reframes, and color as project decisions | 16:9, 9:16, 1:1, and 4:5 exports from one edit | [Four formats](https://slopcamera.com/docs/how-to/edit-video#landscape-delivery) |
|
|
194
196
|
|
|
197
|
+
SlopCamera also composes vector icon scenes with the bundled icon.place library
|
|
198
|
+
and reads Soundfish scores or MIDI files into beat grids for music-timed scenes,
|
|
199
|
+
both locally and without a model. Neither renders audio.
|
|
200
|
+
|
|
195
201
|
Model-backed generation of images, video, and speech is available through your
|
|
196
202
|
own provider access, and cinematic effects, particles, and character
|
|
197
203
|
performance can be planned from source. The gallery has no rendered examples
|
|
@@ -319,9 +325,10 @@ or [Why SlopCamera](https://slopcamera.com/docs/explanation/why-slopcamera).
|
|
|
319
325
|
identical output elsewhere.
|
|
320
326
|
- **Trusted code is not sandboxed.** Native Python and your own Bun workflows
|
|
321
327
|
run with the current user's access.
|
|
322
|
-
- **MCP is a subset.** Its
|
|
323
|
-
audit scenes,
|
|
324
|
-
command and never changes
|
|
328
|
+
- **MCP is a subset.** Its 21 fixed tools check and render diagrams, plan and
|
|
329
|
+
audit scenes, compose icon scenes and soundtrack beat grids, and run ten
|
|
330
|
+
operation codes. It does not expose every CLI command and never changes
|
|
331
|
+
project state.
|
|
325
332
|
|
|
326
333
|
## Design and trust
|
|
327
334
|
|
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
} from "./html-overlay-browser-runtime";
|
|
25
25
|
|
|
26
26
|
const Sha256Schema = z.string().regex(/^[a-f0-9]{64}$/u);
|
|
27
|
-
const ExecutionContractVersionSchema = z.union([z.literal(1), z.literal(2)]);
|
|
27
|
+
const ExecutionContractVersionSchema = z.union([z.literal(1), z.literal(2), z.literal(3)]);
|
|
28
28
|
export type HtmlOverlayExecutionContractVersion = z.infer<typeof ExecutionContractVersionSchema>;
|
|
29
29
|
|
|
30
30
|
const IntegrityLeafSchema = z.strictObject({
|
|
@@ -207,14 +207,12 @@ function historicalHtmlOverlayRendererContract(
|
|
|
207
207
|
});
|
|
208
208
|
}
|
|
209
209
|
|
|
210
|
-
/**
|
|
211
|
-
|
|
210
|
+
/** Version 2 stays byte-identical for completed clone-prevention receipts. */
|
|
211
|
+
function clonePreventionHtmlOverlayRendererContract(
|
|
212
212
|
profileInput?: HtmlOverlayExecutionProfile,
|
|
213
213
|
resourcesInput: readonly HtmlOverlayDeclaredResource[] = [],
|
|
214
|
-
version: HtmlOverlayExecutionContractVersion = 2,
|
|
215
214
|
) {
|
|
216
215
|
const contract = historicalHtmlOverlayRendererContract(profileInput, resourcesInput);
|
|
217
|
-
if (ExecutionContractVersionSchema.parse(version) === 1) return contract;
|
|
218
216
|
return Object.freeze({
|
|
219
217
|
...contract,
|
|
220
218
|
launch: Object.freeze({
|
|
@@ -226,6 +224,58 @@ export function htmlOverlayRendererContract(
|
|
|
226
224
|
});
|
|
227
225
|
}
|
|
228
226
|
|
|
227
|
+
// Qualified against playwright-core 1.62.0's chromiumSwitches(). Keep every
|
|
228
|
+
// default disabled feature when replacing this one exact default switch.
|
|
229
|
+
const QUALIFIED_PLAYWRIGHT_VERSION = "1.62.0";
|
|
230
|
+
const QUALIFIED_PLAYWRIGHT_DISABLED_FEATURES = Object.freeze([
|
|
231
|
+
"AvoidUnnecessaryBeforeUnloadCheckSync",
|
|
232
|
+
"BoundaryEventDispatchTracksNodeRemoval",
|
|
233
|
+
"DestroyProfileOnBrowserClose",
|
|
234
|
+
"DialMediaRouteProvider",
|
|
235
|
+
"GlobalMediaControls",
|
|
236
|
+
"HttpsUpgrades",
|
|
237
|
+
"LensOverlay",
|
|
238
|
+
"MediaRouter",
|
|
239
|
+
"PaintHolding",
|
|
240
|
+
"ThirdPartyStoragePartitioning",
|
|
241
|
+
"BlockOriginHeaderModificationOnRedirect",
|
|
242
|
+
"Translate",
|
|
243
|
+
"AutoDeElevate",
|
|
244
|
+
"OptimizationHints",
|
|
245
|
+
"msForceBrowserSignIn",
|
|
246
|
+
"msEdgeUpdateLaunchServicesPreferredVersion",
|
|
247
|
+
]);
|
|
248
|
+
const QUALIFIED_PLAYWRIGHT_DISABLE_FEATURES_ARGUMENT =
|
|
249
|
+
`--disable-features=${QUALIFIED_PLAYWRIGHT_DISABLED_FEATURES.join(",")}`;
|
|
250
|
+
|
|
251
|
+
/** Historical versions remain immutable; new launches bind one merged switch. */
|
|
252
|
+
export function htmlOverlayRendererContract(
|
|
253
|
+
profileInput?: HtmlOverlayExecutionProfile,
|
|
254
|
+
resourcesInput: readonly HtmlOverlayDeclaredResource[] = [],
|
|
255
|
+
version: HtmlOverlayExecutionContractVersion = 3,
|
|
256
|
+
) {
|
|
257
|
+
const parsedVersion = ExecutionContractVersionSchema.parse(version);
|
|
258
|
+
if (parsedVersion === 1) return historicalHtmlOverlayRendererContract(profileInput, resourcesInput);
|
|
259
|
+
const contract = clonePreventionHtmlOverlayRendererContract(profileInput, resourcesInput);
|
|
260
|
+
if (parsedVersion === 2) return contract;
|
|
261
|
+
if (playwrightCorePackage.version !== QUALIFIED_PLAYWRIGHT_VERSION) {
|
|
262
|
+
throw new Error("The merged HTML-overlay launch policy requires qualified playwright-core 1.62.0 defaults.");
|
|
263
|
+
}
|
|
264
|
+
return Object.freeze({
|
|
265
|
+
...contract,
|
|
266
|
+
launch: Object.freeze({
|
|
267
|
+
...contract.launch,
|
|
268
|
+
args: Object.freeze(contract.launch.args.map(argument => argument.startsWith("--disable-features=")
|
|
269
|
+
? `--disable-features=${[...new Set([
|
|
270
|
+
...QUALIFIED_PLAYWRIGHT_DISABLED_FEATURES,
|
|
271
|
+
...argument.slice("--disable-features=".length).split(","),
|
|
272
|
+
])].join(",")}` : argument)),
|
|
273
|
+
ignoreDefaultArgs: Object.freeze([QUALIFIED_PLAYWRIGHT_DISABLE_FEATURES_ARGUMENT]),
|
|
274
|
+
}),
|
|
275
|
+
schemaVersion: 5,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
|
|
229
279
|
export function assertHtmlOverlayExecutionProfileLibraries(
|
|
230
280
|
libraries: readonly string[], profile?: HtmlOverlayExecutionProfile,
|
|
231
281
|
): void {
|
|
@@ -280,7 +330,7 @@ export function createHtmlOverlayExecutionBundle(
|
|
|
280
330
|
authoringInput: HtmlOverlayAuthoringInput,
|
|
281
331
|
browserRuntimeInput: HtmlOverlayBrowserRuntimeBinding,
|
|
282
332
|
executionProfile?: HtmlOverlayExecutionProfile,
|
|
283
|
-
contractVersion: HtmlOverlayExecutionContractVersion =
|
|
333
|
+
contractVersion: HtmlOverlayExecutionContractVersion = 3,
|
|
284
334
|
): HtmlOverlayExecutionBundle {
|
|
285
335
|
const authoring = HtmlOverlayAuthoringInputSchema.parse(authoringInput);
|
|
286
336
|
assertHtmlOverlayExecutionProfileLibraries(authoring.libraries, executionProfile);
|
|
@@ -4,7 +4,7 @@ import type { z } from "zod";
|
|
|
4
4
|
|
|
5
5
|
import type { ApplicationContext } from "./context";
|
|
6
6
|
|
|
7
|
-
export const SLOPCAMERA_APPLICATION_TOOL_VERSION = "slopcamera-3.
|
|
7
|
+
export const SLOPCAMERA_APPLICATION_TOOL_VERSION = "slopcamera-3.9.1" as const;
|
|
8
8
|
|
|
9
9
|
export const OPERATION_KINDS = [
|
|
10
10
|
"scene.audit",
|
|
@@ -127,8 +127,12 @@ const capabilityModules = Object.freeze([
|
|
|
127
127
|
{ effect: "local-read", name: "diagram sheets check" },
|
|
128
128
|
{ effect: "local-derived-write", name: "diagram sheets render" },
|
|
129
129
|
{ effect: "local-derived-write", name: "image vectorize" },
|
|
130
|
+
{ effect: "local-derived-write", name: "image icon compose" },
|
|
131
|
+
{ effect: "local-derived-write", name: "image icon render" },
|
|
132
|
+
{ effect: "local-derived-write", name: "media soundtrack compose" },
|
|
133
|
+
{ effect: "local-derived-write", name: "media soundtrack grid" },
|
|
130
134
|
],
|
|
131
|
-
description: "Portable diagrams, CLI/SDK drawing sheets, local vectorization, and the bounded semantic operation projection.",
|
|
135
|
+
description: "Portable diagrams, CLI/SDK drawing sheets, local vectorization, deterministic icon scenes and soundtrack beat grids, and the bounded semantic operation projection.",
|
|
132
136
|
moduleId: "slopcamera.capability.diagram-image",
|
|
133
137
|
operationKeys: diagramImageOperations,
|
|
134
138
|
profiles: [{
|
|
@@ -139,7 +143,16 @@ const capabilityModules = Object.freeze([
|
|
|
139
143
|
}],
|
|
140
144
|
stability: "stable",
|
|
141
145
|
title: "Diagrams and images",
|
|
142
|
-
toolNames: [
|
|
146
|
+
toolNames: [
|
|
147
|
+
"check_diagram",
|
|
148
|
+
"compose_icon",
|
|
149
|
+
"compose_soundtrack",
|
|
150
|
+
"derive_soundtrack_grid",
|
|
151
|
+
"execute_slopcamera",
|
|
152
|
+
"render_diagram",
|
|
153
|
+
"render_icon",
|
|
154
|
+
"search_slopcamera",
|
|
155
|
+
],
|
|
143
156
|
trust: "portable",
|
|
144
157
|
version: 1,
|
|
145
158
|
workflowKeys: [],
|
|
@@ -365,7 +365,7 @@ import {
|
|
|
365
365
|
workflowRunStore,
|
|
366
366
|
} from "./workflow-runs";
|
|
367
367
|
|
|
368
|
-
export const SLOPCAMERA_VERSION = "3.
|
|
368
|
+
export const SLOPCAMERA_VERSION = "3.9.1";
|
|
369
369
|
|
|
370
370
|
// Legacy direct renders predate per-target output contracts. Keep them
|
|
371
371
|
// bounded generously enough for long-form production while preventing one
|
package/apps/desktop/cli/help.ts
CHANGED
|
@@ -37,7 +37,7 @@ Commands:
|
|
|
37
37
|
Discover and run Vercel AI Gateway media models
|
|
38
38
|
credits status|topup|wait|forget
|
|
39
39
|
Buy and inspect hosted generation credits
|
|
40
|
-
media audio|color
|
|
40
|
+
media audio|color|soundtrack Apply local audio and video effects; derive soundtrack beat grids
|
|
41
41
|
outputs Print the agent outputs directory
|
|
42
42
|
outputs list|open|reveal List the newest outputs or open one on this Mac
|
|
43
43
|
status What Slopcamera is doing, credits and newest outputs
|
|
@@ -293,6 +293,10 @@ compliance. Drawing sheets are exposed through this CLI and the root SDK, not co
|
|
|
293
293
|
slopcamera image icon --set <file.json> --output-dir <directory>
|
|
294
294
|
[--context <card|hero|inline>] [--candidates <1-4>]
|
|
295
295
|
[--set-rounds <1-4>] [--keep-raster] [--json]
|
|
296
|
+
slopcamera image icon compose <source.json> [--output <file.json>] [--json]
|
|
297
|
+
slopcamera image icon render <source.json> --output <file.svg> [--recipe <file.json>]
|
|
298
|
+
[--size <16-1024>] [--background] [--palette <original|ink|earth|night>]
|
|
299
|
+
[--language <language>] [--json]
|
|
296
300
|
|
|
297
301
|
Explicit --output file commands delegate to @hraness/slopcamera. Vectorization is local,
|
|
298
302
|
bounded, checksum-pinned, and emits inert SVG. File generation uses Vercel AI Gateway with the
|
|
@@ -308,7 +312,13 @@ variation axes or an explicit candidate list — keeps every candidate with its
|
|
|
308
312
|
composes a labelled contact sheet plus receipt for agent review. Texture cells repeat the
|
|
309
313
|
candidate 2×2 so seams are inspectable (--tile/--no-tile overrides). It never replaces existing
|
|
310
314
|
outputs and never promotes a candidate into authored source; review the sheet and select
|
|
311
|
-
explicitly
|
|
315
|
+
explicitly.
|
|
316
|
+
|
|
317
|
+
Icon compose and render are local and deterministic, with no model or network. They solve and
|
|
318
|
+
draw icon.place scenes, collections, construction programs, and recipes into inert SVG; a recipe
|
|
319
|
+
replays only when its recorded digests match. Construction-program languages: outline, sketch,
|
|
320
|
+
pen, crosshatch, engraving, stipple, halftone, glyph, flat, shaded, figure, cutpaper, woodcut,
|
|
321
|
+
offset.`,
|
|
312
322
|
style: `Usage:
|
|
313
323
|
slopcamera style list [--json]
|
|
314
324
|
slopcamera style show <id> [--json]
|
|
@@ -616,6 +626,15 @@ argv, receipts, or logs. When a configured wallet runs out, paid calls fail with
|
|
|
616
626
|
[--output <relative-path>] [--json]
|
|
617
627
|
slopcamera media color <video-path> [grade] [--video-stream <index>]
|
|
618
628
|
[--output <relative-path>] [--json]
|
|
629
|
+
slopcamera media soundtrack compose <score> [--output <file.json>]
|
|
630
|
+
[--format <compose|song|json|midi>] [--json]
|
|
631
|
+
slopcamera media soundtrack grid <score> [--output <file.json>] [--start-us <n>]
|
|
632
|
+
[--format <compose|song|json|midi>] [--json]
|
|
633
|
+
|
|
634
|
+
Soundtrack verbs delegate to @hraness/slopcamera. They verify a Soundfish loop or song (compose
|
|
635
|
+
text, song text, score JSON, or a Standard MIDI file) and derive the {bpm, beatOffsetUs,
|
|
636
|
+
beatsPerBar} music timing that HTML scene requests accept, plus section cue times. They render
|
|
637
|
+
no audio; pair the grid with the track you mix.
|
|
619
638
|
|
|
620
639
|
Audio effects may be combined in one deterministic chain:
|
|
621
640
|
--volume-db <-60..24>
|
|
@@ -725,7 +744,7 @@ export function completions(words: readonly string[]): readonly string[] {
|
|
|
725
744
|
if (command === "diagram") return words[1] === "sheets"
|
|
726
745
|
? ["init", "check", "render"]
|
|
727
746
|
: ["init", "check", "render", "sheets"];
|
|
728
|
-
if (command === "image") return ["vectorize", "generate", "gallery", "icon"];
|
|
747
|
+
if (command === "image") return words[1] === "icon" ? ["compose", "render"] : ["vectorize", "generate", "gallery", "icon"];
|
|
729
748
|
if (command === "workflows") return ["list", "show", "plan", "run"];
|
|
730
749
|
if (command === "code") return ["init", "check", "plan", "run"];
|
|
731
750
|
if (command === "runs") return ["list", "show", "resume", "approve", "cancel"];
|
|
@@ -748,7 +767,7 @@ export function completions(words: readonly string[]): readonly string[] {
|
|
|
748
767
|
if (command === "fillers") return ["list", "apply"];
|
|
749
768
|
if (command === "ai") return ["models", "provider-options", "image", "video", "speech", "transcribe"];
|
|
750
769
|
if (command === "credits") return ["status", "topup", "wait", "forget"];
|
|
751
|
-
if (command === "media") return ["audio", "color"];
|
|
770
|
+
if (command === "media") return words[1] === "soundtrack" ? ["compose", "grid"] : ["audio", "color", "soundtrack"];
|
|
752
771
|
if (command === "render") return ["plan", "run"];
|
|
753
772
|
if (command === "assets") return ["emoji"];
|
|
754
773
|
if (command === "outputs") return ["list", "open", "reveal"];
|
|
@@ -81,18 +81,32 @@ function maximumLibraryBytes(lock: HtmlOverlayActiveLibraryLock): number {
|
|
|
81
81
|
const DEFAULT_BROWSER_STEP_TIMEOUT_MS = 60_000;
|
|
82
82
|
const MAXIMUM_BROWSER_STEP_TIMEOUT_MS = 5 * 60_000;
|
|
83
83
|
|
|
84
|
-
export function
|
|
84
|
+
export function createHtmlOverlayBrowserLaunchOptions(
|
|
85
85
|
libraries: readonly HtmlOverlayLibrarySpecifier[],
|
|
86
86
|
executionProfile?: HtmlOverlayExecutionProfile,
|
|
87
|
-
): string[] {
|
|
87
|
+
): { args: string[]; ignoreDefaultArgs: string[] } {
|
|
88
88
|
assertHtmlOverlayExecutionProfileLibraries(libraries, executionProfile);
|
|
89
89
|
const contract = htmlOverlayRendererContract(executionProfile);
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
90
|
+
// Both the replacement and exact selective suppression are receipt-bound.
|
|
91
|
+
if (!("ignoreDefaultArgs" in contract.launch)) {
|
|
92
|
+
throw new Error("The current HTML-overlay launch contract lacks its selective default-argument policy.");
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
args: [
|
|
96
|
+
...contract.launch.args,
|
|
97
|
+
...(libraries.includes("vgpu")
|
|
98
|
+
? HTML_OVERLAY_RENDERER_CONTRACT.launch.libraryArgs.vgpu
|
|
99
|
+
: []),
|
|
100
|
+
],
|
|
101
|
+
ignoreDefaultArgs: [...contract.launch.ignoreDefaultArgs],
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export function createHtmlOverlayBrowserLaunchArgs(
|
|
106
|
+
libraries: readonly HtmlOverlayLibrarySpecifier[],
|
|
107
|
+
executionProfile?: HtmlOverlayExecutionProfile,
|
|
108
|
+
): string[] {
|
|
109
|
+
return createHtmlOverlayBrowserLaunchOptions(libraries, executionProfile).args;
|
|
96
110
|
}
|
|
97
111
|
const BROWSER_CLEANUP_TIMEOUT_MS = 30_000;
|
|
98
112
|
const BROWSER_RUNTIME_FLAGS_TIMEOUT_MS = 60_000;
|
|
@@ -2107,7 +2121,7 @@ export class PlaywrightHtmlOverlayRenderer implements HtmlOverlayRenderer {
|
|
|
2107
2121
|
browserShutdownRequired = true;
|
|
2108
2122
|
try {
|
|
2109
2123
|
return await this.#launch({
|
|
2110
|
-
|
|
2124
|
+
...createHtmlOverlayBrowserLaunchOptions(
|
|
2111
2125
|
request.authoring.libraries,
|
|
2112
2126
|
request.executionProfile,
|
|
2113
2127
|
),
|
|
@@ -96,6 +96,8 @@ export const CLI_VERBS: readonly VerbRow[] = [
|
|
|
96
96
|
row("image generate", "operate", "Generate an image with Vercel AI Gateway"),
|
|
97
97
|
row("image gallery", "operate", "Generate a review gallery of image candidates"),
|
|
98
98
|
row("image icon", "operate", "Generate a line-art SVG icon"),
|
|
99
|
+
row("image icon compose", "operate", "Solve a vector icon scene and report its digests"),
|
|
100
|
+
row("image icon render", "operate", "Draw a vector icon scene or recipe to inert SVG"),
|
|
99
101
|
|
|
100
102
|
row("html catalog", "read", "List HTML scene profiles"),
|
|
101
103
|
row("html scaffold", "operate", "Write a new HTML scene"),
|
|
@@ -138,6 +140,8 @@ export const CLI_VERBS: readonly VerbRow[] = [
|
|
|
138
140
|
|
|
139
141
|
row("media audio", "operate", "Apply audio effects into a new file"),
|
|
140
142
|
row("media color", "operate", "Apply a color grade into a new file"),
|
|
143
|
+
row("media soundtrack compose", "operate", "Verify a loop or song score"),
|
|
144
|
+
row("media soundtrack grid", "operate", "Derive music timing and section cues from a score"),
|
|
141
145
|
|
|
142
146
|
row("outputs", "read", "Print the outputs folder"),
|
|
143
147
|
row("outputs list", "read", "List the files in the outputs folder, newest first"),
|